From 1c704ecf51ef853621612840b32c3dddb1fd974d Mon Sep 17 00:00:00 2001 From: Eric Milles Date: Fri, 8 Nov 2024 11:50:54 -0600 Subject: [PATCH] Eclipse 4.34 (M3) JDT Patch for Groovy-Eclipse https://github.com/eclipse-jdt/eclipse.jdt.core/releases/tag/S4_34_0_M3 for #1597 #1598 --- .../groovy/core/tests/xform/SealedTests.java | 24 +- groovy-eclipse.setup | 2 +- .../feature.xml | 2 +- .../.settings/org.eclipse.jdt.ui.prefs | 95 +- .../build.properties | 2 +- .../lib/javax20api.jar | Bin 102812 -> 0 bytes .../lib/javax23api.jar | Bin 0 -> 100924 bytes .../eclipse/jdt/core/JDTCompilerAdapter.java | 3 +- .../jdt/core/compiler/CharOperation.java | 1 - .../eclipse/jdt/core/compiler/IProblem.java | 69 +- .../jdt/core/compiler/SubwordMatcher.java | 1 - .../core/compiler/batch/BatchCompiler.java | 1 - .../AbstractAnnotationProcessorManager.java | 1 - .../jdt/internal/compiler/ClassFile.java | 91 +- .../internal/compiler/CompilationResult.java | 64 +- .../jdt/internal/compiler/Compiler.java | 45 +- .../internal/compiler/IProblemFactory.java | 1 - .../internal/compiler/ProcessTaskManager.java | 1 - .../jdt/internal/compiler/ReadManager.java | 1 - .../dispatch/AnnotationDiscoveryVisitor.java | 27 +- .../BaseAnnotationProcessorManager.java | 1 - .../apt/dispatch/BaseMessagerImpl.java | 1 - .../apt/dispatch/BaseProcessingEnvImpl.java | 2 - .../BatchAnnotationProcessorManager.java | 2 - .../compiler/apt/dispatch/BatchFilerImpl.java | 4 +- .../apt/dispatch/BatchMessagerImpl.java | 1 - .../apt/dispatch/BatchProcessingEnvImpl.java | 2 - .../apt/dispatch/HookedJavaFileObject.java | 2 - .../apt/dispatch/IProcessorProvider.java | 1 - .../compiler/apt/dispatch/ProcessorInfo.java | 1 - .../apt/dispatch/RoundDispatcher.java | 1 - .../compiler/apt/dispatch/RoundEnvImpl.java | 2 - .../apt/model/AnnotationMirrorImpl.java | 2 - .../apt/model/AnnotationValueImpl.java | 2 - .../compiler/apt/model/ArrayTypeImpl.java | 1 - .../compiler/apt/model/DeclaredTypeImpl.java | 2 - .../compiler/apt/model/ElementImpl.java | 2 - .../compiler/apt/model/ElementsImpl.java | 27 +- .../compiler/apt/model/ElementsImpl9.java | 78 +- .../compiler/apt/model/ErrorTypeElement.java | 2 - .../compiler/apt/model/ErrorTypeImpl.java | 2 - .../apt/model/ExecutableElementImpl.java | 25 +- .../apt/model/ExecutableTypeImpl.java | 2 - .../internal/compiler/apt/model/Factory.java | 25 +- .../apt/model/IntersectionTypeImpl.java | 9 +- .../compiler/apt/model/ModuleElementImpl.java | 4 +- .../compiler/apt/model/NoTypeImpl.java | 2 - .../apt/model/PackageElementImpl.java | 2 - .../compiler/apt/model/PrimitiveTypeImpl.java | 1 - .../apt/model/RecordComponentElementImpl.java | 1 - .../compiler/apt/model/TypeElementImpl.java | 15 +- .../compiler/apt/model/TypeMirrorImpl.java | 2 - .../apt/model/TypeParameterElementImpl.java | 2 - .../compiler/apt/model/TypeVariableImpl.java | 1 - .../compiler/apt/model/TypesImpl.java | 13 +- .../apt/model/VariableElementImpl.java | 2 - .../compiler/apt/model/WildcardTypeImpl.java | 1 - .../compiler/ast/AND_AND_Expression.java | 13 +- .../jdt/internal/compiler/ast/ASTNode.java | 83 +- .../ast/AbstractMethodDeclaration.java | 28 +- .../compiler/ast/AllocationExpression.java | 19 +- .../jdt/internal/compiler/ast/Annotation.java | 1 - .../ast/ArrayAllocationExpression.java | 14 +- .../compiler/ast/ArrayInitializer.java | 9 +- .../ast/ArrayQualifiedTypeReference.java | 6 +- .../compiler/ast/ArrayTypeReference.java | 1 - .../compiler/ast/AssertStatement.java | 16 +- .../jdt/internal/compiler/ast/Assignment.java | 15 +- .../compiler/ast/BinaryExpression.java | 15 +- .../jdt/internal/compiler/ast/Block.java | 9 +- .../compiler/ast/BranchStatement.java | 29 +- .../internal/compiler/ast/BreakStatement.java | 35 +- .../internal/compiler/ast/CaseStatement.java | 38 +- .../internal/compiler/ast/CastExpression.java | 46 +- .../internal/compiler/ast/CharLiteral.java | 7 +- .../compiler/ast/ClassLiteralAccess.java | 14 +- .../ast/CombinedBinaryExpression.java | 1 - .../ast/CompactConstructorDeclaration.java | 1 - .../ast/CompilationUnitDeclaration.java | 13 +- .../compiler/ast/CompoundAssignment.java | 10 +- .../compiler/ast/ConditionalExpression.java | 137 +- .../compiler/ast/ConstructorDeclaration.java | 24 +- .../compiler/ast/ContinueStatement.java | 35 +- .../internal/compiler/ast/DoStatement.java | 15 +- .../internal/compiler/ast/DoubleLiteral.java | 7 +- .../compiler/ast/EitherOrMultiPattern.java | 7 + .../internal/compiler/ast/EmptyStatement.java | 4 +- .../compiler/ast/EqualExpression.java | 20 +- .../compiler/ast/ExplicitConstructorCall.java | 21 +- .../jdt/internal/compiler/ast/Expression.java | 32 +- .../compiler/ast/FakeDefaultLiteral.java | 3 +- .../compiler/ast/FakedTrackingVariable.java | 22 +- .../compiler/ast/FieldDeclaration.java | 13 +- .../internal/compiler/ast/FieldReference.java | 20 +- .../compiler/ast/ForeachStatement.java | 16 +- .../compiler/ast/FunctionalExpression.java | 17 +- .../internal/compiler/ast/GuardedPattern.java | 10 +- .../compiler/ast/IPolyExpression.java | 1 + .../internal/compiler/ast/IfStatement.java | 13 +- .../compiler/ast/ImplicitTypeDeclaration.java | 1 - .../compiler/ast/ImportReference.java | 10 +- .../internal/compiler/ast/Initializer.java | 16 +- .../compiler/ast/InstanceOfExpression.java | 35 +- .../compiler/ast/IntLiteralMinValue.java | 2 +- .../ast/IntersectionCastTypeReference.java | 1 - .../ast/JavadocArgumentExpression.java | 5 +- .../ast/JavadocImplicitTypeReference.java | 7 +- .../compiler/ast/JavadocMessageSend.java | 10 +- .../compiler/ast/JavadocReturnStatement.java | 6 +- .../ast/JavadocSingleNameReference.java | 6 +- .../ast/JavadocSingleTypeReference.java | 12 +- .../compiler/ast/LabeledStatement.java | 10 +- .../compiler/ast/LambdaExpression.java | 33 +- .../jdt/internal/compiler/ast/Literal.java | 5 +- .../compiler/ast/LocalDeclaration.java | 2 +- .../compiler/ast/LongLiteralMinValue.java | 2 +- .../compiler/ast/MarkerAnnotation.java | 3 +- .../internal/compiler/ast/MessageSend.java | 35 +- .../compiler/ast/MethodDeclaration.java | 14 +- .../compiler/ast/ModuleDeclaration.java | 5 +- .../internal/compiler/ast/NameReference.java | 11 +- .../compiler/ast/NormalAnnotation.java | 5 +- .../compiler/ast/NullAnnotationMatching.java | 26 +- .../internal/compiler/ast/NullLiteral.java | 5 +- .../compiler/ast/OR_OR_Expression.java | 14 +- .../jdt/internal/compiler/ast/Pattern.java | 34 +- .../compiler/ast/PostfixExpression.java | 4 +- .../compiler/ast/PrefixExpression.java | 2 +- .../compiler/ast/ProvidesStatement.java | 1 - .../ast/QualifiedAllocationExpression.java | 25 +- .../compiler/ast/QualifiedNameReference.java | 20 +- .../compiler/ast/QualifiedSuperReference.java | 9 +- .../compiler/ast/QualifiedThisReference.java | 12 +- .../compiler/ast/RecordComponent.java | 14 +- .../internal/compiler/ast/RecordPattern.java | 2 +- .../jdt/internal/compiler/ast/Reference.java | 11 +- .../compiler/ast/ReferenceExpression.java | 30 +- .../compiler/ast/ReturnStatement.java | 71 +- .../compiler/ast/SingleMemberAnnotation.java | 4 +- .../compiler/ast/SingleNameReference.java | 19 +- .../jdt/internal/compiler/ast/Statement.java | 24 +- ...nt.java => StatementWithFinallyBlock.java} | 42 +- .../compiler/ast/SwitchExpression.java | 683 +++------ .../compiler/ast/SwitchStatement.java | 307 ++-- .../compiler/ast/SynchronizedStatement.java | 22 +- .../jdt/internal/compiler/ast/TextBlock.java | 272 ---- .../internal/compiler/ast/ThisReference.java | 9 +- .../internal/compiler/ast/TrueLiteral.java | 2 +- .../internal/compiler/ast/TryStatement.java | 297 ++-- .../compiler/ast/TypeDeclaration.java | 38 +- .../internal/compiler/ast/TypeParameter.java | 15 +- .../internal/compiler/ast/TypePattern.java | 29 +- .../internal/compiler/ast/TypeReference.java | 21 +- .../compiler/ast/UnaryExpression.java | 13 +- .../internal/compiler/ast/WhileStatement.java | 13 +- .../jdt/internal/compiler/ast/Wildcard.java | 8 +- .../internal/compiler/ast/YieldStatement.java | 214 ++- .../internal/compiler/batch/BasicModule.java | 1 - .../compiler/batch/ClasspathDirectory.java | 31 +- .../internal/compiler/batch/ClasspathJar.java | 5 +- .../compiler/batch/ClasspathJep247.java | 1 - .../compiler/batch/ClasspathJep247Jdk12.java | 1 - .../compiler/batch/ClasspathJmod.java | 3 +- .../internal/compiler/batch/ClasspathJrt.java | 1 - .../compiler/batch/ClasspathJsr199.java | 2 - .../compiler/batch/ClasspathLocation.java | 1 - .../batch/ClasspathMultiReleaseJar.java | 1 - .../compiler/batch/ClasspathSourceJar.java | 3 +- .../compiler/batch/CompilationUnit.java | 1 - .../internal/compiler/batch/FileFinder.java | 1 - .../internal/compiler/batch/FileSystem.java | 20 +- .../jdt/internal/compiler/batch/Main.java | 33 +- .../internal/compiler/batch/ModuleFinder.java | 3 +- .../compiler/classfmt/AnnotationInfo.java | 16 +- .../compiler/classfmt/ClassFileReader.java | 35 +- .../classfmt/ElementValuePairInfo.java | 1 - .../classfmt/ExternalAnnotationDecorator.java | 5 +- .../classfmt/ExternalAnnotationProvider.java | 5 +- .../compiler/classfmt/ModuleInfo.java | 1 - .../compiler/classfmt/TypeAnnotationInfo.java | 1 - .../internal/compiler/codegen/CodeStream.java | 60 +- .../codegen/MultiCatchExceptionLabel.java | 2 +- .../compiler/codegen/OperandStack.java | 15 +- .../compiler/codegen/StackMapFrame.java | 1 - .../codegen/StackMapFrameCodeStream.java | 1 - .../codegen/TypeAnnotationCodeStream.java | 1 - .../codegen/VerificationTypeInfo.java | 1 - .../internal/compiler/env/ClassSignature.java | 1 - .../compiler/env/EnumConstantSignature.java | 1 - .../internal/compiler/env/IBinaryType.java | 9 +- .../jdt/internal/compiler/env/IModule.java | 1 - .../env/IModuleAwareNameEnvironment.java | 1 - .../compiler/env/IUpdatableModule.java | 1 - .../compiler/env/NameEnvironmentAnswer.java | 1 - .../flow/ExceptionHandlingFlowContext.java | 25 +- .../compiler/flow/FinallyFlowContext.java | 9 +- .../internal/compiler/flow/FlowContext.java | 102 +- ...StatementWithFinallyBlockFlowContext.java} | 14 +- .../compiler/flow/LoopingFlowContext.java | 1 - .../compiler/flow/SwitchFlowContext.java | 7 +- .../compiler/flow/UnconditionalFlowInfo.java | 1 - .../compiler/impl/CompilerOptions.java | 19 +- .../internal/compiler/impl/IrritantSet.java | 6 +- .../internal/compiler/impl/JavaFeature.java | 4 +- .../lookup/AnnotatableTypeSystem.java | 2 +- .../compiler/lookup/AnnotationBinding.java | 1 - .../lookup/AptBinaryLocalVariableBinding.java | 1 - .../compiler/lookup/ArrayBinding.java | 1 - .../compiler/lookup/BinaryModuleBinding.java | 3 +- .../compiler/lookup/BinaryTypeBinding.java | 73 +- .../jdt/internal/compiler/lookup/Binding.java | 2 +- .../internal/compiler/lookup/BlockScope.java | 4 +- .../internal/compiler/lookup/BoundSet.java | 13 +- .../internal/compiler/lookup/ClassScope.java | 368 +++-- .../compiler/lookup/CompilationUnitScope.java | 61 +- .../lookup/ConstraintExceptionFormula.java | 1 - .../lookup/ConstraintExpressionFormula.java | 18 +- .../lookup/ConstraintTypeFormula.java | 1 - .../compiler/lookup/ElementValuePair.java | 8 +- .../ExternalAnnotationSuperimposer.java | 1 - .../lookup/ExtraCompilerModifiers.java | 2 +- .../ImplicitNullAnnotationVerifier.java | 1 - .../compiler/lookup/InferenceContext18.java | 30 +- .../compiler/lookup/InferenceVariable.java | 1 - .../lookup/IntersectionTypeBinding18.java | 1 - .../compiler/lookup/LocalVariableBinding.java | 6 +- .../compiler/lookup/LookupEnvironment.java | 11 +- .../compiler/lookup/MethodBinding.java | 1 - .../internal/compiler/lookup/MethodScope.java | 11 +- .../compiler/lookup/MethodVerifier.java | 5 +- .../compiler/lookup/MethodVerifier15.java | 1 - .../compiler/lookup/MissingTypeBinding.java | 3 +- .../compiler/lookup/ModuleBinding.java | 1 - .../compiler/lookup/PackageBinding.java | 1 - .../lookup/ParameterizedTypeBinding.java | 61 +- .../compiler/lookup/PolyTypeBinding.java | 4 +- .../lookup/ProblemReferenceBinding.java | 1 - .../compiler/lookup/RawTypeBinding.java | 1 - .../compiler/lookup/ReferenceBinding.java | 27 +- .../jdt/internal/compiler/lookup/Scope.java | 54 +- .../lookup/SortedCompoundNameVector.java | 1 - .../lookup/SortedSimpleNameVector.java | 1 - .../compiler/lookup/SourceModuleBinding.java | 1 - .../compiler/lookup/SourceTypeBinding.java | 288 +--- .../compiler/lookup/SplitPackageBinding.java | 1 - .../lookup/SyntheticMethodBinding.java | 1 - .../internal/compiler/lookup/TypeBinding.java | 32 +- .../compiler/lookup/TypeConstants.java | 4 +- .../internal/compiler/lookup/TypeSystem.java | 1 - .../compiler/lookup/TypeVariableBinding.java | 29 +- .../compiler/lookup/WildcardBinding.java | 1 - .../parser/AbstractCommentParser.java | 12 +- .../parser/IMarkdownCommentHelper.java | 3 +- .../compiler/parser/JavadocParser.java | 20 +- .../compiler/parser/JavadocTagConstants.java | 72 +- .../jdt/internal/compiler/parser/Parser.java | 149 +- .../compiler/parser/RecoveredAnnotation.java | 41 +- .../compiler/parser/RecoveredBlock.java | 5 +- .../compiler/parser/RecoveredElement.java | 11 +- .../compiler/parser/RecoveredField.java | 14 +- .../compiler/parser/RecoveredInitializer.java | 3 +- .../parser/RecoveredLocalVariable.java | 3 +- .../compiler/parser/RecoveredMethod.java | 63 +- .../compiler/parser/RecoveredStatement.java | 1 - .../compiler/parser/RecoveredType.java | 39 +- .../compiler/parser/RecoveredUnit.java | 12 +- .../jdt/internal/compiler/parser/Scanner.java | 5 +- .../compiler/parser/ScannerHelper.java | 1 - .../problem/AbortCompilationUnit.java | 1 - .../problem/DefaultProblemFactory.java | 4 +- .../compiler/problem/ProblemReporter.java | 582 ++------ .../compiler/problem/messages.properties | 83 +- .../jdt/internal/compiler/tool/Archive.java | 1 - .../compiler/tool/ArchiveFileObject.java | 2 - .../compiler/tool/EclipseBatchRequestor.java | 1 - .../compiler/tool/EclipseCompiler.java | 2 - .../compiler/tool/EclipseCompilerImpl.java | 2 - .../tool/EclipseCompilerRequestor.java | 1 - .../compiler/tool/EclipseDiagnostic.java | 2 - .../compiler/tool/EclipseFileManager.java | 18 +- .../compiler/tool/EclipseFileObject.java | 17 +- .../compiler/tool/ExceptionDiagnostic.java | 1 - .../internal/compiler/tool/JrtFileSystem.java | 2 - .../compiler/tool/ModuleLocationHandler.java | 1 - .../compiler/tool/PathFileObject.java | 2 - .../jdt/internal/compiler/tool/Util.java | 1 - .../compiler/util/HashtableOfObject.java | 1 - .../jdt/internal/compiler/util/JRTUtil.java | 12 +- .../internal/compiler/util/JrtFileSystem.java | 3 +- .../jdt/internal/compiler/util/Sorting.java | 1 - .../internal/compiler/util/TextBlockUtil.java | 272 ++++ .../jdt/internal/compiler/util/Util.java | 1 - .../.settings/org.eclipse.jdt.ui.prefs | 93 +- .../META-INF/MANIFEST.MF | 2 +- .../pom.xml | 2 +- .../mockcompiler/MockCompilerFactory.java | 1 - .../.settings/org.eclipse.jdt.ui.prefs | 93 +- .../META-INF/MANIFEST.MF | 1 - .../core/tests/builder/AbstractLeakTest.java | 1 - .../tests/builder/AbstractMethodTests.java | 4 +- .../builder/AnnotationDependencyTests.java | 31 +- .../core/tests/builder/BasicBuildTests.java | 6 +- .../jdt/core/tests/builder/Bug530366Test.java | 3 +- .../jdt/core/tests/builder/Bug531382Test.java | 3 +- .../jdt/core/tests/builder/Bug544921Test.java | 3 +- .../jdt/core/tests/builder/Bug549457Test.java | 3 +- .../jdt/core/tests/builder/Bug549646Test.java | 3 +- .../jdt/core/tests/builder/Bug561287Test.java | 3 +- .../jdt/core/tests/builder/Bug562420Test.java | 3 +- .../jdt/core/tests/builder/Bug564905Test.java | 3 +- .../jdt/core/tests/builder/Bug571363Test.java | 3 +- .../jdt/core/tests/builder/BuilderTests.java | 9 +- .../core/tests/builder/BuilderTests11.java | 3 +- .../core/tests/builder/BuildpathTests.java | 4 +- .../tests/builder/CompressedWriterTest.java | 4 +- .../core/tests/builder/CopyResourceTests.java | 2 +- .../core/tests/builder/DependencyTests.java | 1 - .../core/tests/builder/EfficiencyTests.java | 2 +- .../jdt/core/tests/builder/ErrorsTests.java | 2 - .../core/tests/builder/ExecutionTests.java | 2 +- .../tests/builder/FriendDependencyTests.java | 4 +- .../core/tests/builder/GetResourcesTests.java | 1 - .../core/tests/builder/IncrementalTests.java | 63 +- .../tests/builder/IncrementalTests18.java | 2 - .../core/tests/builder/LeakTestsAfter9.java | 3 +- .../core/tests/builder/LeakTestsBefore9.java | 3 +- .../core/tests/builder/MultiProjectTests.java | 4 +- ...MultiSourceFolderAndOutputFolderTests.java | 3 +- .../core/tests/builder/OutputFolderTests.java | 3 +- .../core/tests/builder/PackageInfoTest.java | 2 - .../jdt/core/tests/builder/PackageTests.java | 4 +- .../tests/builder/ParticipantBuildTests.java | 43 +- .../builder/ReferenceCollectionTest.java | 4 +- .../jdt/core/tests/builder/StateTest.java | 4 +- .../core/tests/builder/StaticFinalTests.java | 2 +- .../builder/TestAttributeBuilderTests.java | 3 +- .../tests/builder/TestingEnvironment.java | 32 +- .../builder/participants/ParticipantBase.java | 1 - .../TestCompilationParticipant1.java | 2 +- .../TestCompilationParticipant2.java | 2 +- .../TestCompilationParticipant3.java | 2 +- .../.settings/org.eclipse.jdt.ui.prefs | 101 +- .../META-INF/MANIFEST.MF | 1 - .../build.properties | 3 +- ....jdt.annotation_1.2.100.v20241001-0914.jar | Bin 0 -> 18693 bytes .../tests/compiler/CharDeduplicationTest.java | 6 +- .../tests/compiler/DeduplicationUtilTest.java | 6 +- .../core/tests/compiler/IrritantSetTest.java | 5 +- .../compiler/map/CharArrayMapperTest.java | 6 +- .../parser/AbstractCompletionTest.java | 9 +- .../parser/AbstractSelectionTest.java | 9 +- .../parser/AbstractSyntaxTreeTest.java | 1 - .../AnnotationCompletionParserTest.java | 2 - .../parser/AnnotationDietRecoveryTest.java | 42 +- .../compiler/parser/CompletionParserTest.java | 1 - .../parser/ComplianceDiagnoseTest.java | 1 - .../compiler/parser/DietCompletionTest.java | 1 - .../compiler/parser/DietRecoveryTest.java | 2 - .../parser/DocumentElementParserTest.java | 1 - .../parser/DualParseSyntaxErrorTest.java | 1 - .../parser/EnumCompletionParserTest.java | 2 - .../compiler/parser/EnumDietRecoveryTest.java | 1 - .../parser/GenericDietRecoveryTest.java | 1 - .../parser/GenericsCompletionParserTest.java | 2 - .../parser/JavadocCompletionParserTest.java | 2 - .../parser/LambdaExpressionSyntaxTest.java | 1 - .../parser/MarkdownCompletionParserTest.java | 2 - .../parser/ModuleDeclarationSyntaxTest.java | 4 +- .../tests/compiler/parser/ParserTest.java | 1 - .../tests/compiler/parser/ParserTest1_7.java | 2 - .../parser/PatternMatchingSelectionTest.java | 3 +- .../parser/ReferenceExpressionSyntaxTest.java | 1 - .../parser/RunCompletionParserTests.java | 6 +- .../compiler/parser/SelectionJavadocTest.java | 4 +- .../parser/SelectionMarkdownTest.java | 4 +- .../parser/SelectionParserTest10.java | 3 +- .../parser/SelectionParserTest12.java | 3 +- .../parser/SelectionParserTest13.java | 3 +- .../parser/SelectionParserTest18.java | 3 +- .../compiler/parser/SelectionParserTest9.java | 3 +- .../tests/compiler/parser/SelectionTest2.java | 3 +- .../compiler/parser/SingleCompletionTest.java | 1 - .../parser/SourceElementParserTest.java | 2 - .../parser/StatementRecoveryTest.java | 2 - .../parser/StatementRecoveryTest_1_5.java | 2 - .../compiler/parser/StringLiteralTest.java | 4 +- .../compiler/parser/SyntaxErrorTest.java | 1 - .../core/tests/compiler/parser/TestAll.java | 6 +- .../parser/TypeAnnotationSyntaxTest.java | 12 +- .../compiler/regression/ASTImplTests.java | 17 +- .../regression/AbstractBatchCompilerTest.java | 1 - .../regression/AbstractComparableTest.java | 4 +- .../AbstractModuleCompilationTest.java | 8 +- .../AbstractNullAnnotationTest.java | 26 +- .../regression/AbstractRegressionTest.java | 566 +++---- .../regression/AbstractRegressionTest9.java | 1 - .../regression/AmbiguousMethodTest.java | 4 +- .../compiler/regression/AnnotationTest.java | 2 - .../tests/compiler/regression/ArrayTest.java | 2 - .../compiler/regression/AssertionTest.java | 3 +- .../compiler/regression/AssignmentTest.java | 4 +- .../regression/AssignmentTest_1_5.java | 4 +- .../regression/AssignmentTest_1_7.java | 4 +- .../compiler/regression/AutoBoxingTest.java | 2 - .../regression/AutomaticModuleNamingTest.java | 4 +- .../regression/BatchCompilerTest.java | 5 +- .../regression/BatchCompilerTest2.java | 4 +- .../regression/BatchCompilerTest_14.java | 4 +- .../regression/BatchCompilerTest_15.java | 8 +- .../regression/BatchCompilerTest_16.java | 4 +- .../regression/BatchCompilerTest_17.java | 84 +- .../regression/BatchCompilerTest_21.java | 3 +- .../regression/BatchCompilerTest_22.java | 134 ++ .../regression/BinaryLiteralTest.java | 4 +- .../compiler/regression/BooleanTest.java | 4 +- .../BootstrapMethodAttributeTest.java | 2 - .../tests/compiler/regression/CastTest.java | 2 - .../regression/CharOperationTest.java | 3 +- .../regression/ClassFileComparatorTest.java | 8 +- .../regression/ClassFileReaderTest_17.java | 7 +- .../regression/ClassFileReaderTest_1_4.java | 1 - .../regression/ClassFileReaderTest_1_5.java | 2 - .../regression/ClassFileReaderTest_1_8.java | 4 +- .../regression/CompilerInvocationTests.java | 29 +- .../compiler/regression/Compliance_1_3.java | 2 - .../compiler/regression/Compliance_1_4.java | 2 - .../compiler/regression/Compliance_1_5.java | 4 +- .../compiler/regression/Compliance_1_6.java | 4 +- .../compiler/regression/Compliance_1_7.java | 4 +- .../compiler/regression/Compliance_CLDC.java | 2 - .../ConcurrentBatchCompilerTest.java | 2 - .../regression/ConditionalExpressionTest.java | 92 +- .../compiler/regression/ConstantTest.java | 13 +- .../regression/DebugAttributeTest.java | 2 - .../DefaultJavaRuntimeEnvironment.java | 1 - .../compiler/regression/Deprecated15Test.java | 2 - .../compiler/regression/Deprecated18Test.java | 2 - .../compiler/regression/Deprecated9Test.java | 47 +- .../compiler/regression/DeprecatedTest.java | 4 +- .../regression/DubiousOutcomeTest.java | 3 +- .../EnclosingMethodAttributeTest.java | 2 - .../tests/compiler/regression/EnumTest.java | 125 +- .../regression/ExpressionContextTests.java | 5 +- .../ExternalizeStringLiteralsTest.java | 4 +- .../ExternalizeStringLiteralsTest_15.java | 4 +- .../ExternalizeStringLiteralsTest_1_5.java | 35 +- .../compiler/regression/FieldAccessTest.java | 2 - .../compiler/regression/FlowAnalysisTest.java | 2 - .../regression/FlowAnalysisTest8.java | 10 +- .../compiler/regression/ForStatementTest.java | 2 - .../regression/ForeachStatementTest.java | 2 - .../regression/GenericTypeSignatureTest.java | 2 - .../compiler/regression/GenericTypeTest.java | 2 - .../regression/GenericsRegressionTest.java | 44 +- .../GenericsRegressionTest_1_7.java | 4 +- .../GenericsRegressionTest_1_8.java | 11 +- .../regression/GenericsRegressionTest_9.java | 4 +- .../ImplicitlyDeclaredClassesTest.java | 46 +- .../regression/InMemoryNameEnvironment.java | 5 +- .../regression/InMemoryNameEnvironment9.java | 1 - .../regression/InitializationTests.java | 2 - .../compiler/regression/InnerClass15Test.java | 2 - .../regression/InnerEmulationTest.java | 2 - .../regression/InnerEmulationTest_1_5.java | 1 - .../regression/InstanceofExpressionTest.java | 3 +- .../InstanceofPrimaryPatternTest.java | 28 +- .../regression/InterfaceMethodsTest.java | 37 +- .../regression/InterfaceMethodsTest_9.java | 3 +- .../regression/InternalHexFloatTest.java | 2 - .../regression/InternalScannerTest.java | 1 - .../compiler/regression/JEP181NestTest.java | 2 - .../regression/JEP286ReservedWordTest.java | 4 +- .../tests/compiler/regression/JEP286Test.java | 4 +- .../regression/JEP323VarLambdaParamsTest.java | 3 +- .../regression/JEP441SnippetsTest.java | 1328 +++++++++++++++++ .../regression/JSR308SpecSnippetTests.java | 4 +- .../regression/JSR335ClassFileTest.java | 2 - .../compiler/regression/JavadocBugsTest.java | 2 - .../compiler/regression/JavadocTest.java | 7 +- .../regression/JavadocTestForClass.java | 2 - .../regression/JavadocTestForConstructor.java | 2 - .../regression/JavadocTestForField.java | 2 - .../regression/JavadocTestForInterface.java | 2 - .../regression/JavadocTestForMethod.java | 2 - .../regression/JavadocTestForModule.java | 10 +- .../regression/JavadocTestForRecord.java | 4 +- .../compiler/regression/JavadocTestMixed.java | 2 - .../regression/JavadocTestOptions.java | 2 - .../compiler/regression/JavadocTest_15.java | 2 - .../compiler/regression/JavadocTest_16.java | 4 +- .../compiler/regression/JavadocTest_18.java | 4 +- .../compiler/regression/JavadocTest_1_3.java | 2 - .../compiler/regression/JavadocTest_1_4.java | 2 - .../compiler/regression/JavadocTest_1_5.java | 2 - .../tests/compiler/regression/Jsr14Test.java | 4 +- .../regression/LambdaExpressionsTest.java | 11 +- .../regression/LambdaRegressionTest.java | 3 +- .../regression/LineNumberAttributeTest.java | 2 - .../compiler/regression/LocalEnumTest.java | 4 +- .../compiler/regression/LocalStaticsTest.java | 4 +- .../regression/LocalVariableTest.java | 4 +- .../tests/compiler/regression/LookupTest.java | 4 +- .../regression/ManifestAnalyzerTest.java | 1 - .../regression/MarkdownCommentsTest.java | 101 +- .../compiler/regression/MethodHandleTest.java | 4 +- .../MethodParametersAttributeTest.java | 2 - .../compiler/regression/MethodVerifyTest.java | 2 - .../regression/ModuleAttributeTests.java | 4 +- .../regression/ModuleCompilationTests.java | 4 +- .../regression/ModuleImportTests.java | 14 +- .../regression/MultiReleaseJarTests.java | 4 +- .../NameEnvironmentAnswerListenerTest.java | 1 - .../NegativeLambdaExpressionsTest.java | 5 +- .../NegativeTypeAnnotationTest.java | 4 +- .../regression/NonFatalErrorTest.java | 4 +- .../NullAnnotationBatchCompilerTest.java | 4 +- .../regression/NullAnnotationTest.java | 407 +++-- .../regression/NullAnnotationTests21.java | 116 +- .../regression/NullAnnotationTests9.java | 8 +- .../compiler/regression/NullChecksTests.java | 4 +- .../NullDeclarationAnnotationTest.java | 63 + .../regression/NullReferenceImplTests.java | 14 +- .../NullReferenceImplTransformations.java | 1 - .../regression/NullReferenceTest.java | 7 +- .../regression/NullReferenceTestAsserts.java | 2 - .../regression/NullTypeAnnotationTest.java | 56 +- .../regression/PatternMatching16Test.java | 10 +- .../regression/PreviewFeatureTest.java | 6 +- .../regression/PrimitiveInPatternsTest.java | 18 +- .../regression/PrimitiveInPatternsTestSH.java | 170 ++- .../regression/ProblemConstructorTest.java | 3 +- .../regression/ProblemTypeAndMethodTest.java | 104 +- .../regression/ProgrammingProblemsTest.java | 713 ++++++++- .../regression/PublicScannerTest.java | 4 +- .../regression/RecordPatternProjectTest.java | 4 +- .../regression/RecordPatternTest.java | 137 +- .../RecordsRestrictedClassTest.java | 4 +- .../regression/RegressionTestSetup.java | 2 +- .../regression/RepeatableAnnotationTest.java | 2 - .../tests/compiler/regression/Requestor.java | 1 - .../ResourceLeakAnnotatedTests.java | 61 +- .../regression/ResourceLeakTests.java | 16 +- .../regression/RunComparableTests.java | 4 +- .../compiler/regression/RuntimeTests.java | 3 +- .../compiler/regression/ScannerTest.java | 3 +- .../regression/SealedTypesSpecReviewTest.java | 147 -- .../compiler/regression/SealedTypesTests.java | 688 +++++++-- .../regression/SerialVersionUIDTests.java | 4 +- .../regression/SerializableLambdaTest.java | 4 +- .../regression/StackMapAttributeTest.java | 9 +- .../compiler/regression/StaticImportTest.java | 3 +- .../compiler/regression/StringConcatTest.java | 4 +- .../regression/SuperAfterStatementsTest.java | 187 ++- .../compiler/regression/SuperTypeTest.java | 6 +- .../regression/SuppressWarningsTest.java | 4 +- .../SwitchExpressionsYieldTest.java | 331 +++- .../regression/SwitchPatternTest.java | 954 +++++++++++- ...rnTest21.java => SwitchPatternTest22.java} | 50 +- .../tests/compiler/regression/SwitchTest.java | 13 +- .../tests/compiler/regression/TestAll.java | 12 +- .../compiler/regression/TextBlockTest.java | 4 +- .../regression/TryStatement17Test.java | 3 +- .../compiler/regression/TryStatementTest.java | 4 +- .../TryWithResourcesStatementTest.java | 2 - .../regression/TypeAnnotationTest.java | 4 +- .../regression/UnderscoresInLiteralsTest.java | 4 +- .../compiler/regression/Unicode10Test.java | 2 - .../compiler/regression/Unicode11Test.java | 2 - .../compiler/regression/Unicode12_1Test.java | 2 - .../compiler/regression/Unicode13Test.java | 2 - .../compiler/regression/Unicode18Test.java | 2 - .../compiler/regression/Unicode9Test.java | 2 - .../regression/UnnamedModuleTest.java | 4 +- .../UnnamedPatternsAndVariablesTest.java | 4 +- .../regression/UseOfUnderscoreJava22Test.java | 4 +- .../regression/UseOfUnderscoreTest.java | 3 +- .../tests/compiler/regression/UtilTest.java | 6 +- .../regression/ValueBasedAnnotationTests.java | 3 +- .../compiler/regression/VarargsTest.java | 12 +- .../tests/compiler/regression/XLargeTest.java | 4 +- .../compiler/regression/XLargeTest2.java | 3 +- .../regression/XtextDependencies.java | 1 - .../core/tests/compiler/util/JrtUtilTest.java | 1 - .../tests/dom/StandAloneASTParserTest.java | 65 +- .../jdt/core/tests/eval/CodeSnippetTest.java | 2 - .../core/tests/eval/DebugEvaluationSetup.java | 12 +- .../core/tests/eval/DebugEvaluationTest.java | 5 +- .../eval/EvaluationContextWrapperTest.java | 5 +- .../jdt/core/tests/eval/EvaluationSetup.java | 4 +- .../jdt/core/tests/eval/EvaluationTest.java | 50 +- .../jdt/core/tests/eval/JDIStackFrame.java | 30 +- .../tests/eval/NegativeCodeSnippetTest.java | 2 - .../core/tests/eval/NegativeVariableTest.java | 1 - .../eval/SanityTestEvaluationContext.java | 1 - .../eval/SanityTestEvaluationResult.java | 1 - .../jdt/core/tests/eval/SimpleTest.java | 4 +- .../eclipse/jdt/core/tests/eval/TestAll.java | 4 +- .../jdt/core/tests/eval/VariableTest.java | 1 - .../eval/target/CodeSnippetClassLoader.java | 2 +- .../tests/eval/target/CodeSnippetRunner.java | 12 +- .../core/tests/eval/target/IDEInterface.java | 6 +- .../core/tests/junit/extension/TestCase.java | 10 +- .../tests/junit/extension/TestResult.java | 8 +- .../jdt/core/tests/runtime/J9VMLauncher.java | 1 - .../core/tests/runtime/LocalVMLauncher.java | 9 +- .../tests/runtime/LocalVirtualMachine.java | 5 +- .../tests/runtime/ProxyConsoleReader.java | 5 +- .../tests/runtime/StandardVMLauncher.java | 1 - .../core/tests/runtime/TargetInterface.java | 8 +- .../jdt/core/tests/runtime/VMInputStream.java | 3 +- .../core/tests/util/AbstractCompilerTest.java | 7 +- .../core/tests/util/CompilerTestSetup.java | 4 +- .../jdt/core/tests/util/TestVerifier.java | 25 +- .../org/eclipse/jdt/core/tests/util/Util.java | 22 +- .../.settings/.api_filters | 12 + .../.settings/org.eclipse.jdt.ui.prefs | 202 ++- .../org/eclipse/jdt/core/BuildJarIndex.java | 1 - .../jdt/core/CheckDebugAttributes.java | 1 - .../codeassist/CompletionElementNotifier.java | 28 +- .../internal/codeassist/CompletionEngine.java | 190 +-- .../CompletionUnitStructureRequestor.java | 16 +- .../internal/codeassist/DOMCodeSelector.java | 631 ++++++++ .../InternalCompletionProposal.java | 12 +- .../InternalExtendedCompletionContext.java | 34 +- .../codeassist/MissingTypesGuesser.java | 11 +- .../internal/codeassist/SelectionEngine.java | 70 +- .../codeassist/ThrownExceptionFinder.java | 1 - .../UnresolvedReferenceNameFinder.java | 12 +- .../complete/CompletionJavadoc.java | 18 +- .../complete/CompletionJavadocParser.java | 1 - .../complete/CompletionNodeDetector.java | 8 +- .../complete/CompletionNodeFound.java | 1 - .../CompletionOnClassLiteralAccess.java | 7 +- .../CompletionOnExplicitConstructorCall.java | 6 +- .../complete/CompletionOnFieldType.java | 3 +- .../complete/CompletionOnImportReference.java | 3 +- .../complete/CompletionOnMemberAccess.java | 11 +- .../complete/CompletionOnMessageSend.java | 6 +- .../CompletionOnPackageReference.java | 3 +- ...letionOnQualifiedAllocationExpression.java | 13 +- .../CompletionOnQualifiedNameReference.java | 13 +- .../CompletionOnQualifiedTypeReference.java | 10 +- .../CompletionOnSingleNameReference.java | 10 +- .../CompletionOnSingleTypeReference.java | 10 +- .../codeassist/complete/CompletionParser.java | 96 +- .../complete/CompletionScanner.java | 3 +- .../codeassist/impl/AssistAnnotation.java | 1 - .../impl/AssistCompilationUnit.java | 1 - .../impl/AssistImportContainer.java | 1 - .../impl/AssistImportDeclaration.java | 1 - .../codeassist/impl/AssistInitializer.java | 1 - .../codeassist/impl/AssistOptions.java | 1 - .../impl/AssistPackageDeclaration.java | 1 - .../codeassist/impl/AssistParser.java | 42 +- .../codeassist/impl/AssistSourceField.java | 1 - .../codeassist/impl/AssistSourceMethod.java | 1 - .../codeassist/impl/AssistSourceType.java | 1 - .../codeassist/impl/AssistTypeParameter.java | 1 - .../jdt/internal/codeassist/impl/Engine.java | 21 +- .../codeassist/select/SelectionJavadoc.java | 15 +- .../select/SelectionJavadocParser.java | 6 +- .../codeassist/select/SelectionNodeFound.java | 2 +- .../SelectionOnExplicitConstructorCall.java | 6 +- .../codeassist/select/SelectionParser.java | 65 +- .../dom/org/eclipse/jdt/core/dom/AST.java | 14 +- .../eclipse/jdt/core/dom/ASTConverter.java | 42 +- .../org/eclipse/jdt/core/dom/ASTMatcher.java | 1 - .../dom/org/eclipse/jdt/core/dom/ASTNode.java | 1 - .../org/eclipse/jdt/core/dom/ASTParser.java | 54 +- .../jdt/core/dom/ASTRecoveryPropagator.java | 1 - .../eclipse/jdt/core/dom/ASTRequestor.java | 1 - .../jdt/core/dom/AnnotationBinding.java | 2 +- .../jdt/core/dom/BindingComparator.java | 1 - .../jdt/core/dom/CharacterLiteral.java | 1 - .../eclipse/jdt/core/dom/CompilationUnit.java | 1 - .../jdt/core/dom/CompilationUnitResolver.java | 13 +- .../dom/CompilationUnitResolverDiscovery.java | 1 - .../jdt/core/dom/DefaultBindingResolver.java | 54 +- .../jdt/core/dom/DocCommentParser.java | 1 - .../jdt/core/dom/EitherOrMultiPattern.java | 1 - .../eclipse/jdt/core/dom/GuardedPattern.java | 1 - .../jdt/core/dom/ImportDeclaration.java | 1 - .../jdt/core/dom/InternalASTRewrite.java | 11 +- .../eclipse/jdt/core/dom/JavaDocRegion.java | 1 - .../jdt/core/dom/JavaDocTextElement.java | 1 - .../dom/org/eclipse/jdt/core/dom/Javadoc.java | 1 - .../eclipse/jdt/core/dom/MethodBinding.java | 3 + .../jdt/core/dom/MethodDeclaration.java | 1 - .../org/eclipse/jdt/core/dom/Modifier.java | 14 +- .../eclipse/jdt/core/dom/NumberLiteral.java | 1 - .../eclipse/jdt/core/dom/PackageBinding.java | 2 - .../eclipse/jdt/core/dom/RecordPattern.java | 1 - .../jdt/core/dom/RecoveredTypeBinding.java | 1 - .../org/eclipse/jdt/core/dom/SimpleName.java | 1 - .../org/eclipse/jdt/core/dom/SimpleType.java | 1 - .../eclipse/jdt/core/dom/StringLiteral.java | 1 - .../org/eclipse/jdt/core/dom/TagElement.java | 1 - .../org/eclipse/jdt/core/dom/TagProperty.java | 1 - .../org/eclipse/jdt/core/dom/TextBlock.java | 1 - .../org/eclipse/jdt/core/dom/TextElement.java | 1 - .../eclipse/jdt/core/dom/TryStatement.java | 2 +- .../org/eclipse/jdt/core/dom/TypeBinding.java | 17 +- .../eclipse/jdt/core/dom/TypeDeclaration.java | 1 - .../org/eclipse/jdt/core/dom/TypePattern.java | 1 - .../jdt/core/dom/rewrite/ASTRewrite.java | 3 +- .../jdt/core/dom/rewrite/ImportRewrite.java | 36 +- .../jdt/core/dom/rewrite/ListRewrite.java | 1 - .../core/dom/ICompilationUnitResolver.java | 1 - .../internal/core/dom/NaiveASTFlattener.java | 20 +- .../core/dom/SourceRangeVerifier.java | 1 - .../core/dom/rewrite/ASTRewriteAnalyzer.java | 26 +- .../core/dom/rewrite/ASTRewriteFlattener.java | 12 +- .../core/dom/rewrite/ASTRewriteFormatter.java | 1 - .../dom/rewrite/LineCommentEndOffsets.java | 1 - .../core/dom/rewrite/ListRewriteEvent.java | 1 - .../core/dom/rewrite/NodeInfoStore.java | 2 - .../core/dom/rewrite/RewriteEventStore.java | 1 - .../core/dom/rewrite/SourceModifier.java | 1 - .../core/dom/rewrite/TrackedNodePosition.java | 5 +- .../rewrite/imports/ConflictIdentifier.java | 1 - .../imports/ConflictingSimpleNameFinder.java | 3 +- .../dom/rewrite/imports/ImportEditor.java | 1 - .../imports/ImportGroupComparator.java | 11 +- .../imports/ImportRewriteAnalyzer.java | 14 +- .../imports/ImportRewriteConfiguration.java | 1 - .../imports/OrderPreservingImportAdder.java | 11 +- .../rewrite/imports/OriginalImportEntry.java | 1 - .../imports/PackageImportComparator.java | 1 - .../StaticConflictingSimpleNameFinder.java | 5 +- .../TypeConflictingSimpleNameFinder.java | 13 +- .../eval/CodeSnippetAllocationExpression.java | 11 +- .../internal/eval/CodeSnippetEvaluator.java | 4 +- .../internal/eval/CodeSnippetMessageSend.java | 12 +- .../CodeSnippetQualifiedNameReference.java | 14 +- .../jdt/internal/eval/CodeSnippetScope.java | 18 +- .../eval/CodeSnippetSingleNameReference.java | 17 +- .../internal/eval/CodeSnippetSkeleton.java | 2 +- .../internal/eval/CodeSnippetToCuMapper.java | 4 +- .../jdt/internal/eval/EvaluationContext.java | 5 +- .../eclipse/jdt/internal/eval/Evaluator.java | 4 +- .../jdt/internal/eval/VariablesEvaluator.java | 4 +- .../jdt/core/formatter/CodeFormatter.java | 3 +- .../formatter/CodeFormatterApplication.java | 1 - .../DefaultCodeFormatterConstants.java | 1 - .../core/formatter/IndentManipulation.java | 2 - .../formatter/DefaultCodeFormatter.java | 1 - .../DefaultCodeFormatterOptions.java | 1 - .../formatter/LineBreaksPreparator.java | 61 +- .../internal/formatter/OneLineEnforcer.java | 30 +- .../internal/formatter/SpacePreparator.java | 83 +- .../internal/formatter/TextEditsBuilder.java | 3 +- .../eclipse/jdt/internal/formatter/Token.java | 1 - .../jdt/internal/formatter/TokenManager.java | 10 +- .../internal/formatter/linewrap/Aligner.java | 14 +- .../linewrap/CommentWrapExecutor.java | 5 +- .../formatter/linewrap/WrapPreparator.java | 95 +- .../internal/formatter/old/CodeFormatter.java | 1 - .../core/ClasspathContainerInitializer.java | 6 +- .../eclipse/jdt/core/CorrectionEngine.java | 10 +- .../eclipse/jdt/core/ICompilationUnit.java | 3 +- .../org/eclipse/jdt/core/IJavaProject.java | 4 +- .../model/org/eclipse/jdt/core/IType.java | 11 +- .../org/eclipse/jdt/core/ITypeHierarchy.java | 1 - .../org/eclipse/jdt/core/JavaConventions.java | 7 +- .../model/org/eclipse/jdt/core/JavaCore.java | 76 +- .../eclipse/jdt/core/JavaModelException.java | 2 - .../eclipse/jdt/core/NamingConventions.java | 1 - .../model/org/eclipse/jdt/core/Signature.java | 1 - .../org/eclipse/jdt/core/ToolFactory.java | 15 +- .../jdt/core/compiler/BuildContext.java | 1 - .../core/compiler/CompilationParticipant.java | 1 - .../jdt/core/compiler/ReconcileContext.java | 1 - .../jdt/core/eval/IEvaluationContext.java | 5 +- .../org/eclipse/jdt/core/jdom/DOMFactory.java | 3 +- .../org/eclipse/jdt/core/jdom/IDOMNode.java | 1 - .../jdt/core/util/CompilationUnitSorter.java | 1 - .../jdt/core/util/ExternalAnnotationUtil.java | 1 - .../core/util/IAttributeNamesConstants.java | 2 +- .../compiler/CompilerConfiguration.java | 1 - .../compiler/DocumentElementParser.java | 15 +- .../compiler/ISourceElementRequestor.java | 1 - .../compiler/SourceElementNotifier.java | 85 +- .../compiler/SourceElementParser.java | 96 +- .../compiler/parser/SourceTypeConverter.java | 5 +- .../compiler/parser/TypeConverter.java | 13 +- .../jdt/internal/core/AbstractClassFile.java | 1 - .../jdt/internal/core/AbstractModule.java | 1 - .../internal/core/BasicCompilationUnit.java | 1 - .../core/BecomeWorkingCopyOperation.java | 5 +- .../jdt/internal/core/BinaryMember.java | 1 - .../jdt/internal/core/BinaryMethod.java | 16 +- .../jdt/internal/core/BinaryModule.java | 1 - .../eclipse/jdt/internal/core/BinaryType.java | 28 +- .../internal/core/BinaryTypeConverter.java | 13 +- .../org/eclipse/jdt/internal/core/Buffer.java | 8 +- .../jdt/internal/core/BufferCache.java | 1 - .../jdt/internal/core/BufferManager.java | 1 - .../eclipse/jdt/internal/core/ClassFile.java | 21 +- .../jdt/internal/core/ClassFileInfo.java | 1 - .../core/ClasspathAttributeDelta.java | 1 - .../jdt/internal/core/ClasspathChange.java | 1 - .../jdt/internal/core/ClasspathEntry.java | 13 +- .../core/CommitWorkingCopyOperation.java | 1 - .../jdt/internal/core/CompilationUnit.java | 72 +- .../core/CompilationUnitElementInfo.java | 1 - .../core/CompilationUnitProblemFinder.java | 18 +- .../CompilationUnitStructureRequestor.java | 14 +- .../internal/core/CopyElementsOperation.java | 1 - .../CopyPackageFragmentRootOperation.java | 16 +- .../core/CopyResourceElementsOperation.java | 1 - .../core/CreateCompilationUnitOperation.java | 18 +- .../internal/core/CreateFieldOperation.java | 1 - .../internal/core/CreateImportOperation.java | 13 +- .../internal/core/CreateMethodOperation.java | 1 - .../CreatePackageDeclarationOperation.java | 11 +- .../core/CreatePackageFragmentOperation.java | 1 - .../core/CreateTypeHierarchyOperation.java | 2 +- .../core/CreateTypeMemberOperation.java | 1 - .../internal/core/DOMToModelPopulator.java | 83 ++ .../core/DeleteElementsOperation.java | 1 - .../DeletePackageFragmentRootOperation.java | 15 +- .../core/DeleteResourceElementsOperation.java | 5 +- .../internal/core/DeltaProcessingState.java | 13 +- .../jdt/internal/core/DeltaProcessor.java | 35 +- .../core/DynamicProjectReferences.java | 1 - .../core/ExternalAnnotationTracker.java | 1 - .../internal/core/ExternalFolderChange.java | 1 - .../internal/core/ExternalFoldersManager.java | 1 - .../core/ExternalPackageFragmentRoot.java | 1 - .../jdt/internal/core/ImportContainer.java | 8 +- .../jdt/internal/core/ImportDeclaration.java | 5 +- .../jdt/internal/core/Initializer.java | 4 +- .../core/InternalNamingConventions.java | 1 - .../jdt/internal/core/JarEntryDirectory.java | 1 - .../jdt/internal/core/JarEntryFile.java | 1 - .../jdt/internal/core/JarEntryResource.java | 1 - .../jdt/internal/core/JarPackageFragment.java | 1 - .../internal/core/JarPackageFragmentRoot.java | 1 - .../core/JavaCorePreferenceInitializer.java | 1 - .../jdt/internal/core/JavaElement.java | 18 +- .../jdt/internal/core/JavaElementDelta.java | 1 - .../core/JavaElementDeltaBuilder.java | 1 - .../internal/core/JavaElementRequestor.java | 1 - .../eclipse/jdt/internal/core/JavaModel.java | 10 +- .../jdt/internal/core/JavaModelCache.java | 1 - .../jdt/internal/core/JavaModelManager.java | 92 +- .../jdt/internal/core/JavaModelOperation.java | 18 +- .../jdt/internal/core/JavaProject.java | 44 +- .../internal/core/JavaProjectElementInfo.java | 1 - .../jdt/internal/core/JavadocContents.java | 5 +- .../internal/core/JrtPackageFragmentRoot.java | 1 - .../jdt/internal/core/LocalVariable.java | 12 +- .../org/eclipse/jdt/internal/core/Member.java | 19 +- .../jdt/internal/core/ModelUpdater.java | 7 +- .../jdt/internal/core/ModularClassFile.java | 3 +- .../internal/core/ModuleDescriptionInfo.java | 1 - .../internal/core/ModulePathContainer.java | 1 - .../core/ModuleSourcePathManager.java | 1 - .../jdt/internal/core/ModuleUpdater.java | 1 - .../MovePackageFragmentRootOperation.java | 16 +- .../jdt/internal/core/MultiOperation.java | 11 +- .../eclipse/jdt/internal/core/NameLookup.java | 28 +- .../jdt/internal/core/NamedMember.java | 15 +- .../jdt/internal/core/NonJavaResource.java | 1 - .../eclipse/jdt/internal/core/Openable.java | 4 +- .../internal/core/OpenableElementInfo.java | 1 - .../internal/core/OverflowingLRUCache.java | 1 - .../jdt/internal/core/PackageDeclaration.java | 5 +- .../jdt/internal/core/PackageFragment.java | 15 +- .../internal/core/PackageFragmentRoot.java | 12 +- .../core/PackageFragmentRootInfo.java | 10 +- .../core/ReconcileWorkingCopyOperation.java | 10 +- .../org/eclipse/jdt/internal/core/Region.java | 1 - .../internal/core/SearchableEnvironment.java | 5 +- .../core/SearchableEnvironmentRequestor.java | 2 +- .../jdt/internal/core/SelectionRequestor.java | 26 +- .../internal/core/SetVariablesOperation.java | 1 - .../internal/core/SortElementsOperation.java | 12 +- .../jdt/internal/core/SourceField.java | 7 +- .../jdt/internal/core/SourceMapper.java | 19 +- .../jdt/internal/core/SourceMethod.java | 11 +- .../core/SourceMethodElementInfo.java | 5 +- .../jdt/internal/core/SourceModule.java | 1 - .../jdt/internal/core/SourceRefElement.java | 1 - .../eclipse/jdt/internal/core/SourceType.java | 4 +- .../internal/core/SourceTypeElementInfo.java | 6 +- .../jdt/internal/core/UserLibrary.java | 1 - .../jdt/internal/core/UserLibraryManager.java | 1 - .../internal/core/VerboseElementCache.java | 1 - .../eclipse/jdt/internal/core/XMLWriter.java | 1 - .../core/builder/AbstractImageBuilder.java | 58 +- .../core/builder/BatchImageBuilder.java | 40 +- .../internal/core/builder/BuildNotifier.java | 8 +- .../core/builder/ClasspathDirectory.java | 1 - .../internal/core/builder/ClasspathJMod.java | 1 - .../internal/core/builder/ClasspathJar.java | 1 - .../internal/core/builder/ClasspathJrt.java | 3 +- .../ClasspathJrtWithReleaseOption.java | 1 - .../core/builder/ClasspathLocation.java | 7 +- .../core/builder/ClasspathMultiDirectory.java | 3 +- .../builder/ClasspathMultiReleaseJar.java | 1 - .../builder/CompilationParticipantResult.java | 5 +- .../ImageBuilderInternalException.java | 2 +- .../core/builder/IncrementalImageBuilder.java | 43 +- .../internal/core/builder/JavaBuilder.java | 46 +- .../core/builder/ModuleEntryProcessor.java | 1 - .../core/builder/ModuleInfoBuilder.java | 1 - .../core/builder/ModulePathEntry.java | 1 - .../core/builder/NameEnvironment.java | 50 +- .../internal/core/builder/ProblemFactory.java | 3 +- .../core/builder/ReferenceCollection.java | 1 - .../jdt/internal/core/builder/SourceFile.java | 3 +- .../jdt/internal/core/builder/State.java | 1 - .../core/eval/EvaluationContextWrapper.java | 11 +- .../internal/core/eval/RequestorWrapper.java | 1 - .../internal/core/hierarchy/BindingMap.java | 1 - .../core/hierarchy/ChangeCollector.java | 13 +- .../core/hierarchy/HierarchyBinaryType.java | 2 +- .../core/hierarchy/HierarchyBuilder.java | 1 - .../core/hierarchy/HierarchyResolver.java | 15 +- .../hierarchy/IndexBasedHierarchyBuilder.java | 1 - .../RegionBasedHierarchyBuilder.java | 1 - .../hierarchy/RegionBasedTypeHierarchy.java | 10 +- .../core/hierarchy/TypeHierarchy.java | 20 +- .../core/jdom/AbstractDOMBuilder.java | 5 +- .../jdt/internal/core/jdom/DOMBuilder.java | 11 +- .../core/jdom/DOMCompilationUnit.java | 4 +- .../jdt/internal/core/jdom/DOMField.java | 8 +- .../jdt/internal/core/jdom/DOMImport.java | 5 +- .../internal/core/jdom/DOMInitializer.java | 5 +- .../jdt/internal/core/jdom/DOMMember.java | 2 +- .../jdt/internal/core/jdom/DOMMethod.java | 5 +- .../jdt/internal/core/jdom/DOMNode.java | 8 +- .../jdt/internal/core/jdom/DOMPackage.java | 5 +- .../jdt/internal/core/jdom/DOMType.java | 5 +- .../core/jdom/SiblingEnumeration.java | 3 +- .../internal/core/jdom/SimpleDOMBuilder.java | 4 +- .../jdt/internal/core/util/ASTNodeFinder.java | 12 +- .../core/util/BindingKeyResolver.java | 37 +- .../internal/core/util/ClassFileReader.java | 15 +- .../jdt/internal/core/util/CodeAttribute.java | 13 +- .../core/util/CodeSnippetParsingUtil.java | 1 - .../core/util/CommentRecorderParser.java | 7 +- .../jdt/internal/core/util/ComponentInfo.java | 2 +- .../jdt/internal/core/util/DOMFinder.java | 26 +- .../internal/core/util/DeduplicationUtil.java | 1 - .../core/util/DefaultBytecodeVisitor.java | 11 +- .../jdt/internal/core/util/Disassembler.java | 9 +- .../jdt/internal/core/util/HandleFactory.java | 27 +- .../internal/core/util/JavaElementFinder.java | 16 +- .../internal/core/util/KeyToSignature.java | 1 - .../jdt/internal/core/util/LRUCache.java | 1 - .../jdt/internal/core/util/Messages.java | 1 - .../jdt/internal/core/util/MethodInfo.java | 12 +- .../jdt/internal/core/util/ModuleUtil.java | 1 - .../util/PermittedSubclassesAttribute.java | 10 +- .../core/util/ResourceCompilationUnit.java | 1 - .../internal/core/util/StackMapAttribute.java | 2 +- .../eclipse/jdt/internal/core/util/Util.java | 45 +- .../core/util/WeakHashSetOfCharArray.java | 1 - .../eclipse/jdt/core/index/JavaIndexer.java | 1 - .../core/index/JavaIndexerApplication.java | 1 - .../jdt/core/search/IJavaSearchConstants.java | 4 +- .../search/IJavaSearchResultCollector.java | 1 - .../jdt/core/search/ReferenceMatch.java | 7 +- .../eclipse/jdt/core/search/SearchEngine.java | 17 +- .../jdt/core/search/SearchParticipant.java | 5 +- .../jdt/core/search/SearchPattern.java | 30 +- .../jdt/core/search/TypeNameMatch.java | 6 +- .../jdt/core/search/TypeReferenceMatch.java | 5 +- .../jdt/internal/core/index/DiskIndex.java | 18 +- .../core/index/FileIndexLocation.java | 1 - .../jdt/internal/core/index/Index.java | 7 +- .../internal/core/index/IndexLocation.java | 1 - .../internal/core/index/JarIndexLocation.java | 1 - .../jdt/internal/core/index/MemoryIndex.java | 4 +- .../jdt/internal/core/index/MetaIndex.java | 1 - .../nd/java/model/BinaryModuleFactory.java | 1 - .../core/nd/java/model/BinaryTypeFactory.java | 1 - .../core/search/BasicSearchEngine.java | 45 +- .../internal/core/search/HierarchyScope.java | 11 +- .../internal/core/search/IndexSelector.java | 12 +- .../core/search/JavaSearchDocument.java | 2 +- .../core/search/JavaSearchParticipant.java | 13 +- .../internal/core/search/JavaSearchScope.java | 12 +- .../core/search/JavaSearchTypeNameMatch.java | 5 +- .../core/search/JavaWorkspaceScope.java | 1 - .../internal/core/search/PathCollector.java | 1 - .../core/search/PatternSearchJob.java | 1 - .../core/search/SubTypeSearchJob.java | 1 - .../core/search/UnindexedSearchScope.java | 1 - .../search/indexing/AddJarFileToIndex.java | 1 - .../core/search/indexing/AddJrtToIndex.java | 1 - .../core/search/indexing/BinaryIndexer.java | 1 - .../search/indexing/DOMToIndexVisitor.java | 345 +++++ .../search/indexing/DefaultJavaIndexer.java | 1 - .../core/search/indexing/IndexAllProject.java | 1 - .../search/indexing/IndexBinaryFolder.java | 1 - .../core/search/indexing/IndexManager.java | 15 +- .../search/indexing/IndexNamesRegistry.java | 1 - .../core/search/indexing/QualifierQuery.java | 1 - .../indexing/RemoveFolderFromIndex.java | 1 - .../core/search/indexing/RemoveFromIndex.java | 1 - .../core/search/indexing/SaveIndex.java | 1 - .../core/search/indexing/SourceIndexer.java | 68 + .../indexing/SourceIndexerRequestor.java | 1 - .../core/search/matching/AndLocator.java | 18 +- .../core/search/matching/AndPattern.java | 1 - .../matching/ClassFileMatchLocator.java | 25 +- .../matching/ClasspathSourceDirectory.java | 3 +- .../search/matching/ConstructorPattern.java | 1 - .../core/search/matching/FieldLocator.java | 7 +- .../core/search/matching/FieldPattern.java | 1 - .../search/matching/IntersectingPattern.java | 8 +- .../matching/JavaSearchNameEnvironment.java | 1 - .../search/matching/LocalVariableLocator.java | 8 +- .../search/matching/LocalVariablePattern.java | 8 +- .../core/search/matching/MatchLocator.java | 96 +- .../search/matching/MatchLocatorParser.java | 17 +- .../core/search/matching/MatchingNodeSet.java | 3 +- .../core/search/matching/MethodLocator.java | 15 +- .../core/search/matching/MethodPattern.java | 10 +- .../core/search/matching/ModulePattern.java | 1 - .../matching/MultiTypeDeclarationPattern.java | 4 +- .../core/search/matching/OrLocator.java | 18 +- .../core/search/matching/OrPattern.java | 6 +- .../matching/PackageDeclarationPattern.java | 3 +- .../matching/PackageReferenceLocator.java | 13 +- .../core/search/matching/PatternLocator.java | 11 +- .../core/search/matching/PossibleMatch.java | 15 +- .../search/matching/PossibleMatchSet.java | 1 - .../QualifiedTypeDeclarationPattern.java | 2 +- .../SecondaryTypeDeclarationPattern.java | 1 - .../matching/SuperTypeNamesCollector.java | 35 +- .../matching/SuperTypeReferenceLocator.java | 12 +- .../matching/SuperTypeReferencePattern.java | 8 +- .../matching/TypeDeclarationLocator.java | 7 +- .../matching/TypeDeclarationPattern.java | 4 +- .../search/matching/TypeParameterLocator.java | 5 +- .../search/matching/TypeReferenceLocator.java | 13 +- .../core/search/matching/VariableLocator.java | 9 +- .../core/search/processing/JobManager.java | 1 - pom.xml | 2 +- 1043 files changed, 12727 insertions(+), 8530 deletions(-) delete mode 100644 jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/lib/javax20api.jar create mode 100644 jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/lib/javax23api.jar rename jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/{SubRoutineStatement.java => StatementWithFinallyBlock.java} (59%) rename jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/{InsideSubRoutineFlowContext.java => InsideStatementWithFinallyBlockFlowContext.java} (75%) create mode 100644 jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/TextBlockUtil.java create mode 100644 jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/lib/org.eclipse.jdt.annotation_1.2.100.v20241001-0914.jar create mode 100644 jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest_22.java rename jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/{parser => regression}/ImplicitlyDeclaredClassesTest.java (92%) create mode 100644 jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JEP441SnippetsTest.java create mode 100644 jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullDeclarationAnnotationTest.java delete mode 100644 jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SealedTypesSpecReviewTest.java rename jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/{SwitchPatternTest21.java => SwitchPatternTest22.java} (95%) create mode 100644 jdt-patch/e434/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/DOMCodeSelector.java create mode 100644 jdt-patch/e434/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DOMToModelPopulator.java create mode 100644 jdt-patch/e434/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/DOMToIndexVisitor.java diff --git a/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/SealedTests.java b/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/SealedTests.java index e79346bb6d..88ff1d2557 100644 --- a/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/SealedTests.java +++ b/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/SealedTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2009-2021 the original author or authors. + * Copyright 2009-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -121,19 +121,23 @@ public void testSealed2() { "1. ERROR in Foo.groovy (at line 1)\n" + "\t@groovy.transform.Sealed(permittedSubclasses=[Bar,Baz])\n" + "\t ^^^\n" + - "Permitted class Bar does not declare Foo as direct super class\n" + + (javaModelSealedSupport2() + ? "Permitted type Bar does not declare Foo as a direct supertype\n" + : "Permitted class Bar does not declare Foo as direct super class\n") + "----------\n" + "----------\n" + "1. ERROR in Baz.groovy (at line 1)\n" + "\tclass Baz extends Foo {\n" + "\t ^^^\n" + - "The class Baz with a sealed direct superclass or a sealed direct superinterface Foo should be declared either final, sealed, or non-sealed\n" + + "The class Baz with a sealed direct super" + (javaModelSealedSupport2() ? "type" : "class or a sealed direct superinterface") + + " Foo should be declared either final, sealed, or non-sealed\n" + "----------\n" + "----------\n" + "1. ERROR in Boo.groovy (at line 1)\n" + "\tclass Boo extends Foo {\n" + "\t ^^^\n" + - "The class Boo with a sealed direct superclass or a sealed direct superinterface Foo should be declared either final, sealed, or non-sealed\n" + + "The class Boo with a sealed direct super" + (javaModelSealedSupport2() ? "type" : "class or a sealed direct superinterface") + + " Foo should be declared either final, sealed, or non-sealed\n" + "----------\n" + "2. ERROR in Boo.groovy (at line 1)\n" + "\tclass Boo extends Foo {\n" + @@ -143,7 +147,9 @@ public void testSealed2() { "3. ERROR in Boo.groovy (at line 1)\n" + "\tclass Boo extends Foo {\n" + "\t ^^^\n" + - "The type Boo extending a sealed class Foo should be a permitted subtype of Foo\n" + + (javaModelSealedSupport2() + ? "The class Boo cannot extend the class Foo as it is not a permitted subtype of Foo\n" + : "The type Boo extending a sealed class Foo should be a permitted subtype of Foo\n") + "----------\n"); } @@ -176,7 +182,8 @@ public void testSealed3() { "1. ERROR in p\\Baz.java (at line 2)\n" + "\tclass Baz extends Foo {\n" + "\t ^^^\n" + - "The class Baz with a sealed direct superclass or a sealed direct superinterface Foo should be declared either final, sealed, or non-sealed\n" + + "The class Baz with a sealed direct super" + (javaModelSealedSupport2() ? "type" : "class or a sealed direct superinterface") + + " Foo should be declared either final, sealed, or non-sealed\n" + "----------\n"); } @@ -187,4 +194,9 @@ private static boolean javaModelSealedSupport() { return org.eclipse.jdt.core.JavaCore.getPlugin().getBundle().getVersion() .compareTo(org.osgi.framework.Version.parseVersion("3.28")) >= 0; } + + private static boolean javaModelSealedSupport2() { + return org.eclipse.jdt.core.JavaCore.getPlugin().getBundle().getVersion() + .compareTo(org.osgi.framework.Version.parseVersion("3.40")) >= 0; + } } diff --git a/groovy-eclipse.setup b/groovy-eclipse.setup index 3c38bad7ce..181ab00797 100644 --- a/groovy-eclipse.setup +++ b/groovy-eclipse.setup @@ -311,7 +311,7 @@ + url="https://download.eclipse.org/eclipse/updates/4.34-I-builds/I20241107-0510"/> diff --git a/jdt-patch/e434/Feature-org.codehaus.groovy.jdt.patch/feature.xml b/jdt-patch/e434/Feature-org.codehaus.groovy.jdt.patch/feature.xml index cc6d15d990..6e87fb5bdd 100644 --- a/jdt-patch/e434/Feature-org.codehaus.groovy.jdt.patch/feature.xml +++ b/jdt-patch/e434/Feature-org.codehaus.groovy.jdt.patch/feature.xml @@ -18,7 +18,7 @@ - + A;#-~er(q+k^h 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 literal 0 HcmV?d00001 diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/JDTCompilerAdapter.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/JDTCompilerAdapter.java index a25db9858e..3337ff127c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/JDTCompilerAdapter.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/JDTCompilerAdapter.java @@ -25,14 +25,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Javac; import org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter; import org.apache.tools.ant.types.Commandline; -import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Commandline.Argument; +import org.apache.tools.ant.types.Path; import org.apache.tools.ant.util.JavaEnvUtils; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.antadapter.AntAdapterMessages; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/CharOperation.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/CharOperation.java index 2f08682850..5933dbd195 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/CharOperation.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/CharOperation.java @@ -18,7 +18,6 @@ import java.util.Arrays; import java.util.List; - import org.eclipse.jdt.internal.compiler.parser.ScannerHelper; /** diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/IProblem.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/IProblem.java index 84ed1618b9..42d2fd9d5d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/IProblem.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/IProblem.java @@ -790,6 +790,11 @@ public interface IProblem { /** @since 3.1 */ int DiscouragedReference = TypeRelated + 280; + /** + * @since 3.40 + */ + int LambdaParameterIsNeverUsed = Internal + 281; + int InterfaceCannotHaveInitializers = TypeRelated + 300; int DuplicateModifierForType = TypeRelated + 301; int IllegalModifierForClass = TypeRelated + 302; @@ -2226,6 +2231,8 @@ public interface IProblem { int PreviewAPIUsed = Compliance + 1108; /** @since 3.39*/ int JavaVersionNotSupported = Compliance + 1109; + /** @since 3.40*/ + int JavaVersionTooRecent = Compliance + 1110; /** @since 3.13 */ int UnlikelyCollectionMethodArgumentType = 1200; @@ -2310,41 +2317,63 @@ public interface IProblem { /* Java14 errors - begin */ /** @since 3.21 */ int SwitchExpressionsYieldIncompatibleResultExpressionTypes = TypeRelated + 1700; - /** @since 3.21 */ + /** @since 3.21 + * @deprecated no longer issued - will be removed + */ int SwitchExpressionsYieldEmptySwitchBlock = Syntax + 1701; /** @since 3.21 */ int SwitchExpressionsYieldNoResultExpression = Internal + 1702; /** @since 3.21 */ int SwitchExpressionaYieldSwitchLabeledBlockCompletesNormally = Internal + 1703; - /** @since 3.21 */ + /** @since 3.21 + * @deprecated no longer issued - will be removed + */ int SwitchExpressionsYieldLastStatementCompletesNormally = Internal + 1704; - /** @since 3.21 */ + /** @since 3.21 + * @deprecated no longer issued - will be removed + */ int SwitchExpressionsYieldTrailingSwitchLabels = Internal + 1705; /** @since 3.21 */ int SwitchPreviewMixedCase = Syntax + 1706; /** @since 3.21 */ int SwitchExpressionsYieldMissingDefaultCase = Syntax + 1707; - /** @since 3.21 */ + /** @since 3.21 + * @deprecated no longer issued - will be removed + */ int SwitchExpressionsYieldMissingValue = Syntax + 1708; /** @since 3.21 */ int SwitchExpressionsYieldMissingEnumConstantCase = Syntax + 1709; - /** @since 3.21 */ + /** @since 3.21 + * @deprecated no longer issued - will be removed + */ int SwitchExpressionsYieldIllegalLastStatement = Internal + 1710; - /** @since 3.21 */ + /** @since 3.21 + * @deprecated no longer issued - will be removed + */ int SwitchExpressionsYieldBreakNotAllowed = Syntax + 1711; - /** @since 3.21 */ + /** @since 3.21 + * @deprecated no longer issued - will be removed + */ int SwitchExpressionsYieldUnqualifiedMethodWarning = Syntax + 1712; /** @since 3.21 */ int SwitchExpressionsYieldUnqualifiedMethodError = Syntax + 1713; /** @since 3.21 */ int SwitchExpressionsYieldOutsideSwitchExpression = Syntax + 1714; - /** @since 3.21 */ + /** @since 3.21 + * @deprecated no longer issued - will be removed + */ int SwitchExpressionsYieldRestrictedGeneralWarning = Internal + 1715; - /** @since 3.21 */ + /** @since 3.21 + * @deprecated no longer issued - will be removed + */ int SwitchExpressionsYieldIllegalStatement = Internal + 1716; - /** @since 3.21 */ + /** @since 3.21 + * @deprecated no longer issued - will be removed + */ int SwitchExpressionsYieldTypeDeclarationWarning = Internal + 1717; - /** @since 3.21 */ + /** @since 3.21 + * @deprecated no longer issued - will be removed + */ int SwitchExpressionsYieldTypeDeclarationError = Internal + 1718; /** @since 3.22 */ int MultiConstantCaseLabelsNotSupported = Syntax + 1719; @@ -2531,7 +2560,9 @@ public interface IProblem { int SealedPermittedTypeOutsideOfPackage = TypeRelated + 1859; /** @since 3.28 */ int SealedSealedTypeMissingPermits = TypeRelated + 1860; - /** @since 3.28 */ + /** @since 3.28 + * @deprecated problem no longer generated + */ int SealedInterfaceIsSealedAndNonSealed = TypeRelated + 1861; /** @since 3.28 */ int SealedDisAllowedNonSealedModifierInInterface = TypeRelated + 1862; @@ -2541,11 +2572,19 @@ public interface IProblem { int SealedLocalDirectSuperTypeSealed = TypeRelated + 1864; /** @since 3.28 */ int SealedAnonymousClassCannotExtendSealedType = TypeRelated + 1865; - /** @since 3.28 */ + /** @since 3.28 + * @deprecated problem no longer generated + */ int SealedSuperTypeInDifferentPackage = TypeRelated + 1866; - /** @since 3.28 */ + /** @since 3.28 + * @deprecated problem no longer generated + */ int SealedSuperTypeDisallowed = TypeRelated + 1867; - /* Java15 errors - end */ + /** + * @since 3.40 + */ + int FunctionalInterfaceMayNotbeSealed = TypeRelated + 1868; + /* Java17 Sealed types errors - end */ /** * @since 3.28 diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/SubwordMatcher.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/SubwordMatcher.java index 9886aefd5c..bdcd9b880e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/SubwordMatcher.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/SubwordMatcher.java @@ -15,7 +15,6 @@ import java.util.Arrays; import java.util.BitSet; - import org.eclipse.jdt.internal.compiler.parser.ScannerHelper; class SubwordMatcher { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/batch/BatchCompiler.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/batch/BatchCompiler.java index 7e4ca11bf2..7662c71977 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/batch/BatchCompiler.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/batch/BatchCompiler.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.core.compiler.batch; import java.io.PrintWriter; - import org.eclipse.jdt.core.compiler.CompilationProgress; import org.eclipse.jdt.internal.compiler.batch.Main; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/AbstractAnnotationProcessorManager.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/AbstractAnnotationProcessorManager.java index 5eecab8743..3b32665b7f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/AbstractAnnotationProcessorManager.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/AbstractAnnotationProcessorManager.java @@ -15,7 +15,6 @@ package org.eclipse.jdt.internal.compiler; import java.io.PrintWriter; - import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ClassFile.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ClassFile.java index d587bbbbb0..354576a4d4 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ClassFile.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ClassFile.java @@ -44,86 +44,20 @@ import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Collectors; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.IProblem; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Annotation; -import org.eclipse.jdt.internal.compiler.ast.AnnotationMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Argument; -import org.eclipse.jdt.internal.compiler.ast.ArrayInitializer; -import org.eclipse.jdt.internal.compiler.ast.CaseStatement; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.ast.CaseStatement.ResolvedCase; -import org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess; -import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ExportsStatement; -import org.eclipse.jdt.internal.compiler.ast.Expression; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.FunctionalExpression; -import org.eclipse.jdt.internal.compiler.ast.LambdaExpression; -import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration; -import org.eclipse.jdt.internal.compiler.ast.MemberValuePair; -import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ModuleDeclaration; -import org.eclipse.jdt.internal.compiler.ast.NormalAnnotation; -import org.eclipse.jdt.internal.compiler.ast.NullLiteral; -import org.eclipse.jdt.internal.compiler.ast.OpensStatement; -import org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference; -import org.eclipse.jdt.internal.compiler.ast.Receiver; -import org.eclipse.jdt.internal.compiler.ast.RecordComponent; -import org.eclipse.jdt.internal.compiler.ast.ReferenceExpression; -import org.eclipse.jdt.internal.compiler.ast.RequiresStatement; -import org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation; -import org.eclipse.jdt.internal.compiler.ast.SingleNameReference; -import org.eclipse.jdt.internal.compiler.ast.StringLiteral; -import org.eclipse.jdt.internal.compiler.ast.SwitchStatement; import org.eclipse.jdt.internal.compiler.ast.SwitchStatement.SingletonBootstrap; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; -import org.eclipse.jdt.internal.compiler.ast.TypeParameter; -import org.eclipse.jdt.internal.compiler.ast.TypeReference; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.AnnotationContext; -import org.eclipse.jdt.internal.compiler.codegen.AnnotationTargetTypeConstants; -import org.eclipse.jdt.internal.compiler.codegen.AttributeNamesConstants; -import org.eclipse.jdt.internal.compiler.codegen.CodeStream; -import org.eclipse.jdt.internal.compiler.codegen.ConstantPool; -import org.eclipse.jdt.internal.compiler.codegen.ExceptionLabel; -import org.eclipse.jdt.internal.compiler.codegen.Opcodes; -import org.eclipse.jdt.internal.compiler.codegen.OperandStack; -import org.eclipse.jdt.internal.compiler.codegen.StackMapFrame; -import org.eclipse.jdt.internal.compiler.codegen.StackMapFrameCodeStream; +import org.eclipse.jdt.internal.compiler.codegen.*; import org.eclipse.jdt.internal.compiler.codegen.StackMapFrameCodeStream.ExceptionMarker; -import org.eclipse.jdt.internal.compiler.codegen.TypeAnnotationCodeStream; -import org.eclipse.jdt.internal.compiler.codegen.VerificationTypeInfo; import org.eclipse.jdt.internal.compiler.impl.BooleanConstant; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.StringConstant; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; -import org.eclipse.jdt.internal.compiler.lookup.PolymorphicMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.SyntheticArgumentBinding; -import org.eclipse.jdt.internal.compiler.lookup.SyntheticMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.problem.AbortMethod; import org.eclipse.jdt.internal.compiler.problem.AbortType; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; @@ -451,8 +385,7 @@ else if (this.referenceBinding.isAnnotationType()) attributesNumber += generateBootstrapMethods(this.bootstrapMethods); } if (this.targetJDK >= ClassFileConstants.JDK17) { - // add record attributes - attributesNumber += generatePermittedTypeAttributes(); + attributesNumber += generatePermittedSubclassesAttribute(); } // Inner class attribute int numberOfInnerClasses = this.innerClassesBindings == null ? 0 : this.innerClassesBindings.size(); @@ -2918,10 +2851,9 @@ private int generateNestAttributes() { nAttrs += generateNestHostAttribute(); return nAttrs; } - private int generatePermittedTypeAttributes() { - SourceTypeBinding type = this.referenceBinding; + private int generatePermittedSubclassesAttribute() { int localContentsOffset = this.contentsOffset; - ReferenceBinding[] permittedTypes = type.permittedTypes(); + ReferenceBinding[] permittedTypes = this.referenceBinding.permittedTypes(); int l = permittedTypes != null ? permittedTypes.length : 0; if (l == 0) return 0; @@ -2930,6 +2862,14 @@ private int generatePermittedTypeAttributes() { if (exSize + localContentsOffset >= this.contents.length) { resizeContents(exSize); } + /* + * PermittedSubclasses_attribute { + u2 attribute_name_index; + u4 attribute_length; + u2 number_of_classes; + u2 classes[number_of_classes]; + } + */ int attributeNameIndex = this.constantPool.literalIndex(AttributeNamesConstants.PermittedSubclasses); this.contents[localContentsOffset++] = (byte) (attributeNameIndex >> 8); @@ -5902,7 +5842,6 @@ private int generateTypeAnnotationAttributeForTypeDeclaration() { superInterface.getAllAnnotationContexts(AnnotationTargetTypeConstants.CLASS_EXTENDS, i, allTypeAnnotationContexts); } } - // TODO: permittedTypes codegen TypeParameter[] typeParameters = typeDeclaration.typeParameters; if (typeParameters != null) { for (int i = 0, max = typeParameters.length; i < max; i++) { @@ -6104,7 +6043,7 @@ public void initialize(SourceTypeBinding aType, ClassFile parentClassFile, boole if (aType.isAnonymousType()) { ReferenceBinding superClass = aType.superclass; if (superClass == null || !(superClass.isEnum() && superClass.isSealed())) - accessFlags &= ~ClassFileConstants.AccFinal; + accessFlags &= ~ClassFileConstants.AccFinal; } int finalAbstract = ClassFileConstants.AccFinal | ClassFileConstants.AccAbstract; if ((accessFlags & finalAbstract) == finalAbstract) { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/CompilationResult.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/CompilationResult.java index 7060b2caa8..c51186f66d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/CompilationResult.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/CompilationResult.java @@ -15,6 +15,20 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler; +import java.lang.ref.SoftReference; +import java.util.*; +import org.eclipse.jdt.core.compiler.CategorizedProblem; +import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.core.compiler.IProblem; +import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; +import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; +import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; +import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; +import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; +import org.eclipse.jdt.internal.compiler.parser.RecoveryScannerData; +import org.eclipse.jdt.internal.compiler.util.Util; + /** * A compilation result consists of all information returned by the compiler for * a single compiled compilation source unit. This includes: @@ -35,29 +49,6 @@ * specific fields and methods which were referenced, but does contain their * declaring types and any other types used to locate such fields or methods. */ -import java.util.Arrays; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.eclipse.jdt.core.compiler.CategorizedProblem; -import org.eclipse.jdt.core.compiler.CharOperation; -import org.eclipse.jdt.core.compiler.IProblem; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; -import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.parser.RecoveryScannerData; -import org.eclipse.jdt.internal.compiler.util.Util; - @SuppressWarnings({ "rawtypes", "unchecked" }) public class CompilationResult { @@ -88,6 +79,8 @@ public class CompilationResult { private boolean hasMandatoryErrors; public List annotations = new ArrayList<>(1); private List scheduledProblems; + private volatile boolean cacheSource; + private volatile SoftReference contentRef; private static final int[] EMPTY_LINE_ENDS = Util.EMPTY_INT_ARRAY; private static final Comparator PROBLEM_COMPARATOR = new Comparator() { @@ -495,4 +488,29 @@ public void materializeProblems() { } } } + +public void cacheSource() { + this.cacheSource = true; +} + +public char[] getContents() { + SoftReference cr = this.contentRef; + if (cr != null) { + char[] cachedContents = cr.get(); + if (cachedContents != null) { + return cachedContents; + } + } + return this.compilationUnit.getContents(); +} + +public void cacheContents(char[] contents) { + if (this.cacheSource) { + this.contentRef = new SoftReference<>(contents); + } +} + +public void releaseContent() { + this.contentRef = null; +} } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/Compiler.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/Compiler.java index 8dc0999814..b1498db4c8 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/Compiler.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/Compiler.java @@ -17,18 +17,40 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler; -import org.eclipse.jdt.core.compiler.*; -import org.eclipse.jdt.internal.compiler.env.*; -import org.eclipse.jdt.internal.compiler.impl.*; -import org.eclipse.jdt.internal.compiler.ast.*; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import org.eclipse.jdt.core.compiler.CategorizedProblem; +import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.core.compiler.CompilationProgress; +import org.eclipse.jdt.core.compiler.IProblem; +import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; +import org.eclipse.jdt.internal.compiler.ast.ImportReference; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.lookup.*; -import org.eclipse.jdt.internal.compiler.parser.*; -import org.eclipse.jdt.internal.compiler.problem.*; -import org.eclipse.jdt.internal.compiler.util.*; - -import java.io.*; -import java.util.*; +import org.eclipse.jdt.internal.compiler.env.AccessRestriction; +import org.eclipse.jdt.internal.compiler.env.IBinaryType; +import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; +import org.eclipse.jdt.internal.compiler.env.INameEnvironment; +import org.eclipse.jdt.internal.compiler.env.ISourceType; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; +import org.eclipse.jdt.internal.compiler.impl.CompilerStats; +import org.eclipse.jdt.internal.compiler.impl.ITypeRequestor; +import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; +import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; +import org.eclipse.jdt.internal.compiler.lookup.PackageBinding; +import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; +import org.eclipse.jdt.internal.compiler.lookup.SourceTypeCollisionException; +import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; +import org.eclipse.jdt.internal.compiler.parser.Parser; +import org.eclipse.jdt.internal.compiler.problem.AbortCompilation; +import org.eclipse.jdt.internal.compiler.problem.AbortCompilationUnit; +import org.eclipse.jdt.internal.compiler.problem.DefaultProblem; +import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; +import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; +import org.eclipse.jdt.internal.compiler.util.Messages; +import org.eclipse.jdt.internal.compiler.util.Util; public class Compiler implements ITypeRequestor, ProblemSeverities { public Parser parser; @@ -891,6 +913,7 @@ protected void internalBeginToCompile(ICompilationUnit[] sourceUnits, int maxUni if (this.totalUnits < this.parseThreshold) { parsedUnit = this.parser.parse(sourceUnits[i], unitResult); } else { + unitResult.cacheSource(); parsedUnit = this.parser.dietParse(sourceUnits[i], unitResult); } long resolveStart = System.currentTimeMillis(); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/IProblemFactory.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/IProblemFactory.java index a6bb739626..21980dfb75 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/IProblemFactory.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/IProblemFactory.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.internal.compiler; import java.util.Locale; - import org.eclipse.jdt.core.compiler.CategorizedProblem; /* diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ProcessTaskManager.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ProcessTaskManager.java index 1bdb321340..7cccf43a2b 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ProcessTaskManager.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ProcessTaskManager.java @@ -23,7 +23,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; - import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.problem.AbortCompilation; import org.eclipse.jdt.internal.compiler.util.Messages; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ReadManager.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ReadManager.java index 9f602093b5..522b71d575 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ReadManager.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ReadManager.java @@ -24,7 +24,6 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; - import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; /** Reads a list of ICompilationUnit before actually needed (ahead) **/ diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/AnnotationDiscoveryVisitor.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/AnnotationDiscoveryVisitor.java index 8998514d48..aa9b59ddce 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/AnnotationDiscoveryVisitor.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/AnnotationDiscoveryVisitor.java @@ -15,36 +15,13 @@ import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; - import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.apt.model.ElementImpl; import org.eclipse.jdt.internal.compiler.apt.model.Factory; import org.eclipse.jdt.internal.compiler.apt.util.ManyToMany; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Annotation; -import org.eclipse.jdt.internal.compiler.ast.Argument; -import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ModuleDeclaration; -import org.eclipse.jdt.internal.compiler.ast.RecordComponent; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; -import org.eclipse.jdt.internal.compiler.ast.TypeParameter; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.AptSourceLocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; -import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; -import org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; /** * This class is used to visit the JDT compiler internal AST to discover annotations, diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseAnnotationProcessorManager.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseAnnotationProcessorManager.java index e16725f5d1..a7f3899534 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseAnnotationProcessorManager.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseAnnotationProcessorManager.java @@ -18,7 +18,6 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; - import org.eclipse.jdt.internal.compiler.AbstractAnnotationProcessorManager; import org.eclipse.jdt.internal.compiler.Compiler; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseMessagerImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseMessagerImpl.java index 6c28ab2c90..a83b42619d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseMessagerImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseMessagerImpl.java @@ -18,7 +18,6 @@ import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; import javax.tools.Diagnostic.Kind; - import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.apt.model.AnnotationMemberValue; import org.eclipse.jdt.internal.compiler.apt.model.AnnotationMirrorImpl; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseProcessingEnvImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseProcessingEnvImpl.java index 135fb7aede..74c45f22b2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseProcessingEnvImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseProcessingEnvImpl.java @@ -18,7 +18,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; - import javax.annotation.processing.Filer; import javax.annotation.processing.Messager; import javax.annotation.processing.ProcessingEnvironment; @@ -26,7 +25,6 @@ import javax.lang.model.util.Elements; import javax.lang.model.util.Types; import javax.tools.JavaFileManager; - import org.eclipse.jdt.internal.compiler.Compiler; import org.eclipse.jdt.internal.compiler.apt.model.ElementsImpl; import org.eclipse.jdt.internal.compiler.apt.model.Factory; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchAnnotationProcessorManager.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchAnnotationProcessorManager.java index e5e904fe8e..658bf17d70 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchAnnotationProcessorManager.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchAnnotationProcessorManager.java @@ -22,13 +22,11 @@ import java.util.List; import java.util.ServiceConfigurationError; import java.util.ServiceLoader; - import javax.annotation.processing.Processor; import javax.lang.model.SourceVersion; import javax.tools.JavaFileManager; import javax.tools.StandardJavaFileManager; import javax.tools.StandardLocation; - import org.eclipse.jdt.internal.compiler.batch.Main; import org.eclipse.jdt.internal.compiler.problem.AbortCompilation; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchFilerImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchFilerImpl.java index 66c9a55ca8..ad4924a85b 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchFilerImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchFilerImpl.java @@ -20,17 +20,15 @@ import java.io.IOException; import java.net.URI; import java.util.HashSet; - import javax.annotation.processing.Filer; import javax.annotation.processing.FilerException; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.tools.FileObject; import javax.tools.JavaFileManager; +import javax.tools.JavaFileManager.Location; import javax.tools.JavaFileObject; import javax.tools.StandardLocation; -import javax.tools.JavaFileManager.Location; - import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchMessagerImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchMessagerImpl.java index 1f0e9b2773..e0756fc393 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchMessagerImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchMessagerImpl.java @@ -20,7 +20,6 @@ import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; import javax.tools.Diagnostic.Kind; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.internal.compiler.batch.Main; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchProcessingEnvImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchProcessingEnvImpl.java index 0643446403..df97cb6e40 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchProcessingEnvImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BatchProcessingEnvImpl.java @@ -23,9 +23,7 @@ import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; - import javax.tools.JavaFileManager; - import org.eclipse.jdt.internal.compiler.apt.util.EclipseFileManager; import org.eclipse.jdt.internal.compiler.batch.Main; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/HookedJavaFileObject.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/HookedJavaFileObject.java index 7776c12a89..d55d8d39cd 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/HookedJavaFileObject.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/HookedJavaFileObject.java @@ -18,10 +18,8 @@ import java.io.IOException; import java.io.OutputStream; import java.io.Writer; - import javax.tools.ForwardingJavaFileObject; import javax.tools.JavaFileObject; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.batch.CompilationUnit; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/IProcessorProvider.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/IProcessorProvider.java index ae4e7dc751..ccb6a6c3a3 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/IProcessorProvider.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/IProcessorProvider.java @@ -16,7 +16,6 @@ package org.eclipse.jdt.internal.compiler.apt.dispatch; import java.util.List; - import javax.annotation.processing.Processor; /** diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/ProcessorInfo.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/ProcessorInfo.java index 9248929bbd..283cde88b5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/ProcessorInfo.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/ProcessorInfo.java @@ -19,7 +19,6 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; - import javax.annotation.processing.Processor; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/RoundDispatcher.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/RoundDispatcher.java index 15131a4832..0cac394a67 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/RoundDispatcher.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/RoundDispatcher.java @@ -20,7 +20,6 @@ import java.util.Iterator; import java.util.List; import java.util.Set; - import javax.annotation.processing.RoundEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/RoundEnvImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/RoundEnvImpl.java index be99d72313..56140636b1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/RoundEnvImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/RoundEnvImpl.java @@ -19,13 +19,11 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; - import javax.annotation.processing.RoundEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.TypeElement; import javax.lang.model.util.ElementFilter; - import org.eclipse.jdt.internal.compiler.apt.model.Factory; import org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl; import org.eclipse.jdt.internal.compiler.apt.util.ManyToMany; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/AnnotationMirrorImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/AnnotationMirrorImpl.java index 61bf96dfe4..d89b67c383 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/AnnotationMirrorImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/AnnotationMirrorImpl.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; - import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.ExecutableElement; @@ -34,7 +33,6 @@ import javax.lang.model.type.MirroredTypeException; import javax.lang.model.type.MirroredTypesException; import javax.lang.model.type.TypeMirror; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/AnnotationValueImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/AnnotationValueImpl.java index 60d382e1f7..70309383eb 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/AnnotationValueImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/AnnotationValueImpl.java @@ -18,13 +18,11 @@ import java.util.Collection; import java.util.Collections; import java.util.List; - import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.AnnotationValueVisitor; import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeMirror; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.DoubleConstant; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ArrayTypeImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ArrayTypeImpl.java index 378c71662f..ba3668030c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ArrayTypeImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ArrayTypeImpl.java @@ -20,7 +20,6 @@ import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeVisitor; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/DeclaredTypeImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/DeclaredTypeImpl.java index f1ece38140..78ecf1d8a6 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/DeclaredTypeImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/DeclaredTypeImpl.java @@ -18,14 +18,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeVisitor; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementImpl.java index b258002ef8..48050396d2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementImpl.java @@ -18,7 +18,6 @@ import java.util.Collections; import java.util.List; import java.util.Set; - import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; @@ -26,7 +25,6 @@ import javax.lang.model.element.Name; import javax.lang.model.element.PackageElement; import javax.lang.model.type.TypeMirror; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; import org.eclipse.jdt.internal.compiler.lookup.Binding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementsImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementsImpl.java index 20b5173ccc..cf9e91cd18 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementsImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementsImpl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2023 BEA Systems, Inc. and others + * Copyright (c) 2006, 2024 BEA Systems, Inc. and others * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -29,7 +29,6 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; - import javax.lang.model.SourceVersion; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; @@ -41,7 +40,6 @@ import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; @@ -49,19 +47,7 @@ import org.eclipse.jdt.internal.compiler.ast.Javadoc; import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodVerifier; -import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; -import org.eclipse.jdt.internal.compiler.lookup.PackageBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; +import org.eclipse.jdt.internal.compiler.lookup.*; /** * Utilities for working with java8 and earlier language elements. @@ -72,7 +58,7 @@ public class ElementsImpl implements Elements { // Used for parsing Javadoc comments: matches initial delimiter, followed by whitespace - private static final Pattern INITIAL_DELIMITER = Pattern.compile("^\\s*/\\*+"); //$NON-NLS-1$ + protected static final Pattern INITIAL_DELIMITER = Pattern.compile("^\\s*/\\*+"); //$NON-NLS-1$ protected final BaseProcessingEnvImpl _env; @@ -342,7 +328,7 @@ public String getDocComment(Element e) { * @param e an Element of any sort, possibly with a javadoc comment. * @return a String, or null if the comment is not available */ - private char[] getUnparsedDocComment(Element e) + protected char[] getUnparsedDocComment(Element e) { Javadoc javadoc = null; ReferenceContext referenceContext = null; @@ -402,7 +388,8 @@ private char[] getUnparsedDocComment(Element e) if (javadoc != null && referenceContext != null) { char[] contents = referenceContext.compilationResult().getCompilationUnit().getContents(); if (contents != null) { - return CharOperation.subarray(contents, javadoc.sourceStart, javadoc.sourceEnd - 1); + // In case of markdown, the end of line is part of the source range + return CharOperation.subarray(contents, javadoc.sourceStart, javadoc.isMarkdown ? javadoc.sourceEnd : javadoc.sourceEnd - 1); } } return null; @@ -415,7 +402,7 @@ private char[] getUnparsedDocComment(Element e) * Javac's behavior with regard to tab expansion and trimming of whitespace and * asterisks is bizarre and undocumented. We do our best here to emulate it. */ - private static String formatJavadoc(char[] unparsed) + protected static String formatJavadoc(char[] unparsed) { if (unparsed == null || unparsed.length < 5) { // delimiters take 5 chars return null; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementsImpl9.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementsImpl9.java index ed97430a69..82481c5a46 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementsImpl9.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ElementsImpl9.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2023 BEA Systems, Inc. and others + * Copyright (c) 2006, 2024 BEA Systems, Inc. and others * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -21,7 +21,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Set; - +import java.util.regex.Matcher; import javax.lang.model.AnnotatedConstruct; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; @@ -32,27 +32,16 @@ import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.JavaFileObject.Kind; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; -import org.eclipse.jdt.internal.compiler.lookup.BinaryModuleBinding; -import org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; -import org.eclipse.jdt.internal.compiler.lookup.PackageBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.SourceModuleBinding; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; +import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.parser.ScannerHelper; import org.eclipse.jdt.internal.compiler.tool.EclipseFileManager; import org.eclipse.jdt.internal.compiler.tool.PathFileObject; import org.eclipse.jdt.internal.compiler.util.HashtableOfModule; +import org.eclipse.jdt.internal.compiler.util.TextBlockUtil; /** * Utilities for working with java9 language elements. @@ -304,4 +293,61 @@ public boolean isCompactConstructor(ExecutableElement e) { MethodBinding methodBinding = (MethodBinding) ((ExecutableElementImpl) e)._binding; return methodBinding.isCompactConstructor(); } + // Must pass a non-null, non-empty char[] + private boolean isTraditionalJavadoc(char[] unparsed) { + String[] allLines = new String(unparsed).split("\n"); //$NON-NLS-1$ + Matcher delimiterMatcher = INITIAL_DELIMITER.matcher(allLines[0]); + return delimiterMatcher.find(); + } + @Override + public String getDocComment(Element e) { + char[] unparsed = getUnparsedDocComment(e); + if (unparsed == null) + return null; + if (isTraditionalJavadoc(unparsed)) { + // There will be some duplication of sanity checks between + // isTraditionalJavadoc() and formatJavadoc() + // but will have to live with that. + return super.formatJavadoc(unparsed); + } + // 1. Get the unparsed document content and convert it to individual lines + // 2. Remove the /// from each line + // 3. Common whitespace after /// in each line is removed + // 4. The lines are put together with \n as delimiter and returned + char[][] lines = TextBlockUtil.convertTextBlockToLines(unparsed); + char[][] contentLines = new char[lines.length][]; + for (int i = 0; i < lines.length; i++) { + char[] cs = lines[i]; + int slashes = 0; + int startIdx = 0; + line: for (char c : cs) { + startIdx++; + switch(c) { + case '/': + slashes++; + if (slashes > 2) + break line; + break; + default: + if (!ScannerHelper.isWhitespace(c) || slashes == 3) { + break line; + } + break; + } + } + char[] cs2 = new char[cs.length - startIdx]; + contentLines[i] = cs2; + System.arraycopy(cs, startIdx, cs2, 0, cs2.length); + } + int textBlockIndent = TextBlockUtil.getWhitespacePrefix(contentLines); + char[] formatTextBlock = TextBlockUtil.formatTextBlock(contentLines, textBlockIndent); + return new String(formatTextBlock); + } + @Override + public DocCommentKind getDocCommentKind(Element e) { + char[] unparsed = getUnparsedDocComment(e); + if (unparsed == null) + return null; + return isTraditionalJavadoc(unparsed) ? DocCommentKind.TRADITIONAL : DocCommentKind.END_OF_LINE; + } } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ErrorTypeElement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ErrorTypeElement.java index a9667e1537..bff6f8b2c9 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ErrorTypeElement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ErrorTypeElement.java @@ -19,7 +19,6 @@ import java.util.Collections; import java.util.List; import java.util.Set; - import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; @@ -29,7 +28,6 @@ import javax.lang.model.element.TypeParameterElement; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ErrorTypeImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ErrorTypeImpl.java index cb4ab934e6..50eebab205 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ErrorTypeImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ErrorTypeImpl.java @@ -18,14 +18,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.type.ErrorType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeVisitor; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ExecutableElementImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ExecutableElementImpl.java index b597dfb2b3..8ff0a6dd4b 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ExecutableElementImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ExecutableElementImpl.java @@ -18,34 +18,13 @@ import java.util.Collections; import java.util.List; import java.util.Set; - -import javax.lang.model.element.AnnotationValue; -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.ElementVisitor; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.Name; -import javax.lang.model.element.PackageElement; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.TypeParameterElement; -import javax.lang.model.element.VariableElement; +import javax.lang.model.element.*; import javax.lang.model.type.TypeMirror; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.Argument; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationHolder; -import org.eclipse.jdt.internal.compiler.lookup.AptBinaryLocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodVerifier; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; public class ExecutableElementImpl extends ElementImpl implements ExecutableElement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ExecutableTypeImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ExecutableTypeImpl.java index 4beec43887..5958b19672 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ExecutableTypeImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ExecutableTypeImpl.java @@ -17,13 +17,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - import javax.lang.model.type.ExecutableType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeVariable; import javax.lang.model.type.TypeVisitor; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/Factory.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/Factory.java index 6be4076b79..e99a32406c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/Factory.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/Factory.java @@ -25,7 +25,6 @@ import java.util.EnumSet; import java.util.List; import java.util.Set; - import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; @@ -37,28 +36,10 @@ import javax.lang.model.type.NullType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; -import org.eclipse.jdt.internal.compiler.lookup.PackageBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.WildcardBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; /** * Creates javax.lang.model wrappers around JDT internal compiler bindings. @@ -208,14 +189,14 @@ private static void decodeModifiers(Set result, int modifiers, int[] c try { appendModifier(result, modifiers, checkBit, Modifier.valueOf("NON_SEALED")); //$NON-NLS-1$ } catch(IllegalArgumentException iae) { - // Don't have JDK 15, just ignore and proceed. + // Don't have JDK 17, just ignore and proceed. } break; case ExtraCompilerModifiers.AccSealed : try { appendModifier(result, modifiers, checkBit, Modifier.valueOf("SEALED")); //$NON-NLS-1$ } catch(IllegalArgumentException iae) { - // Don't have JDK 15, just ignore and proceed. + // Don't have JDK 17, just ignore and proceed. } break; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/IntersectionTypeImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/IntersectionTypeImpl.java index 3874f7d4b3..60f0370edc 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/IntersectionTypeImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/IntersectionTypeImpl.java @@ -14,15 +14,14 @@ package org.eclipse.jdt.internal.compiler.apt.model; -import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; - +import java.util.Arrays; +import java.util.List; import javax.lang.model.type.IntersectionType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeVisitor; -import java.util.Arrays; -import java.util.List; +import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; +import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; /** * Implementation of the WildcardType diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ModuleElementImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ModuleElementImpl.java index e78f05658f..bb367ba4c1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ModuleElementImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/ModuleElementImpl.java @@ -14,13 +14,12 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.apt.model; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; - import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ElementVisitor; @@ -29,7 +28,6 @@ import javax.lang.model.element.Name; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/NoTypeImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/NoTypeImpl.java index 22294ba7da..35904d9ac5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/NoTypeImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/NoTypeImpl.java @@ -18,13 +18,11 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Array; import java.util.List; - import javax.lang.model.element.AnnotationMirror; import javax.lang.model.type.NoType; import javax.lang.model.type.NullType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeVisitor; - import org.eclipse.jdt.internal.compiler.lookup.Binding; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/PackageElementImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/PackageElementImpl.java index 47f5985e1f..20b1060cd6 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/PackageElementImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/PackageElementImpl.java @@ -20,13 +20,11 @@ import java.util.HashSet; import java.util.List; import java.util.Set; - import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ElementVisitor; import javax.lang.model.element.Name; import javax.lang.model.element.PackageElement; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.batch.FileSystem; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/PrimitiveTypeImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/PrimitiveTypeImpl.java index 4de98969d2..4e8415a44e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/PrimitiveTypeImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/PrimitiveTypeImpl.java @@ -18,7 +18,6 @@ import javax.lang.model.type.PrimitiveType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeVisitor; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/RecordComponentElementImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/RecordComponentElementImpl.java index a86c4df2f3..a1a3618984 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/RecordComponentElementImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/RecordComponentElementImpl.java @@ -18,7 +18,6 @@ import javax.lang.model.element.ElementVisitor; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.RecordComponentElement; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; import org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeElementImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeElementImpl.java index 4212db5f3f..c9faaebb85 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeElementImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeElementImpl.java @@ -19,23 +19,10 @@ import java.util.IdentityHashMap; import java.util.List; import java.util.Set; - import javax.lang.model.SourceVersion; -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.ElementVisitor; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.Name; -import javax.lang.model.element.NestingKind; -import javax.lang.model.element.PackageElement; -import javax.lang.model.element.RecordComponentElement; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.TypeParameterElement; -import javax.lang.model.element.VariableElement; +import javax.lang.model.element.*; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeMirrorImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeMirrorImpl.java index 9dffc2dd1d..14e9aafe35 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeMirrorImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeMirrorImpl.java @@ -18,12 +18,10 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Array; import java.util.List; - import javax.lang.model.element.AnnotationMirror; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeVisitor; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; import org.eclipse.jdt.internal.compiler.lookup.Binding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeParameterElementImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeParameterElementImpl.java index a6502f35b6..069b7c8bcc 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeParameterElementImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeParameterElementImpl.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; @@ -30,7 +29,6 @@ import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeParameterElement; import javax.lang.model.type.TypeMirror; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeVariableImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeVariableImpl.java index b4f293f2b4..41bad40403 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeVariableImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypeVariableImpl.java @@ -19,7 +19,6 @@ import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeVariable; import javax.lang.model.type.TypeVisitor; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypesImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypesImpl.java index 40c26f8774..1209a6c2b8 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypesImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/TypesImpl.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.type.ArrayType; @@ -32,20 +31,10 @@ import javax.lang.model.type.TypeMirror; import javax.lang.model.type.WildcardType; import javax.lang.model.util.Types; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.ast.Wildcard; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; /** * Utilities for working with types (as opposed to elements). diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/VariableElementImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/VariableElementImpl.java index 826b204a06..8e83eb9cf0 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/VariableElementImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/VariableElementImpl.java @@ -19,7 +19,6 @@ import java.util.List; import java.util.Objects; import java.util.Set; - import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ElementVisitor; @@ -27,7 +26,6 @@ import javax.lang.model.element.Name; import javax.lang.model.element.PackageElement; import javax.lang.model.element.VariableElement; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/WildcardTypeImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/WildcardTypeImpl.java index 31a74593e7..50ac17d625 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/WildcardTypeImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/model/WildcardTypeImpl.java @@ -18,7 +18,6 @@ import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeVisitor; import javax.lang.model.type.WildcardType; - import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl; import org.eclipse.jdt.internal.compiler.ast.Wildcard; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.java index 4f04e202ef..bf4c0dce1a 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.java @@ -19,10 +19,15 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.lookup.Binding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; /** dedicated treatment for the {@code &&} */ public class AND_AND_Expression extends BinaryExpression { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ASTNode.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ASTNode.java index 88d9f9c877..80050df0af 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ASTNode.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ASTNode.java @@ -53,42 +53,14 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationPosition; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.env.AccessRestriction; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18; -import org.eclipse.jdt.internal.compiler.lookup.InvocationSite; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; -import org.eclipse.jdt.internal.compiler.lookup.PackageBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.WildcardBinding; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; +import org.eclipse.jdt.internal.compiler.impl.StringConstant; +import org.eclipse.jdt.internal.compiler.lookup.*; @SuppressWarnings({"rawtypes", "unchecked"}) public abstract class ASTNode implements TypeConstants, TypeIds { @@ -110,7 +82,7 @@ public abstract class ASTNode implements TypeConstants, TypeIds { public final static int Bit12 = 0x800; // depth (name ref, msg) | operator (operator) | has abstract methods (type decl) public final static int Bit13 = 0x1000; // depth (name ref, msg) | operator (operator) | is secondary type (type decl) public final static int Bit14 = 0x2000; // strictly assigned (reference lhs) | discard enclosing instance (explicit constr call) | hasBeenGenerated (type decl) - public final static int Bit15 = 0x4000; // is unnecessary cast (expression) | is varargs (type ref) | isSubRoutineEscaping (try statement) | superAccess (javadoc allocation expression/javadoc message send/javadoc return statement) + public final static int Bit15 = 0x4000; // is unnecessary cast (expression) | is varargs (type ref) | IsFinallyBlockEscaping (try statement) | superAccess (javadoc allocation expression/javadoc message send/javadoc return statement) public final static int Bit16 = 0x8000; // in javadoc comment (name ref, type ref, msg) public final static int Bit17 = 0x10000; // compound assigned (reference lhs) | unchecked (msg, alloc, explicit constr call) public final static int Bit18 = 0x20000; // non null (expression) | onDemand (import reference) @@ -125,7 +97,7 @@ public abstract class ASTNode implements TypeConstants, TypeIds { public final static int Bit27 = 0x4000000; // parenthesis count (expression) public final static int Bit28 = 0x8000000; // parenthesis count (expression) public final static int Bit29 = 0x10000000; // parenthesis count (expression) - public final static int Bit30 = 0x20000000; // elseif (if statement) | try block exit (try statement) | fall-through (case statement) | ignore no effect assign (expression ref) | needScope (for statement) | isAnySubRoutineEscaping (return statement) | blockExit (synchronized statement) + public final static int Bit30 = 0x20000000; // elseif (if statement) | try block exit (try statement) | fall-through (case statement) | ignore no effect assign (expression ref) | needScope (for statement) | IsAnyFinallyBlockEscaping (return|yield statement) | blockExit (synchronized statement) public final static int Bit31 = 0x40000000; // local declaration reachable (local decl) | ignore raw type check (type ref) | discard entire assignment (assignment) | isSynchronized (return statement) | thenExit (if statement) public final static int Bit32 = 0x80000000; // reachable (statement) @@ -214,7 +186,7 @@ public abstract class ASTNode implements TypeConstants, TypeIds { // try statements - public static final int IsSubRoutineEscaping = Bit15; + public static final int IsFinallyBlockEscaping = Bit15; public static final int IsTryBlockExiting = Bit30; // for type declaration @@ -307,8 +279,8 @@ public abstract class ASTNode implements TypeConstants, TypeIds { // for parameterized qualified/single type ref public static final int DidResolve = Bit19; - // for return statement - public static final int IsAnySubRoutineEscaping = Bit30; + // for return & yield statements + public static final int IsAnyFinallyBlockEscaping = Bit30; public static final int IsSynchronized = Bit31; // for synchronized statement @@ -528,6 +500,8 @@ public final boolean isFieldUseDeprecated(FieldBinding field, Scope scope, int f // inside same unit - no report if (scope.isDefinedInSameUnit(field.declaringClass)) return false; + if (sinceValueUnreached(field, scope)) return false; + // if context is deprecated, may avoid reporting if (!scope.compilerOptions().reportDeprecationInsideDeprecatedCode && scope.isInsideDeprecatedCode()) return false; return true; @@ -578,6 +552,8 @@ public final boolean isMethodUseDeprecated(MethodBinding method, Scope scope, // inside same unit - no report if (scope.isDefinedInSameUnit(method.declaringClass)) return false; + if (sinceValueUnreached(method, scope)) return false; + // non explicit use and non explicitly deprecated - no report if (!isExplicitUse && (method.modifiers & ClassFileConstants.AccDeprecated) == 0) { @@ -589,6 +565,37 @@ public final boolean isMethodUseDeprecated(MethodBinding method, Scope scope, return true; } + private boolean sinceValueUnreached(Binding binding, Scope scope) { + if (binding instanceof TypeBinding typeBinding) { + if (!typeBinding.isReadyForAnnotations()) { + return false; + } + } + AnnotationBinding[] annotations = binding.getAnnotations(); + for (AnnotationBinding annotation : annotations) { + if (annotation != null && annotation.getAnnotationType().id == TypeIds.T_JavaLangDeprecated) { + ElementValuePair[] pairs = annotation.getElementValuePairs(); + for (ElementValuePair pair : pairs) { + if (CharOperation.equals(pair.getName(), TypeConstants.SINCE)) { + if (pair.getValue() instanceof StringConstant strConstant) { + try { + String value = strConstant.stringValue(); + long sinceLevel = CompilerOptions.versionToJdkLevel(value); + long complianceLevel = scope.compilerOptions().complianceLevel; + if (complianceLevel < sinceLevel) { + return true; + } + } catch (NumberFormatException e) { + // do nothing and fall through + } + } + } + } + } + } + return false; + } + public boolean isSuper() { return false; @@ -649,6 +656,8 @@ public final boolean isTypeUseDeprecated(TypeBinding type, Scope scope) { // inside same unit - no report if (scope.isDefinedInSameUnit(refType)) return false; + if (sinceValueUnreached(refType, scope)) return false; + // if context is deprecated, may avoid reporting if (!scope.compilerOptions().reportDeprecationInsideDeprecatedCode && scope.isInsideDeprecatedCode()) return false; return true; @@ -1066,7 +1075,7 @@ public static void resolveAnnotations(BlockScope scope, Annotation[] sourceAnnot return annotations; } - /** Resolve JSR308 annotations on a type reference, array creation expression or a wildcard. Type parameters go directly to the subroutine, + /** Resolve JSR308 annotations on a type reference, array creation expression or a wildcard. Type parameters go directly to the method/ctor, By construction the bindings associated with QTR, PQTR etc get resolved first and then annotations for different levels get resolved and applied at one go. Likewise for multidimensional arrays. diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.java index 7b0c1df01b..1105d22466 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.java @@ -30,25 +30,33 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; -import java.util.List; - import static org.eclipse.jdt.internal.compiler.lookup.MethodBinding.PARAM_NONNULL; +import static org.eclipse.jdt.internal.compiler.lookup.MethodBinding.PARAM_NOTOWNING; import static org.eclipse.jdt.internal.compiler.lookup.MethodBinding.PARAM_NULLABLE; import static org.eclipse.jdt.internal.compiler.lookup.MethodBinding.PARAM_NULLITY; import static org.eclipse.jdt.internal.compiler.lookup.MethodBinding.PARAM_OWNING; -import static org.eclipse.jdt.internal.compiler.lookup.MethodBinding.PARAM_NOTOWNING; -import org.eclipse.jdt.core.compiler.*; -import org.eclipse.jdt.internal.compiler.*; +import java.util.List; +import org.eclipse.jdt.core.compiler.CategorizedProblem; +import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.core.compiler.IProblem; +import org.eclipse.jdt.internal.compiler.ASTVisitor; +import org.eclipse.jdt.internal.compiler.ClassFile; +import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationPosition; +import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; -import org.eclipse.jdt.internal.compiler.impl.*; -import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; +import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; import org.eclipse.jdt.internal.compiler.lookup.*; -import org.eclipse.jdt.internal.compiler.problem.*; -import org.eclipse.jdt.internal.compiler.parser.*; +import org.eclipse.jdt.internal.compiler.parser.Parser; +import org.eclipse.jdt.internal.compiler.problem.AbortCompilation; +import org.eclipse.jdt.internal.compiler.problem.AbortCompilationUnit; +import org.eclipse.jdt.internal.compiler.problem.AbortMethod; +import org.eclipse.jdt.internal.compiler.problem.AbortType; +import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; +import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; import org.eclipse.jdt.internal.compiler.util.Util; @SuppressWarnings({"rawtypes"}) diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java index db201eadc1..f711cbc358 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java @@ -54,15 +54,18 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; -import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.*; +import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.ASSIGNMENT_CONTEXT; +import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.INVOCATION_CONTEXT; +import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.VANILLA_CONTEXT; import java.util.HashMap; - import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.codegen.Opcodes; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.JavaFeature; @@ -543,7 +546,13 @@ public TypeBinding resolveType(BlockScope scope) { protected void checkEarlyConstructionContext(BlockScope scope) { if (JavaFeature.FLEXIBLE_CONSTRUCTOR_BODIES.isSupported(scope.compilerOptions()) && this.type != null && this.type.resolvedType instanceof ReferenceBinding currentType) { - TypeBinding uninitialized = scope.getMatchingUninitializedType(currentType, !currentType.isLocalType()); + // only enclosing types of non-static member types are relevant + if (currentType.isStatic() || currentType.isLocalType()) + return; + currentType = currentType.enclosingType(); + if (currentType == null) + return; + TypeBinding uninitialized = scope.getMatchingUninitializedType(currentType, true); if (uninitialized != null) scope.problemReporter().allocationInEarlyConstructionContext(this, this.resolvedType, uninitialized); } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Annotation.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Annotation.java index b7168a036b..891699de25 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Annotation.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Annotation.java @@ -40,7 +40,6 @@ package org.eclipse.jdt.internal.compiler.ast; import java.util.Stack; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java index 01b231f4c8..3587bc028e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java @@ -23,13 +23,17 @@ package org.eclipse.jdt.internal.compiler.ast; import java.util.List; - import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; import org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationCollector; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.AnnotationContext; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.TagBits; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class ArrayAllocationExpression extends Expression { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.java index 5daf55cea1..4ce1dbbad1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.java @@ -25,11 +25,14 @@ import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.ASSIGNMENT_CONTEXT; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class ArrayInitializer extends Expression { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.java index 94d390a9dd..d11dd8da34 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.java @@ -17,7 +17,11 @@ import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; +import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; +import org.eclipse.jdt.internal.compiler.lookup.Scope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import org.eclipse.jdt.internal.compiler.problem.AbortCompilation; public class ArrayQualifiedTypeReference extends QualifiedTypeReference { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.java index 4a7cae4e7a..2897c860a3 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.java @@ -18,7 +18,6 @@ package org.eclipse.jdt.internal.compiler.ast; import java.util.function.Consumer; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AssertStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AssertStatement.java index ee98c8b742..47bd685370 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AssertStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AssertStatement.java @@ -18,13 +18,21 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; +import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.codegen.Opcodes; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; -import org.eclipse.jdt.internal.compiler.ASTVisitor; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; +import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; +import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class AssertStatement extends Statement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Assignment.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Assignment.java index bc4535a153..b4e389a319 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Assignment.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Assignment.java @@ -39,11 +39,20 @@ import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.Binding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.TagBits; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeIds; +import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.WildcardBinding; public class Assignment extends Expression { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java index c3064de12b..b1b9fb8316 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java @@ -17,13 +17,18 @@ package org.eclipse.jdt.internal.compiler.ast; import java.util.List; - import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeIds; public class BinaryExpression extends OperatorExpression { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Block.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Block.java index 00ef6de2f0..9601579da2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Block.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Block.java @@ -21,10 +21,13 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; public class Block extends Statement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BranchStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BranchStatement.java index 59522dfa93..60542a47aa 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BranchStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BranchStatement.java @@ -13,14 +13,15 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; public abstract class BranchStatement extends Statement { public char[] label; public BranchLabel targetLabel; - public SubRoutineStatement[] subroutines; + public StatementWithFinallyBlock[] statementsWithFinallyBlock; public int initStateIndex = -1; /** @@ -32,12 +33,6 @@ public BranchStatement(char[] label, int sourceStart,int sourceEnd) { this.sourceEnd = sourceEnd; } -protected void setSubroutineSwitchExpression(SubRoutineStatement sub) { - // Do nothing -} -protected void restartExceptionLabels(CodeStream codeStream) { - // do nothing -} /** * Branch code generation * @@ -52,21 +47,17 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { // generation of code responsible for invoking the finally // blocks in sequence - if (this.subroutines != null){ - for (int i = 0, max = this.subroutines.length; i < max; i++){ - SubRoutineStatement sub = this.subroutines[i]; - SwitchExpression se = sub.getSwitchExpression(); - setSubroutineSwitchExpression(sub); - boolean didEscape = sub.generateSubRoutineInvocation(currentScope, codeStream, this.targetLabel, this.initStateIndex, null); - sub.setSwitchExpression(se); + if (this.statementsWithFinallyBlock != null){ + for (int i = 0, max = this.statementsWithFinallyBlock.length; i < max; i++){ + StatementWithFinallyBlock stmt = this.statementsWithFinallyBlock[i]; + boolean didEscape = stmt.generateFinallyBlock(currentScope, codeStream, this.targetLabel, this.initStateIndex); if (didEscape) { codeStream.recordPositionsFrom(pc, this.sourceStart); - SubRoutineStatement.reenterAllExceptionHandlers(this.subroutines, i, codeStream); + StatementWithFinallyBlock.reenterAllExceptionHandlers(this.statementsWithFinallyBlock, i, codeStream); if (this.initStateIndex != -1) { codeStream.removeNotDefinitelyAssignedVariables(currentScope, this.initStateIndex); codeStream.addDefinitelyAssignedVariables(currentScope, this.initStateIndex); } - restartExceptionLabels(codeStream); return; } } @@ -74,7 +65,7 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { // checkAndLoadSyntheticVars(codeStream); codeStream.goto_(this.targetLabel); codeStream.recordPositionsFrom(pc, this.sourceStart); - SubRoutineStatement.reenterAllExceptionHandlers(this.subroutines, -1, codeStream); + StatementWithFinallyBlock.reenterAllExceptionHandlers(this.statementsWithFinallyBlock, -1, codeStream); if (this.initStateIndex != -1) { codeStream.removeNotDefinitelyAssignedVariables(currentScope, this.initStateIndex); codeStream.addDefinitelyAssignedVariables(currentScope, this.initStateIndex); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BreakStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BreakStatement.java index 7ae2388128..265de6f170 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BreakStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/BreakStatement.java @@ -16,8 +16,10 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.InsideStatementWithFinallyBlockFlowContext; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; public class BreakStatement extends BranchStatement { @@ -44,7 +46,7 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl } return flowInfo; // pretend it did not break since no actual target } else if (targetContext == FlowContext.NonLocalGotoThroughSwitchContext) { // JLS 13 14.15 - currentScope.problemReporter().switchExpressionsBreakOutOfSwitchExpression(this); + currentScope.problemReporter().breakOutOfSwitchExpression(this); return flowInfo; // pretend it did not break since no actual target } @@ -56,39 +58,38 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl this.targetLabel = targetContext.breakLabel(); FlowContext traversedContext = flowContext; - int subCount = 0; - this.subroutines = new SubRoutineStatement[5]; + int stmtCount = 0; + this.statementsWithFinallyBlock = new StatementWithFinallyBlock[5]; do { - SubRoutineStatement sub; - if ((sub = traversedContext.subroutine()) != null) { - if (subCount == this.subroutines.length) { - System.arraycopy(this.subroutines, 0, (this.subroutines = new SubRoutineStatement[subCount*2]), 0, subCount); // grow + StatementWithFinallyBlock stmt; + if ((stmt = traversedContext.statementWithFinallyBlock()) != null) { + if (stmtCount == this.statementsWithFinallyBlock.length) { + System.arraycopy(this.statementsWithFinallyBlock, 0, (this.statementsWithFinallyBlock = new StatementWithFinallyBlock[stmtCount*2]), 0, stmtCount); // grow } - this.subroutines[subCount++] = sub; - if (sub.isSubRoutineEscaping()) { + this.statementsWithFinallyBlock[stmtCount++] = stmt; + if (stmt.isFinallyBlockEscaping()) { break; } } traversedContext.recordReturnFrom(flowInfo.unconditionalInits()); traversedContext.recordBreakTo(targetContext); - if (traversedContext instanceof InsideSubRoutineFlowContext) { + if (traversedContext instanceof InsideStatementWithFinallyBlockFlowContext) { ASTNode node = traversedContext.associatedNode; if (node instanceof TryStatement) { TryStatement tryStatement = (TryStatement) node; - flowInfo.addInitializationsFrom(tryStatement.subRoutineInits); // collect inits + flowInfo.addInitializationsFrom(tryStatement.finallyBlockInits); // collect inits } } else if (traversedContext == targetContext) { - // only record break info once accumulated through subroutines, and only against target context + // only record break info once accumulated, and only against target context targetContext.recordBreakFrom(flowInfo); break; } } while ((traversedContext = traversedContext.getLocalParent()) != null); - // resize subroutines - if (subCount != this.subroutines.length) { - System.arraycopy(this.subroutines, 0, (this.subroutines = new SubRoutineStatement[subCount]), 0, subCount); + if (stmtCount != this.statementsWithFinallyBlock.length) { + System.arraycopy(this.statementsWithFinallyBlock, 0, (this.statementsWithFinallyBlock = new StatementWithFinallyBlock[stmtCount]), 0, stmtCount); } return FlowInfo.DEAD_END; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java index 5a18d8c809..5836da042d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java @@ -17,7 +17,6 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Stream; - import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.ast.Pattern.PrimitiveConversionRoute; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; @@ -44,7 +43,7 @@ public class CaseStatement extends Statement { public BranchLabel targetLabel; public Expression[] constantExpressions; // case with multiple expressions - if you want a under-the-hood view, use peeledLabelExpressions() public BranchLabel[] targetLabels; // for multiple expressions - public boolean isExpr = false; + public boolean isSwitchRule = false; public SwitchStatement swich; // owning switch public int typeSwitchIndex; // for the first pattern among this.constantExpressions @@ -75,11 +74,16 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl int nullPatternCount = 0; for (int i = 0, length = this.constantExpressions.length; i < length; i++) { Expression e = this.constantExpressions[i]; - for (LocalVariableBinding local : e.bindingsWhenTrue()) { - local.useFlag = LocalVariableBinding.USED; // these are structurally required even if not touched + CompilerOptions compilerOptions = currentScope.compilerOptions(); + long sourceLevel = compilerOptions.sourceLevel; + boolean enablePreviewFeatures = compilerOptions.enablePreviewFeatures; + if (!JavaFeature.UNNAMMED_PATTERNS_AND_VARS.isSupported(sourceLevel, enablePreviewFeatures)) { + for (LocalVariableBinding local : e.bindingsWhenTrue()) { + local.useFlag = LocalVariableBinding.USED; // these are structurally required even if not touched + } } nullPatternCount += e instanceof NullLiteral ? 1 : 0; - if (i > 0 && (e instanceof Pattern) && !JavaFeature.UNNAMMED_PATTERNS_AND_VARS.isSupported(currentScope.compilerOptions().sourceLevel, currentScope.compilerOptions().enablePreviewFeatures)) { + if (i > 0 && (e instanceof Pattern) && !JavaFeature.UNNAMMED_PATTERNS_AND_VARS.isSupported(sourceLevel, enablePreviewFeatures)) { if (!(i == nullPatternCount && e instanceof TypePattern)) currentScope.problemReporter().IllegalFallThroughToPattern(e); } @@ -173,6 +177,16 @@ public String toString() { */ public ResolvedCase[] resolveCase(BlockScope scope, TypeBinding switchExpressionType, SwitchStatement switchStatement) { this.swich = switchStatement; + + if (this.isSwitchRule) + this.swich.switchBits |= SwitchStatement.LabeledRules; + else + this.swich.switchBits |= SwitchStatement.LabeledBlockStatementGroup; + + if ((this.swich.switchBits & (SwitchStatement.LabeledRules | SwitchStatement.LabeledBlockStatementGroup)) == (SwitchStatement.LabeledRules | SwitchStatement.LabeledBlockStatementGroup)) { + scope.problemReporter().arrowColonMixup(this); + } + scope.enclosingCase = this; // record entering in a switch case block if (this.constantExpressions == Expression.NO_EXPRESSIONS) { checkDuplicateDefault(scope, switchStatement, this); @@ -367,6 +381,8 @@ private Constant resolveCasePattern(BlockScope scope, TypeBinding caseType, Type if (type != null) { constant = IntConstant.fromValue(switchStatement.constantIndex); switchStatement.caseLabelElements.add(e); + if (e instanceof RecordPattern) + switchStatement.containsRecordPatterns = true; if (isUnguarded) switchStatement.caseLabelElementTypes.add(type); @@ -375,11 +391,8 @@ private Constant resolveCasePattern(BlockScope scope, TypeBinding caseType, Type // The following code is copied from InstanceOfExpression#resolve() // But there are enough differences to warrant a copy if (!type.isReifiable()) { - if (expressionType != TypeBinding.NULL && !(e instanceof RecordPattern)) { - boolean isLegal = e.checkCastTypesCompatibility(scope, type, expressionType, e, false); - if (!isLegal || (e.bits & ASTNode.UnsafeCast) != 0) { - scope.problemReporter().unsafeCastInInstanceof(e, type, expressionType); - } + if (!e.isApplicable(switchExpressionType, scope, e)) { + return Constant.NotAConstant; } } else if (type.isValidBinding()) { // if not a valid binding, an error has already been reported for unresolved type @@ -458,16 +471,15 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { public StringBuilder printStatement(int tab, StringBuilder output) { printIndent(tab, output); if (this.constantExpressions == Expression.NO_EXPRESSIONS) { - output.append("default "); //$NON-NLS-1$ - output.append(this.isExpr ? "->" : ":"); //$NON-NLS-1$ //$NON-NLS-2$ + output.append("default"); //$NON-NLS-1$ } else { output.append("case "); //$NON-NLS-1$ for (int i = 0, l = this.constantExpressions.length; i < l; ++i) { this.constantExpressions[i].printExpression(0, output); if (i < l -1) output.append(','); } - output.append(this.isExpr ? " ->" : " :"); //$NON-NLS-1$ //$NON-NLS-2$ } + output.append(this.isSwitchRule ? " ->" : " :"); //$NON-NLS-1$ //$NON-NLS-2$ return output; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CastExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CastExpression.java index d425e13d8a..c6c6ebf3ed 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CastExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CastExpression.java @@ -41,22 +41,7 @@ import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.IrritantSet; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18; -import org.eclipse.jdt.internal.compiler.lookup.InvocationSite; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.PolymorphicMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; public class CastExpression extends Expression { @@ -445,24 +430,21 @@ public static boolean checkUnsafeCast(Expression expression, Scope scope, TypeBi ParameterizedTypeBinding paramCastType = (ParameterizedTypeBinding) castType; TypeBinding[] castArguments = paramCastType.arguments; int length = castArguments == null ? 0 : castArguments.length; - if ((paramCastType.tagBits & (TagBits.HasDirectWildcard|TagBits.HasTypeVariable)) != 0) { - // verify alternate cast type, substituting different type arguments - for (int i = 0; i < length; i++) { - if (castArguments[i].isUnboundWildcard()) - continue; - TypeBinding[] alternateArguments; - // need to clone for each iteration to avoid env paramtype cache interference - System.arraycopy(paramCastType.arguments, 0, alternateArguments = new TypeBinding[length], 0, length); - alternateArguments[i] = TypeBinding.equalsEquals(paramCastType.arguments[i], scope.getJavaLangObject()) ? scope.getJavaLangBoolean() : scope.getJavaLangObject(); - LookupEnvironment environment = scope.environment(); - ParameterizedTypeBinding alternateCastType = environment.createParameterizedType((ReferenceBinding)castType.erasure(), alternateArguments, castType.enclosingType()); - if (TypeBinding.equalsEquals(alternateCastType.findSuperTypeOriginatingFrom(expressionType), match)) { - expression.bits |= ASTNode.UnsafeCast; - break; - } + // verify alternate cast type, substituting different type arguments + for (int i = 0; i < length; i++) { + if (castArguments[i].isUnboundWildcard()) + continue; + TypeBinding[] alternateArguments; + // need to clone for each iteration to avoid env paramtype cache interference + System.arraycopy(paramCastType.arguments, 0, alternateArguments = new TypeBinding[length], 0, length); + alternateArguments[i] = TypeBinding.equalsEquals(paramCastType.arguments[i], scope.getJavaLangObject()) ? scope.getJavaLangBoolean() : scope.getJavaLangObject(); + LookupEnvironment environment = scope.environment(); + ParameterizedTypeBinding alternateCastType = environment.createParameterizedType((ReferenceBinding)castType.erasure(), alternateArguments, castType.enclosingType()); + if (TypeBinding.equalsEquals(alternateCastType.findSuperTypeOriginatingFrom(expressionType), match)) { + expression.bits |= ASTNode.UnsafeCast; + break; } } - // Type arguments added by subtypes of S and removed by supertypes of T don't need to be checked since the type arguments aren't specified by either S or T return true; } else { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CharLiteral.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CharLiteral.java index 6d1846b63e..a28256ece8 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CharLiteral.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CharLiteral.java @@ -14,9 +14,10 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.impl.CharConstant; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import org.eclipse.jdt.internal.compiler.parser.ScannerHelper; public class CharLiteral extends NumberLiteral { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ClassLiteralAccess.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ClassLiteralAccess.java index a51c5e257d..5cc009d515 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ClassLiteralAccess.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ClassLiteralAccess.java @@ -15,10 +15,18 @@ import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; +import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; +import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; +import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; public class ClassLiteralAccess extends Expression { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CombinedBinaryExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CombinedBinaryExpression.java index 5431c0e501..9d795453ad 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CombinedBinaryExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CombinedBinaryExpression.java @@ -16,7 +16,6 @@ package org.eclipse.jdt.internal.compiler.ast; import java.util.List; - import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.flow.FlowContext; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompactConstructorDeclaration.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompactConstructorDeclaration.java index c2f8b6a347..50babeea63 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompactConstructorDeclaration.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompactConstructorDeclaration.java @@ -14,7 +14,6 @@ import java.util.ArrayList; import java.util.List; - import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java index 95b75ee731..3131f56b75 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java @@ -25,7 +25,6 @@ import java.util.Comparator; import java.util.HashMap; import java.util.Map; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.IProblem; @@ -39,16 +38,7 @@ import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.IrritantSet; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; -import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope; -import org.eclipse.jdt.internal.compiler.lookup.ImportBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.lookup.Substitution.NullSubstitution; import org.eclipse.jdt.internal.compiler.parser.NLSTag; import org.eclipse.jdt.internal.compiler.problem.AbortCompilationUnit; @@ -187,6 +177,7 @@ public void cleanUp() { if (this.scope != null) this.scope.cleanUpInferenceContexts(); + this.compilationResult.releaseContent(); } private void cleanUp(TypeDeclaration type) { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java index b390ca578a..e3231a81b2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java @@ -21,10 +21,14 @@ import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class CompoundAssignment extends Assignment implements OperatorIds { public int operator; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.java index a607cc5102..f887e4d997 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.java @@ -31,14 +31,27 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; -import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.*; +import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.ASSIGNMENT_CONTEXT; +import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.INVOCATION_CONTEXT; +import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.VANILLA_CONTEXT; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; -import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; +import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.Binding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; +import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; +import org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.Scope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeIds; public class ConditionalExpression extends OperatorExpression implements IPolyExpression { @@ -61,7 +74,6 @@ public class ConditionalExpression extends OperatorExpression implements IPolyEx private boolean isPolyExpression = false; private TypeBinding originalValueIfTrueType; private TypeBinding originalValueIfFalseType; - private boolean use18specifics; public ConditionalExpression(Expression condition, Expression valueIfTrue, Expression valueIfFalse) { this.condition = condition; @@ -317,10 +329,12 @@ public void generateCode( // End of if statement endifLabel.place(); } - if (this.valueIfFalse.resolvedType == TypeBinding.NULL) { - if (!this.resolvedType.isBaseType()) { - codeStream.operandStack.pop(TypeBinding.NULL); - codeStream.operandStack.push(this.resolvedType); + if (valueRequired) { + if (this.valueIfFalse.resolvedType == TypeBinding.NULL) { + if (!this.resolvedType.isBaseType()) { + codeStream.operandStack.pop(TypeBinding.NULL); + codeStream.operandStack.push(this.resolvedType); + } } } } @@ -457,17 +471,11 @@ public StringBuilder printExpressionNoParenthesis(int indent, StringBuilder outp public TypeBinding resolveType(BlockScope scope) { // JLS3 15.25 LookupEnvironment env = scope.environment(); - final long sourceLevel = scope.compilerOptions().sourceLevel; - boolean use15specifics = sourceLevel >= ClassFileConstants.JDK1_5; - this.use18specifics = sourceLevel >= ClassFileConstants.JDK1_8; - - if (this.use18specifics) { - if (this.expressionContext == ASSIGNMENT_CONTEXT || this.expressionContext == INVOCATION_CONTEXT) { - this.valueIfTrue.setExpressionContext(this.expressionContext); - this.valueIfTrue.setExpectedType(this.expectedType); - this.valueIfFalse.setExpressionContext(this.expressionContext); - this.valueIfFalse.setExpectedType(this.expectedType); - } + if (this.expressionContext == ASSIGNMENT_CONTEXT || this.expressionContext == INVOCATION_CONTEXT) { + this.valueIfTrue.setExpressionContext(this.expressionContext); + this.valueIfTrue.setExpectedType(this.expectedType); + this.valueIfFalse.setExpressionContext(this.expressionContext); + this.valueIfFalse.setExpectedType(this.expectedType); } if (this.constant != Constant.NotAConstant) { @@ -519,28 +527,17 @@ public TypeBinding resolveType(BlockScope scope) { if (this.originalValueIfFalseType == null || !this.originalValueIfFalseType.isValidBinding()) return this.resolvedType = null; } - // Propagate the constant value from the valueIfTrue and valueIFFalse expression if it is possible - Constant condConstant, trueConstant, falseConstant; - if ((condConstant = this.condition.constant) != Constant.NotAConstant - && (trueConstant = this.valueIfTrue.constant) != Constant.NotAConstant - && (falseConstant = this.valueIfFalse.constant) != Constant.NotAConstant) { - // all terms are constant expression so we can propagate the constant - // from valueIFTrue or valueIfFalse to the receiver constant - this.constant = condConstant.booleanValue() ? trueConstant : falseConstant; - } if (isPolyExpression()) { if (this.expectedType == null || !this.expectedType.isProperType(true)) { - // We will be back here in case of a PolyTypeBinding. So, to enable - // further processing, set it back to default. - this.constant = Constant.NotAConstant; return new PolyTypeBinding(this); } + constantFold(); return this.resolvedType = computeConversions(scope, this.expectedType) ? this.expectedType : null; } TypeBinding valueIfTrueType = this.originalValueIfTrueType; TypeBinding valueIfFalseType = this.originalValueIfFalseType; - if (use15specifics && TypeBinding.notEquals(valueIfTrueType, valueIfFalseType)) { + if (TypeBinding.notEquals(valueIfTrueType, valueIfFalseType)) { if (valueIfTrueType.isBaseType()) { if (valueIfFalseType.isBaseType()) { // bool ? baseType : baseType @@ -576,6 +573,8 @@ public TypeBinding resolveType(BlockScope scope) { } } } + constantFold(); + Constant condConstant; if (TypeBinding.equalsEquals(valueIfTrueType, valueIfFalseType)) { // harmed the implicit conversion this.valueIfTrue.computeConversion(scope, valueIfTrueType, this.originalValueIfTrueType); this.valueIfFalse.computeConversion(scope, valueIfFalseType, this.originalValueIfFalseType); @@ -651,48 +650,27 @@ public TypeBinding resolveType(BlockScope scope) { } // Type references (null null is already tested) if (valueIfTrueType.isBaseType() && valueIfTrueType != TypeBinding.NULL) { - if (use15specifics) { - valueIfTrueType = env.computeBoxingType(valueIfTrueType); - } else { - scope.problemReporter().conditionalArgumentsIncompatibleTypes(this, valueIfTrueType, valueIfFalseType); - return null; - } + valueIfTrueType = env.computeBoxingType(valueIfTrueType); } if (valueIfFalseType.isBaseType() && valueIfFalseType != TypeBinding.NULL) { - if (use15specifics) { - valueIfFalseType = env.computeBoxingType(valueIfFalseType); - } else { - scope.problemReporter().conditionalArgumentsIncompatibleTypes(this, valueIfTrueType, valueIfFalseType); - return null; - } + valueIfFalseType = env.computeBoxingType(valueIfFalseType); } - if (use15specifics) { - // >= 1.5 : LUB(operand types) must exist - TypeBinding commonType = null; - if (valueIfTrueType == TypeBinding.NULL) { - commonType = valueIfFalseType.withoutToplevelNullAnnotation(); // null on other branch invalidates any @NonNull - } else if (valueIfFalseType == TypeBinding.NULL) { - commonType = valueIfTrueType.withoutToplevelNullAnnotation(); // null on other branch invalidates any @NonNull - } else { - commonType = scope.lowerUpperBound(new TypeBinding[] { valueIfTrueType, valueIfFalseType }); - } - if (commonType != null) { - this.valueIfTrue.computeConversion(scope, commonType, this.originalValueIfTrueType); - this.valueIfFalse.computeConversion(scope, commonType, this.originalValueIfFalseType); - return this.resolvedType = commonType.capture(scope, this.sourceStart, this.sourceEnd); - } + + // >= 1.5 : LUB(operand types) must exist + TypeBinding commonType = null; + if (valueIfTrueType == TypeBinding.NULL) { + commonType = valueIfFalseType.withoutToplevelNullAnnotation(); // null on other branch invalidates any @NonNull + } else if (valueIfFalseType == TypeBinding.NULL) { + commonType = valueIfTrueType.withoutToplevelNullAnnotation(); // null on other branch invalidates any @NonNull } else { - // < 1.5 : one operand must be convertible to the other - if (valueIfFalseType.isCompatibleWith(valueIfTrueType)) { - this.valueIfTrue.computeConversion(scope, valueIfTrueType, this.originalValueIfTrueType); - this.valueIfFalse.computeConversion(scope, valueIfTrueType, this.originalValueIfFalseType); - return this.resolvedType = valueIfTrueType; - } else if (valueIfTrueType.isCompatibleWith(valueIfFalseType)) { - this.valueIfTrue.computeConversion(scope, valueIfFalseType, this.originalValueIfTrueType); - this.valueIfFalse.computeConversion(scope, valueIfFalseType, this.originalValueIfFalseType); - return this.resolvedType = valueIfFalseType; - } + commonType = scope.lowerUpperBound(new TypeBinding[] { valueIfTrueType, valueIfFalseType }); } + if (commonType != null) { + this.valueIfTrue.computeConversion(scope, commonType, this.originalValueIfTrueType); + this.valueIfFalse.computeConversion(scope, commonType, this.originalValueIfFalseType); + return this.resolvedType = commonType.capture(scope, this.sourceStart, this.sourceEnd); + } + scope.problemReporter().conditionalArgumentsIncompatibleTypes( this, valueIfTrueType, @@ -700,6 +678,18 @@ public TypeBinding resolveType(BlockScope scope) { return null; } + private void constantFold() { + // Propagate the constant value from the valueIfTrue and valueIFFalse expression if it is possible + Constant condConstant, trueConstant, falseConstant; + if ((condConstant = this.condition.constant) != Constant.NotAConstant + && (trueConstant = this.valueIfTrue.constant) != Constant.NotAConstant + && (falseConstant = this.valueIfFalse.constant) != Constant.NotAConstant) { + // all terms are constant expression so we can propagate the constant + // from valueIFTrue or valueIfFalse to the receiver constant + this.constant = condConstant.booleanValue() ? trueConstant : falseConstant; + } + } + protected boolean computeConversions(BlockScope scope, TypeBinding targetType) { boolean ok = true; if (this.originalValueIfTrueType != null && this.originalValueIfTrueType.isValidBinding()) { @@ -800,9 +790,6 @@ public boolean isFunctionalType() { @Override public boolean isPolyExpression() throws UnsupportedOperationException { - if (!this.use18specifics) - return false; - if (this.isPolyExpression) return true; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java index 13bf3cc7e9..f0e048f592 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java @@ -32,18 +32,28 @@ import java.util.ArrayList; import java.util.List; - -import org.eclipse.jdt.core.compiler.*; -import org.eclipse.jdt.internal.compiler.*; +import org.eclipse.jdt.core.compiler.CategorizedProblem; +import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.core.compiler.IProblem; +import org.eclipse.jdt.internal.compiler.ASTVisitor; +import org.eclipse.jdt.internal.compiler.ClassFile; +import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationCollector; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.codegen.Opcodes; +import org.eclipse.jdt.internal.compiler.codegen.StackMapFrameCodeStream; +import org.eclipse.jdt.internal.compiler.flow.ExceptionHandlingFlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.InitializationFlowContext; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.JavaFeature; import org.eclipse.jdt.internal.compiler.lookup.*; -import org.eclipse.jdt.internal.compiler.parser.*; -import org.eclipse.jdt.internal.compiler.problem.*; +import org.eclipse.jdt.internal.compiler.parser.Parser; +import org.eclipse.jdt.internal.compiler.problem.AbortMethod; +import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; +import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; import org.eclipse.jdt.internal.compiler.util.Util; @SuppressWarnings({"rawtypes", "unchecked"}) diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.java index d39b297b42..4e439c0c39 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ContinueStatement.java @@ -16,8 +16,10 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.InsideStatementWithFinallyBlockFlowContext; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; public class ContinueStatement extends BranchStatement { @@ -44,7 +46,7 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl } return flowInfo; // pretend it did not continue since no actual target } else if (targetContext == FlowContext.NonLocalGotoThroughSwitchContext) { - currentScope.problemReporter().switchExpressionsContinueOutOfSwitchExpression(this); + currentScope.problemReporter().continueOutOfSwitchExpression(this); return flowInfo; // pretend it did not continue since no actual target } @@ -60,38 +62,37 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl this.targetLabel = targetContext.continueLabel(); FlowContext traversedContext = flowContext; - int subCount = 0; - this.subroutines = new SubRoutineStatement[5]; + int stmtCount = 0; + this.statementsWithFinallyBlock = new StatementWithFinallyBlock[5]; do { - SubRoutineStatement sub; - if ((sub = traversedContext.subroutine()) != null) { - if (subCount == this.subroutines.length) { - System.arraycopy(this.subroutines, 0, this.subroutines = new SubRoutineStatement[subCount*2], 0, subCount); // grow + StatementWithFinallyBlock stmt; + if ((stmt = traversedContext.statementWithFinallyBlock()) != null) { + if (stmtCount == this.statementsWithFinallyBlock.length) { + System.arraycopy(this.statementsWithFinallyBlock, 0, this.statementsWithFinallyBlock = new StatementWithFinallyBlock[stmtCount*2], 0, stmtCount); // grow } - this.subroutines[subCount++] = sub; - if (sub.isSubRoutineEscaping()) { + this.statementsWithFinallyBlock[stmtCount++] = stmt; + if (stmt.isFinallyBlockEscaping()) { break; } } traversedContext.recordReturnFrom(flowInfo.unconditionalInits()); - if (traversedContext instanceof InsideSubRoutineFlowContext) { + if (traversedContext instanceof InsideStatementWithFinallyBlockFlowContext) { ASTNode node = traversedContext.associatedNode; if (node instanceof TryStatement) { TryStatement tryStatement = (TryStatement) node; - flowInfo.addInitializationsFrom(tryStatement.subRoutineInits); // collect inits + flowInfo.addInitializationsFrom(tryStatement.finallyBlockInits); // collect inits } } else if (traversedContext == targetContext) { - // only record continue info once accumulated through subroutines, and only against target context + // only record continue info once accumulated and only against target context targetContext.recordContinueFrom(flowContext, flowInfo); break; } } while ((traversedContext = traversedContext.getLocalParent()) != null); - // resize subroutines - if (subCount != this.subroutines.length) { - System.arraycopy(this.subroutines, 0, this.subroutines = new SubRoutineStatement[subCount], 0, subCount); + if (stmtCount != this.statementsWithFinallyBlock.length) { + System.arraycopy(this.statementsWithFinallyBlock, 0, this.statementsWithFinallyBlock = new StatementWithFinallyBlock[stmtCount], 0, stmtCount); } return FlowInfo.DEAD_END; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/DoStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/DoStatement.java index 38534c6ea1..b46771256c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/DoStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/DoStatement.java @@ -19,10 +19,17 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.LoopingFlowContext; +import org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo; +import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeIds; public class DoStatement extends Statement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/DoubleLiteral.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/DoubleLiteral.java index 87c58ad519..d493a3852f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/DoubleLiteral.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/DoubleLiteral.java @@ -15,9 +15,10 @@ import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.impl.DoubleConstant; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import org.eclipse.jdt.internal.compiler.util.FloatUtil; public class DoubleLiteral extends NumberLiteral { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EitherOrMultiPattern.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EitherOrMultiPattern.java index 9d4e81fe9b..8ef74f12e1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EitherOrMultiPattern.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EitherOrMultiPattern.java @@ -54,6 +54,13 @@ public void setIsGuarded() { this.patterns[i].setIsGuarded(); } + @Override + public void setOuterExpressionType(TypeBinding expressionType) { + super.setOuterExpressionType(expressionType); + for (int i = 0; i < this.patternsCount; i++) + this.patterns[i].setOuterExpressionType(expressionType); + } + @Override public TypeBinding resolveType(BlockScope scope) { boolean hasError = false; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EmptyStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EmptyStatement.java index 19762f3aac..0f9931140e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EmptyStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EmptyStatement.java @@ -14,12 +14,12 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; -import org.eclipse.jdt.internal.compiler.ASTVisitor; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; public class EmptyStatement extends Statement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java index 2231ddf745..e6daf6c30b 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java @@ -20,11 +20,23 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo; +import org.eclipse.jdt.internal.compiler.impl.BooleanConstant; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; +import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.lookup.Binding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.Scope; +import org.eclipse.jdt.internal.compiler.lookup.TagBits; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeIds; public class EqualExpression extends BinaryExpression { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java index 15f4ce3913..0822132c48 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java @@ -36,7 +36,6 @@ import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.INVOCATION_CONTEXT; import java.util.Arrays; - import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.codegen.CodeStream; @@ -44,25 +43,7 @@ import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.JavaFeature; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; -import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18; -import org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; public class ExplicitConstructorCall extends Statement implements Invocation { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Expression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Expression.java index 5307deb2fe..d95d8055b6 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Expression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Expression.java @@ -36,7 +36,6 @@ import java.util.ArrayList; import java.util.List; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; @@ -46,24 +45,7 @@ import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.WildcardBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.problem.ShouldNotImplement; import org.eclipse.jdt.internal.compiler.util.Messages; @@ -262,6 +244,10 @@ protected void updateFlowOnBooleanResult(FlowInfo flowInfo, boolean result) { // nop } +public boolean hasSideEffects() { + return (this.constant == Constant.NotAConstant || (this.implicitConversion & TypeIds.BOXING) != 0) && !(this instanceof NullLiteral); +} + /** * Returns false if cast is not legal. */ @@ -1118,6 +1104,10 @@ public StringBuilder print(int indent, StringBuilder output) { public abstract StringBuilder printExpression(int indent, StringBuilder output); +public StringBuilder printExpression(int tab, StringBuilder output, boolean makeShort) { + return printExpression(tab, output); +} + @Override public StringBuilder printStatement(int indent, StringBuilder output) { return print(indent, output).append(";"); //$NON-NLS-1$ @@ -1254,7 +1244,7 @@ public boolean forcedToBeRaw(ReferenceContext referenceContext) { } } else if (this instanceof SwitchExpression) { SwitchExpression se = (SwitchExpression) this; - for (Expression e : se.resultExpressions) { + for (Expression e : se.resultExpressions()) { if (e.forcedToBeRaw(referenceContext)) return true; } @@ -1264,7 +1254,7 @@ public boolean forcedToBeRaw(ReferenceContext referenceContext) { /** * Returns an object which can be used to identify identical JSR sequence targets - * (see TryStatement subroutine codegen) + * (see TryStatement finally block codegen) * or null if not reusable */ public Object reusableJSRTarget() { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FakeDefaultLiteral.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FakeDefaultLiteral.java index 7199c2a9e7..84e6d7a648 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FakeDefaultLiteral.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FakeDefaultLiteral.java @@ -14,7 +14,8 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; /** * Sole purpose of {@link FakeDefaultLiteral} is to appear diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java index aadcde5a57..bf9055eb85 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java @@ -23,7 +23,6 @@ import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.CompilationResult; @@ -34,18 +33,7 @@ import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; import org.eclipse.jdt.internal.compiler.util.Util; @@ -253,7 +241,7 @@ else if (expression instanceof ConditionalExpression) { return getMoreUnsafeFromBranches((ConditionalExpression)expression, flowInfo, branch -> getCloseTrackingVariable(branch, flowInfo, flowContext, useAnnotations)); } else if (expression instanceof SwitchExpression) { - for (Expression re : ((SwitchExpression) expression).resultExpressions) { + for (Expression re : ((SwitchExpression) expression).resultExpressions()) { FakedTrackingVariable fakedTrackingVariable = getCloseTrackingVariable(re, flowInfo, flowContext, useAnnotations); if (fakedTrackingVariable != null) { return fakedTrackingVariable; @@ -356,7 +344,7 @@ public static FakedTrackingVariable preConnectTrackerAcrossAssignment(ASTNode lo } private static boolean containsAllocation(SwitchExpression location) { - for (Expression re : location.resultExpressions) { + for (Expression re : location.resultExpressions()) { if (containsAllocation(re)) return true; } @@ -403,7 +391,7 @@ private static void preConnectTrackerAcrossAssignment(ASTNode location, LocalVar private static void preConnectTrackerAcrossAssignment(ASTNode location, LocalVariableBinding local, FlowInfo flowInfo, SwitchExpression se, FakedTrackingVariable closeTracker, boolean useAnnotations) { - for (Expression re : se.resultExpressions) { + for (Expression re : se.resultExpressions()) { preConnectTrackerAcrossAssignment(location, local, flowInfo, closeTracker, re, useAnnotations); } } @@ -899,7 +887,7 @@ else if (expression instanceof CastExpression) local, location, branch, previousTracker)); } else if (expression instanceof SwitchExpression) { FakedTrackingVariable mostRisky = null; - for (Expression result : ((SwitchExpression) expression).resultExpressions) { + for (Expression result : ((SwitchExpression) expression).resultExpressions()) { FakedTrackingVariable current = analyseCloseableExpression(scope, flowInfo, flowContext, useAnnotations, local, location, result, previousTracker); if (mostRisky == null) diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java index db24805a2e..014d8c055e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java @@ -23,17 +23,20 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; -import java.util.List; - import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.ASSIGNMENT_CONTEXT; +import java.util.List; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; import org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationCollector; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.AnnotationContext; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.codegen.Opcodes; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; +import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FieldReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FieldReference.java index 459934f1e0..75a590585e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FieldReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FieldReference.java @@ -32,25 +32,7 @@ import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18; -import org.eclipse.jdt.internal.compiler.lookup.InvocationSite; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.MissingTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemFieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; public class FieldReference extends Reference implements InvocationSite { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java index bc67511959..be4f819fdd 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ForeachStatement.java @@ -36,21 +36,7 @@ import org.eclipse.jdt.internal.compiler.flow.LoopingFlowContext; import org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.CaptureBinding; -import org.eclipse.jdt.internal.compiler.lookup.ImplicitNullAnnotationVerifier; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; +import org.eclipse.jdt.internal.compiler.lookup.*; public class ForeachStatement extends Statement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java index 0d83b07baa..3789ec43e5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java @@ -36,22 +36,7 @@ import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope; -import org.eclipse.jdt.internal.compiler.lookup.IntersectionTypeBinding18; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.MethodVerifier; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeBindingVisitor; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; public abstract class FunctionalExpression extends Expression { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/GuardedPattern.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/GuardedPattern.java index a4317e9c06..47e6f2b846 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/GuardedPattern.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/GuardedPattern.java @@ -76,6 +76,12 @@ public void setIsEitherOrPattern() { this.primaryPattern.setIsEitherOrPattern(); } + @Override + public void setOuterExpressionType(TypeBinding expressionType) { + super.setOuterExpressionType(expressionType); + this.primaryPattern.setOuterExpressionType(expressionType); + } + @Override public boolean coversType(TypeBinding type, Scope scope) { return isUnguarded() && this.primaryPattern.coversType(type, scope); @@ -130,7 +136,7 @@ public void traverse(ASTVisitor visitor, BlockScope scope) { } @Override - protected boolean isApplicable(TypeBinding other, BlockScope scope) { - return this.primaryPattern.isApplicable(other, scope); + protected boolean isApplicable(TypeBinding expressionType, BlockScope scope, ASTNode location) { + return this.primaryPattern.isApplicable(expressionType, scope, location); } } \ No newline at end of file diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IPolyExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IPolyExpression.java index ce05e75055..23484a9fae 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IPolyExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IPolyExpression.java @@ -40,6 +40,7 @@ public interface IPolyExpression { // Target type injection. public void setExpectedType(TypeBinding targetType); public TypeBinding invocationTargetType(); + public TypeBinding expectedType(); // Compatibility checks. public boolean isPotentiallyCompatibleWith(TypeBinding targetType, Scope scope); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IfStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IfStatement.java index 9a266ec811..3091758ec6 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IfStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IfStatement.java @@ -20,10 +20,15 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class IfStatement extends Statement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ImplicitTypeDeclaration.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ImplicitTypeDeclaration.java index 3636a37e95..9400bf4dc5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ImplicitTypeDeclaration.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ImplicitTypeDeclaration.java @@ -13,7 +13,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.stream.Stream; - import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ImportReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ImportReference.java index 0de446aced..b6ce1f7712 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ImportReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ImportReference.java @@ -15,11 +15,13 @@ import java.util.HashSet; import java.util.Set; - import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope; +import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; +import org.eclipse.jdt.internal.compiler.lookup.PackageBinding; +import org.eclipse.jdt.internal.compiler.lookup.SplitPackageBinding; public class ImportReference extends ASTNode { @@ -33,7 +35,6 @@ public class ImportReference extends ASTNode { public Annotation[] annotations; // star end position public int trailingStarPosition; - public boolean implicit; public ImportReference( char[][] tokens, @@ -58,9 +59,6 @@ public boolean isStatic() { public char[][] getImportName() { return this.tokens; } - public boolean isImplicit() { - return this.implicit; - } public char[] getSimpleName() { return this.tokens[this.tokens.length - 1]; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Initializer.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Initializer.java index 90c7e46742..34457eb36e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Initializer.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Initializer.java @@ -18,10 +18,18 @@ import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; -import org.eclipse.jdt.internal.compiler.parser.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.lookup.Binding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; +import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; +import org.eclipse.jdt.internal.compiler.lookup.MethodScope; +import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; +import org.eclipse.jdt.internal.compiler.lookup.Scope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.parser.Parser; public class Initializer extends FieldDeclaration { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java index 490fecd919..60fd0e9a6e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java @@ -25,18 +25,25 @@ package org.eclipse.jdt.internal.compiler.ast; import java.util.stream.Stream; - import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.ast.Pattern.PrimitiveConversionRoute; import org.eclipse.jdt.internal.compiler.ast.Pattern.TestContextRecord; import org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationPosition; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.JavaFeature; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.Binding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.Scope; +import org.eclipse.jdt.internal.compiler.lookup.TagBits; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class InstanceOfExpression extends OperatorExpression implements IGenerateTypeCheck { @@ -270,6 +277,13 @@ public TypeBinding resolveType(BlockScope scope) { if (expressionType == null || checkedType == null) return null; + if (this.pattern != null) { + if (this.pattern.isApplicable(expressionType, scope, this)) { + checkForPrimitives(scope, checkedType, expressionType); + } + return this.resolvedType = TypeBinding.BOOLEAN; + } + if (!checkedType.isReifiable()) { CompilerOptions options = scope.compilerOptions(); // Report same as before for older compliances @@ -279,7 +293,7 @@ public TypeBinding resolveType(BlockScope scope) { if (expressionType != TypeBinding.NULL) { boolean isLegal = checkCastTypesCompatibility(scope, checkedType, expressionType, this.expression, true); if (!isLegal || (this.bits & ASTNode.UnsafeCast) != 0) { - scope.problemReporter().unsafeCastInInstanceof(this.expression, checkedType, expressionType); + scope.problemReporter().unsafeCastInTestingContext(this.expression, checkedType, expressionType); } else { checkRefForPrimitivesAndAddSecretVariable(scope, checkedType, expressionType); } @@ -287,17 +301,18 @@ public TypeBinding resolveType(BlockScope scope) { } } else if (checkedType.isValidBinding()) { // if not a valid binding, an error has already been reported for unresolved type - if ((expressionType != TypeBinding.NULL && expressionType.isBaseType()) // disallow autoboxing - || checkedType.isBaseType() - || !checkCastTypesCompatibility(scope, checkedType, expressionType, null, true)) { - checkForPrimitives(scope, checkedType, expressionType); - } + checkForPrimitives(scope, checkedType, expressionType); } return this.resolvedType = TypeBinding.BOOLEAN; } private void checkForPrimitives(BlockScope scope, TypeBinding checkedType, TypeBinding expressionType) { + boolean needToCheck = (expressionType != TypeBinding.NULL && expressionType.isBaseType()) // disallow autoboxing + || checkedType.isBaseType() + || !checkCastTypesCompatibility(scope, checkedType, expressionType, null, true); + if (!needToCheck) + return; PrimitiveConversionRoute route = Pattern.findPrimitiveConversionRoute(checkedType, expressionType, scope); this.testContextRecord = new TestContextRecord(checkedType, expressionType, route); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IntLiteralMinValue.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IntLiteralMinValue.java index 5dfed33eee..c70d81428c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IntLiteralMinValue.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IntLiteralMinValue.java @@ -13,7 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; -import org.eclipse.jdt.internal.compiler.impl.*; +import org.eclipse.jdt.internal.compiler.impl.IntConstant; public class IntLiteralMinValue extends IntLiteral { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.java index 9cb8ab99bc..0c530f8f74 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/IntersectionCastTypeReference.java @@ -19,7 +19,6 @@ import java.util.HashMap; import java.util.Map; - import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.lookup.BlockScope; import org.eclipse.jdt.internal.compiler.lookup.ClassScope; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocArgumentExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocArgumentExpression.java index de95a42bff..f239d3e407 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocArgumentExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocArgumentExpression.java @@ -16,7 +16,10 @@ import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; +import org.eclipse.jdt.internal.compiler.lookup.Scope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class JavadocArgumentExpression extends Expression { public char[] token; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.java index 384916a2c9..1c4440ea03 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocImplicitTypeReference.java @@ -17,7 +17,12 @@ import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; +import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; +import org.eclipse.jdt.internal.compiler.lookup.Scope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class JavadocImplicitTypeReference extends TypeReference { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.java index 71cd1be4b8..b8caed35c5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocMessageSend.java @@ -16,7 +16,15 @@ import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; +import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; +import org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding; +import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; +import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; +import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; +import org.eclipse.jdt.internal.compiler.lookup.Scope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class JavadocMessageSend extends MessageSend { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocReturnStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocReturnStatement.java index 36e1867073..b57c87623d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocReturnStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocReturnStatement.java @@ -14,7 +14,11 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; +import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; +import org.eclipse.jdt.internal.compiler.lookup.MethodScope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class JavadocReturnStatement extends ReturnStatement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocSingleNameReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocSingleNameReference.java index a59e0a28e9..77b514ffa1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocSingleNameReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocSingleNameReference.java @@ -14,7 +14,11 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.MethodScope; +import org.eclipse.jdt.internal.compiler.lookup.TagBits; public class JavadocSingleNameReference extends SingleNameReference { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocSingleTypeReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocSingleTypeReference.java index f5ca09aeb4..5650bc43cc 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocSingleTypeReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/JavadocSingleTypeReference.java @@ -17,17 +17,7 @@ import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; -import org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; -import org.eclipse.jdt.internal.compiler.lookup.PackageBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; public class JavadocSingleTypeReference extends SingleTypeReference implements IJavadocTypeReference { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LabeledStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LabeledStatement.java index 6facbe19cf..682dc0249e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LabeledStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LabeledStatement.java @@ -14,9 +14,13 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.LabelFlowContext; +import org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; public class LabeledStatement extends Statement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java index 69d847dcb1..a03184f714 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LambdaExpression.java @@ -55,7 +55,6 @@ import java.util.List; import java.util.Map; import java.util.Set; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; @@ -72,36 +71,9 @@ import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; -import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18; -import org.eclipse.jdt.internal.compiler.lookup.IntersectionTypeBinding18; -import org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.Substitution; -import org.eclipse.jdt.internal.compiler.lookup.Substitution.NullSubstitution; -import org.eclipse.jdt.internal.compiler.lookup.SyntheticArgumentBinding; -import org.eclipse.jdt.internal.compiler.lookup.SyntheticMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.WildcardBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.lookup.Scope.Substitutor; +import org.eclipse.jdt.internal.compiler.lookup.Substitution.NullSubstitution; import org.eclipse.jdt.internal.compiler.parser.Parser; import org.eclipse.jdt.internal.compiler.problem.AbortCompilation; import org.eclipse.jdt.internal.compiler.problem.AbortCompilationUnit; @@ -763,6 +735,7 @@ public StringBuilder printExpression(int tab, StringBuilder output) { return printExpression(tab, output, false); } + @Override public StringBuilder printExpression(int tab, StringBuilder output, boolean makeShort) { int parenthesesCount = (this.bits & ASTNode.ParenthesizedMASK) >> ASTNode.ParenthesizedSHIFT; String suffix = ""; //$NON-NLS-1$ diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Literal.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Literal.java index 97357678a3..ce952e4fe1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Literal.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Literal.java @@ -15,8 +15,9 @@ import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; -import org.eclipse.jdt.internal.compiler.impl.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public abstract class Literal extends Expression { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java index a6192e74d7..a9d08ee11f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java @@ -245,7 +245,7 @@ private static Expression findPolyExpression(Expression e) { } if (e instanceof SwitchExpression) { SwitchExpression se = (SwitchExpression)e; - for (Expression re : se.resultExpressions) { + for (Expression re : se.resultExpressions()) { Expression candidate = findPolyExpression(re); if (candidate != null) return candidate; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LongLiteralMinValue.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LongLiteralMinValue.java index 183ca98d2b..c687a35ffa 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LongLiteralMinValue.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LongLiteralMinValue.java @@ -13,7 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; -import org.eclipse.jdt.internal.compiler.impl.*; +import org.eclipse.jdt.internal.compiler.impl.LongConstant; public class LongLiteralMinValue extends LongLiteral { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.java index a86cd21b94..ed0e138be5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MarkerAnnotation.java @@ -20,7 +20,8 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; public class MarkerAnnotation extends Annotation { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MessageSend.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MessageSend.java index b967f5ec25..7932215dd1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MessageSend.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MessageSend.java @@ -71,7 +71,6 @@ import java.util.HashMap; import java.util.function.BiConsumer; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; @@ -85,37 +84,7 @@ import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.IrritantSet; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.ImplicitNullAnnotationVerifier; -import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18; -import org.eclipse.jdt.internal.compiler.lookup.InferenceVariable; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodVerifier; -import org.eclipse.jdt.internal.compiler.lookup.MissingTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.PolyParameterizedGenericMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.PolymorphicMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable; @@ -343,7 +312,7 @@ private void yieldQualifiedCheck(BlockScope currentScope) { return; if (!CharOperation.equals(this.selector, TypeConstants.YIELD)) return; - currentScope.problemReporter().switchExpressionsYieldUnqualifiedMethodError(this); + currentScope.problemReporter().unqualifiedYieldMethod(this); } private void recordCallingClose(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo, Expression closeTarget) { if (closeTarget.isThis() || closeTarget.isSuper()) { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java index 4300189585..8bf053f810 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java @@ -31,7 +31,6 @@ import java.util.List; import java.util.function.BiPredicate; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.CompilationResult; @@ -42,18 +41,7 @@ import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.MemberTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.parser.Parser; import org.eclipse.jdt.internal.compiler.problem.AbortMethod; import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ModuleDeclaration.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ModuleDeclaration.java index 5d6a595a90..44f567bafc 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ModuleDeclaration.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ModuleDeclaration.java @@ -14,14 +14,15 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; -import static org.eclipse.jdt.internal.compiler.problem.ProblemSeverities.*; +import static org.eclipse.jdt.internal.compiler.problem.ProblemSeverities.AbortCompilation; +import static org.eclipse.jdt.internal.compiler.problem.ProblemSeverities.AbortCompilationUnit; +import static org.eclipse.jdt.internal.compiler.problem.ProblemSeverities.AbortMethod; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.IProblem; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NameReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NameReference.java index 1ed8cf0eed..30af219c9e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NameReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NameReference.java @@ -20,11 +20,18 @@ package org.eclipse.jdt.internal.compiler.ast; import java.util.function.Predicate; - import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.Binding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; +import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18; +import org.eclipse.jdt.internal.compiler.lookup.InvocationSite; +import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; +import org.eclipse.jdt.internal.compiler.lookup.Scope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; import org.eclipse.jdt.internal.compiler.problem.AbortMethod; public abstract class NameReference extends Reference implements InvocationSite { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.java index e1a8a7dbf4..be3b75a887 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NormalAnnotation.java @@ -14,7 +14,10 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.Binding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; +import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair; /** * Normal annotation node diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.java index 051cea830b..53015ed9e7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.java @@ -19,30 +19,8 @@ import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.ExternalAnnotationStatus; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.CaptureBinding; -import org.eclipse.jdt.internal.compiler.lookup.InvocationSite; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.Substitution; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeBindingVisitor; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.WildcardBinding; import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; /** @@ -178,7 +156,7 @@ public static int checkAssignment(BlockScope currentScope, FlowContext flowConte } else if (expression instanceof SwitchExpression && expression.isPolyExpression()) { // drill into all the branches: SwitchExpression se = ((SwitchExpression) expression); - Expression[] resExprs = se.resultExpressions.toArray(new Expression[0]); + Expression[] resExprs = se.resultExpressions().toArray(new Expression[0]); Expression re = resExprs[0]; int status0 = NullAnnotationMatching.checkAssignment(currentScope, flowContext, var, flowInfo, re.nullStatus(flowInfo, flowContext), re, re.resolvedType); boolean identicalStatus = true; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NullLiteral.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NullLiteral.java index 7ea8ca3660..97ab14148f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NullLiteral.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/NullLiteral.java @@ -16,11 +16,12 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.codegen.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class NullLiteral extends MagicLiteral { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.java index 603b1ceda3..d355d4fe4d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.java @@ -20,10 +20,16 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo; +import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.lookup.Binding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; //dedicated treatment for the || public class OR_OR_Expression extends BinaryExpression { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Pattern.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Pattern.java index f07c01e55a..15d3fdad80 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Pattern.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Pattern.java @@ -139,25 +139,37 @@ public TypeReference getType() { } // 14.30.3 Properties of Patterns: A pattern p is said to be applicable at a type T if ... - protected boolean isApplicable(TypeBinding other, BlockScope scope) { - TypeBinding patternType = this.resolvedType; - if (patternType == null) // ill resolved pattern - return false; + protected boolean isApplicable(TypeBinding expressionType, BlockScope scope, ASTNode location) { + if (expressionType == TypeBinding.NULL) + return true; + TypeReference typeRef = getType(); + if (typeRef == null) + return true; // nothing to be checked for wildcard '_' + TypeBinding patternType = typeRef.resolvedType; + if (patternType == null || !patternType.isValidBinding() || !expressionType.isValidBinding()) + return false; // problem already reported + // 14.30.3 Properties of Patterns doesn't allow boxing nor unboxing, primitive widening/narrowing (< JLS23) - if (patternType.isBaseType() != other.isBaseType() && !JavaFeature.PRIMITIVES_IN_PATTERNS.isSupported(scope.compilerOptions())) { - scope.problemReporter().incompatiblePatternType(this, other, patternType); + if (patternType.isBaseType() != expressionType.isBaseType() && !JavaFeature.PRIMITIVES_IN_PATTERNS.isSupported(scope.compilerOptions())) { + scope.problemReporter().notCompatibleTypesError(location, expressionType, patternType); return false; } if (patternType.isBaseType()) { PrimitiveConversionRoute route = Pattern.findPrimitiveConversionRoute(this.resolvedType, this.outerExpressionType, scope); - if (!TypeBinding.equalsEquals(other, patternType) + if (!TypeBinding.equalsEquals(expressionType, patternType) && route == PrimitiveConversionRoute.NO_CONVERSION_ROUTE) { - scope.problemReporter().incompatiblePatternType(this, other, patternType); + scope.problemReporter().notCompatibleTypesError(location, expressionType, patternType); + return false; + } + } else { + if (!checkCastTypesCompatibility(scope, patternType, expressionType, null, true)) { + scope.problemReporter().notCompatibleTypesError(location, expressionType, patternType); + return false; + } + if ((this.bits & ASTNode.UnsafeCast) != 0) { + scope.problemReporter().unsafeCastInTestingContext(location, patternType, this.outerExpressionType); return false; } - } else if (!checkCastTypesCompatibility(scope, other, patternType, null, true)) { - scope.problemReporter().incompatiblePatternType(this, other, patternType); - return false; } return true; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/PostfixExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/PostfixExpression.java index 8fcee0f1b1..fde6e2f02c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/PostfixExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/PostfixExpression.java @@ -14,8 +14,8 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; public class PostfixExpression extends CompoundAssignment { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/PrefixExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/PrefixExpression.java index 1702d9c86d..a73f3f7a45 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/PrefixExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/PrefixExpression.java @@ -14,7 +14,7 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; public class PrefixExpression extends CompoundAssignment { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ProvidesStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ProvidesStatement.java index ef1d80783f..146b24a43f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ProvidesStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ProvidesStatement.java @@ -17,7 +17,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; - import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.compiler.lookup.Binding; import org.eclipse.jdt.internal.compiler.lookup.BlockScope; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java index a3052713f0..74b00f54ab 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java @@ -40,7 +40,6 @@ import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.INVOCATION_CONTEXT; import java.util.Arrays; - import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.codegen.CodeStream; @@ -49,29 +48,7 @@ import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; -import org.eclipse.jdt.internal.compiler.lookup.ImplicitNullAnnotationVerifier; -import org.eclipse.jdt.internal.compiler.lookup.IntersectionTypeBinding18; -import org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeBindingVisitor; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; /** * Variation on allocation, where can optionally be specified any of: diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java index 6ac930ce8e..be86df1435 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java @@ -37,25 +37,7 @@ import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.MissingTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemFieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.SyntheticMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; public class QualifiedNameReference extends NameReference { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.java index d747e21bfc..04f2649ec6 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.java @@ -74,8 +74,13 @@ public TypeBinding resolveType(BlockScope scope) { ReferenceBinding enclosingReceiverType = scope.enclosingReceiverType(); // interface-qualified this selects a default method in a super interface, // but here we are only interested in supers of *enclosing instances*: - if (enclosingReceiverType != null && !enclosingReceiverType.isInterface() && scope.isInsideEarlyConstructionContext(enclosingReceiverType, false)) - scope.problemReporter().errorExpressionInEarlyConstructionContext(this); + if (enclosingReceiverType != null && !enclosingReceiverType.isInterface()) { + TypeBinding typeToCheck = (enclosingReceiverType.isCompatibleWith(this.resolvedType)) + ? enclosingReceiverType // cannot reference super of the current type + : this.resolvedType; // assumeably not a super but an outer type + if (scope.isInsideEarlyConstructionContext(typeToCheck, false)) + scope.problemReporter().errorExpressionInEarlyConstructionContext(this); + } return this.resolvedType = (this.currentCompatibleType.isInterface() ? this.currentCompatibleType : this.currentCompatibleType.superclass()); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java index c9951c4091..0aecf21390 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java @@ -20,11 +20,17 @@ import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.JavaFeature; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; +import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; +import org.eclipse.jdt.internal.compiler.lookup.MethodScope; +import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class QualifiedThisReference extends ThisReference { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordComponent.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordComponent.java index dde93ffb9a..34e234a810 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordComponent.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordComponent.java @@ -17,9 +17,17 @@ import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationCollector; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.AnnotationContext; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; +import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; +import org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding; +import org.eclipse.jdt.internal.compiler.lookup.SyntheticMethodBinding; +import org.eclipse.jdt.internal.compiler.lookup.TagBits; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class RecordComponent extends AbstractVariableDeclaration { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordPattern.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordPattern.java index e0e222faca..637d5687d7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordPattern.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordPattern.java @@ -152,7 +152,7 @@ public TypeBinding resolveType(BlockScope scope) { } } TypeBinding componentType = componentBinding.type; - if (p1.isApplicable(componentType, scope)) { + if (p1.isApplicable(componentType, scope, p1)) { p1.isTotalTypeNode = p1.coversType(componentType, scope); MethodBinding[] methods = this.resolvedType.getMethods(componentBinding.name); if (methods != null && methods.length > 0) { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Reference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Reference.java index 708204c358..1412bd9d90 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Reference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Reference.java @@ -28,16 +28,7 @@ import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.JavaFeature; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; +import org.eclipse.jdt.internal.compiler.lookup.*; public abstract class Reference extends Expression { /** diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java index ee73869bd2..0b75c348bf 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java @@ -66,33 +66,7 @@ import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.IrritantSet; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; -import org.eclipse.jdt.internal.compiler.lookup.ImplicitNullAnnotationVerifier; -import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18; -import org.eclipse.jdt.internal.compiler.lookup.InvocationSite; -import org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.SyntheticArgumentBinding; -import org.eclipse.jdt.internal.compiler.lookup.SyntheticMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.parser.Parser; import org.eclipse.jdt.internal.compiler.parser.Scanner; @@ -151,7 +125,7 @@ private ReferenceExpression copy() { char [] source = new char [this.sourceEnd+1]; System.arraycopy(this.text, 0, source, this.sourceStart, this.sourceEnd - this.sourceStart + 1); parser.scanner = this.scanner; - ReferenceExpression copy = (ReferenceExpression) parser.parseExpression(source, this.sourceStart, this.sourceEnd - this.sourceStart + 1, + ReferenceExpression copy = (ReferenceExpression) parser.parseReferenceExpression(source, this.sourceStart, this.sourceEnd - this.sourceStart + 1, this.enclosingScope.referenceCompilationUnit(), false /* record line separators */); copy.original = this; copy.sourceStart = this.sourceStart; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java index 3751f6012a..7da8c15cdc 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java @@ -45,16 +45,26 @@ import static org.eclipse.jdt.internal.compiler.ast.ExpressionContext.ASSIGNMENT_CONTEXT; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.InitializationFlowContext; +import org.eclipse.jdt.internal.compiler.flow.InsideStatementWithFinallyBlockFlowContext; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; +import org.eclipse.jdt.internal.compiler.lookup.MethodScope; +import org.eclipse.jdt.internal.compiler.lookup.Scope; +import org.eclipse.jdt.internal.compiler.lookup.TagBits; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeIds; public class ReturnStatement extends Statement { public Expression expression; - public SubRoutineStatement[] subroutines; + public StatementWithFinallyBlock[] statementsWithFinallyBlock; public LocalVariableBinding saveValueVariable; public int initStateIndex = -1; private final boolean implicitReturn; @@ -104,42 +114,42 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl methodScope.recordInitializationStates(flowInfo); // compute the return sequence (running the finally blocks) FlowContext traversedContext = flowContext; - int subCount = 0; + int stmtCount = 0; boolean saveValueNeeded = false; boolean hasValueToSave = needValueStore(); boolean noAutoCloseables = true; do { - SubRoutineStatement sub; - if ((sub = traversedContext.subroutine()) != null) { - if (this.subroutines == null){ - this.subroutines = new SubRoutineStatement[5]; + StatementWithFinallyBlock stmt; + if ((stmt = traversedContext.statementWithFinallyBlock()) != null) { + if (this.statementsWithFinallyBlock == null){ + this.statementsWithFinallyBlock = new StatementWithFinallyBlock[5]; } - if (subCount == this.subroutines.length) { - System.arraycopy(this.subroutines, 0, (this.subroutines = new SubRoutineStatement[subCount*2]), 0, subCount); // grow + if (stmtCount == this.statementsWithFinallyBlock.length) { + System.arraycopy(this.statementsWithFinallyBlock, 0, (this.statementsWithFinallyBlock = new StatementWithFinallyBlock[stmtCount*2]), 0, stmtCount); // grow } - this.subroutines[subCount++] = sub; - if (sub.isSubRoutineEscaping()) { + this.statementsWithFinallyBlock[stmtCount++] = stmt; + if (stmt.isFinallyBlockEscaping()) { saveValueNeeded = false; - this.bits |= ASTNode.IsAnySubRoutineEscaping; + this.bits |= ASTNode.IsAnyFinallyBlockEscaping; break; } - if (sub instanceof TryStatement) { - if (((TryStatement) sub).resources.length > 0) { + if (stmt instanceof TryStatement) { + if (((TryStatement) stmt).resources.length > 0) { noAutoCloseables = false; } } } traversedContext.recordReturnFrom(flowInfo.unconditionalInits()); - if (traversedContext instanceof InsideSubRoutineFlowContext) { + if (traversedContext instanceof InsideStatementWithFinallyBlockFlowContext) { ASTNode node = traversedContext.associatedNode; if (node instanceof SynchronizedStatement) { this.bits |= ASTNode.IsSynchronized; } else if (node instanceof TryStatement) { TryStatement tryStatement = (TryStatement) node; - flowInfo.addInitializationsFrom(tryStatement.subRoutineInits); // collect inits + flowInfo.addInitializationsFrom(tryStatement.finallyBlockInits); // collect inits if (hasValueToSave) { - if (this.saveValueVariable == null){ // closest subroutine secret variable is used + if (this.saveValueVariable == null){ // closest try statememt's secret variable is used prepareSaveValueLocation(tryStatement); } saveValueNeeded = true; @@ -151,14 +161,13 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl currentScope.problemReporter().cannotReturnInInitializer(this); return FlowInfo.DEAD_END; } else if (traversedContext.associatedNode instanceof SwitchExpression) { - currentScope.problemReporter().switchExpressionsReturnWithinSwitchExpression(this); + currentScope.problemReporter().returnOutOfSwitchExpression(this); return FlowInfo.DEAD_END; } } while ((traversedContext = traversedContext.getLocalParent()) != null); - // resize subroutines - if ((this.subroutines != null) && (subCount != this.subroutines.length)) { - System.arraycopy(this.subroutines, 0, (this.subroutines = new SubRoutineStatement[subCount]), 0, subCount); + if ((this.statementsWithFinallyBlock != null) && (stmtCount != this.statementsWithFinallyBlock.length)) { + System.arraycopy(this.statementsWithFinallyBlock, 0, (this.statementsWithFinallyBlock = new StatementWithFinallyBlock[stmtCount]), 0, stmtCount); } // secret local variable for return value (note that this can only occur in a real method) @@ -231,19 +240,19 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { // generate the expression if (needValueStore()) { alreadyGeneratedExpression = true; - this.expression.generateCode(currentScope, codeStream, needValue()); // no value needed if non-returning subroutine + this.expression.generateCode(currentScope, codeStream, needValue()); // no value needed if non-returning method generateStoreSaveValueIfNecessary(currentScope, codeStream); } // generation of code responsible for invoking the finally blocks in sequence - if (this.subroutines != null) { + if (this.statementsWithFinallyBlock != null) { Object reusableJSRTarget = this.expression == null ? (Object)TypeBinding.VOID : this.expression.reusableJSRTarget(); - for (int i = 0, max = this.subroutines.length; i < max; i++) { - SubRoutineStatement sub = this.subroutines[i]; - boolean didEscape = sub.generateSubRoutineInvocation(currentScope, codeStream, reusableJSRTarget, this.initStateIndex, this.saveValueVariable); + for (int i = 0, max = this.statementsWithFinallyBlock.length; i < max; i++) { + StatementWithFinallyBlock stmt = this.statementsWithFinallyBlock[i]; + boolean didEscape = stmt.generateFinallyBlock(currentScope, codeStream, reusableJSRTarget, this.initStateIndex); if (didEscape) { codeStream.recordPositionsFrom(pc, this.sourceStart); - SubRoutineStatement.reenterAllExceptionHandlers(this.subroutines, i, codeStream); + StatementWithFinallyBlock.reenterAllExceptionHandlers(this.statementsWithFinallyBlock, i, codeStream); return; } } @@ -266,7 +275,7 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { codeStream.addDefinitelyAssignedVariables(currentScope, this.initStateIndex); } codeStream.recordPositionsFrom(pc, this.sourceStart); - SubRoutineStatement.reenterAllExceptionHandlers(this.subroutines, -1, codeStream); + StatementWithFinallyBlock.reenterAllExceptionHandlers(this.statementsWithFinallyBlock, -1, codeStream); } /** @@ -293,7 +302,7 @@ private boolean needValueStore() { public boolean needValue() { return this.saveValueVariable != null || (this.bits & ASTNode.IsSynchronized) != 0 - || ((this.bits & ASTNode.IsAnySubRoutineEscaping) == 0); + || ((this.bits & ASTNode.IsAnyFinallyBlockEscaping) == 0); } public void prepareSaveValueLocation(TryStatement targetTryStatement){ diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.java index 649140aea1..cf8d251afe 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SingleMemberAnnotation.java @@ -16,7 +16,9 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; +import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair; /** * SingleMemberAnnotation node diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java index 6fad432f57..2847abaca7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java @@ -35,24 +35,7 @@ import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.MissingTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemFieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.problem.AbortMethod; import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Statement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Statement.java index 00ee5f5018..b189ca8771 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Statement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Statement.java @@ -45,8 +45,10 @@ import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching.CheckMode; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.lookup.*; @@ -190,12 +192,11 @@ void analyseOneArgument18(BlockScope currentScope, FlowContext flowContext, Flow ce.internalAnalyseOneArgument18(currentScope, flowContext, expectedType, ce.valueIfTrue, flowInfo, ce.ifTrueNullStatus, expectedNonNullness, originalExpected); ce.internalAnalyseOneArgument18(currentScope, flowContext, expectedType, ce.valueIfFalse, flowInfo, ce.ifFalseNullStatus, expectedNonNullness, originalExpected); return; - } else if (argument instanceof SwitchExpression && argument.isPolyExpression()) { - SwitchExpression se = (SwitchExpression) argument; - for (int i = 0; i < se.resultExpressions.size(); i++) { + } else if (argument instanceof SwitchExpression se && se.isPolyExpression()) { + for (Expression rExpression : se.resultExpressions()) { se.internalAnalyseOneArgument18(currentScope, flowContext, expectedType, - se.resultExpressions.get(i), flowInfo, - se.resultExpressionNullStatus.get(i), expectedNonNullness, originalExpected); + rExpression, flowInfo, + rExpression.nullStatus(flowInfo, flowContext), expectedNonNullness, originalExpected); } return; } @@ -257,12 +258,11 @@ protected void checkAgainstNullTypeAnnotation(BlockScope scope, TypeBinding requ internalCheckAgainstNullTypeAnnotation(scope, requiredType, ce.valueIfTrue, ce.ifTrueNullStatus, flowContext, flowInfo); internalCheckAgainstNullTypeAnnotation(scope, requiredType, ce.valueIfFalse, ce.ifFalseNullStatus, flowContext, flowInfo); return; - } else if (expression instanceof SwitchExpression && expression.isPolyExpression()) { - SwitchExpression se = (SwitchExpression) expression; - for (int i = 0; i < se.resultExpressions.size(); i++) { + } else if (expression instanceof SwitchExpression se && se.isPolyExpression()) { + for (Expression rExpression : se.resultExpressions()) { internalCheckAgainstNullTypeAnnotation(scope, requiredType, - se.resultExpressions.get(i), - se.resultExpressionNullStatus.get(i), flowContext, flowInfo); + rExpression, + rExpression.nullStatus(flowInfo, flowContext), flowContext, flowInfo); } return; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SubRoutineStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/StatementWithFinallyBlock.java similarity index 59% rename from jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SubRoutineStatement.java rename to jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/StatementWithFinallyBlock.java index 044cfa17df..2ad04f7c50 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SubRoutineStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/StatementWithFinallyBlock.java @@ -16,25 +16,24 @@ import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.codegen.ExceptionLabel; import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; /** - * Extra behavior for statements which are generating subroutines + * Extra behavior for statements which have a finally block - e.g., try blocks have finally; synchronized statements have hidden finally blocks that call monitorexit etc. */ -public abstract class SubRoutineStatement extends Statement { +public abstract class StatementWithFinallyBlock extends Statement { - public static void reenterAllExceptionHandlers(SubRoutineStatement[] subroutines, int max, CodeStream codeStream) { - if (subroutines == null) return; - if (max < 0) max = subroutines.length; + public static void reenterAllExceptionHandlers(StatementWithFinallyBlock[] statements, int max, CodeStream codeStream) { + if (statements == null) return; + if (max < 0) max = statements.length; for (int i = 0; i < max; i++) { - SubRoutineStatement sub = subroutines[i]; - sub.enterAnyExceptionHandler(codeStream); - sub.enterDeclaredExceptionHandlers(codeStream); + StatementWithFinallyBlock stmt = statements[i]; + stmt.enterAnyExceptionHandler(codeStream); + stmt.enterDeclaredExceptionHandlers(codeStream); + stmt.enterResourceExceptionHandlers(codeStream); } } ExceptionLabel anyExceptionLabel; - protected SwitchExpression switchExpression = null; public ExceptionLabel enterAnyExceptionHandler(CodeStream codeStream) { @@ -49,6 +48,10 @@ public void enterDeclaredExceptionHandlers(CodeStream codeStream) { // do nothing by default } + public void enterResourceExceptionHandlers(CodeStream codeStream) { + // do nothing by default + } + public void exitAnyExceptionHandler() { if (this.anyExceptionLabel != null) { this.anyExceptionLabel.placeEnd(); @@ -59,24 +62,15 @@ public void exitDeclaredExceptionHandlers(CodeStream codeStream) { // do nothing by default } - /** - * Generate an invocation of a subroutine (e.g. jsr finally) in current context. - * @return boolean, true if the generated code will abrupt completion + * Generate the finally block in current context. + * @return boolean, true if the generated code will complete abruptly. */ - public abstract boolean generateSubRoutineInvocation(BlockScope currentScope, CodeStream codeStream, Object targetLocation, int stateIndex, LocalVariableBinding secretLocal); + public abstract boolean generateFinallyBlock(BlockScope currentScope, CodeStream codeStream, Object targetLocation, int stateIndex); - public abstract boolean isSubRoutineEscaping(); + public abstract boolean isFinallyBlockEscaping(); public void placeAllAnyExceptionHandler() { this.anyExceptionLabel.place(); } - - public SwitchExpression getSwitchExpression() { - return this.switchExpression; - } - - public void setSwitchExpression(SwitchExpression switchExpression) { - this.switchExpression = switchExpression; - } -} +} \ No newline at end of file diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SwitchExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SwitchExpression.java index 16471b5f1c..65f2ab7c71 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SwitchExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SwitchExpression.java @@ -18,22 +18,17 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; - import org.eclipse.jdt.core.compiler.CharOperation; -import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.Binding; import org.eclipse.jdt.internal.compiler.lookup.BlockScope; import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; @@ -47,28 +42,123 @@ public class SwitchExpression extends SwitchStatement implements IPolyExpression { /* package */ TypeBinding expectedType; - private ExpressionContext expressionContext = VANILLA_CONTEXT; - private boolean isPolyExpression = false; - private TypeBinding[] originalValueResultExpressionTypes; - private TypeBinding[] finalValueResultExpressionTypes; - /* package */ Map originalTypeMap = new HashMap<>(); - - + ExpressionContext expressionContext = VANILLA_CONTEXT; private int nullStatus = FlowInfo.UNKNOWN; - public List resultExpressions; - public boolean resolveAll; - /* package */ List resultExpressionNullStatus; - public boolean containsTry = false; - private static Map type_map; + public boolean jvmStackVolatile = false; static final char[] SECRET_YIELD_VALUE_NAME = " yieldValue".toCharArray(); //$NON-NLS-1$ - int yieldResolvedPosition = -1; List typesOnStack; - static { - type_map = new HashMap<>(); - type_map.put(TypeBinding.CHAR, new TypeBinding[] {TypeBinding.CHAR, TypeBinding.INT}); - type_map.put(TypeBinding.SHORT, new TypeBinding[] {TypeBinding.SHORT, TypeBinding.BYTE, TypeBinding.INT}); - type_map.put(TypeBinding.BYTE, new TypeBinding[] {TypeBinding.BYTE, TypeBinding.INT}); + public Result results = new Result(); + + class Result { // Abstraction to help with 15.28.1 determination of the type of a switch expression. + + private Set rExpressions = new LinkedHashSet<>(4); + private Set rTypes = new HashSet<>(); + + // Result expressions aggregate classification - will be negated as and when the picture changes + private boolean allUniform = true; + private boolean allBoolean = true; + private boolean allNumeric = true; + private boolean allWellFormed = true; // true as long as result expression completely fail to resolve (resolvedType == null) + + private TypeBinding resultType() { + + if (!this.allWellFormed) + return null; + + if (SwitchExpression.this.isPolyExpression()) + return resolveAsType(SwitchExpression.this.expectedType); + + if (this.allUniform) { + TypeBinding uniformType = null; + for (Expression rExpression : this.rExpressions) + uniformType = uniformType == null ? rExpression.resolvedType : NullAnnotationMatching.moreDangerousType(uniformType, rExpression.resolvedType); + return uniformType; + } + + if (this.allBoolean) + return resolveAsType(TypeBinding.BOOLEAN); + + if (this.allNumeric) { + for (TypeBinding type : TypeBinding.NUMERIC_TYPES) { + TypeBinding result = switch (type.id) { + case T_double, T_float, T_long, T_int -> this.rTypes.contains(type) ? type : null; + case T_short, T_byte, T_char -> { + if (this.rTypes.contains(type)) { + if (type.id != T_char && this.rTypes.contains(TypeBinding.CHAR)) + yield TypeBinding.INT; + for (Expression rExpression : this.rExpressions) { + if (rExpression.resolvedType.id == T_int && rExpression.constant != Constant.NotAConstant && !rExpression.isConstantValueOfTypeAssignableToType(rExpression.resolvedType, type)) + yield TypeBinding.INT; + } + yield type; + } + yield null; + } + default -> throw new IllegalStateException("Unexpected control flow!"); //$NON-NLS-1$; + }; + if (result != null) + return resolveAsType(result); + } + throw new IllegalStateException("Unexpected control flow!"); //$NON-NLS-1$ + } + // Non-uniform, non-boolean, non-numeric: Force to reference versions, compute lub and apply capture and we are done! + LookupEnvironment env = SwitchExpression.this.scope.environment(); + TypeBinding [] resultReferenceTypes = new TypeBinding[this.rExpressions.size()]; + int i = 0; + for (Expression rExpression : this.rExpressions) + resultReferenceTypes[i++] = rExpression.resolvedType.isBaseType() ? env.computeBoxingType(rExpression.resolvedType) : rExpression.resolvedType; + + TypeBinding lub = SwitchExpression.this.scope.lowerUpperBound(resultReferenceTypes); + if (lub != null) + return resolveAsType(lub); + + SwitchExpression.this.scope.problemReporter().incompatibleSwitchExpressionResults(SwitchExpression.this); // Is this unreachable ? can lub be null with only reference types ??! + return null; + } + + /** Add an expression to known result expressions, gather some aggregate characteristics if in standalone context. + * @return a flag indicating the overall well-formedness of result expression set. + */ + public boolean add(/*@NonNull*/ Expression rxpression) { + + this.rExpressions.add(rxpression); + + TypeBinding rxpressionType = rxpression.resolvedType; + if (rxpressionType == null) { // tolerate poly-expression resolving to null in the absence of target type. + if (!rxpression.isPolyExpression() || ((IPolyExpression) rxpression).expectedType() != null) + this.allWellFormed = false; + } else if (!rxpressionType.isValidBinding()) { + this.allWellFormed = false; + } + + // Classify result expressions on an aggregate basis - needed only for well formed, non-poly switches. + if (!this.allWellFormed || SwitchExpression.this.isPolyExpression()) + return this.allWellFormed; + + rxpressionType = rxpressionType.unboxedType(); + this.allUniform &= TypeBinding.equalsEquals(this.rExpressions.iterator().next().resolvedType, rxpression.resolvedType); + this.allBoolean &= rxpressionType.id == T_boolean; + this.allNumeric &= rxpressionType.isNumericType(); + + if (this.allNumeric) { + boolean definiteType = true; + if (rxpressionType.id == T_int && rxpression.constant != Constant.NotAConstant) { + int i = rxpression.constant.intValue(); + if (i <= Character.MAX_VALUE && i >= Short.MIN_VALUE) + definiteType = false; + // else int constants may get reclassified as they undergo narrowing conversions - can't pin them yet. + } + if (definiteType) + this.rTypes.add(rxpressionType); + } + return true; + } + + @Override + public String toString() { + return this.rExpressions.toString(); + } } @Override @@ -86,8 +176,8 @@ public ExpressionContext getExpressionContext() { return this.expressionContext; } @Override - protected boolean ignoreMissingDefaultCase(CompilerOptions compilerOptions, boolean isEnumSwitch) { - return isEnumSwitch; // mandatory error if not enum in switch expressions + protected boolean ignoreMissingDefaultCase(CompilerOptions compilerOptions) { + return true; } @Override protected void reportMissingEnumConstantCase(BlockScope upperScope, FieldBinding enumConstant) { @@ -115,79 +205,15 @@ else if ((this.nullStatus & FlowInfo.POTENTIALLY_NULL) != 0) return true; // all checking done } - private void computeNullStatus(FlowInfo flowInfo, FlowContext flowContext) { - boolean precomputed = this.resultExpressionNullStatus.size() > 0; - if (!precomputed) - this.resultExpressionNullStatus.add(this.resultExpressions.get(0).nullStatus(flowInfo, flowContext)); int status = this.resultExpressions.get(0).nullStatus(flowInfo, flowContext); - int combinedStatus = status; - boolean identicalStatus = true; - for (int i = 1, l = this.resultExpressions.size(); i < l; ++i) { - if (!precomputed) - this.resultExpressionNullStatus.add(this.resultExpressions.get(i).nullStatus(flowInfo, flowContext)); - int tmp = this.resultExpressions.get(i).nullStatus(flowInfo, flowContext); - identicalStatus &= status == tmp; - combinedStatus |= tmp; - } - if (identicalStatus) { - this.nullStatus = status; - return; - } - status = Expression.computeNullStatus(0, combinedStatus); - if (status > 0) - this.nullStatus = status; - } - - @Override - protected void completeNormallyCheck(BlockScope blockScope) { - int sz = this.statements != null ? this.statements.length : 0; - if (sz == 0) return; - /* JLS 12 15.28.1 Given a switch expression, if the switch block consists of switch labeled rules - * then it is a compile-time error if any switch labeled block can complete normally. - */ - if ((this.switchBits & LabeledRules) != 0) { - for (Statement stmt : this.statements) { - if (!(stmt instanceof Block)) - continue; - if (stmt.canCompleteNormally()) - blockScope.problemReporter().switchExpressionLastStatementCompletesNormally(stmt); - } - return; - } - /* JLS 12 15.28.1 - * If, on the other hand, the switch block consists of switch labeled statement groups, then it is a - * compile-time error if either the last statement in the switch block can complete normally, or the - * switch block includes one or more switch labels at the end. - */ - Statement lastNonCaseStmt = null; - Statement firstTrailingCaseStmt = null; - for (int i = sz - 1; i >= 0; i--) { - Statement stmt = this.statements[sz - 1]; - if (stmt instanceof CaseStatement) - firstTrailingCaseStmt = stmt; - else { - lastNonCaseStmt = stmt; - break; - } - } - if (lastNonCaseStmt != null) { - if (lastNonCaseStmt.canCompleteNormally()) - blockScope.problemReporter().switchExpressionLastStatementCompletesNormally(lastNonCaseStmt); - else if (lastNonCaseStmt instanceof ContinueStatement || lastNonCaseStmt instanceof ReturnStatement) { - blockScope.problemReporter().switchExpressionIllegalLastStatement(lastNonCaseStmt); - } - } - if (firstTrailingCaseStmt != null) { - blockScope.problemReporter().switchExpressionTrailingSwitchLabels(firstTrailingCaseStmt); - } - } @Override protected boolean needToCheckFlowInAbsenceOfDefaultBranch() { // JLS 12 16.1.8 return (this.switchBits & LabeledRules) == 0; } + @Override public Expression[] getPolyExpressions() { List polys = new ArrayList<>(); - for (Expression e : this.resultExpressions) { + for (Expression e : this.results.rExpressions) { Expression[] ea = e.getPolyExpressions(); if (ea == null || ea.length ==0) continue; polys.addAll(Arrays.asList(ea)); @@ -196,7 +222,7 @@ public Expression[] getPolyExpressions() { } @Override public boolean isPertinentToApplicability(TypeBinding targetType, MethodBinding method) { - for (Expression e : this.resultExpressions) { + for (Expression e : this.results.rExpressions) { if (!e.isPertinentToApplicability(targetType, method)) return false; } @@ -204,7 +230,7 @@ public boolean isPertinentToApplicability(TypeBinding targetType, MethodBinding } @Override public boolean isPotentiallyCompatibleWith(TypeBinding targetType, Scope scope1) { - for (Expression e : this.resultExpressions) { + for (Expression e : this.results.rExpressions) { if (!e.isPotentiallyCompatibleWith(targetType, scope1)) return false; } @@ -212,7 +238,7 @@ public boolean isPotentiallyCompatibleWith(TypeBinding targetType, Scope scope1) } @Override public boolean isFunctionalType() { - for (Expression e : this.resultExpressions) { + for (Expression e : this.results.rExpressions) { if (e.isFunctionalType()) // return true even for one functional type return true; } @@ -261,11 +287,15 @@ private LocalVariableBinding addTypeStackVariable(CodeStream codeStream, TypeBin lvb.declaration = new LocalDeclaration(name, 0, 0); return lvb; } - private void spillOperandStack(CodeStream codeStream) { + + private void spillOperandStackIfNeeded(CodeStream codeStream) { + int operandStackSize = codeStream.operandStack.size(); + if (!this.jvmStackVolatile || (codeStream.stackDepth == 0 && operandStackSize == 0)) // nothing to spill and nothing to compain + return; int nextResolvedPosition = this.scope.offset; this.typesOnStack = new ArrayList<>(); int index = 0; - while (codeStream.operandStack.size() > 0) { + while (operandStackSize > 0) { TypeBinding type = codeStream.operandStack.peek(); LocalVariableBinding lvb = addTypeStackVariable(codeStream, type, TypeIds.T_undefined, index++, nextResolvedPosition); nextResolvedPosition += switch (lvb.type.id) { @@ -275,101 +305,52 @@ private void spillOperandStack(CodeStream codeStream) { this.typesOnStack.add(lvb); codeStream.store(lvb, false); codeStream.addVariable(lvb); + operandStackSize = codeStream.operandStack.size(); } - if (codeStream.stackDepth != 0 || codeStream.operandStack.size() != 0) { + if (codeStream.stackDepth != 0 || codeStream.operandStack.size() != 0) codeStream.classFile.referenceBinding.scope.problemReporter().operandStackSizeInappropriate(codeStream.classFile.referenceBinding.scope.referenceContext); - } - // now keep a position reserved for yield result value - this.yieldResolvedPosition = nextResolvedPosition; - nextResolvedPosition += ((TypeBinding.equalsEquals(this.resolvedType, TypeBinding.LONG)) || - (TypeBinding.equalsEquals(this.resolvedType, TypeBinding.DOUBLE))) ? - 2 : 1; int delta = nextResolvedPosition - this.scope.offset; this.scope.adjustLocalVariablePositions(delta, false); } - public void refillOperandStack(CodeStream codeStream) { + + public void refillOperandStackIfNeeded(CodeStream codeStream, YieldStatement yield) { + if (!this.jvmStackVolatile || this.typesOnStack == null || this.typesOnStack.isEmpty() || (yield.bits & ASTNode.IsAnyFinallyBlockEscaping) != 0) // nothing spilled or no point restoring. + return; + + if (codeStream.stackDepth != 0 || codeStream.operandStack.size() != 0) + codeStream.classFile.referenceBinding.scope.problemReporter().operandStackSizeInappropriate(codeStream.classFile.referenceBinding.scope.referenceContext); + List tos = this.typesOnStack; - int sz = tos != null ? tos.size() : 0; - codeStream.operandStack.clear(); - codeStream.stackDepth = 0; - int index = sz - 1; + int index = tos != null ? tos.size() - 1 : -1; while (index >= 0) { LocalVariableBinding lvb = tos.get(index--); codeStream.load(lvb); -// lvb.recordInitializationEndPC(codeStream.position); -// codeStream.removeVariable(lvb); } } + private void removeStoredTypes(CodeStream codeStream) { List tos = this.typesOnStack; - int sz = tos != null ? tos.size() : 0; - int index = sz - 1; + int index = tos != null ? tos.size() -1 : - 1; while (index >= 0) { LocalVariableBinding lvb = tos.get(index--); codeStream.removeVariable(lvb); } } + @Override public void generateCode(BlockScope currentScope, CodeStream codeStream, boolean valueRequired) { - if (this.containsTry) { - spillOperandStack(codeStream); - } + spillOperandStackIfNeeded(codeStream); super.generateCode(currentScope, codeStream); - if (this.containsTry) { + if (this.jvmStackVolatile) removeStoredTypes(codeStream); - } - if (!valueRequired) { - // switch expression is saved to a variable that is not used. We need to pop the generated value from the stack + if (!valueRequired) { // switch expression result discarded (saved to a variable that is not used.) switch(postConversionType(currentScope).id) { - case TypeIds.T_long : - case TypeIds.T_double : - codeStream.pop2(); - break; - case TypeIds.T_void : - break; - default : - codeStream.pop(); - break; + case TypeIds.T_long, TypeIds.T_double -> codeStream.pop2(); + default -> codeStream.pop(); } - } else { - if (!this.isPolyExpression()) // not in invocation or assignment contexts - codeStream.generateImplicitConversion(this.implicitConversion); - } - } - protected boolean computeConversions(BlockScope blockScope, TypeBinding targetType) { - boolean ok = true; - for (int i = 0, l = this.resultExpressions.size(); i < l; ++i) { - ok &= computeConversionsResultExpressions(blockScope, targetType, this.originalValueResultExpressionTypes[i], this.resultExpressions.get(i)); - } - return ok; - } - private boolean computeConversionsResultExpressions(BlockScope blockScope, TypeBinding targetType, TypeBinding resultExpressionType, - Expression resultExpression) { - if (resultExpressionType != null && resultExpressionType.isValidBinding()) { - if (resultExpression.isConstantValueOfTypeAssignableToType(resultExpressionType, targetType) - || resultExpressionType.isCompatibleWith(targetType)) { - - resultExpression.computeConversion(blockScope, targetType, resultExpressionType); - if (resultExpressionType.needsUncheckedConversion(targetType)) { - blockScope.problemReporter().unsafeTypeConversion(resultExpression, resultExpressionType, targetType); - } - if (resultExpression instanceof CastExpression - && (resultExpression.bits & (ASTNode.UnnecessaryCast|ASTNode.DisableUnnecessaryCastCheck)) == 0) { - CastExpression.checkNeedForAssignedCast(blockScope, targetType, (CastExpression) resultExpression); - } - } else if (isBoxingCompatible(resultExpressionType, targetType, resultExpression, blockScope)) { - resultExpression.computeConversion(blockScope, targetType, resultExpressionType); - if (resultExpression instanceof CastExpression - && (resultExpression.bits & (ASTNode.UnnecessaryCast|ASTNode.DisableUnnecessaryCastCheck)) == 0) { - CastExpression.checkNeedForAssignedCast(blockScope, targetType, (CastExpression) resultExpression); - } - } else { - blockScope.problemReporter().typeMismatchError(resultExpressionType, targetType, resultExpression, null); - return false; - } - } - return true; + } else if (!this.isPolyExpression()) + codeStream.generateImplicitConversion(this.implicitConversion); } @Override @@ -380,299 +361,89 @@ public void resolve(BlockScope upperScope) { @Override public TypeBinding resolveType(BlockScope upperScope) { try { - int resultExpressionsCount; if (this.constant != Constant.NotAConstant) { this.constant = Constant.NotAConstant; - - // A switch expression is a poly expression if it appears in an assignment context or an invocation context (5.2, 5.3). - // Otherwise, it is a standalone expression. - if (this.expressionContext == ASSIGNMENT_CONTEXT || this.expressionContext == INVOCATION_CONTEXT) { - for (Expression e : this.resultExpressions) { - //Where a poly switch expression appears in a context of a particular kind with target type T, - //its result expressions similarly appear in a context of the same kind with target type T. - e.setExpressionContext(this.expressionContext); - e.setExpectedType(this.expectedType); - } - } - - if (this.originalTypeMap == null) - this.originalTypeMap = new HashMap<>(); - super.resolve(upperScope); - - if (this.statements == null || this.statements.length == 0) { - // Report Error JLS 13 15.28.1 The switch block must not be empty. - upperScope.problemReporter().switchExpressionEmptySwitchBlock(this); - return null; - } - - resultExpressionsCount = this.resultExpressions != null ? this.resultExpressions.size() : 0; - if (resultExpressionsCount == 0) { - // Report Error JLS 13 15.28.1 - // It is a compile-time error if a switch expression has no result expressions. - upperScope.problemReporter().switchExpressionNoResultExpressions(this); - return null; - } - - if (this.originalValueResultExpressionTypes == null) { - this.originalValueResultExpressionTypes = new TypeBinding[resultExpressionsCount]; - this.finalValueResultExpressionTypes = new TypeBinding[resultExpressionsCount]; - for (int i = 0; i < resultExpressionsCount; ++i) { - this.finalValueResultExpressionTypes[i] = this.originalValueResultExpressionTypes[i] = - this.resultExpressions.get(i).resolvedType; - } - } - if (isPolyExpression()) { //The type of a poly switch expression is the same as its target type. - if (this.expectedType == null || !this.expectedType.isProperType(true)) { - return new PolyTypeBinding(this); - } - return this.resolvedType = computeConversions(this.scope, this.expectedType) ? this.expectedType : null; - } - // fall through - } else { - // re-resolving of poly expression: - resultExpressionsCount = this.resultExpressions != null ? this.resultExpressions.size() : 0; - if (resultExpressionsCount == 0) - return this.resolvedType = null; // error flagging would have been done during the earlier phase. - for (int i = 0; i < resultExpressionsCount; i++) { - Expression resultExpr = this.resultExpressions.get(i); - TypeBinding origType = this.originalTypeMap.get(resultExpr); - // NB: if origType == null we assume that initial resolving failed hard, rendering re-resolving impossible - if (origType != null && origType.kind() == Binding.POLY_TYPE) { - this.finalValueResultExpressionTypes[i] = this.originalValueResultExpressionTypes[i] = - resultExpr.resolveTypeExpecting(upperScope, this.expectedType); - } - // This is a kludge and only way completion can tell this node to resolve all - // resultExpressions. Ideal solution is to remove all other expressions except - // the one that contain the completion node. - if (this.resolveAll) continue; - if (resultExpr.resolvedType == null || !resultExpr.resolvedType.isValidBinding()) - return this.resolvedType = null; - } - this.resolvedType = computeConversions(this.scope, this.expectedType) ? this.expectedType : null; - // fall through - } - - if (resultExpressionsCount == 1) - return this.resolvedType = this.originalValueResultExpressionTypes[0]; - - boolean typeUniformAcrossAllArms = true; - TypeBinding tmp = this.originalValueResultExpressionTypes[0]; - for (int i = 1, l = this.originalValueResultExpressionTypes.length; i < l; ++i) { - TypeBinding originalType = this.originalValueResultExpressionTypes[i]; - if (originalType != null && TypeBinding.notEquals(tmp, originalType)) { - typeUniformAcrossAllArms = false; - break; - } - } - // If the result expressions all have the same type (which may be the null type), - // then that is the type of the switch expression. - if (typeUniformAcrossAllArms) { - tmp = this.originalValueResultExpressionTypes[0]; - for (int i = 1; i < resultExpressionsCount; ++i) { - if (this.originalValueResultExpressionTypes[i] != null) - tmp = NullAnnotationMatching.moreDangerousType(tmp, this.originalValueResultExpressionTypes[i]); - } - return this.resolvedType = tmp; - } - - boolean typeBbolean = true; - for (TypeBinding t : this.originalValueResultExpressionTypes) { - if (t != null) - typeBbolean &= t.id == T_boolean || t.id == T_JavaLangBoolean; - } - LookupEnvironment env = this.scope.environment(); - /* - * Otherwise, if the type of each result expression is boolean or Boolean, - * an unboxing conversion (5.1.8) is applied to each result expression of type Boolean, - * and the switch expression has type boolean. - */ - if (typeBbolean) { - for (int i = 0; i < resultExpressionsCount; ++i) { - if (this.originalValueResultExpressionTypes[i] == null) continue; - if (this.originalValueResultExpressionTypes[i].id == T_boolean) continue; - this.finalValueResultExpressionTypes[i] = env.computeBoxingType(this.originalValueResultExpressionTypes[i]); - this.resultExpressions.get(i).computeConversion(this.scope, this.finalValueResultExpressionTypes[i], this.originalValueResultExpressionTypes[i]); + super.resolve(upperScope); // drills down into switch block, which will cause yield expressions to be discovered and added to `this.results` + if (this.results.rExpressions.size() == 0) { + upperScope.problemReporter().unyieldingSwitchExpression(this); + return this.resolvedType = null; } - return this.resolvedType = TypeBinding.BOOLEAN; + if (isPolyExpression() && (this.expectedType == null || !this.expectedType.isProperType(true))) + return new PolyTypeBinding(this); + } else { // re-resolve poly-expression against the eventual target type. + for (Expression rExpression : this.results.rExpressions) + if (rExpression.isPolyExpression()) + rExpression.resolveTypeExpecting(upperScope, this.expectedType); } - - /* - * Otherwise, if the type of each result expression is convertible to a numeric type (5.1.8), the type - * of the switch expression is given by numeric promotion (5.6.3) applied to the result expressions. - */ - boolean typeNumeric = true; - TypeBinding resultNumeric = null; - HashSet typeSet = new HashSet<>(); - /* JLS 13 5.6 Numeric Contexts - * An expression appears in a numeric context if it is one of:.... - * ...8. a result expression of a standalone switch expression (15.28.1), - * where all the result expressions are convertible to a numeric type - * If any expression is of a reference type, it is subjected to unboxing conversion (5.1.8). - */ - for (int i = 0; i < resultExpressionsCount; ++i) { - TypeBinding originalType = this.originalValueResultExpressionTypes[i]; - if (originalType == null) continue; - tmp = originalType.isNumericType() ? originalType : env.computeBoxingType(originalType); - if (!tmp.isNumericType()) { - typeNumeric = false; - break; - } - typeSet.add(TypeBinding.wellKnownType(this.scope, tmp.id)); - } - if (typeNumeric) { - /* If any result expression is of type double, then other result expressions that are not of type double - * are widened to double. - * Otherwise, if any result expression is of type float, then other result expressions that are not of - * type float are widened to float. - * Otherwise, if any result expression is of type long, then other result expressions that are not of - * type long are widened to long. - */ - TypeBinding[] dfl = new TypeBinding[]{// do not change the order JLS 13 5.6 - TypeBinding.DOUBLE, - TypeBinding.FLOAT, - TypeBinding.LONG}; - for (TypeBinding binding : dfl) { - if (typeSet.contains(binding)) { - resultNumeric = binding; - break; - } - } - - /* Otherwise, if any expression appears in a numeric array context or a numeric arithmetic context, - * rather than a numeric choice context, then the promoted type is int and other expressions that are - * not of type int undergo widening primitive conversion to int. - not applicable since numeric choice context. - * [Note: A numeric choice context is a numeric context that is either a numeric conditional expression or - * a standalone switch expression where all the result expressions are convertible to a numeric type.] - */ - - /* Otherwise, if any result expression is of type int and is not a constant expression, the other - * result expressions that are not of type int are widened to int. - */ - resultNumeric = resultNumeric != null ? resultNumeric : check_nonconstant_int(); - - resultNumeric = resultNumeric != null ? resultNumeric : // one among the first few rules applied. - getResultNumeric(typeSet); // check the rest - typeSet = null; // hey gc! - for (int i = 0; i < resultExpressionsCount; ++i) { - this.resultExpressions.get(i).computeConversion(this.scope, - resultNumeric, this.originalValueResultExpressionTypes[i]); - this.finalValueResultExpressionTypes[i] = resultNumeric; - } - // After the conversion(s), if any, value set conversion (5.1.13) is then applied to each result expression. - return this.resolvedType = resultNumeric; - } - - /* Otherwise, boxing conversion (5.1.7) is applied to each result expression that has a primitive type, - * after which the type of the switch expression is the result of applying capture conversion (5.1.10) - * to the least upper bound (4.10.4) of the types of the result expressions. - */ - for (int i = 0; i < resultExpressionsCount; ++i) { - TypeBinding finalType = this.finalValueResultExpressionTypes[i]; - if (finalType != null && finalType.isBaseType()) - this.finalValueResultExpressionTypes[i] = env.computeBoxingType(finalType); - } - TypeBinding commonType = this.scope.lowerUpperBound(this.finalValueResultExpressionTypes); - if (commonType != null) { - for (int i = 0, l = this.resultExpressions.size(); i < l; ++i) { - if (this.originalValueResultExpressionTypes[i] == null) continue; - this.resultExpressions.get(i).computeConversion(this.scope, commonType, this.originalValueResultExpressionTypes[i]); - this.finalValueResultExpressionTypes[i] = commonType; - } - return this.resolvedType = commonType.capture(this.scope, this.sourceStart, this.sourceEnd); - } - this.scope.problemReporter().switchExpressionIncompatibleResultExpressions(this); - return null; + return this.resolvedType = this.results.resultType(); } finally { if (this.scope != null) this.scope.enclosingCase = null; // no longer inside switch case block } } - private TypeBinding check_nonconstant_int() { - for (int i = 0, l = this.resultExpressions.size(); i < l; ++i) { - Expression e = this.resultExpressions.get(i); - TypeBinding type = this.originalValueResultExpressionTypes[i]; - if (type != null && type.id == T_int && e.constant == Constant.NotAConstant) - return TypeBinding.INT; - } - return null; - } - private boolean areAllIntegerResultExpressionsConvertibleToTargetType(TypeBinding targetType) { - for (int i = 0, l = this.resultExpressions.size(); i < l; ++i) { - Expression e = this.resultExpressions.get(i); - TypeBinding t = this.originalValueResultExpressionTypes[i]; - if (!TypeBinding.equalsEquals(t, TypeBinding.INT)) continue; - if (!e.isConstantValueOfTypeAssignableToType(t, targetType)) - return false; + + // We have resolved the switch expression to be if type `switchType'. Allow result expressions to adapt. + // Return the type after applying capture conversion. + private TypeBinding resolveAsType(TypeBinding switchType) { + for (Expression rExpression : this.results.rExpressions) { + if (rExpression.resolvedType != null && rExpression.resolvedType.isValidBinding()) { + if (rExpression.isConstantValueOfTypeAssignableToType(rExpression.resolvedType, switchType) || rExpression.resolvedType.isCompatibleWith(switchType)) { + rExpression.computeConversion(this.scope, switchType, rExpression.resolvedType); + if (rExpression.resolvedType.needsUncheckedConversion(switchType)) + this.scope.problemReporter().unsafeTypeConversion(rExpression, rExpression.resolvedType, switchType); + if (rExpression instanceof CastExpression && (rExpression.bits & (ASTNode.UnnecessaryCast | ASTNode.DisableUnnecessaryCastCheck)) == 0) + CastExpression.checkNeedForAssignedCast(this.scope, switchType, (CastExpression) rExpression); + } else if (isBoxingCompatible(rExpression.resolvedType, switchType, rExpression, this.scope)) { + rExpression.computeConversion(this.scope, switchType, rExpression.resolvedType); + if (rExpression instanceof CastExpression && (rExpression.bits & (ASTNode.UnnecessaryCast | ASTNode.DisableUnnecessaryCastCheck)) == 0) + CastExpression.checkNeedForAssignedCast(this.scope, switchType, (CastExpression) rExpression); + } else { + this.scope.problemReporter().typeMismatchError(rExpression.resolvedType, switchType, rExpression, null); + return null; + } + } } - return true; + return switchType.capture(this.scope, this.sourceStart, this.sourceEnd); } + + @Override public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo) { flowInfo = super.analyseCode(currentScope, flowContext, flowInfo); - this.resultExpressionNullStatus = new ArrayList<>(0); - final CompilerOptions compilerOptions = currentScope.compilerOptions(); - if (compilerOptions.enableSyntacticNullAnalysisForFields) { - for (Expression re : this.resultExpressions) { - this.resultExpressionNullStatus.add(re.nullStatus(flowInfo, flowContext)); - // wipe information that was meant only for this result expression: - flowContext.expireNullCheckedFieldInfo(); + if ((this.switchBits & LabeledRules) != 0) { // 15.28.1 + for (Statement stmt : this.statements) { + if (stmt instanceof Block && stmt.canCompleteNormally()) + currentScope.problemReporter().switchExpressionBlockCompletesNormally(stmt); } + } else { + Statement ultimateStmt = this.statements[this.statements.length - 1]; // length guaranteed > 0 + if (ultimateStmt.canCompleteNormally()) + currentScope.problemReporter().switchExpressionBlockCompletesNormally(ultimateStmt); } - computeNullStatus(flowInfo, flowContext); - return flowInfo; - } - - private TypeBinding check_csb(Set typeSet, TypeBinding candidate) { - if (!typeSet.contains(candidate)) - return null; - TypeBinding[] allowedTypes = SwitchExpression.type_map.get(candidate); - Set allowedSet = Arrays.stream(allowedTypes).collect(Collectors.toSet()); - - if (!allowedSet.containsAll(typeSet)) - return null; + if (currentScope.compilerOptions().enableSyntacticNullAnalysisForFields) + flowContext.expireNullCheckedFieldInfo(); // wipe information that was meant only for this result expression: - return areAllIntegerResultExpressionsConvertibleToTargetType(candidate) ? - candidate : null; - } - private TypeBinding getResultNumeric(Set typeSet) { - // note: if an expression has a type integer, then it will be a constant - // since non-constant integers are already processed before reaching here. - - /* Otherwise, if any expression is of type short, and every other expression is either of type short, - * or of type byte, or a constant expression of type int with a value that is representable in the - * type short, then T is short, the byte expressions undergo widening primitive conversion to short, - * and the int expressions undergo narrowing primitive conversion to short.\ - * - * Otherwise, if any expression is of type byte, and every other expression is either of type byte or a - * constant expression of type int with a value that is representable in the type byte, then T is byte - * and the int expressions undergo narrowing primitive conversion to byte. - * - * Otherwise, if any expression is of type char, and every other expression is either of type char or a - * constant expression of type int with a value that is representable in the type char, then T is char - * and the int expressions undergo narrowing primitive conversion to char. - * - * Otherwise, T is int and all the expressions that are not of type int undergo widening - * primitive conversion to int. - */ - - // DO NOT Change the order below [as per JLS 13 5.6 ]. - TypeBinding[] csb = new TypeBinding[] {TypeBinding.SHORT, TypeBinding.BYTE, TypeBinding.CHAR}; - for (TypeBinding c : csb) { - TypeBinding result = check_csb(typeSet, c); - if (result != null) - return result; + int status = this.results.rExpressions.iterator().next().nullStatus(flowInfo, flowContext); + int combinedStatus = status; + boolean identicalStatus = true; + for (Expression rExpression : this.results.rExpressions) { + status = rExpression.nullStatus(flowInfo, flowContext); + identicalStatus &= combinedStatus == status; + combinedStatus |= status; } - /* Otherwise, all the result expressions that are not of type int are widened to int. */ - return TypeBinding.INT; + if (identicalStatus) { + this.nullStatus = status; + return flowInfo; + } + status = Expression.computeNullStatus(0, combinedStatus); + if (status > 0) + this.nullStatus = status; + return flowInfo; } + @Override public boolean isPolyExpression() { - if (this.isPolyExpression) - return true; - // JLS 13 15.28.1 A switch expression is a poly expression if it appears in an assignment context or - // an invocation context (5.2, 5.3). Otherwise, it is a standalone expression. - return this.isPolyExpression = this.expressionContext == ASSIGNMENT_CONTEXT || - this.expressionContext == INVOCATION_CONTEXT; + return this.expressionContext == ASSIGNMENT_CONTEXT || this.expressionContext == INVOCATION_CONTEXT; } @Override public boolean isTrulyExpression() { @@ -683,7 +454,7 @@ public boolean isCompatibleWith(TypeBinding left, Scope skope) { if (!isPolyExpression()) return super.isCompatibleWith(left, skope); - for (Expression e : this.resultExpressions) { + for (Expression e : this.results.rExpressions) { if (!e.isCompatibleWith(left, skope)) return false; } @@ -694,7 +465,7 @@ public boolean isBoxingCompatibleWith(TypeBinding targetType, Scope skope) { if (!isPolyExpression()) return super.isBoxingCompatibleWith(targetType, skope); - for (Expression e : this.resultExpressions) { + for (Expression e : this.results.rExpressions) { if (!(e.isCompatibleWith(targetType, skope) || e.isBoxingCompatibleWith(targetType, skope))) return false; } @@ -706,29 +477,29 @@ public boolean sIsMoreSpecific(TypeBinding s, TypeBinding t, Scope skope) { return true; if (!isPolyExpression()) return false; - for (Expression e : this.resultExpressions) { + for (Expression e : this.results.rExpressions) { if (!e.sIsMoreSpecific(s, t, skope)) return false; } return true; } + + @Override + public StringBuilder printExpression(int tab, StringBuilder output, boolean makeShort) { + if (!makeShort) { + return super.printExpression(tab, output); + } else { + printIndent(tab, output).append("switch ("); //$NON-NLS-1$ + return this.expression.printExpression(0, output).append(") { ... }"); //$NON-NLS-1$ + } + } + @Override public TypeBinding expectedType() { return this.expectedType; } - @Override - public void traverse( - ASTVisitor visitor, - BlockScope blockScope) { - - if (visitor.visit(this, blockScope)) { - this.expression.traverse(visitor, blockScope); - if (this.statements != null) { - int statementsLength = this.statements.length; - for (int i = 0; i < statementsLength; i++) - this.statements[i].traverse(visitor, this.scope); - } - } - visitor.endVisit(this, blockScope); + + public Set resultExpressions() { + return this.results.rExpressions; } } \ No newline at end of file diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java index fdd30bbc2c..e5b681457f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java @@ -19,16 +19,18 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; -import static org.eclipse.jdt.internal.compiler.ClassFile.CONSTANT_BOOTSTRAP__PRIMITIVE_CLASS; import static org.eclipse.jdt.internal.compiler.ClassFile.CONSTANT_BOOTSTRAP__GET_STATIC_FINAL; +import static org.eclipse.jdt.internal.compiler.ClassFile.CONSTANT_BOOTSTRAP__PRIMITIVE_CLASS; import java.lang.invoke.ConstantBootstraps; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; +import java.util.Set; import java.util.function.Function; import java.util.function.IntPredicate; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.ast.CaseStatement.ResolvedCase; @@ -53,7 +55,6 @@ import org.eclipse.jdt.internal.compiler.lookup.SyntheticMethodBinding; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; @SuppressWarnings("rawtypes") @@ -86,6 +87,7 @@ public static record SingletonBootstrap(String id, char[] selector, char[] signa public int switchBits; public boolean containsPatterns; + public boolean containsRecordPatterns; public boolean containsNull; boolean nullProcessed = false; BranchLabel switchPatternRestartTarget; @@ -103,6 +105,7 @@ public static record SingletonBootstrap(String id, char[] selector, char[] signa public final static int TotalPattern = ASTNode.Bit3; public final static int Exhaustive = ASTNode.Bit4; public final static int QualifiedEnum = ASTNode.Bit5; + public final static int LabeledBlockStatementGroup = ASTNode.Bit6; // for switch on strings private static final char[] SecretStringVariableName = " switchDispatchString".toCharArray(); //$NON-NLS-1$ @@ -365,8 +368,7 @@ public boolean visit(TNode node) { } } if (node.type instanceof ReferenceBinding ref && ref.isSealed()) { - List allAllowedTypes = ref.getAllEnumerableReferenceTypes(); - this.covers &= isExhaustiveWithCaseTypes(allAllowedTypes, availableTypes); + this.covers &= caseElementsCoverSealedType(ref, availableTypes); return this.covers; } this.covers = false; @@ -401,9 +403,6 @@ protected int getFallThroughState(Statement stmt, BlockScope blockScope) { } return FALLTHROUGH; } - protected void completeNormallyCheck(BlockScope blockScope) { - // do nothing - } protected boolean needToCheckFlowInAbsenceOfDefaultBranch() { return !this.isExhaustive(); } @@ -416,7 +415,6 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl } SwitchFlowContext switchContext = new SwitchFlowContext(flowContext, this, (this.breakLabel = new BranchLabel()), true, true); - switchContext.isExpression = this instanceof SwitchExpression; CompilerOptions compilerOptions = currentScope.compilerOptions(); @@ -477,19 +475,6 @@ else if ((statement.bits & ASTNode.DocumentedFallthrough) == 0) { // the case is complaintLevel = initialComplaintLevel; // reset complaint fallThroughState = this.containsPatterns ? FALLTHROUGH : CASE; } else { - if (!isTrulyExpression() && - compilerOptions.complianceLevel >= ClassFileConstants.JDK14 && - statement instanceof YieldStatement && - ((YieldStatement) statement).isImplicit) { - YieldStatement y = (YieldStatement) statement; - Expression e = ((YieldStatement) statement).expression; - /* JLS 13 14.11.2 - Switch labeled rules in switch statements differ from those in switch expressions (15.28). - In switch statements they must be switch labeled statement expressions, ... */ - if (!y.expression.statementExpression()) { - this.scope.problemReporter().invalidExpressionAsStatement(e); - } - } fallThroughState = getFallThroughState(statement, currentScope); // reset below if needed } if ((complaintLevel = statement.complainIfUnreachable(caseInits, this.scope, complaintLevel, true)) < Statement.COMPLAINED_UNREACHABLE) { @@ -505,7 +490,6 @@ Switch labeled rules in switch statements differ from those in switch expression } } } - completeNormallyCheck(currentScope); } final TypeBinding resolvedTypeBinding = this.expression.resolvedType; @@ -823,13 +807,6 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { int max = localKeysCopy[constantCount - 1]; int min = localKeysCopy[0]; if ((long) (constantCount * 2.5) > ((long) max - (long) min)) { - - // work-around 1.3 VM bug, if max>0x7FFF0000, must use lookup bytecode - // see http://dev.eclipse.org/bugs/show_bug.cgi?id=21557 - if (max > 0x7FFF0000 && currentScope.compilerOptions().complianceLevel < ClassFileConstants.JDK1_4) { - codeStream.lookupswitch(defaultLabel, this.constants, sortedIndexes, caseLabels); - - } else { codeStream.tableswitch( defaultLabel, min, @@ -838,7 +815,6 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { sortedIndexes, this.constMapping, caseLabels); - } } else { codeStream.lookupswitch(defaultLabel, this.constants, sortedIndexes, caseLabels); } @@ -885,7 +861,6 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { if (this.preSwitchInitStateIndex != -1) { codeStream.removeNotDefinitelyAssignedVariables(currentScope, this.preSwitchInitStateIndex); } - defaultLabel.place(); /* a default case is not needed for an exhaustive switch expression * we need to handle the default case to throw an error in order to make the stack map consistent. * All cases will return a value on the stack except the missing default case. @@ -894,9 +869,10 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { CompilerOptions compilerOptions = this.scope != null ? this.scope.compilerOptions() : null; if (compilerOptions.complianceLevel >= ClassFileConstants.JDK19) { // since 19 we have MatchException for this - if (codeStream.lastAbruptCompletion != codeStream.position) { + if (this.statements.length > 0 && this.statements[this.statements.length - 1].canCompleteNormally()) { codeStream.goto_(this.breakLabel); // hop, skip and jump over match exception throw. } + defaultLabel.place(); codeStream.newJavaLangMatchException(); codeStream.dup(); codeStream.aconst_null(); @@ -905,6 +881,7 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { codeStream.athrow(); } else { // old style using IncompatibleClassChangeError: + defaultLabel.place(); codeStream.newJavaLangIncompatibleClassChangeError(); codeStream.dup(); codeStream.invokeJavaLangIncompatibleClassChangeErrorDefaultConstructor(); @@ -1108,11 +1085,9 @@ boolean isAllowedType(TypeBinding type) { @Override public void resolve(BlockScope upperScope) { try { - boolean isEnumSwitch = false; boolean isStringSwitch = false; TypeBinding expressionType = this.expression.resolveType(upperScope); CompilerOptions compilerOptions = upperScope.compilerOptions(); - boolean isEnhanced = checkAndSetEnhanced(upperScope, expressionType); if (expressionType != null) { this.expression.computeConversion(upperScope, expressionType, expressionType); checkType: { @@ -1128,15 +1103,11 @@ public void resolve(BlockScope upperScope) { if (expressionType.isCompatibleWith(TypeBinding.INT)) break checkType; } else if (expressionType.isEnum()) { - isEnumSwitch = true; - if (compilerOptions.complianceLevel < ClassFileConstants.JDK1_5) { - upperScope.problemReporter().incorrectSwitchType(this.expression, expressionType); // https://bugs.eclipse.org/bugs/show_bug.cgi?id=360317 - } break checkType; } else if (!this.containsPatterns && !this.containsNull && upperScope.isBoxingCompatibleWith(expressionType, TypeBinding.INT)) { this.expression.computeConversion(upperScope, TypeBinding.INT, expressionType); break checkType; - } else if (compilerOptions.complianceLevel >= ClassFileConstants.JDK1_7 && expressionType.id == TypeIds.T_JavaLangString) { + } else if (expressionType.id == TypeIds.T_JavaLangString) { if (this.containsPatterns || this.containsNull) { isStringSwitch = !JavaFeature.PATTERN_MATCHING_IN_SWITCH.isSupported(compilerOptions); this.isNonTraditional = true; @@ -1291,65 +1262,100 @@ && defaultFound && isExhaustive()) { if (this.dispatchPatternCopy == null) { addSecretPatternSwitchVariables(upperScope); } - reportMixingCaseTypes(); - // check default case for non-enum switch: - boolean flagged = checkAndFlagDefaultSealed(upperScope, compilerOptions); - if (!flagged && this.defaultCase == null) { - if (ignoreMissingDefaultCase(compilerOptions, isEnumSwitch) && isEnumSwitch) { - upperScope.methodScope().hasMissingSwitchDefault = true; - } else { - if (!isEnumSwitch && !isExhaustive()) { + complainIfNotExhaustiveSwitch(upperScope, expressionType, compilerOptions); + + } finally { + if (this.scope != null) this.scope.enclosingCase = null; // no longer inside switch case block + } + } + private void complainIfNotExhaustiveSwitch(BlockScope upperScope, TypeBinding selectorType, CompilerOptions compilerOptions) { + + boolean isEnhanced = isEnhancedSwitch(upperScope, selectorType); + if (selectorType != null && selectorType.isEnum()) { + if (isEnhanced) + this.switchBits |= SwitchStatement.Exhaustive; // negated below if found otherwise + if (this.defaultCase != null && !compilerOptions.reportMissingEnumCaseDespiteDefault) + return; + + int constantCount = this.otherConstants == null ? 0 : this.otherConstants.length; + if (!((this.switchBits & TotalPattern) != 0) && + ((this.containsPatterns || this.containsNull) || + (constantCount >= this.caseCount && + constantCount != ((ReferenceBinding)selectorType).enumConstantCount()))) { + Set unenumeratedConstants = unenumeratedConstants((ReferenceBinding) selectorType, constantCount); + if (unenumeratedConstants.size() != 0) { + this.switchBits &= ~SwitchStatement.Exhaustive; + if (!(this.defaultCase != null && (this.defaultCase.bits & DocumentedCasesOmitted) != 0)) { if (isEnhanced) upperScope.problemReporter().enhancedSwitchMissingDefaultCase(this.expression); - else - upperScope.problemReporter().missingDefaultCase(this, isEnumSwitch, expressionType); - } - } - } - // Exhaustiveness check for enum switch - if (isEnumSwitch && compilerOptions.complianceLevel >= ClassFileConstants.JDK1_5) { - if (this.defaultCase == null || compilerOptions.reportMissingEnumCaseDespiteDefault) { - int constantCount = this.otherConstants == null ? 0 : this.otherConstants.length; - if (isEnhanced) - this.switchBits |= SwitchStatement.Exhaustive; // negated below if found otherwise - if (!((this.switchBits & TotalPattern) != 0) && - ((this.containsPatterns || this.containsNull) || - (constantCount >= this.caseCount && - constantCount != ((ReferenceBinding)expressionType).enumConstantCount()))) { - FieldBinding[] enumFields = ((ReferenceBinding) expressionType.erasure()).fields(); - for (int i = 0, max = enumFields.length; i < max; i++) { - FieldBinding enumConstant = enumFields[i]; - if ((enumConstant.modifiers & ClassFileConstants.AccEnum) == 0) continue; - findConstant : { - for (int j = 0; j < constantCount; j++) { - if ((enumConstant.id + 1) == this.otherConstants[j].c.intValue()) // zero should not be returned see bug 141810 - break findConstant; - } - this.switchBits &= ~SwitchStatement.Exhaustive; - // enum constant did not get referenced from switch - boolean suppress = (this.defaultCase != null && (this.defaultCase.bits & DocumentedCasesOmitted) != 0); - if (!suppress) { - if (isEnhanced) - upperScope.problemReporter().enhancedSwitchMissingDefaultCase(this.expression); - else - reportMissingEnumConstantCase(upperScope, enumConstant); - } + else { + for (FieldBinding enumConstant : unenumeratedConstants) { + reportMissingEnumConstantCase(upperScope, enumConstant); } } } } - if (this.defaultCase == null) { - if (ignoreMissingDefaultCase(compilerOptions, isEnumSwitch)) { - upperScope.methodScope().hasMissingSwitchDefault = true; - } else { - upperScope.problemReporter().missingDefaultCase(this, isEnumSwitch, expressionType); + } + + if (this.defaultCase == null) { + if (ignoreMissingDefaultCase(compilerOptions)) { + upperScope.methodScope().hasMissingSwitchDefault = true; + } else { + upperScope.problemReporter().missingDefaultCase(this, true, selectorType); + } + } + return; + } + + if (isExhaustive() || this.defaultCase != null || selectorType == null) { + if (isEnhanced) + this.switchBits |= SwitchStatement.Exhaustive; + return; + } + + if (JavaFeature.PATTERN_MATCHING_IN_SWITCH.isSupported(compilerOptions) && selectorType.isSealed() && caseElementsCoverSealedType((ReferenceBinding) selectorType, this.caseLabelElementTypes)) { + this.switchBits |= SwitchStatement.Exhaustive; + return; + } + + if (selectorType.isRecordWithComponents() && this.containsRecordPatterns && caseElementsCoverRecordType(upperScope, compilerOptions, (ReferenceBinding) selectorType)) { + this.switchBits |= SwitchStatement.Exhaustive; + return; + } + + if (!isExhaustive()) { + if (isEnhanced) + upperScope.problemReporter().enhancedSwitchMissingDefaultCase(this.expression); + else + upperScope.problemReporter().missingDefaultCase(this, false, selectorType); + } + } + + // Return the set of enumerations belonging to the selector enum type that are NOT listed in case statements. + private Set unenumeratedConstants(ReferenceBinding enumType, int constantCount) { + FieldBinding[] enumFields = ((ReferenceBinding) enumType.erasure()).fields(); + Set unenumerated = new HashSet<>(Arrays.asList(enumFields)); + for (int i = 0, max = enumFields.length; i < max; i++) { + FieldBinding enumConstant = enumFields[i]; + if ((enumConstant.modifiers & ClassFileConstants.AccEnum) == 0) { + unenumerated.remove(enumConstant); + continue; + } + for (int j = 0; j < constantCount; j++) { + if (TypeBinding.equalsEquals(this.otherConstants[j].e.resolvedType, enumType)) { + if (this.otherConstants[j].e instanceof NameReference reference) { + FieldBinding field = reference.fieldBinding(); + int intValue = field.original().id + 1; + if ((enumConstant.id + 1) == intValue) { // zero should not be returned see bug 141810 + unenumerated.remove(enumConstant); + break; + } } } } - } finally { - if (this.scope != null) this.scope.enclosingCase = null; // no longer inside switch case block } + return unenumerated; } private boolean isCaseStmtNullDefault(CaseStatement caseStmt) { return caseStmt != null @@ -1366,9 +1372,9 @@ private boolean isExhaustive() { return (this.switchBits & SwitchStatement.Exhaustive) != 0; } - private boolean checkAndSetEnhanced(BlockScope upperScope, TypeBinding expressionType) { + private boolean isEnhancedSwitch(BlockScope upperScope, TypeBinding expressionType) { if (JavaFeature.PATTERN_MATCHING_IN_SWITCH.isSupported(upperScope.compilerOptions()) - && expressionType != null && !(this instanceof SwitchExpression )) { + && expressionType != null && !(this instanceof SwitchExpression)) { boolean acceptableType = !expressionType.isEnum(); switch (expressionType.id) { @@ -1392,7 +1398,7 @@ private boolean checkAndSetEnhanced(BlockScope upperScope, TypeBinding expressio return true; } } - if (expressionType != null && JavaFeature.PRIMITIVES_IN_PATTERNS.isSupported(upperScope.compilerOptions())) { + if (expressionType != null && !(this instanceof SwitchExpression) && JavaFeature.PRIMITIVES_IN_PATTERNS.isSupported(upperScope.compilerOptions())) { switch (expressionType.id) { case TypeIds.T_float: case TypeIds.T_double: @@ -1407,89 +1413,47 @@ private boolean checkAndSetEnhanced(BlockScope upperScope, TypeBinding expressio } return false; } - private boolean checkAndFlagDefaultSealed(BlockScope skope, CompilerOptions compilerOptions) { - if (this.defaultCase != null) { // mark covered as a side effect (since covers is intro in 406) - this.switchBits |= SwitchStatement.Exhaustive; - return false; - } - boolean checkSealed = this.containsPatterns - && JavaFeature.SEALED_CLASSES.isSupported(compilerOptions) - && JavaFeature.PATTERN_MATCHING_IN_SWITCH.isSupported(compilerOptions) - && this.expression.resolvedType instanceof ReferenceBinding; - if (!checkSealed) return false; - ReferenceBinding ref = (ReferenceBinding) this.expression.resolvedType; - if (!(ref.isClass() || ref.isInterface() || ref.isTypeVariable() || ref.isIntersectionType())) - return false; - if (ref instanceof TypeVariableBinding) { - TypeVariableBinding tvb = (TypeVariableBinding) ref; - ref = tvb.firstBound instanceof ReferenceBinding ? (ReferenceBinding) tvb.firstBound : ref; - } - if (ref.isRecord()) { - boolean isRecordPattern = false; - for (Pattern pattern : this.caseLabelElements) { - if (pattern instanceof RecordPattern) { - isRecordPattern = true; - break; - } - } - if (isRecordPattern) - return checkAndFlagDefaultRecord(skope, compilerOptions, ref); - } - if (!ref.isSealed()) return false; - if (!isExhaustiveWithCaseTypes(ref.getAllEnumerableReferenceTypes(), this.caseLabelElementTypes)) { - if (this instanceof SwitchExpression) // non-exhaustive switch expressions will be flagged later. - return false; - skope.problemReporter().enhancedSwitchMissingDefaultCase(this.expression); - return true; - } - this.switchBits |= SwitchStatement.Exhaustive; - return false; - } - private boolean checkAndFlagDefaultRecord(BlockScope skope, CompilerOptions compilerOptions, ReferenceBinding ref) { - RecordComponentBinding[] comps = ref.components(); - List allallowedTypes = new ArrayList<>(); - allallowedTypes.add(ref); - if (comps == null || comps.length == 0) { - if (!isExhaustiveWithCaseTypes(allallowedTypes, this.caseLabelElementTypes)) { - skope.problemReporter().enhancedSwitchMissingDefaultCase(this.expression); - return true; - } - return false; - } - // non-zero components - RNode head = new RNode(ref); + + private boolean caseElementsCoverRecordType(BlockScope skope, CompilerOptions compilerOptions, ReferenceBinding recordType) { + RNode head = new RNode(recordType); for (Pattern pattern : this.caseLabelElements) { head.addPattern(pattern); } CoverageCheckerVisitor ccv = new CoverageCheckerVisitor(); head.traverse(ccv); - if (!ccv.covers) { - skope.problemReporter().enhancedSwitchMissingDefaultCase(this.expression); - return true; // not exhaustive, error flagged - } - this.switchBits |= SwitchStatement.Exhaustive; - return false; + return ccv.covers; } - private boolean isExhaustiveWithCaseTypes(List allAllowedTypes, List listedTypes) { - int pendingTypes = allAllowedTypes.size(); - for (ReferenceBinding pt : allAllowedTypes) { - /* Per JLS 14.11.1.1: A type T that names an abstract sealed class or sealed interface is covered - if every permitted direct subclass or subinterface of it is covered. These subtypes are already - added to allAllowedTypes and subject to cover test. - */ - if (pt.isAbstract() && pt.isSealed()) { - --pendingTypes; + + private boolean caseElementsCoverSealedType(ReferenceBinding sealedType, List listedTypes) { + List allAllowedTypes = sealedType.getAllEnumerableAvatars(); + Iterator iterator = allAllowedTypes.iterator(); + while (iterator.hasNext()) { + ReferenceBinding next = iterator.next(); + if (next.isAbstract() && next.isSealed()) { + /* Per JLS 14.11.1.1: A type T that names an abstract sealed class or sealed interface is covered + if every permitted direct subclass or subinterface of it is covered. These subtypes are already + added to allAllowedTypes and subject to cover test. + */ + iterator.remove(); continue; } + if (next.isEnum()) { + int constantCount = this.otherConstants == null ? 0 : this.otherConstants.length; + Set unenumeratedConstants = unenumeratedConstants(next, constantCount); + if (unenumeratedConstants.size() == 0) { + iterator.remove(); + continue; + } + } for (TypeBinding type : listedTypes) { // permits specifies classes, not parameterizations - if (pt.erasure().isCompatibleWith(type.erasure())) { - --pendingTypes; + if (next.erasure().isCompatibleWith(type.erasure())) { + iterator.remove(); break; } } } - return pendingTypes == 0; + return allAllowedTypes.size() == 0; } private boolean needPatternDispatchCopy() { if (this.containsPatterns || (this.switchBits & QualifiedEnum) != 0) @@ -1525,33 +1489,14 @@ private void addSecretPatternSwitchVariables(BlockScope upperScope) { protected void reportMissingEnumConstantCase(BlockScope upperScope, FieldBinding enumConstant) { upperScope.problemReporter().missingEnumConstantCase(this, enumConstant); } - protected boolean ignoreMissingDefaultCase(CompilerOptions compilerOptions, boolean isEnumSwitch) { + protected boolean ignoreMissingDefaultCase(CompilerOptions compilerOptions) { return compilerOptions.getSeverity(CompilerOptions.MissingDefaultCase) == ProblemSeverities.Ignore; } @Override public boolean isTrulyExpression() { return false; } - private void reportMixingCaseTypes() { - if (this.caseCount == 0) { - if (this.defaultCase != null && this.defaultCase.isExpr) - this.switchBits |= LabeledRules; - return; - } - if (this.cases[0] == null) - return; - boolean isExpr = this.cases[0].isExpr; - if (isExpr) this.switchBits |= LabeledRules; - for (int i = 1, l = this.caseCount; i < l; ++i) { - if (this.cases[i].isExpr != isExpr) { - this.scope.problemReporter().switchExpressionMixedCase(this.cases[i]); - return; - } - } - if (this.defaultCase != null && this.defaultCase.isExpr != isExpr) { - this.scope.problemReporter().switchExpressionMixedCase(this.defaultCase); - } - } + private void reportDuplicateCase(final Statement duplicate, final Statement original, int length) { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SynchronizedStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SynchronizedStatement.java index 863d676822..cef936eed7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SynchronizedStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/SynchronizedStatement.java @@ -16,12 +16,18 @@ import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.InsideStatementWithFinallyBlockFlowContext; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -public class SynchronizedStatement extends SubRoutineStatement { +public class SynchronizedStatement extends StatementWithFinallyBlock { // comes with a hidden finally block that contains the monitorexit sequence public Expression expression; public Block block; @@ -66,7 +72,7 @@ public FlowInfo analyseCode( flowInfo = this.block.analyseCode( this.scope, - new InsideSubRoutineFlowContext(flowContext, this), + new InsideStatementWithFinallyBlockFlowContext(flowContext, this), expressionFlowInfo); this.mergedSynchronizedInitStateIndex = @@ -81,7 +87,7 @@ public FlowInfo analyseCode( } @Override -public boolean isSubRoutineEscaping() { +public boolean isFinallyBlockEscaping() { return false; } @@ -168,10 +174,10 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { } /** - * @see SubRoutineStatement#generateSubRoutineInvocation(BlockScope, CodeStream, Object, int, LocalVariableBinding) + * @see StatementWithFinallyBlock#generateFinallyBlock(BlockScope, CodeStream, Object, int) */ @Override -public boolean generateSubRoutineInvocation(BlockScope currentScope, CodeStream codeStream, Object targetLocation, int stateIndex, LocalVariableBinding secretLocal) { +public boolean generateFinallyBlock(BlockScope currentScope, CodeStream codeStream, Object targetLocation, int stateIndex) { codeStream.load(this.synchroVariable); codeStream.monitorexit(); exitAnyExceptionHandler(); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TextBlock.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TextBlock.java index 8675c3cd82..601391b855 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TextBlock.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TextBlock.java @@ -12,12 +12,6 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.ast; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.jdt.core.compiler.CharOperation; -import org.eclipse.jdt.core.compiler.InvalidInputException; -import org.eclipse.jdt.internal.compiler.parser.ScannerHelper; import org.eclipse.jdt.internal.compiler.util.Util; public class TextBlock extends StringLiteral { @@ -31,272 +25,6 @@ private TextBlock(char[] token, int start, int end, int lineNumber, int endLineN public static TextBlock createTextBlock(char[] token, int start, int end, int lineNumber, int endLineNumber) { return new TextBlock(token, start,end, lineNumber, endLineNumber); } - public static char[][] convertTextBlockToLines(char[] all) { - // 1. Normalize, i.e. convert all CR CRLF to LF - all = normalize(all); - // 2. Split into lines. Consider both \n and \r as line separators - char[][] lines = CharOperation.splitOn('\n', all); - int size = lines.length; - List list = new ArrayList<>(lines.length); - for(int i = 0; i < lines.length; i++) { - char[] line = lines[i]; - if (i + 1 == size && line.length == 0) { - list.add(line); - break; - } - char[][] sub = CharOperation.splitOn('\r', line); - if (sub.length == 0) { - list.add(line); - } else { - for (char[] cs : sub) { - list.add(cs); - } - } - } - size = list.size(); - lines = list.toArray(new char[size][]); - return lines; - } - public static int getTextBlockIndent(char[][] lines) { - int prefix = -1; - int size = lines.length; - for(int i = 0; i < size; i++) { - char[] line = lines[i]; - boolean blank = true; - int whitespaces = 0; - for (char c : line) { - if (blank) { - if (ScannerHelper.isWhitespace(c)) { - whitespaces++; - } else { - blank = false; - } - } - } - // The last line with closing delimiter is part of the - // determining line list even if empty - if (!blank || (i+1 == size)) { - if (prefix < 0 || whitespaces < prefix) { - prefix = whitespaces; - } - } - } - return prefix == -1 ? 0 : prefix; - } - public static int getIndentForFragments(char[][] fragments) { - int prefix = -1; - for(int index = 0; index < fragments.length; index++) { - char[][] lines = convertTextBlockToLines(fragments[index]); - int size = lines.length; - for(int i = 0; i < size; i++) { - if (index > 0 && i == 0) { - continue; - } - char[] line = lines[i]; - boolean blank = true; - int whitespaces = 0; - for (char c : line) { - if (blank) { - if (ScannerHelper.isWhitespace(c)) { - whitespaces++; - } else { - blank = false; - } - } - } - // The last line with closing delimiter is part of the - // determining line list even if empty - if (!blank || (i+1 == size)) { - if (prefix < 0 || whitespaces < prefix) { - prefix = whitespaces; - } - } - } - } - return prefix == -1 ? 0 : prefix; - } - public static char[] formatTextBlock(char[] all, int indent, boolean followsExp, boolean precedesExp) { - char[][] lines = convertTextBlockToLines(all); - return formatTextBlock(lines, indent, followsExp, precedesExp); - } - public static char[] formatTextBlock(char[][] lines, int indent) { - return formatTextBlock(lines, indent, false, false); - } - public static char[] formatTextBlock(char[][] lines, int indent, boolean followsExp, boolean precedesExp) { - // Handle incidental white space - // Split into lines and identify determining lines - // Remove the common white space prefix - // Handle escape sequences that are not already done in getNextToken0() - int size = lines.length; - StringBuilder result = new StringBuilder(); - boolean newLine = false; - for(int i = 0; i < size; i++) { - if (i > 0) - followsExp = false; - char[] l = lines[i]; - int length = l.length; - int prefix = followsExp ? 0 : indent; - // Remove the common prefix from each line - // And remove all trailing whitespace - // Finally append the \n at the end of the line (except the last line) - int trail = length; - // Only the last line is really prefixed to the embedded - // expression in a string template - if (!precedesExp || i < (size -1)) { - for(;trail > 0;) { - if (!ScannerHelper.isWhitespace(l[trail-1])) { - break; - } - trail--; - } - } - if (i >= (size -1)) { - if (newLine) result.append('\n'); - if (trail < prefix) - continue; - newLine = getLineContent(result, l, prefix, trail-1, false, true); - } else { - if (i > 0 && newLine) - result.append('\n'); - if (trail <= prefix) { - newLine = true; - } else { - boolean merge = length > 0 && l[length - 1] == '\\'; - newLine = getLineContent(result, l, prefix, trail-1, merge, false); - } - } - } - return result.toString().toCharArray(); - } - private static char[] normalize(char[] content) { - StringBuilder result = new StringBuilder(); - boolean isCR = false; - for (char c : content) { - switch (c) { - case '\r': - result.append(c); - isCR = true; - break; - case '\n': - if (!isCR) { - result.append(c); - } - isCR = false; - break; - default: - result.append(c); - isCR = false; - break; - } - } - return result.toString().toCharArray(); - } - // This method is for handling the left over escaped characters during the first - // scanning (scanForStringLiteral). Admittedly this goes over the text block - // content again char by char, but this is required in order to correctly - // treat all the white space and line endings - private static boolean getLineContent(StringBuilder result, char[] line, int start, int end, boolean merge, boolean lastLine) { - int lastPointer = 0; - for(int i = start; i < end;) { - char c = line[i]; - if (c != '\\') { - i++; - continue; - } - if (i < end) { - if (lastPointer + 1 <= i) { - result.append(CharOperation.subarray(line, lastPointer == 0 ? start : lastPointer, i)); - } - char next = line[++i]; - switch (next) { - case '\\' : - result.append('\\'); - if (i == end) - merge = false; - break; - case 's' : - result.append(' '); - break; - case '"': - result.append('"'); - break; - case 'b' : - result.append('\b'); - break; - case 'n' : - result.append('\n'); - break; - case 'r' : - result.append('\r'); - break; - case 't' : - result.append('\t'); - break; - case 'f' : - result.append('\f'); - break; - default : - // Direct copy from Scanner#scanEscapeCharacter - int pos = i + 1; - int number = ScannerHelper.getHexadecimalValue(next); - if (number >= 0 && number <= 7) { - boolean zeroToThreeNot = number > 3; - try { - if (pos <= end && ScannerHelper.isDigit(next = line[pos])) { - pos++; - int digit = ScannerHelper.getHexadecimalValue(next); - if (digit >= 0 && digit <= 7) { - number = (number * 8) + digit; - if (pos <= end && ScannerHelper.isDigit(next = line[pos])) { - pos++; - if (zeroToThreeNot) { - // has read \NotZeroToThree OctalDigit Digit --> ignore last character - } else { - digit = ScannerHelper.getHexadecimalValue(next); - if (digit >= 0 && digit <= 7){ // has read \ZeroToThree OctalDigit OctalDigit - number = (number * 8) + digit; - } else { - // has read \ZeroToThree OctalDigit NonOctalDigit --> ignore last character - } - } - } else { - // has read \OctalDigit NonDigit--> ignore last character - } - } else { - // has read \OctalDigit NonOctalDigit--> ignore last character - } - } else { - // has read \OctalDigit --> ignore last character - } - } catch (InvalidInputException e) { - // Unlikely as this has already been processed in scanForStringLiteral() - } - if (number < 255) { - next = (char) number; - } - result.append(next); - lastPointer = i = pos; - continue; - } else { - // Dealing with just '\' - result.append(c); - lastPointer = i; - continue; - } - } - lastPointer = ++i; - } - } - end = merge ? end : end >= line.length ? end : end + 1; - char[] chars = lastPointer == 0 ? - CharOperation.subarray(line, start, end) : - CharOperation.subarray(line, lastPointer, end); - // The below check is because CharOperation.subarray tend to return null when the - // boundaries produce a zero sized char[] - if (chars != null && chars.length > 0) - result.append(chars); - return (!merge && !lastLine); - } @Override public StringBuilder printExpression(int indent, StringBuilder output) { output.append("\"\"\"\n"); //$NON-NLS-1$ diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ThisReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ThisReference.java index 00daeb26c8..25ffc2c9f9 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ThisReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ThisReference.java @@ -19,12 +19,17 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.codegen.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.JavaFeature; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; +import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; +import org.eclipse.jdt.internal.compiler.lookup.MethodScope; +import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class ThisReference extends Reference { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TrueLiteral.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TrueLiteral.java index 86c395fae9..dd62c435ab 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TrueLiteral.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TrueLiteral.java @@ -14,8 +14,8 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.impl.BooleanConstant; import org.eclipse.jdt.internal.compiler.lookup.BlockScope; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TryStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TryStatement.java index d47d75cc72..6e45a3b492 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TryStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TryStatement.java @@ -1,3 +1,4 @@ +// GROOVY PATCHED /******************************************************************************* * Copyright (c) 2000, 2024 IBM Corporation and others. * @@ -36,15 +37,25 @@ import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.codegen.ConstantPool; +import org.eclipse.jdt.internal.compiler.codegen.ExceptionLabel; +import org.eclipse.jdt.internal.compiler.codegen.MultiCatchExceptionLabel; +import org.eclipse.jdt.internal.compiler.codegen.StackMapFrameCodeStream; +import org.eclipse.jdt.internal.compiler.flow.ExceptionHandlingFlowContext; +import org.eclipse.jdt.internal.compiler.flow.FinallyFlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.InsideStatementWithFinallyBlockFlowContext; +import org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.impl.JavaFeature; import org.eclipse.jdt.internal.compiler.lookup.*; -public class TryStatement extends SubRoutineStatement { +public class TryStatement extends StatementWithFinallyBlock { - static final char[] SECRET_RETURN_ADDRESS_NAME = " returnAddress".toCharArray(); //$NON-NLS-1$ static final char[] SECRET_ANY_HANDLER_NAME = " anyExceptionHandler".toCharArray(); //$NON-NLS-1$ static final char[] SECRET_PRIMARY_EXCEPTION_VARIABLE_NAME = " primaryException".toCharArray(); //$NON-NLS-1$ static final char[] SECRET_CAUGHT_THROWABLE_VARIABLE_NAME = " caughtThrowable".toCharArray(); //$NON-NLS-1$; @@ -59,27 +70,25 @@ public class TryStatement extends SubRoutineStatement { public Block finallyBlock; BlockScope scope; - public UnconditionalFlowInfo subRoutineInits; + public UnconditionalFlowInfo finallyBlockInits; ReferenceBinding[] caughtExceptionTypes; boolean[] catchExits; - BranchLabel subRoutineStartLabel; + BranchLabel finallyBlockStartLabel; public LocalVariableBinding anyExceptionVariable, - returnAddressVariable, secretReturnValue; ExceptionLabel[] declaredExceptionLabels; // only set while generating code - // for inlining/optimizing JSR instructions + // for sharing finally blocks - behavior disabled by https://bugs.eclipse.org/bugs/show_bug.cgi?id=404146; can be enabled only by an undocumented option. private Object[] reusableJSRTargets; private BranchLabel[] reusableJSRSequenceStartLabels; private int[] reusableJSRStateIndexes; private int reusableJSRTargetsCount = 0; - private static final int NO_FINALLY = 0; // no finally block - private static final int FINALLY_SUBROUTINE = 1; // finally is generated as a subroutine (using jsr/ret bytecodes) + private static final int NO_FINALLY = 0; // no finally block private static final int FINALLY_DOES_NOT_COMPLETE = 2; // non returning finally is optimized with only one instance of finally block - private static final int FINALLY_INLINE = 3; // finally block must be inlined since cannot use jsr/ret bytecodes >1.5 + private static final int FINALLY_INLINE = 3; // finally block must be inlined // for local variables table attributes int mergedInitStateIndex = -1; @@ -97,11 +106,11 @@ public class TryStatement extends SubRoutineStatement { public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo) { // Consider the try block and catch block so as to compute the intersection of initializations and - // the minimum exit relative depth amongst all of them. Then consider the subroutine, and append its - // initialization to the try/catch ones, if the subroutine completes normally. If the subroutine does not + // the minimum exit relative depth amongst all of them. Then consider the finally block, and append its + // initialization to the try/catch ones, if the finally block completes normally. If it does not // complete, then only keep this result for the rest of the analysis - // process the finally block (subroutine) - create a context for the subroutine + // process the finally block - create a context for it this.preTryInitStateIndex = currentScope.methodScope().recordInitializationStates(flowInfo); @@ -115,16 +124,13 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl if (this.caughtThrowableVariable != null) { this.caughtThrowableVariable.useFlag = LocalVariableBinding.USED; } - if (this.returnAddressVariable != null) { // TODO (philippe) if subroutine is escaping, unused - this.returnAddressVariable.useFlag = LocalVariableBinding.USED; - } int resourcesLength = this.resources.length; if (resourcesLength > 0) { this.postResourcesInitStateIndexes = new int[resourcesLength]; } - if (this.subRoutineStartLabel == null) { + if (this.finallyBlockStartLabel == null) { // no finally block -- this is a simplified copy of the else part if (flowContext instanceof FinallyFlowContext) { // if this TryStatement sits inside another TryStatement, establish the wiring so that @@ -171,7 +177,12 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl } } if (localVariableBinding != null) { - localVariableBinding.useFlag = LocalVariableBinding.USED; // Is implicitly used anyways. + CompilerOptions compilerOptions = currentScope.compilerOptions(); + long sourceLevel = compilerOptions.sourceLevel; + boolean enablePreviewFeatures = compilerOptions.enablePreviewFeatures; + if (!JavaFeature.UNNAMMED_PATTERNS_AND_VARS.isSupported(sourceLevel, enablePreviewFeatures)) { + localVariableBinding.useFlag = LocalVariableBinding.USED; // Is implicitly used anyways. + } } MethodBinding closeMethod = findCloseMethod(resource, resolvedType); if (closeMethod != null && closeMethod.isValidBinding() && closeMethod.returnType.id == TypeIds.T_void) { @@ -229,11 +240,11 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl return tryInfo; } else { - InsideSubRoutineFlowContext insideSubContext; + InsideStatementWithFinallyBlockFlowContext insideSubContext; FinallyFlowContext finallyContext; - UnconditionalFlowInfo subInfo; + UnconditionalFlowInfo finallyInfo; // analyse finally block first - insideSubContext = new InsideSubRoutineFlowContext(flowContext, this); + insideSubContext = new InsideStatementWithFinallyBlockFlowContext(flowContext, this); if (flowContext instanceof FinallyFlowContext) { // if this TryStatement sits inside another TryStatement, establish the wiring so that // FlowContext.markFinallyNullStatus can report into initsOnFinally of the outer try context: @@ -253,7 +264,7 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl flowInfo); insideSubContext.initsOnFinally = handlingContext.initsOnFinally; - subInfo = + finallyInfo = this.finallyBlock .analyseCode( currentScope, @@ -261,19 +272,19 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl flowInfo.nullInfoLessUnconditionalCopy()) .unconditionalInits(); handlingContext.conditionalLevel = 0; // start collection initsOnFinally only after analysing the finally block - if (subInfo == FlowInfo.DEAD_END) { - this.bits |= ASTNode.IsSubRoutineEscaping; + if (finallyInfo == FlowInfo.DEAD_END) { + this.bits |= ASTNode.IsFinallyBlockEscaping; this.scope.problemReporter().finallyMustCompleteNormally(this.finallyBlock); } else { // for resource analysis we need the finallyInfo in these nested scopes: - FlowInfo finallyInfo = subInfo.copy(); - this.tryBlock.scope.finallyInfo = finallyInfo; + FlowInfo finallyInfoCopy = finallyInfo.copy(); + this.tryBlock.scope.finallyInfo = finallyInfoCopy; if (this.catchBlocks != null) { for (int i = 0; i < this.catchBlocks.length; i++) - this.catchBlocks[i].scope.finallyInfo = finallyInfo; + this.catchBlocks[i].scope.finallyInfo = finallyInfoCopy; } } - this.subRoutineInits = subInfo; + this.finallyBlockInits = finallyInfo; // only try blocks initialize that member - may consider creating a // separate class if needed @@ -368,12 +379,12 @@ public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, Fl this.naturalExitMergeInitStateIndex = currentScope.methodScope().recordInitializationStates(tryInfo); - if (subInfo == FlowInfo.DEAD_END) { + if (finallyInfo == FlowInfo.DEAD_END) { this.mergedInitStateIndex = - currentScope.methodScope().recordInitializationStates(subInfo); - return subInfo; + currentScope.methodScope().recordInitializationStates(finallyInfo); + return finallyInfo; } else { - FlowInfo mergedInfo = tryInfo.addInitializationsFrom(subInfo); + FlowInfo mergedInfo = tryInfo.addInitializationsFrom(finallyInfo); this.mergedInitStateIndex = currentScope.methodScope().recordInitializationStates(mergedInfo); return mergedInfo; @@ -463,7 +474,7 @@ private boolean isUncheckedCatchBlock(int catchBlock) { @Override public ExceptionLabel enterAnyExceptionHandler(CodeStream codeStream) { - if (this.subRoutineStartLabel == null) + if (this.finallyBlockStartLabel == null) return null; return super.enterAnyExceptionHandler(codeStream); } @@ -473,6 +484,10 @@ public void enterDeclaredExceptionHandlers(CodeStream codeStream) { for (int i = 0, length = this.declaredExceptionLabels == null ? 0 : this.declaredExceptionLabels.length; i < length; i++) { this.declaredExceptionLabels[i].placeStart(); } +} + +@Override +public void enterResourceExceptionHandlers(CodeStream codeStream) { int resourceCount = this.resources.length; if (resourceCount > 0 && this.resourceExceptionLabels != null) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=375248 // Reinstall handlers @@ -484,7 +499,7 @@ public void enterDeclaredExceptionHandlers(CodeStream codeStream) { @Override public void exitAnyExceptionHandler() { - if (this.subRoutineStartLabel == null) + if (this.finallyBlockStartLabel == null) return; super.exitAnyExceptionHandler(); } @@ -497,31 +512,24 @@ public void exitDeclaredExceptionHandlers(CodeStream codeStream) { } private int finallyMode() { - if (this.subRoutineStartLabel == null) { + if (this.finallyBlockStartLabel == null) { return NO_FINALLY; - } else if (isSubRoutineEscaping()) { + } else if (isFinallyBlockEscaping()) { return FINALLY_DOES_NOT_COMPLETE; } else { return FINALLY_INLINE; } } -/** - * Try statement code generation with or without jsr bytecode use - * post 1.5 target level, cannot use jsr bytecode, must instead inline finally block - * returnAddress is only allocated if jsr is allowed - */ + @Override public void generateCode(BlockScope currentScope, CodeStream codeStream) { if ((this.bits & ASTNode.IsReachable) == 0) { return; } - boolean isStackMapFrameCodeStream = codeStream instanceof StackMapFrameCodeStream; + // in case the labels needs to be reinitialized // when the code generation is restarted in wide mode this.anyExceptionLabel = null; - this.reusableJSRTargets = null; - this.reusableJSRSequenceStartLabels = null; - this.reusableJSRTargetsCount = 0; int pc = codeStream.position; int finallyMode = finallyMode(); @@ -548,8 +556,8 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream) { } else { exceptionLabels = null; } - if (this.subRoutineStartLabel != null) { - this.subRoutineStartLabel.initialize(codeStream); + if (this.finallyBlockStartLabel != null) { + this.finallyBlockStartLabel.initialize(codeStream); enterAnyExceptionHandler(codeStream); } // generate the try block @@ -669,7 +677,6 @@ Our initialization type state is the same as it was at the end of the just concl // place end positions of user-defined exception labels if (tryBlockHasSomeCode) { - // natural exit may require subroutine invocation (if finally != null) BranchLabel naturalExitLabel = new BranchLabel(codeStream); BranchLabel postCatchesFinallyLabel = null; boolean patternAccessorsMayThrow = codeStream.patternAccessorsMayThrow(this.tryBlock.scope); @@ -681,7 +688,6 @@ Our initialization type state is the same as it was at the end of the just concl if ((this.bits & ASTNode.IsTryBlockExiting) == 0) { int position = codeStream.position; switch(finallyMode) { - case FINALLY_SUBROUTINE : case FINALLY_INLINE : requiresNaturalExit = true; if (this.naturalExitMergeInitStateIndex != -1) { @@ -698,7 +704,7 @@ Our initialization type state is the same as it was at the end of the just concl codeStream.goto_(naturalExitLabel); break; case FINALLY_DOES_NOT_COMPLETE : - codeStream.goto_(this.subRoutineStartLabel); + codeStream.goto_(this.finallyBlockStartLabel); break; } @@ -753,9 +759,7 @@ Our initialization type state is the same as it was at the end of the just concl switch(finallyMode) { case FINALLY_INLINE : // inlined finally here can see all merged variables - if (isStackMapFrameCodeStream) { - ((StackMapFrameCodeStream) codeStream).pushStateIndex(this.naturalExitMergeInitStateIndex); - } + ((StackMapFrameCodeStream) codeStream).pushStateIndex(this.naturalExitMergeInitStateIndex); if (this.catchExitInitStateIndexes[i] != -1) { codeStream.removeNotDefinitelyAssignedVariables(currentScope, this.catchExitInitStateIndexes[i]); codeStream.addDefinitelyAssignedVariables(currentScope, this.catchExitInitStateIndexes[i]); @@ -763,13 +767,9 @@ Our initialization type state is the same as it was at the end of the just concl // entire sequence for finally is associated to finally block this.finallyBlock.generateCode(this.scope, codeStream); codeStream.goto_(postCatchesFinallyLabel); - if (isStackMapFrameCodeStream) { - ((StackMapFrameCodeStream) codeStream).popStateIndex(); - } + ((StackMapFrameCodeStream) codeStream).popStateIndex(); + break; - case FINALLY_SUBROUTINE : - requiresNaturalExit = true; - //$FALL-THROUGH$ case NO_FINALLY : if (this.naturalExitMergeInitStateIndex != -1) { codeStream.removeNotDefinitelyAssignedVariables(currentScope, this.naturalExitMergeInitStateIndex); @@ -778,21 +778,17 @@ Our initialization type state is the same as it was at the end of the just concl codeStream.goto_(naturalExitLabel); break; case FINALLY_DOES_NOT_COMPLETE : - codeStream.goto_(this.subRoutineStartLabel); + codeStream.goto_(this.finallyBlockStartLabel); break; } } } } - // extra handler for trailing natural exit (will be fixed up later on when natural exit is generated below) - ExceptionLabel naturalExitExceptionHandler = requiresNaturalExit && (finallyMode == FINALLY_SUBROUTINE) - ? new ExceptionLabel(codeStream, null) - : null; // addition of a special handler so as to ensure that any uncaught exception (or exception thrown // inside catch blocks) will run the finally block int finallySequenceStartPC = codeStream.position; - if (this.subRoutineStartLabel != null && this.anyExceptionLabel.getCount() != 0) { + if (this.finallyBlockStartLabel != null && this.anyExceptionLabel.getCount() != 0) { codeStream.pushExceptionOnStack(this.scope.getJavaLangThrowable()); if (this.preTryInitStateIndex != -1) { // reset initialization state, as for a normal catch block @@ -800,75 +796,38 @@ Our initialization type state is the same as it was at the end of the just concl codeStream.addDefinitelyAssignedVariables(currentScope, this.preTryInitStateIndex); } placeAllAnyExceptionHandler(); - if (naturalExitExceptionHandler != null) naturalExitExceptionHandler.place(); switch(finallyMode) { - case FINALLY_SUBROUTINE : - // any exception handler - codeStream.store(this.anyExceptionVariable, false); - codeStream.jsr(this.subRoutineStartLabel); - codeStream.recordPositionsFrom(finallySequenceStartPC, this.finallyBlock.sourceStart); - int position = codeStream.position; - codeStream.throwAnyException(this.anyExceptionVariable); - codeStream.recordPositionsFrom(position, this.finallyBlock.sourceEnd); - // subroutine - this.subRoutineStartLabel.place(); - codeStream.pushExceptionOnStack(this.scope.getJavaLangThrowable()); - position = codeStream.position; - codeStream.store(this.returnAddressVariable, false); - codeStream.recordPositionsFrom(position, this.finallyBlock.sourceStart); - this.finallyBlock.generateCode(this.scope, codeStream); - position = codeStream.position; - codeStream.ret(this.returnAddressVariable.resolvedPosition); - codeStream.recordPositionsFrom( - position, - this.finallyBlock.sourceEnd); - // the ret bytecode is part of the subroutine - break; case FINALLY_INLINE : // any exception handler codeStream.store(this.anyExceptionVariable, false); codeStream.addVariable(this.anyExceptionVariable); codeStream.recordPositionsFrom(finallySequenceStartPC, this.finallyBlock.sourceStart); - // subroutine this.finallyBlock.generateCode(currentScope, codeStream); - position = codeStream.position; + int position = codeStream.position; codeStream.throwAnyException(this.anyExceptionVariable); codeStream.removeVariable(this.anyExceptionVariable); if (this.preTryInitStateIndex != -1) { codeStream.removeNotDefinitelyAssignedVariables(currentScope, this.preTryInitStateIndex); } - this.subRoutineStartLabel.place(); + this.finallyBlockStartLabel.place(); codeStream.recordPositionsFrom(position, this.finallyBlock.sourceEnd); break; case FINALLY_DOES_NOT_COMPLETE : // any exception handler codeStream.pop(); - this.subRoutineStartLabel.place(); + this.finallyBlockStartLabel.place(); codeStream.recordPositionsFrom(finallySequenceStartPC, this.finallyBlock.sourceStart); - // subroutine this.finallyBlock.generateCode(this.scope, codeStream); break; } - // will naturally fall into subsequent code after subroutine invocation + // will naturally fall into subsequent code after finally block execution if (requiresNaturalExit) { switch(finallyMode) { - case FINALLY_SUBROUTINE : - naturalExitLabel.place(); - int position = codeStream.position; - naturalExitExceptionHandler.placeStart(); - codeStream.jsr(this.subRoutineStartLabel); - naturalExitExceptionHandler.placeEnd(); - codeStream.recordPositionsFrom( - position, - this.finallyBlock.sourceEnd); - break; case FINALLY_INLINE : // inlined finally here can see all merged variables - if (isStackMapFrameCodeStream) { - ((StackMapFrameCodeStream) codeStream).pushStateIndex(this.naturalExitMergeInitStateIndex); - } + ((StackMapFrameCodeStream) codeStream).pushStateIndex(this.naturalExitMergeInitStateIndex); if (this.naturalExitMergeInitStateIndex != -1) { codeStream.removeNotDefinitelyAssignedVariables(currentScope, this.naturalExitMergeInitStateIndex); codeStream.addDefinitelyAssignedVariables(currentScope, this.naturalExitMergeInitStateIndex); @@ -877,16 +836,14 @@ Our initialization type state is the same as it was at the end of the just concl // entire sequence for finally is associated to finally block this.finallyBlock.generateCode(this.scope, codeStream); if (postCatchesFinallyLabel != null) { - position = codeStream.position; + int position = codeStream.position; // entire sequence for finally is associated to finally block codeStream.goto_(postCatchesFinallyLabel); codeStream.recordPositionsFrom( position, this.finallyBlock.sourceEnd); } - if (isStackMapFrameCodeStream) { - ((StackMapFrameCodeStream) codeStream).popStateIndex(); - } + ((StackMapFrameCodeStream) codeStream).popStateIndex(); break; case FINALLY_DOES_NOT_COMPLETE : break; @@ -899,12 +856,12 @@ Our initialization type state is the same as it was at the end of the just concl postCatchesFinallyLabel.place(); } } else { - // no subroutine, simply position end label (natural exit == end) + // no finally block, simply position end label (natural exit == end) naturalExitLabel.place(); } } else { // try block had no effect, only generate the body of the finally block if any - if (this.subRoutineStartLabel != null) { + if (this.finallyBlockStartLabel != null) { this.finallyBlock.generateCode(this.scope, codeStream); } } @@ -974,44 +931,9 @@ private boolean isDuplicateResourceReference(int index) { return false; } -/** - * @see SubRoutineStatement#generateSubRoutineInvocation(BlockScope, CodeStream, Object, int, LocalVariableBinding) - */ -@Override -public boolean generateSubRoutineInvocation(BlockScope currentScope, CodeStream codeStream, Object targetLocation, int stateIndex, LocalVariableBinding secretLocal) { - - int resourceCount = this.resources.length; - if (resourceCount > 0 && this.resourceExceptionLabels != null) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=375248 - for (int i = resourceCount; i > 0; --i) { - // Disarm the handlers and take care of resource closure. - this.resourceExceptionLabels[i].placeEnd(); - BranchLabel exitLabel = new BranchLabel(codeStream); - int invokeCloseStartPc = codeStream.position; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=343785 - generateCodeSnippet(this.resources[i - 1], codeStream, exitLabel, false); - codeStream.recordPositionsFrom(invokeCloseStartPc, this.tryBlock.sourceEnd); - exitLabel.place(); - } - this.resourceExceptionLabels[0].placeEnd(); // outermost should end here as well, will start again on enter - } - - boolean isStackMapFrameCodeStream = codeStream instanceof StackMapFrameCodeStream; - int finallyMode = finallyMode(); - switch(finallyMode) { - case FINALLY_DOES_NOT_COMPLETE : - if (this.switchExpression != null) { - exitAnyExceptionHandler(); - exitDeclaredExceptionHandlers(codeStream); - this.finallyBlock.generateCode(currentScope, codeStream); - return true; - } - codeStream.goto_(this.subRoutineStartLabel); - return true; - - case NO_FINALLY : - exitDeclaredExceptionHandlers(codeStream); - return false; - } - // optimize subroutine invocation sequences, using the targetLocation (if any) +// Disabled behavior enabled only by an undocumented option. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=404146 +private boolean reusedFinallyBlock(CodeStream codeStream, Object targetLocation, int stateIndex) { + // optimize finally block generation, using the targetLocation (if any) CompilerOptions options = this.scope.compilerOptions(); if (options.shareCommonFinallyBlocks && targetLocation != null) { boolean reuseTargetLocation = true; @@ -1030,7 +952,7 @@ public boolean generateSubRoutineInvocation(BlockScope currentScope, CodeStream continue nextReusableTarget; } // current target has been used in the past, simply branch to its label - if ((this.reusableJSRStateIndexes[i] != stateIndex) && finallyMode == FINALLY_INLINE) { + if ((this.reusableJSRStateIndexes[i] != stateIndex) && finallyMode() == FINALLY_INLINE) { reuseTargetLocation = false; break nextReusableTarget; } else { @@ -1056,29 +978,55 @@ public boolean generateSubRoutineInvocation(BlockScope currentScope, CodeStream this.reusableJSRSequenceStartLabels[this.reusableJSRTargetsCount++] = reusableJSRSequenceStartLabel; } } - if (finallyMode == FINALLY_INLINE) { - if (isStackMapFrameCodeStream) { - ((StackMapFrameCodeStream) codeStream).pushStateIndex(stateIndex); + return false; +} +/** + * @see StatementWithFinallyBlock#generateFinallyBlock(BlockScope, CodeStream, Object, int) + */ +@Override +public boolean generateFinallyBlock(BlockScope currentScope, CodeStream codeStream, Object targetLocation, int stateIndex) { + + int resourceCount = this.resources.length; + if (resourceCount > 0 && this.resourceExceptionLabels != null) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=375248 + for (int i = resourceCount; i > 0; --i) { + // Disarm the handlers and take care of resource closure. + this.resourceExceptionLabels[i].placeEnd(); + BranchLabel exitLabel = new BranchLabel(codeStream); + int invokeCloseStartPc = codeStream.position; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=343785 + generateCodeSnippet(this.resources[i - 1], codeStream, exitLabel, false); + codeStream.recordPositionsFrom(invokeCloseStartPc, this.tryBlock.sourceEnd); + exitLabel.place(); } - // cannot use jsr bytecode, then simply inline the subroutine - // inside try block, ensure to deactivate all catch block exception handlers while inlining finally block + this.resourceExceptionLabels[0].placeEnd(); // outermost should end here as well, will start again on enter + } + + int finallyMode = finallyMode(); + switch (finallyMode) { + case FINALLY_DOES_NOT_COMPLETE: + codeStream.goto_(this.finallyBlockStartLabel); + return true; + case NO_FINALLY: + exitDeclaredExceptionHandlers(codeStream); + return false; + } + + /********* Begin: undocumented behavior off by default ******* */ + if (reusedFinallyBlock( codeStream, targetLocation, stateIndex)) + return true; + /********* End: undocumented behavior off by default ******* */ + + if (finallyMode == FINALLY_INLINE) { + ((StackMapFrameCodeStream) codeStream).pushStateIndex(stateIndex); exitAnyExceptionHandler(); exitDeclaredExceptionHandlers(codeStream); this.finallyBlock.generateCode(currentScope, codeStream); - if (isStackMapFrameCodeStream) { - ((StackMapFrameCodeStream) codeStream).popStateIndex(); - } - } else { - // classic subroutine invocation, distinguish case of non-returning subroutine - codeStream.jsr(this.subRoutineStartLabel); - exitAnyExceptionHandler(); - exitDeclaredExceptionHandlers(codeStream); + ((StackMapFrameCodeStream) codeStream).popStateIndex(); } return false; } @Override -public boolean isSubRoutineEscaping() { - return (this.bits & ASTNode.IsSubRoutineEscaping) != 0; +public boolean isFinallyBlockEscaping() { + return (this.bits & ASTNode.IsFinallyBlockEscaping) != 0; } @Override @@ -1123,9 +1071,16 @@ public StringBuilder printStatement(int indent, StringBuilder output) { public void resolve(BlockScope upperScope) { // special scope for secret locals optimization. this.scope = new BlockScope(upperScope); - + /* GROOVY edit + if (upperScope.enclosingSwitchExpression() instanceof SwitchExpression swich) + */ + var swich = upperScope.enclosingSwitchExpression(); + if (swich != null) { + // GROOVY end + swich.jvmStackVolatile = true; // ought to prepare for any raised exception blowing up the the operand stack to smithereens + } BlockScope finallyScope = null; - BlockScope resourceManagementScope = null; // Single scope to hold all resources and additional secret variables. + BlockScope resourceManagementScope = null; // Single scope to hold all resources and additional secret variables. int resourceCount = this.resources.length; if (resourceCount > 0) { resourceManagementScope = new BlockScope(this.scope); @@ -1188,7 +1143,7 @@ public void resolve(BlockScope upperScope) { // provision for returning and forcing the finally block to run MethodScope methodScope = this.scope.methodScope(); - this.subRoutineStartLabel = new BranchLabel(); + this.finallyBlockStartLabel = new BranchLabel(); this.anyExceptionVariable = new LocalVariableBinding(TryStatement.SECRET_ANY_HANDLER_NAME, this.scope.getJavaLangThrowable(), ClassFileConstants.AccDefault, false); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java index 4b7f2b81cb..aa65bb9401 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java @@ -33,16 +33,30 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; - -import org.eclipse.jdt.core.compiler.*; -import org.eclipse.jdt.internal.compiler.*; -import org.eclipse.jdt.internal.compiler.impl.*; +import org.eclipse.jdt.core.compiler.CategorizedProblem; +import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.core.compiler.IProblem; +import org.eclipse.jdt.internal.compiler.ASTVisitor; +import org.eclipse.jdt.internal.compiler.ClassFile; +import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.InitializationFlowContext; +import org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; +import org.eclipse.jdt.internal.compiler.impl.JavaFeature; +import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; +import org.eclipse.jdt.internal.compiler.impl.StringConstant; import org.eclipse.jdt.internal.compiler.lookup.*; -import org.eclipse.jdt.internal.compiler.parser.*; -import org.eclipse.jdt.internal.compiler.problem.*; +import org.eclipse.jdt.internal.compiler.parser.Parser; +import org.eclipse.jdt.internal.compiler.problem.AbortCompilation; +import org.eclipse.jdt.internal.compiler.problem.AbortCompilationUnit; +import org.eclipse.jdt.internal.compiler.problem.AbortMethod; +import org.eclipse.jdt.internal.compiler.problem.AbortType; +import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; +import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; import org.eclipse.jdt.internal.compiler.util.SimpleSetOfCharArray; import org.eclipse.jdt.internal.compiler.util.Util; @@ -1056,7 +1070,7 @@ public void manageEnclosingInstanceAccessIfNecessary(BlockScope currentScope, Fl Scope outerScope = currentScope.parent; if (!methodScope.isConstructorCall) { nestedType.addSyntheticArgumentAndField(nestedType.enclosingType()); - outerScope = outerScope.enclosingClassScope(); + outerScope = outerScope.enclosingInstanceScope(); earlySeen = methodScope.isInsideEarlyConstructionContext(nestedType.enclosingType(), false); } if (JavaFeature.FLEXIBLE_CONSTRUCTOR_BODIES.isSupported(currentScope.compilerOptions())) { @@ -1074,6 +1088,8 @@ public void manageEnclosingInstanceAccessIfNecessary(BlockScope currentScope, Fl earlySeen = cs.insideEarlyConstructionContext; } outerScope = outerScope.parent; + if (outerScope instanceof MethodScope ms && ms.isStatic) + break; } } } @@ -1349,7 +1365,9 @@ public void resolve() { this.scope.problemReporter().missingDeprecatedAnnotationForType(this); } if ((annotationTagBits & TagBits.AnnotationFunctionalInterface) != 0) { - if(!this.binding.isFunctionalInterface(this.scope)) { + if (this.binding.isSealed()) { + this.scope.problemReporter().functionalInterfaceMayNotBeSealed(this); + } else if (!this.binding.isFunctionalInterface(this.scope)) { this.scope.problemReporter().notAFunctionalInterface(this); } } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeParameter.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeParameter.java index 2fd8cbeb2c..694046e6d3 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeParameter.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeParameter.java @@ -19,7 +19,6 @@ package org.eclipse.jdt.internal.compiler.ast; import java.util.List; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationCollector; @@ -27,19 +26,7 @@ import org.eclipse.jdt.internal.compiler.codegen.AnnotationContext; import org.eclipse.jdt.internal.compiler.codegen.AnnotationTargetTypeConstants; import org.eclipse.jdt.internal.compiler.codegen.CodeStream; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; public class TypeParameter extends AbstractVariableDeclaration { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java index 1eb31bbc5b..38a822204e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java @@ -18,20 +18,10 @@ import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.flow.FlowContext; import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.JavaFeature; -import org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; public class TypePattern extends Pattern implements IGenerateTypeCheck { @@ -155,7 +145,7 @@ public void generateTestingConversion(BlockScope scope, CodeStream codeStream) { case WIDENING_REFERENCE_AND_UNBOXING_COVERSION_AND_WIDENING_PRIMITIVE_CONVERSION: int rhsUnboxed = TypeIds.box2primitive(provided.superclass().id); codeStream.generateUnboxingConversion(rhsUnboxed); - this.computeConversion(scope, TypeBinding.wellKnownBaseType(rhsUnboxed), expected); + this.computeConversion(scope, expected, TypeBinding.wellKnownBaseType(rhsUnboxed)); codeStream.generateImplicitConversion(this.implicitConversion); break; case NARROWING_AND_UNBOXING_CONVERSION: @@ -212,7 +202,11 @@ public boolean dominates(Pattern p) { return false; if (p.resolvedType == null || this.resolvedType == null) return false; - return p.resolvedType.erasure().isSubtypeOf(this.resolvedType.erasure(), false); + + if (p.resolvedType.isSubtypeOf(this.resolvedType, false)) + return true; + + return p.resolvedType.erasure().findSuperTypeOriginatingFrom(this.resolvedType.erasure()) != null; } @Override @@ -244,8 +238,11 @@ public TypeBinding resolveType(BlockScope scope) { this.local.resolve(scope, true); if (this.local.binding != null) { this.local.binding.modifiers |= ExtraCompilerModifiers.AccOutOfFlowScope; // start out this way, will be BlockScope.include'd when definitely assigned - if (enclosingPattern != null) - this.local.binding.useFlag = LocalVariableBinding.USED; // syntactically required even if untouched + CompilerOptions compilerOptions = scope.compilerOptions(); + if (!JavaFeature.UNNAMMED_PATTERNS_AND_VARS.isSupported(compilerOptions.sourceLevel, compilerOptions.enablePreviewFeatures)) { + if (enclosingPattern != null) + this.local.binding.useFlag = LocalVariableBinding.USED; // syntactically required even if untouched + } if (this.local.type != null) this.resolvedType = this.local.binding.type; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeReference.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeReference.java index 42d66fdccc..1e02242bb5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeReference.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypeReference.java @@ -42,7 +42,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching.CheckMode; @@ -53,22 +52,7 @@ import org.eclipse.jdt.internal.compiler.flow.FlowInfo; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.Substitution; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; public abstract class TypeReference extends Expression { @@ -573,9 +557,6 @@ && isTypeUseDeprecated(type, scope)) { public boolean isTypeReference() { return true; } -public boolean isImplicit() { - return false; -} public boolean isWildcard() { return false; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.java index f15cb60366..f022c2f517 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.java @@ -17,11 +17,16 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.impl.BooleanConstant; +import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class UnaryExpression extends OperatorExpression { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java index 90f81191f2..e0a895c707 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java @@ -20,11 +20,16 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.impl.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; +import org.eclipse.jdt.internal.compiler.codegen.CodeStream; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.LoopingFlowContext; +import org.eclipse.jdt.internal.compiler.impl.Constant; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class WhileStatement extends Statement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Wildcard.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Wildcard.java index 2f2915df4c..2ed6275715 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Wildcard.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Wildcard.java @@ -23,7 +23,13 @@ import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.lookup.Binding; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.ClassScope; +import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; +import org.eclipse.jdt.internal.compiler.lookup.Scope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; +import org.eclipse.jdt.internal.compiler.lookup.WildcardBinding; /** * Node to represent Wildcard diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/YieldStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/YieldStatement.java index fdb4ca5390..aad443020e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/YieldStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/YieldStatement.java @@ -14,20 +14,18 @@ package org.eclipse.jdt.internal.compiler.ast; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.codegen.CodeStream; -import org.eclipse.jdt.internal.compiler.flow.*; -import org.eclipse.jdt.internal.compiler.impl.Constant; -import org.eclipse.jdt.internal.compiler.lookup.*; +import org.eclipse.jdt.internal.compiler.flow.FlowContext; +import org.eclipse.jdt.internal.compiler.flow.FlowInfo; +import org.eclipse.jdt.internal.compiler.flow.InsideStatementWithFinallyBlockFlowContext; +import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class YieldStatement extends BranchStatement { public Expression expression; public SwitchExpression switchExpression; - public boolean isImplicit; - static final char[] SECRET_YIELD_RESULT_VALUE_NAME = " secretYieldValue".toCharArray(); //$NON-NLS-1$ - private LocalVariableBinding secretYieldResultValue = null; public YieldStatement(Expression expression, int sourceStart, int sourceEnd) { super(null, sourceStart, sourceEnd); @@ -36,188 +34,146 @@ public YieldStatement(Expression expression, int sourceStart, int sourceEnd) { @Override public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo) { - // this.switchExpression != null true here. - - // here requires to generate a sequence of finally blocks invocations depending corresponding - // to each of the traversed try statements, so that execution will terminate properly. - - // lookup the null label, this should answer the returnContext - for implicit yields, the nesting - // doesn't occur since it immediately follow '->' and hence identical to default break - ie the - // immediate breakable context is guaranteed to be the one intended; - // while explicit yield should move up the parent to the switch expression. - FlowContext targetContext = flowContext.getTargetContextForYield(!this.isImplicit); + /* Lookup target context: since an implicit yield immediately follows '->', it cannot be wrapped by another context, + so the immediate breakable context is guaranteed to be the one intended, while explicit yield should move up the parents + to the immediate enclosing switch **expression** + */ + FlowContext targetContext = flowContext.getTargetContextForYield(this.isImplicit); flowInfo = this.expression.analyseCode(currentScope, flowContext, flowInfo); this.expression.checkNPEbyUnboxing(currentScope, flowContext, flowInfo); - if (flowInfo.reachMode() == FlowInfo.REACHABLE && currentScope.compilerOptions().isAnnotationBasedNullAnalysisEnabled) - checkAgainstNullAnnotation(currentScope, flowContext, flowInfo, this.expression); targetContext.recordAbruptExit(); targetContext.expireNullCheckedFieldInfo(); - this.initStateIndex = - currentScope.methodScope().recordInitializationStates(flowInfo); + this.initStateIndex = currentScope.methodScope().recordInitializationStates(flowInfo); this.targetLabel = targetContext.breakLabel(); FlowContext traversedContext = flowContext; - int subCount = 0; - this.subroutines = new SubRoutineStatement[5]; + int finallys = 0; + this.statementsWithFinallyBlock = new StatementWithFinallyBlock[5]; do { - SubRoutineStatement sub; - if ((sub = traversedContext.subroutine()) != null) { - if (subCount == this.subroutines.length) { - System.arraycopy(this.subroutines, 0, (this.subroutines = new SubRoutineStatement[subCount*2]), 0, subCount); // grow - } - this.subroutines[subCount++] = sub; - if (sub.isSubRoutineEscaping()) { + StatementWithFinallyBlock stmt; + if ((stmt = traversedContext.statementWithFinallyBlock()) != null) { + if (finallys == this.statementsWithFinallyBlock.length) + System.arraycopy(this.statementsWithFinallyBlock, 0, (this.statementsWithFinallyBlock = new StatementWithFinallyBlock[finallys*2]), 0, finallys); // grow + this.statementsWithFinallyBlock[finallys++] = stmt; + if (stmt.isFinallyBlockEscaping()) { + this.bits |= ASTNode.IsAnyFinallyBlockEscaping; break; } } traversedContext.recordReturnFrom(flowInfo.unconditionalInits()); traversedContext.recordBreakTo(targetContext); - if (traversedContext instanceof InsideSubRoutineFlowContext) { - ASTNode node = traversedContext.associatedNode; - if (node instanceof TryStatement) { - flowInfo.addInitializationsFrom(((TryStatement) node).subRoutineInits); // collect inits + if (traversedContext instanceof InsideStatementWithFinallyBlockFlowContext) { + if (traversedContext.associatedNode instanceof TryStatement ts) { + flowInfo.addInitializationsFrom(ts.finallyBlockInits); // collect inits } } else if (traversedContext == targetContext) { - // only record break info once accumulated through subroutines, and only against target context targetContext.recordBreakFrom(flowInfo); break; } } while ((traversedContext = traversedContext.getLocalParent()) != null); - // resize subroutines - if (subCount != this.subroutines.length) { - System.arraycopy(this.subroutines, 0, (this.subroutines = new SubRoutineStatement[subCount]), 0, subCount); - } - return FlowInfo.DEAD_END; -} - -@Override -protected void setSubroutineSwitchExpression(SubRoutineStatement sub) { - sub.setSwitchExpression(this.switchExpression); -} + if (finallys != this.statementsWithFinallyBlock.length) + System.arraycopy(this.statementsWithFinallyBlock, 0, (this.statementsWithFinallyBlock = new StatementWithFinallyBlock[finallys]), 0, finallys); -protected void addSecretYieldResultValue(BlockScope scope) { - SwitchExpression se = this.switchExpression; - if (se == null || !se.containsTry) - return; - LocalVariableBinding local = new LocalVariableBinding( - YieldStatement.SECRET_YIELD_RESULT_VALUE_NAME, - se.resolvedType, - ClassFileConstants.AccDefault, - false); - local.setConstant(Constant.NotAConstant); - local.useFlag = LocalVariableBinding.USED; - local.declaration = new LocalDeclaration(YieldStatement.SECRET_YIELD_RESULT_VALUE_NAME, 0, 0); - assert se.yieldResolvedPosition >= 0; - local.resolvedPosition = se.yieldResolvedPosition; - assert local.resolvedPosition < scope.maxOffset; - scope.addLocalVariable(local); - this.secretYieldResultValue = local; + return FlowInfo.DEAD_END; } -@Override -protected void restartExceptionLabels(CodeStream codeStream) { - SubRoutineStatement.reenterAllExceptionHandlers(this.subroutines, -1, codeStream); +private void adjustOperandStackTopIfNeeded(CodeStream codeStream) { // See https://github.com/eclipse-jdt/eclipse.jdt.core/issues/3135 + if (this.expression.resolvedType == TypeBinding.NULL) { + if (!this.switchExpression.resolvedType.isBaseType()) { // no opcode called for to align the types, but we need to adjust the notion of type of TOS. + codeStream.operandStack.pop(TypeBinding.NULL); + codeStream.operandStack.push(this.switchExpression.resolvedType); + } + } } @Override public void generateCode(BlockScope currentScope, CodeStream codeStream) { - if ((this.bits & ASTNode.IsReachable) == 0) { + + if ((this.bits & ASTNode.IsReachable) == 0) return; - } - boolean generateExpressionResultCodeExpanded = false; - if (this.switchExpression != null && this.switchExpression.containsTry && this.switchExpression.resolvedType != null ) { - generateExpressionResultCodeExpanded = true; - addSecretYieldResultValue(currentScope); - assert this.secretYieldResultValue != null; - codeStream.record(this.secretYieldResultValue); - SingleNameReference lhs = new SingleNameReference(this.secretYieldResultValue.name, 0); - lhs.binding = this.secretYieldResultValue; - lhs.bits &= ~ASTNode.RestrictiveFlagMASK; // clear bits - lhs.bits |= Binding.LOCAL; - lhs.bits |= ASTNode.IsSecretYieldValueUsage; - ((LocalVariableBinding) lhs.binding).markReferenced(); // TODO : Can be skipped? - Assignment assignment = new Assignment(lhs, this.expression, 0); - assignment.generateCode(currentScope, codeStream); + + if (this.switchExpression != null) + this.switchExpression.refillOperandStackIfNeeded(codeStream, this); + + int pc = codeStream.position; + boolean expressionGenerationDeferred = true; // If possible defer generating the expression to until after inlining of enclosing try's finally {} + if (this.expression.hasSideEffects() || this.statementsWithFinallyBlock.length == 0) { // can't defer or no need to defer + expressionGenerationDeferred = false; + boolean valueRequired = this.switchExpression != null && (this.bits & ASTNode.IsAnyFinallyBlockEscaping) == 0; // no value needed if finally completes abruptly or for a statement switch + this.expression.generateCode(currentScope, codeStream, valueRequired); + if (valueRequired) + adjustOperandStackTopIfNeeded(codeStream); } else { - this.expression.generateCode(currentScope, codeStream, this.switchExpression != null); + codeStream.nop(); // prevent exception ranges from being empty on account of deferral : try { yield 42; } catch (Exception ex) {} ... } - int pc = codeStream.position; - // generation of code responsible for invoking the finally - // blocks in sequence - if (this.subroutines != null){ - for (int i = 0, max = this.subroutines.length; i < max; i++){ - SubRoutineStatement sub = this.subroutines[i]; - SwitchExpression se = sub.getSwitchExpression(); - setSubroutineSwitchExpression(sub); - boolean didEscape = sub.generateSubRoutineInvocation(currentScope, codeStream, this.targetLabel, this.initStateIndex, null); - sub.setSwitchExpression(se); - if (didEscape) { - if (generateExpressionResultCodeExpanded) { - codeStream.removeVariable(this.secretYieldResultValue); - } - codeStream.recordPositionsFrom(pc, this.sourceStart); - SubRoutineStatement.reenterAllExceptionHandlers(this.subroutines, i, codeStream); - if (this.initStateIndex != -1) { - codeStream.removeNotDefinitelyAssignedVariables(currentScope, this.initStateIndex); - codeStream.addDefinitelyAssignedVariables(currentScope, this.initStateIndex); - } - restartExceptionLabels(codeStream); - return; + + // inline finally blocks in sequence + for (int i = 0, max = this.statementsWithFinallyBlock.length; i < max; i++) { + StatementWithFinallyBlock stmt = this.statementsWithFinallyBlock[i]; + boolean didEscape = stmt.generateFinallyBlock(currentScope, codeStream, this.expression.reusableJSRTarget(), this.initStateIndex); + if (didEscape) { + codeStream.recordPositionsFrom(pc, this.sourceStart); + StatementWithFinallyBlock.reenterAllExceptionHandlers(this.statementsWithFinallyBlock, i, codeStream); + if (this.initStateIndex != -1) { + codeStream.removeNotDefinitelyAssignedVariables(currentScope, this.initStateIndex); + codeStream.addDefinitelyAssignedVariables(currentScope, this.initStateIndex); } + return; } } - if (generateExpressionResultCodeExpanded) { - this.switchExpression.refillOperandStack(codeStream); - codeStream.load(this.secretYieldResultValue); - codeStream.removeVariable(this.secretYieldResultValue); + + if (expressionGenerationDeferred) { + this.expression.generateCode(currentScope, codeStream, this.switchExpression != null); + adjustOperandStackTopIfNeeded(codeStream); } + codeStream.goto_(this.targetLabel); - codeStream.recordPositionsFrom(pc, this.sourceStart); - SubRoutineStatement.reenterAllExceptionHandlers(this.subroutines, -1, codeStream); if (this.initStateIndex != -1) { codeStream.removeNotDefinitelyAssignedVariables(currentScope, this.initStateIndex); codeStream.addDefinitelyAssignedVariables(currentScope, this.initStateIndex); } + codeStream.recordPositionsFrom(pc, this.sourceStart); + StatementWithFinallyBlock.reenterAllExceptionHandlers(this.statementsWithFinallyBlock, -1, codeStream); } @Override public void resolve(BlockScope scope) { - if (this.switchExpression != null || this.isImplicit) { - if (this.switchExpression == null && this.isImplicit && !this.expression.statementExpression()) { - if (scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK14) { - /* JLS 13 14.11.2 - Switch labeled rules in switch statements differ from those in switch expressions (15.28). - In switch statements they must be switch labeled statement expressions, ... */ - scope.problemReporter().invalidExpressionAsStatement(this.expression); - return; - } + if (this.switchExpression == null) { + this.switchExpression = scope.enclosingSwitchExpression(); + if (this.switchExpression != null && this.switchExpression.isPolyExpression()) { + this.expression.setExpressionContext(this.switchExpression.expressionContext); // result expressions feature in same context ... + this.expression.setExpectedType(this.switchExpression.expectedType); // ... with the same target type } - } else { - if (scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK14) { - scope.problemReporter().switchExpressionsYieldOutsideSwitchExpression(this); + } + + this.expression.resolveType(scope); + if (this.switchExpression != null) { + this.switchExpression.results.add(this.expression); + } + + if (this.isImplicit) { + if (this.switchExpression == null && !this.expression.statementExpression()) { + scope.problemReporter().invalidExpressionAsStatement(this.expression); } + } else if (this.switchExpression == null) { + scope.problemReporter().yieldOutsideSwitchExpression(this); } - TypeBinding type = this.expression.resolveType(scope); - if (this.switchExpression != null && type != null) - this.switchExpression.originalTypeMap.put(this.expression, type); } @Override public StringBuilder printStatement(int tab, StringBuilder output) { - if (!this.isImplicit) - printIndent(tab, output).append("yield"); //$NON-NLS-1$ if (this.isImplicit) { this.expression.print(tab, output); } else { - output.append(' '); + printIndent(tab, output).append("yield "); //$NON-NLS-1$ this.expression.printExpression(tab, output); } return output.append(';'); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/BasicModule.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/BasicModule.java index b811cee157..2173013c37 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/BasicModule.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/BasicModule.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.internal.compiler.batch; import java.util.Arrays; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.ExportsStatement; import org.eclipse.jdt.internal.compiler.ast.ModuleDeclaration; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java index bab9dac7d9..18ae5d338a 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java @@ -17,6 +17,21 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.batch; +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Stream; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; @@ -36,22 +51,6 @@ import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; import org.eclipse.jdt.internal.compiler.util.Util; -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Stream; - @SuppressWarnings({"rawtypes", "unchecked"}) public class ClasspathDirectory extends ClasspathLocation { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java index 7de81432b7..3a0d3cd2bb 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java @@ -27,7 +27,6 @@ import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; @@ -35,11 +34,11 @@ import org.eclipse.jdt.internal.compiler.classfmt.ExternalAnnotationDecorator; import org.eclipse.jdt.internal.compiler.classfmt.ExternalAnnotationProvider; import org.eclipse.jdt.internal.compiler.env.AccessRuleSet; +import org.eclipse.jdt.internal.compiler.env.IBinaryType; import org.eclipse.jdt.internal.compiler.env.IModule; import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer; -import org.eclipse.jdt.internal.compiler.env.IBinaryType; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; import org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.ExternalAnnotationStatus; +import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; import org.eclipse.jdt.internal.compiler.util.ManifestAnalyzer; import org.eclipse.jdt.internal.compiler.util.SuffixConstants; import org.eclipse.jdt.internal.compiler.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJep247.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJep247.java index 8b828fc6e0..e9212e833e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJep247.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJep247.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.Map; import java.util.Set; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJep247Jdk12.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJep247Jdk12.java index aa488bc89b..4492a78588 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJep247Jdk12.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJep247Jdk12.java @@ -27,7 +27,6 @@ import java.util.List; import java.util.Map; import java.util.function.Function; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJmod.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJmod.java index f6079766b3..c9db9de7c5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJmod.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJmod.java @@ -20,7 +20,6 @@ import java.util.HashSet; import java.util.List; import java.util.zip.ZipEntry; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; @@ -28,9 +27,9 @@ import org.eclipse.jdt.internal.compiler.classfmt.ExternalAnnotationDecorator; import org.eclipse.jdt.internal.compiler.classfmt.ExternalAnnotationProvider; import org.eclipse.jdt.internal.compiler.env.AccessRuleSet; +import org.eclipse.jdt.internal.compiler.env.IBinaryType; import org.eclipse.jdt.internal.compiler.env.IModule; import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer; -import org.eclipse.jdt.internal.compiler.env.IBinaryType; import org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.ExternalAnnotationStatus; import org.eclipse.jdt.internal.compiler.util.SuffixConstants; import org.eclipse.jdt.internal.compiler.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJrt.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJrt.java index 9e0957de01..7d4d428e1f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJrt.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJrt.java @@ -29,7 +29,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.zip.ZipFile; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJsr199.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJsr199.java index fcff3f78b2..2e88aec470 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJsr199.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathJsr199.java @@ -25,10 +25,8 @@ import java.util.Iterator; import java.util.List; import java.util.Set; - import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathLocation.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathLocation.java index 3cab64ed4e..7604025818 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathLocation.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathLocation.java @@ -21,7 +21,6 @@ import java.util.List; import java.util.Set; import java.util.function.Function; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.env.AccessRestriction; import org.eclipse.jdt.internal.compiler.env.AccessRuleSet; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathMultiReleaseJar.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathMultiReleaseJar.java index 2195c3da00..420e7dbb3e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathMultiReleaseJar.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathMultiReleaseJar.java @@ -11,7 +11,6 @@ import java.util.Enumeration; import java.util.HashSet; import java.util.zip.ZipEntry; - import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; import org.eclipse.jdt.internal.compiler.classfmt.ExternalAnnotationDecorator; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathSourceJar.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathSourceJar.java index 4314437df4..d394a2cb94 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathSourceJar.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ClasspathSourceJar.java @@ -14,10 +14,9 @@ package org.eclipse.jdt.internal.compiler.batch; import java.io.File; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; import java.util.zip.ZipEntry; - import org.eclipse.jdt.internal.compiler.env.AccessRuleSet; import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer; import org.eclipse.jdt.internal.compiler.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/CompilationUnit.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/CompilationUnit.java index 0889543668..277ef39609 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/CompilationUnit.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/CompilationUnit.java @@ -16,7 +16,6 @@ import java.io.File; import java.io.IOException; import java.util.function.Function; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/FileFinder.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/FileFinder.java index 188b7a7b6b..91a1a7889f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/FileFinder.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/FileFinder.java @@ -16,7 +16,6 @@ import java.io.File; import java.util.ArrayList; import java.util.List; - import org.eclipse.jdt.internal.compiler.env.IModule; public class FileFinder { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/FileSystem.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/FileSystem.java index 4369867e74..ff32d8b856 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/FileSystem.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/FileSystem.java @@ -34,27 +34,25 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.zip.ZipFile; - import javax.lang.model.SourceVersion; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ExternalAnnotationDecorator; import org.eclipse.jdt.internal.compiler.env.AccessRuleSet; -import org.eclipse.jdt.internal.compiler.env.IModulePathEntry; import org.eclipse.jdt.internal.compiler.env.IModule; import org.eclipse.jdt.internal.compiler.env.IModuleAwareNameEnvironment; +import org.eclipse.jdt.internal.compiler.env.IModulePathEntry; +import org.eclipse.jdt.internal.compiler.env.IUpdatableModule; +import org.eclipse.jdt.internal.compiler.env.IUpdatableModule.UpdateKind; +import org.eclipse.jdt.internal.compiler.env.IUpdatableModule.UpdatesByKind; import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; import org.eclipse.jdt.internal.compiler.parser.Parser; import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; -import org.eclipse.jdt.internal.compiler.env.IUpdatableModule; -import org.eclipse.jdt.internal.compiler.env.IUpdatableModule.UpdateKind; -import org.eclipse.jdt.internal.compiler.env.IUpdatableModule.UpdatesByKind; -import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.util.JRTUtil; import org.eclipse.jdt.internal.compiler.util.SuffixConstants; import org.eclipse.jdt.internal.compiler.util.Util; @@ -295,7 +293,13 @@ public static Classpath getClasspath(String classpathName, String encoding, Acce return getClasspath(classpathName, encoding, false, accessRuleSet, null, options, release); } public static Classpath getJrtClasspath(String jdkHome, String encoding, AccessRuleSet accessRuleSet, Map options) { - return new ClasspathJrt(new File(convertPathSeparators(jdkHome)), true, accessRuleSet, null); + ClasspathJrt classpathJrt = new ClasspathJrt(new File(convertPathSeparators(jdkHome)), true, accessRuleSet, null); + try { + classpathJrt.initialize(); + } catch (IOException e) { + // Broken entry, but let clients have it anyway. + } + return classpathJrt; } public static Classpath getOlderSystemRelease(String jdkHome, String release, AccessRuleSet accessRuleSet) { return isJRE12Plus ? diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/Main.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/Main.java index cc21bb551c..4c3ca0aad7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/Main.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/Main.java @@ -35,21 +35,7 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.batch; -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.LineNumberReader; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.io.StringReader; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -57,25 +43,10 @@ import java.nio.file.Paths; import java.text.DateFormat; import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.MissingResourceException; -import java.util.Properties; -import java.util.ResourceBundle; -import java.util.Set; -import java.util.StringTokenizer; import java.util.function.Function; import java.util.stream.IntStream; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.CompilationProgress; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ModuleFinder.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ModuleFinder.java index 7a970f5e7e..6a36f108ea 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ModuleFinder.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/batch/ModuleFinder.java @@ -24,15 +24,14 @@ import java.util.jar.Manifest; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; - import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; import org.eclipse.jdt.internal.compiler.env.IModule; -import org.eclipse.jdt.internal.compiler.env.PackageExportImpl; import org.eclipse.jdt.internal.compiler.env.IModule.IPackageExport; +import org.eclipse.jdt.internal.compiler.env.PackageExportImpl; import org.eclipse.jdt.internal.compiler.parser.Parser; import org.eclipse.jdt.internal.compiler.util.JRTUtil; import org.eclipse.jdt.internal.compiler.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.java index 9b692bb1f2..b9f84d38ff 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.java @@ -15,12 +15,22 @@ package org.eclipse.jdt.internal.compiler.classfmt; import java.util.Arrays; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.codegen.ConstantPool; -import org.eclipse.jdt.internal.compiler.env.*; -import org.eclipse.jdt.internal.compiler.impl.*; +import org.eclipse.jdt.internal.compiler.env.ClassSignature; +import org.eclipse.jdt.internal.compiler.env.EnumConstantSignature; +import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; +import org.eclipse.jdt.internal.compiler.env.IBinaryElementValuePair; +import org.eclipse.jdt.internal.compiler.impl.BooleanConstant; +import org.eclipse.jdt.internal.compiler.impl.ByteConstant; +import org.eclipse.jdt.internal.compiler.impl.CharConstant; +import org.eclipse.jdt.internal.compiler.impl.DoubleConstant; +import org.eclipse.jdt.internal.compiler.impl.FloatConstant; +import org.eclipse.jdt.internal.compiler.impl.IntConstant; +import org.eclipse.jdt.internal.compiler.impl.LongConstant; +import org.eclipse.jdt.internal.compiler.impl.ShortConstant; +import org.eclipse.jdt.internal.compiler.impl.StringConstant; import org.eclipse.jdt.internal.compiler.lookup.TagBits; import org.eclipse.jdt.internal.compiler.util.CharDeduplication; import org.eclipse.jdt.internal.compiler.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.java index 77a5090592..d93ad08048 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.java @@ -26,21 +26,10 @@ import java.net.URISyntaxException; import java.util.Arrays; import java.util.function.Predicate; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.codegen.AnnotationTargetTypeConstants; import org.eclipse.jdt.internal.compiler.codegen.AttributeNamesConstants; -import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; -import org.eclipse.jdt.internal.compiler.env.IBinaryElementValuePair; -import org.eclipse.jdt.internal.compiler.env.IBinaryField; -import org.eclipse.jdt.internal.compiler.env.IBinaryMethod; -import org.eclipse.jdt.internal.compiler.env.IBinaryModule; -import org.eclipse.jdt.internal.compiler.env.IBinaryNestedType; -import org.eclipse.jdt.internal.compiler.env.IBinaryType; -import org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation; -import org.eclipse.jdt.internal.compiler.env.IModule; -import org.eclipse.jdt.internal.compiler.env.IRecordComponent; -import org.eclipse.jdt.internal.compiler.env.ITypeAnnotationWalker; +import org.eclipse.jdt.internal.compiler.env.*; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.ExternalAnnotationStatus; import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; @@ -71,7 +60,7 @@ public class ClassFileReader extends ClassFileStruct implements IBinaryType { private InnerClassInfo[] innerInfos; private final char[][] interfaceNames; private final int interfacesCount; - private final char[][] permittedSubtypesNames; + private char[][] permittedSubtypesNames; private int permittedSubtypesCount; private MethodInfo[] methods; private final int methodsCount; @@ -404,7 +393,6 @@ public ClassFileReader(byte[] classFileBytes, char[] fileName, boolean fullyInit char[] enclosingTypeNam = null; char[] sourceFileNam = null; char[] signatur = null; - char[][] permittedSubtypesNam = null; for (int i = 0; i < attributesCount; i++) { int utf8Offset = this.constantPoolOffsets[u2At(readOffset)]; @@ -538,11 +526,9 @@ public ClassFileReader(byte[] classFileBytes, char[] fileName, boolean fullyInit if (this.permittedSubtypesCount != 0) { accessFlag |= ExtraCompilerModifiers.AccSealed; offset += 2; - permittedSubtypesNam = new char[this.permittedSubtypesCount][]; + this.permittedSubtypesNames = new char[this.permittedSubtypesCount][]; for (int j = 0; j < this.permittedSubtypesCount; j++) { - utf8Offset = - this.constantPoolOffsets[u2At(this.constantPoolOffsets[u2At(offset)] + 1)]; - permittedSubtypesNam[j] = CharDeduplication.intern(utf8At(utf8Offset + 3, u2At(utf8Offset + 1))); + this.permittedSubtypesNames[j] = CharDeduplication.intern(getConstantClassNameAt(u2At(offset))); offset += 2; } } @@ -559,7 +545,6 @@ public ClassFileReader(byte[] classFileBytes, char[] fileName, boolean fullyInit this.enclosingTypeName = enclosingTypeNam; this.sourceFileName = sourceFileNam; this.signature = signatur; - this.permittedSubtypesNames= permittedSubtypesNam; if (fullyInitialize) { initialize(); } @@ -813,7 +798,7 @@ public char[][] getInterfaceNames() { } @Override -public char[][] getPermittedSubtypeNames() { +public char[][] getPermittedSubtypesNames() { return this.permittedSubtypesNames; } @@ -1126,14 +1111,14 @@ && hasStructuralTypeAnnotationChanges(getTypeAnnotations(), newClassFile.getType return true; } - // permitted sub-types - char[][] newPermittedSubtypeNames = newClassFile.getPermittedSubtypeNames(); - if (this.permittedSubtypesNames != newPermittedSubtypeNames) { - int newPermittedSubtypesLength = newPermittedSubtypeNames == null ? 0 : newPermittedSubtypeNames.length; + // permitted subtypes + char[][] newPermittedSubtypesNames = newClassFile.getPermittedSubtypesNames(); + if (this.permittedSubtypesNames != newPermittedSubtypesNames) { + int newPermittedSubtypesLength = newPermittedSubtypesNames == null ? 0 : newPermittedSubtypesNames.length; if (newPermittedSubtypesLength != this.permittedSubtypesCount) return true; for (int i = 0, max = this.permittedSubtypesCount; i < max; i++) - if (!CharOperation.equals(this.permittedSubtypesNames[i], newPermittedSubtypeNames[i])) + if (!CharOperation.equals(this.permittedSubtypesNames[i], newPermittedSubtypesNames[i])) return true; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ElementValuePairInfo.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ElementValuePairInfo.java index b064be60f7..73b090dd61 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ElementValuePairInfo.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ElementValuePairInfo.java @@ -15,7 +15,6 @@ package org.eclipse.jdt.internal.compiler.classfmt; import java.util.Arrays; - import org.eclipse.jdt.core.compiler.CharOperation; public class ElementValuePairInfo implements org.eclipse.jdt.internal.compiler.env.IBinaryElementValuePair { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationDecorator.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationDecorator.java index f1603397dd..0e9e340e0d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationDecorator.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationDecorator.java @@ -21,7 +21,6 @@ import java.net.URI; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; - import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; import org.eclipse.jdt.internal.compiler.env.IBinaryField; import org.eclipse.jdt.internal.compiler.env.IBinaryMethod; @@ -143,8 +142,8 @@ public char[] getSuperclassName() { } @Override - public char[][] getPermittedSubtypeNames() { - return this.inputType.getPermittedSubtypeNames(); + public char[][] getPermittedSubtypesNames() { + return this.inputType.getPermittedSubtypesNames(); } @Override diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java index e2fcc659da..77c7ce9685 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java @@ -15,6 +15,8 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.classfmt; +import static org.eclipse.jdt.internal.compiler.util.Util.*; + import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -22,7 +24,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; import org.eclipse.jdt.internal.compiler.env.IBinaryElementValuePair; @@ -32,8 +33,6 @@ import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; import org.eclipse.jdt.internal.compiler.util.Util; -import static org.eclipse.jdt.internal.compiler.util.Util.*; - public class ExternalAnnotationProvider { public static final String ANNOTATION_FILE_EXTENSION= "eea"; //$NON-NLS-1$ diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ModuleInfo.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ModuleInfo.java index c81b7077c9..ce25cb56a1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ModuleInfo.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/ModuleInfo.java @@ -15,7 +15,6 @@ import java.net.URI; import java.util.Arrays; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; import org.eclipse.jdt.internal.compiler.env.IBinaryModule; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationInfo.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationInfo.java index c1c1087373..520c27368a 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationInfo.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationInfo.java @@ -15,7 +15,6 @@ package org.eclipse.jdt.internal.compiler.classfmt; import java.util.Arrays; - import org.eclipse.jdt.internal.compiler.codegen.AnnotationTargetTypeConstants; import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; import org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java index 37fd2d9f97..c2a820147c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java @@ -38,24 +38,10 @@ import java.util.Stack; import java.util.function.Predicate; import java.util.function.Supplier; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ClassFile; import org.eclipse.jdt.internal.compiler.CompilationResult; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration; -import org.eclipse.jdt.internal.compiler.ast.AllocationExpression; -import org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression; -import org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall; -import org.eclipse.jdt.internal.compiler.ast.Expression; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.FunctionalExpression; -import org.eclipse.jdt.internal.compiler.ast.LambdaExpression; -import org.eclipse.jdt.internal.compiler.ast.OperatorIds; -import org.eclipse.jdt.internal.compiler.ast.ReferenceExpression; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; -import org.eclipse.jdt.internal.compiler.ast.TypeReference; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.codegen.OperandStack.OperandCategory; import org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo; @@ -5758,30 +5744,6 @@ public void ixor() { this.bCodeStream[this.classFileOffset++] = Opcodes.OPC_ixor; } -final public void jsr(BranchLabel lbl) { - if (this.wideMode) { - jsr_w(lbl); - return; - } - this.countLabels = 0; - if (this.classFileOffset >= this.bCodeStream.length) { - resizeByteArray(); - } - this.position++; - this.bCodeStream[this.classFileOffset++] = Opcodes.OPC_jsr; - lbl.branch(); -} - -final public void jsr_w(BranchLabel lbl) { - this.countLabels = 0; - if (this.classFileOffset >= this.bCodeStream.length) { - resizeByteArray(); - } - this.position++; - this.bCodeStream[this.classFileOffset++] = Opcodes.OPC_jsr_w; - lbl.branchWide(); -} - public void l2d() { this.countLabels = 0; if (this.classFileOffset >= this.bCodeStream.length) { @@ -7247,26 +7209,6 @@ private final void resizeByteArray() { System.arraycopy(this.bCodeStream, 0, this.bCodeStream = new byte[requiredSize], 0, length); } -final public void ret(int index) { - this.countLabels = 0; - if (index > 255) { // Widen - if (this.classFileOffset + 3 >= this.bCodeStream.length) { - resizeByteArray(); - } - this.position += 2; - this.bCodeStream[this.classFileOffset++] = Opcodes.OPC_wide; - this.bCodeStream[this.classFileOffset++] = Opcodes.OPC_ret; - writeUnsignedShort(index); - } else { // Don't Widen - if (this.classFileOffset + 1 >= this.bCodeStream.length) { - resizeByteArray(); - } - this.position += 2; - this.bCodeStream[this.classFileOffset++] = Opcodes.OPC_ret; - this.bCodeStream[this.classFileOffset++] = (byte) index; - } -} - public void return_() { this.countLabels = 0; if (this.classFileOffset >= this.bCodeStream.length) { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.java index be1bde25e1..6ba79024f1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/MultiCatchExceptionLabel.java @@ -17,8 +17,8 @@ package org.eclipse.jdt.internal.compiler.codegen; import org.eclipse.jdt.internal.compiler.ast.Annotation; -import org.eclipse.jdt.internal.compiler.ast.UnionTypeReference; import org.eclipse.jdt.internal.compiler.ast.TypeReference; +import org.eclipse.jdt.internal.compiler.ast.UnionTypeReference; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class MultiCatchExceptionLabel extends ExceptionLabel { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/OperandStack.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/OperandStack.java index 2413b5222e..dd3cdf2730 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/OperandStack.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/OperandStack.java @@ -16,7 +16,6 @@ import java.util.Stack; import java.util.function.Supplier; - import org.eclipse.jdt.internal.compiler.ClassFile; import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; @@ -264,6 +263,20 @@ public void dup2_x2() { } } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append('['); + for (int i = 0, length = size(); i < length; i++) { + if (i != 0) + sb.append(", "); //$NON-NLS-1$ + TypeBinding type = this.stack.get(i); + sb.append(type.shortReadableName()); + } + sb.append("]\n"); //$NON-NLS-1$ + return sb.toString(); + } + public static class NullStack extends OperandStack { public NullStack() { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.java index fd7eeee702..d2f68fc494 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.java @@ -16,7 +16,6 @@ import java.text.MessageFormat; import java.util.HashMap; import java.util.Map; - import org.eclipse.jdt.internal.compiler.lookup.Scope; import org.eclipse.jdt.internal.compiler.lookup.TypeIds; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.java index 1fa593a313..863f387551 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/StackMapFrameCodeStream.java @@ -18,7 +18,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Set; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ClassFile; import org.eclipse.jdt.internal.compiler.ast.ASTNode; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java index 2a8879a07d..2d0e6a1479 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/TypeAnnotationCodeStream.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.List; - import org.eclipse.jdt.internal.compiler.ClassFile; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/VerificationTypeInfo.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/VerificationTypeInfo.java index bff0e6e8b7..7832858e52 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/VerificationTypeInfo.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/codegen/VerificationTypeInfo.java @@ -15,7 +15,6 @@ import java.util.ArrayList; import java.util.List; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; import org.eclipse.jdt.internal.compiler.lookup.Scope; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/ClassSignature.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/ClassSignature.java index 217426359f..7ccddd8e3c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/ClassSignature.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/ClassSignature.java @@ -15,7 +15,6 @@ package org.eclipse.jdt.internal.compiler.env; import java.util.Arrays; - import org.eclipse.jdt.core.compiler.CharOperation; /** diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/EnumConstantSignature.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/EnumConstantSignature.java index c8a3ccda52..3219e6dacf 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/EnumConstantSignature.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/EnumConstantSignature.java @@ -15,7 +15,6 @@ package org.eclipse.jdt.internal.compiler.env; import java.util.Arrays; - import org.eclipse.jdt.core.compiler.CharOperation; /** * Represents a reference to a enum constant in the class file. diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IBinaryType.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IBinaryType.java index 9eae6b5d25..cce631129c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IBinaryType.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IBinaryType.java @@ -18,7 +18,6 @@ package org.eclipse.jdt.internal.compiler.env; import java.net.URI; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.ExternalAnnotationStatus; import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; @@ -95,13 +94,13 @@ public interface IBinaryType extends IGenericType, IBinaryInfo { char[][] getInterfaceNames(); /** - * Answer the unresolved names of the receiver's permitted sub types + * Answer the unresolved names of the receiver's permitted subtypes in the + * class file format as specified in section 4.2 of the Java 2 VM spec * or null if the array is empty. * - * A name is a simple name or a qualified, dot separated name. - * For example, Hashtable or java.util.Hashtable. + * For example, java.lang.String is java/lang/String. */ -default char[][] getPermittedSubtypeNames() { +default char[][] getPermittedSubtypesNames() { return null; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IModule.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IModule.java index 11998aa7c8..78fead836e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IModule.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IModule.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.internal.compiler.env; import java.util.jar.Manifest; - import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; public interface IModule { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IModuleAwareNameEnvironment.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IModuleAwareNameEnvironment.java index 5bd5584fcb..093af6cf38 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IModuleAwareNameEnvironment.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IModuleAwareNameEnvironment.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.internal.compiler.env; import java.util.function.Predicate; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; import org.eclipse.jdt.internal.compiler.util.SimpleSetOfCharArray; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IUpdatableModule.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IUpdatableModule.java index 1c39e246d1..70a6749371 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IUpdatableModule.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/IUpdatableModule.java @@ -17,7 +17,6 @@ import java.util.Collections; import java.util.List; import java.util.function.Consumer; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.util.SimpleSetOfCharArray; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/NameEnvironmentAnswer.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/NameEnvironmentAnswer.java index 6f6496c40b..208f4bba66 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/NameEnvironmentAnswer.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/env/NameEnvironmentAnswer.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.internal.compiler.env; import java.util.Arrays; - import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java index 3d1ee67ccb..8eeccfb7ff 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java @@ -21,14 +21,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; - -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.ASTNode; +import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.Argument; -import org.eclipse.jdt.internal.compiler.ast.UnionTypeReference; -import org.eclipse.jdt.internal.compiler.ast.SubRoutineStatement; +import org.eclipse.jdt.internal.compiler.ast.StatementWithFinallyBlock; import org.eclipse.jdt.internal.compiler.ast.TryStatement; import org.eclipse.jdt.internal.compiler.ast.TypeReference; +import org.eclipse.jdt.internal.compiler.ast.UnionTypeReference; import org.eclipse.jdt.internal.compiler.codegen.ObjectCache; import org.eclipse.jdt.internal.compiler.lookup.BlockScope; import org.eclipse.jdt.internal.compiler.lookup.CatchParameterBinding; @@ -311,19 +310,19 @@ public void recordReturnFrom(UnconditionalFlowInfo flowInfo) { } /** - * Exception handlers (with no finally block) are also included with subroutine - * only once (in case parented with true InsideSubRoutineFlowContext). - * Standard management of subroutines need to also operate on intermediate + * Exception handlers (with no finally block) are also included with statement with finally block + * only once (in case parented with true InsideStatementWithFinallyBlockFlowContext). + * Standard management of statements with finally blocks need to also operate on intermediate * exception handlers. - * @see org.eclipse.jdt.internal.compiler.flow.FlowContext#subroutine() + * @see org.eclipse.jdt.internal.compiler.flow.FlowContext#statementWithFinallyBlock() */ @Override -public SubRoutineStatement subroutine() { - if (this.associatedNode instanceof SubRoutineStatement) { - // exception handler context may be child of InsideSubRoutineFlowContext, which maps to same handler - if (this.parent.subroutine() == this.associatedNode) +public StatementWithFinallyBlock statementWithFinallyBlock() { + if (this.associatedNode instanceof StatementWithFinallyBlock) { + // exception handler context may be child of InsideStatementWithFinallyBlockFlowContext, which maps to same handler + if (this.parent.statementWithFinallyBlock() == this.associatedNode) return null; - return (SubRoutineStatement) this.associatedNode; + return (StatementWithFinallyBlock) this.associatedNode; } return null; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java index cbf65ca5ee..fc59e146c5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java @@ -67,7 +67,7 @@ public FinallyFlowContext(FlowContext parent, ASTNode associatedNode, ExceptionH /** * Given some contextual initialization info (derived from a try block or a catch block), this - * code will check that the subroutine context does not also initialize a final variable potentially set + * code will check that the finally context does not also initialize a final variable potentially set * redundantly. */ public void complainOnDeferredChecks(FlowInfo flowInfo, BlockScope scope) { @@ -101,9 +101,7 @@ public void complainOnDeferredChecks(FlowInfo flowInfo, BlockScope scope) { if (complained) { FlowContext currentContext = this.getLocalParent(); while (currentContext != null) { - //if (currentContext.isSubRoutine()) { currentContext.removeFinalAssignmentIfAny(this.finalAssignments[i]); - //} currentContext = currentContext.getLocalParent(); } } @@ -242,11 +240,6 @@ public String individualToString() { return buffer.toString(); } - @Override - public boolean isSubRoutine() { - return true; - } - @Override protected boolean recordFinalAssignment( VariableBinding binding, diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/FlowContext.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/FlowContext.java index bffbac02a5..72b61ba760 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/FlowContext.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/flow/FlowContext.java @@ -28,35 +28,11 @@ package org.eclipse.jdt.internal.compiler.flow; import java.util.ArrayList; - import org.eclipse.jdt.core.compiler.CharOperation; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Expression; -import org.eclipse.jdt.internal.compiler.ast.FakedTrackingVariable; -import org.eclipse.jdt.internal.compiler.ast.LabeledStatement; -import org.eclipse.jdt.internal.compiler.ast.LambdaExpression; -import org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching; -import org.eclipse.jdt.internal.compiler.ast.Reference; -import org.eclipse.jdt.internal.compiler.ast.SingleNameReference; -import org.eclipse.jdt.internal.compiler.ast.SubRoutineStatement; -import org.eclipse.jdt.internal.compiler.ast.SwitchExpression; -import org.eclipse.jdt.internal.compiler.ast.ThrowStatement; -import org.eclipse.jdt.internal.compiler.ast.TryStatement; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.codegen.BranchLabel; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.BlockScope; -import org.eclipse.jdt.internal.compiler.lookup.CatchParameterBinding; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; +import org.eclipse.jdt.internal.compiler.lookup.*; /** * Reflects the context of code analysis, keeping track of enclosing @@ -192,7 +168,7 @@ public FieldBinding[] nullCheckedFields() { count = 0; for (int i=0; iConsumers are free to use {@code sourceLevel} or this + * {@code requestedSourceVersion} value to decide of their behavior.

+ *

May be {@code null}.

+ */ + public String requestedSourceVersion; /** VM target level, refers to a JDK version, e.g. {@link ClassFileConstants#JDK1_4} */ public long targetJDK; /** Source encoding format */ @@ -714,6 +723,8 @@ public static String optionKeyFromIrritant(int irritant) { return OPTION_ReportHiddenCatchBlock; case UnusedLocalVariable : return OPTION_ReportUnusedLocal; + case UnusedLambdaParameter: + return OPTION_ReportUnusedLambdaParameter; case UnusedArgument : return OPTION_ReportUnusedParameter; case UnusedExceptionParameter : @@ -1190,6 +1201,7 @@ public static String warningTokenFromIrritant(int irritant) { case UnusedImport : case UnusedLabel : case UnusedLocalVariable : + case UnusedLambdaParameter : case UnusedObjectAllocation : case UnusedArgument : // OPTION_ReportUnusedParameter case UnusedPrivateMember : @@ -1359,6 +1371,7 @@ public Map getMap() { optionsMap.put(OPTION_ReportDeprecationWhenOverridingDeprecatedMethod, this.reportDeprecationWhenOverridingDeprecatedMethod ? ENABLED : DISABLED); optionsMap.put(OPTION_ReportHiddenCatchBlock, getSeverityString(MaskedCatchBlock)); optionsMap.put(OPTION_ReportUnusedLocal, getSeverityString(UnusedLocalVariable)); + optionsMap.put(OPTION_ReportUnusedLambdaParameter, getSeverityString(UnusedLambdaParameter)); optionsMap.put(OPTION_ReportUnusedParameter, getSeverityString(UnusedArgument)); optionsMap.put(OPTION_ReportUnusedExceptionParameter, getSeverityString(UnusedExceptionParameter)); optionsMap.put(OPTION_ReportUnusedImport, getSeverityString(UnusedImport)); @@ -1783,7 +1796,7 @@ public void set(Map optionsMap) { long level = versionToJdkLevel(optionValue); if (level != 0) this.complianceLevel = level; } - if ((optionValue = optionsMap.get(OPTION_Source)) != null) { + if ((this.requestedSourceVersion = optionValue = optionsMap.get(OPTION_Source)) != null) { long level = versionToJdkLevel(optionValue); if (level != 0) this.sourceLevel = level; } @@ -1944,6 +1957,7 @@ public void set(Map optionsMap) { if ((optionValue = optionsMap.get(OPTION_ReportTerminalDeprecation)) != null) updateSeverity(UsingTerminallyDeprecatedAPI, optionValue); if ((optionValue = optionsMap.get(OPTION_ReportHiddenCatchBlock)) != null) updateSeverity(MaskedCatchBlock, optionValue); if ((optionValue = optionsMap.get(OPTION_ReportUnusedLocal)) != null) updateSeverity(UnusedLocalVariable, optionValue); + if ((optionValue = optionsMap.get(OPTION_ReportUnusedLambdaParameter)) != null) updateSeverity(UnusedLambdaParameter, optionValue); if ((optionValue = optionsMap.get(OPTION_ReportUnusedParameter)) != null) updateSeverity(UnusedArgument, optionValue); if ((optionValue = optionsMap.get(OPTION_ReportUnusedExceptionParameter)) != null) updateSeverity(UnusedExceptionParameter, optionValue); if ((optionValue = optionsMap.get(OPTION_ReportUnusedImport)) != null) updateSeverity(UnusedImport, optionValue); @@ -2332,6 +2346,7 @@ public String toString() { buf.append("\n\t- removal: ").append(getSeverityString(UsingTerminallyDeprecatedAPI)); //$NON-NLS-1$ buf.append("\n\t- masked catch block: ").append(getSeverityString(MaskedCatchBlock)); //$NON-NLS-1$ buf.append("\n\t- unused local variable: ").append(getSeverityString(UnusedLocalVariable)); //$NON-NLS-1$ + buf.append("\n\t- unused lambda parameter: ").append(getSeverityString(UnusedLambdaParameter)); //$NON-NLS-1$ buf.append("\n\t- unused parameter: ").append(getSeverityString(UnusedArgument)); //$NON-NLS-1$ buf.append("\n\t- unused exception parameter: ").append(getSeverityString(UnusedExceptionParameter)); //$NON-NLS-1$ buf.append("\n\t- unused import: ").append(getSeverityString(UnusedImport)); //$NON-NLS-1$ diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java index 5f22ad875b..a6f7409093 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java @@ -140,7 +140,8 @@ public class IrritantSet { |CompilerOptions.UnstableAutoModuleName |CompilerOptions.PreviewFeatureUsed) .set(CompilerOptions.InsufficientResourceManagement - |CompilerOptions.IncompatibleOwningContract); + |CompilerOptions.IncompatibleOwningContract + |CompilerOptions.UnusedLambdaParameter); // default errors IF AnnotationBasedNullAnalysis is enabled: COMPILER_DEFAULT_ERRORS.set( CompilerOptions.NullSpecViolation @@ -178,7 +179,8 @@ public class IrritantSet { .set(CompilerOptions.DeadCode) .set(CompilerOptions.UnusedObjectAllocation) .set(CompilerOptions.UnusedTypeParameter) - .set(CompilerOptions.RedundantSpecificationOfTypeArguments); + .set(CompilerOptions.RedundantSpecificationOfTypeArguments) + .set(CompilerOptions.UnusedLambdaParameter); STATIC_METHOD .set(CompilerOptions.MethodCanBePotentiallyStatic); RESOURCE diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/impl/JavaFeature.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/impl/JavaFeature.java index 125d8729f5..9ad5ec3873 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/impl/JavaFeature.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/impl/JavaFeature.java @@ -56,7 +56,7 @@ public enum JavaFeature { SEALED_CLASSES(ClassFileConstants.JDK17, Messages.bind(Messages.sealed_types), - new char[][] {TypeConstants.SEALED, TypeConstants.PERMITS}, + new char[][] {TypeConstants.SEALED, TypeConstants.NON_SEALED, TypeConstants.PERMITS}, false), PATTERN_MATCHING_IN_SWITCH(ClassFileConstants.JDK21, Messages.bind(Messages.pattern_matching_switch), @@ -94,7 +94,7 @@ public enum JavaFeature { *
Individual exceptions from old rules *
  • MethodScope.findField()
  • Scope.getBinding(char[], int, InvocationSite, boolean)
*
Main code gen change in TypeDeclaration.manageEnclosingInstanceAccessIfNecessary() - *
Only if feature is actually supported, we will generate special synthetid args & fields
+ *
Only if feature is actually supported, we will generate special synthetic args and fields
* Uses some feature-specific help from BlockScope.getEmulationPath() * */ diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.java index c3567c74bf..b49ac17f46 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem.java @@ -289,7 +289,7 @@ public TypeBinding getAnnotatedType(TypeBinding type, AnnotationBinding[][] anno return annotatedType; } - /* Private subroutine for public APIs. Create an annotated version of the type. To materialize the annotated version, we can't use new since + /* Private method for public APIs. Create an annotated version of the type. To materialize the annotated version, we can't use new since this is a general purpose method designed to deal type bindings of all types. "Clone" the incoming type, specializing for any enclosing type that may itself be possibly be annotated. This is so the binding for @Outer Outer.Inner != Outer.@Inner Inner != @Outer Outer.@Inner Inner. Likewise so the bindings for @Readonly List<@NonNull String> != @Readonly List<@Nullable String> != @Readonly List<@Interned String> diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java index 857cc6fc9b..0a14db160f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.internal.compiler.lookup; import java.util.Arrays; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.Annotation; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AptBinaryLocalVariableBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AptBinaryLocalVariableBinding.java index 8f305320eb..30510f2844 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AptBinaryLocalVariableBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/AptBinaryLocalVariableBinding.java @@ -15,7 +15,6 @@ import java.util.Arrays; import java.util.Objects; - import org.eclipse.jdt.core.compiler.CharOperation; public class AptBinaryLocalVariableBinding extends LocalVariableBinding { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java index c2fe228003..fd0685a7bc 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java @@ -33,7 +33,6 @@ import java.util.List; import java.util.Set; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ClassFile; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BinaryModuleBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BinaryModuleBinding.java index a282b6f083..c5fa89b022 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BinaryModuleBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BinaryModuleBinding.java @@ -16,7 +16,6 @@ import java.net.URI; import java.util.LinkedHashMap; import java.util.stream.Stream; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; @@ -25,8 +24,8 @@ import org.eclipse.jdt.internal.compiler.env.IModule.IModuleReference; import org.eclipse.jdt.internal.compiler.env.IModule.IPackageExport; import org.eclipse.jdt.internal.compiler.env.IModule.IService; -import org.eclipse.jdt.internal.compiler.util.Util; import org.eclipse.jdt.internal.compiler.env.IModuleAwareNameEnvironment; +import org.eclipse.jdt.internal.compiler.util.Util; public class BinaryModuleBinding extends ModuleBinding { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java index 0cfb81d63d..a5ff9987f2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java @@ -52,7 +52,6 @@ import java.net.URI; import java.util.ArrayList; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.classfmt.AnnotationInfo; @@ -63,17 +62,7 @@ import org.eclipse.jdt.internal.compiler.classfmt.NonNullDefaultAwareTypeAnnotationWalker; import org.eclipse.jdt.internal.compiler.classfmt.TypeAnnotationWalker; import org.eclipse.jdt.internal.compiler.codegen.ConstantPool; -import org.eclipse.jdt.internal.compiler.env.ClassSignature; -import org.eclipse.jdt.internal.compiler.env.EnumConstantSignature; -import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; -import org.eclipse.jdt.internal.compiler.env.IBinaryElementValuePair; -import org.eclipse.jdt.internal.compiler.env.IBinaryField; -import org.eclipse.jdt.internal.compiler.env.IBinaryMethod; -import org.eclipse.jdt.internal.compiler.env.IBinaryNestedType; -import org.eclipse.jdt.internal.compiler.env.IBinaryType; -import org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation; -import org.eclipse.jdt.internal.compiler.env.IRecordComponent; -import org.eclipse.jdt.internal.compiler.env.ITypeAnnotationWalker; +import org.eclipse.jdt.internal.compiler.env.*; import org.eclipse.jdt.internal.compiler.impl.BooleanConstant; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.Constant; @@ -103,7 +92,7 @@ public class BinaryTypeBinding extends ReferenceBinding { protected ReferenceBinding superclass; protected ReferenceBinding enclosingType; protected ReferenceBinding[] superInterfaces; - protected ReferenceBinding[] permittedSubtypes; + protected ReferenceBinding[] permittedTypes; protected FieldBinding[] fields; protected RecordComponentBinding[] components; protected MethodBinding[] methods; @@ -274,7 +263,7 @@ public BinaryTypeBinding(BinaryTypeBinding prototype) { this.superclass = prototype.superclass; this.enclosingType = prototype.enclosingType; this.superInterfaces = prototype.superInterfaces; - this.permittedSubtypes = prototype.permittedSubtypes; + this.permittedTypes = prototype.permittedTypes; this.fields = prototype.fields; this.components = prototype.components; this.methods = prototype.methods; @@ -454,7 +443,7 @@ void cachePartsFrom(IBinaryType binaryType, boolean needFieldsAndMethods) { // and still want to use binaries passed that point (e.g. type hierarchy resolver, see bug 63748). this.typeVariables = Binding.NO_TYPE_VARIABLES; this.superInterfaces = Binding.NO_SUPERINTERFACES; - this.permittedSubtypes = Binding.NO_PERMITTEDTYPES; + this.permittedTypes = Binding.NO_PERMITTED_TYPES; // must retrieve member types in case superclass/interfaces need them this.memberTypes = Binding.NO_MEMBER_TYPES; @@ -560,31 +549,16 @@ void cachePartsFrom(IBinaryType binaryType, boolean needFieldsAndMethods) { types.toArray(this.superInterfaces); this.tagBits |= TagBits.HasUnresolvedSuperinterfaces; } - - this.permittedSubtypes = Binding.NO_PERMITTEDTYPES; - if (!wrapper.atEnd()) { - // attempt to find each permitted type if it exists in the cache (otherwise - resolve it when requested) - java.util.ArrayList types = new java.util.ArrayList(2); - short rank = 0; - do { - types.add(this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames, toplevelWalker.toSupertype(rank++, wrapper.peekFullType()))); - } while (!wrapper.atEnd()); - this.permittedSubtypes = new ReferenceBinding[types.size()]; - types.toArray(this.permittedSubtypes); - this.extendedTagBits |= ExtendedTagBits.HasUnresolvedPermittedSubtypes; - } - } - // fall back, in case we haven't got them from signature - char[][] permittedSubtypeNames = binaryType.getPermittedSubtypeNames(); - if (this.permittedSubtypes == Binding.NO_PERMITTEDTYPES && permittedSubtypeNames != null) { + char[][] permittedSubtypesNames = binaryType.getPermittedSubtypesNames(); + if (permittedSubtypesNames != null) { this.modifiers |= ExtraCompilerModifiers.AccSealed; - int size = permittedSubtypeNames.length; + int size = permittedSubtypesNames.length; if (size > 0) { - this.permittedSubtypes = new ReferenceBinding[size]; + this.permittedTypes = new ReferenceBinding[size]; for (short i = 0; i < size; i++) - // attempt to find each superinterface if it exists in the cache (otherwise - resolve it when requested) - this.permittedSubtypes[i] = this.environment.getTypeFromConstantPoolName(permittedSubtypeNames[i], 0, -1, false, missingTypeNames, toplevelWalker.toSupertype(i, null)); + // attempt to find each permitted type if it exists in the cache (otherwise - resolve it when requested) + this.permittedTypes[i] = this.environment.getTypeFromConstantPoolName(permittedSubtypesNames[i], 0, -1, false, missingTypeNames); } } boolean canUseNullTypeAnnotations = this.environment.globalOptions.isAnnotationBasedNullAnalysisEnabled && this.environment.globalOptions.sourceLevel >= ClassFileConstants.JDK1_8; @@ -598,12 +572,6 @@ void cachePartsFrom(IBinaryType binaryType, boolean needFieldsAndMethods) { break; } } - for (TypeBinding permsub : this.permittedSubtypes) { - if (permsub.hasNullTypeAnnotations()) { - this.externalAnnotationStatus = ExternalAnnotationStatus.TYPE_IS_ANNOTATED; - break; - } - } } } @@ -2617,13 +2585,12 @@ public ReferenceBinding[] superInterfaces() { public ReferenceBinding[] permittedTypes() { if (!isPrototype()) { - return this.permittedSubtypes = this.prototype.permittedTypes(); + return this.permittedTypes = this.prototype.permittedTypes(); } - for (int i = this.permittedSubtypes.length; --i >= 0;) - this.permittedSubtypes[i] = (ReferenceBinding) resolveType(this.permittedSubtypes[i], this.environment, false); + for (int i = this.permittedTypes.length; --i >= 0;) + this.permittedTypes[i] = (ReferenceBinding) resolveType(this.permittedTypes[i], this.environment, false); // re-resolution seems harmless - // Note: unlike for superinterfaces() hierarchy check not required here since these are subtypes - return this.permittedSubtypes; + return this.permittedTypes; } @Override public TypeVariableBinding[] typeVariables() { @@ -2693,17 +2660,17 @@ public String toString() { buffer.append("NULL SUPERINTERFACES"); //$NON-NLS-1$ } - if (this.permittedSubtypes != null) { - if (this.permittedSubtypes != Binding.NO_PERMITTEDTYPES) { + if (this.permittedTypes != null) { + if (this.permittedTypes != Binding.NO_PERMITTED_TYPES) { buffer.append("\n\tpermits : "); //$NON-NLS-1$ - for (int i = 0, length = this.permittedSubtypes.length; i < length; i++) { - if (i > 0) + for (int i = 0, length = this.permittedTypes.length; i < length; i++) { + if (i > 0) buffer.append(", "); //$NON-NLS-1$ - buffer.append((this.permittedSubtypes[i] != null) ? this.permittedSubtypes[i].debugName() : "NULL TYPE"); //$NON-NLS-1$ + buffer.append((this.permittedTypes[i] != null) ? this.permittedTypes[i].debugName() : "NULL TYPE"); //$NON-NLS-1$ } } } else { - buffer.append("NULL PERMITTEDSUBTYPES"); //$NON-NLS-1$ + buffer.append("NULL PERMITTED SUBTYPES"); //$NON-NLS-1$ } if (this.enclosingType != null) { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/Binding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/Binding.java index 34073261c3..c1beb405a4 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/Binding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/Binding.java @@ -62,7 +62,7 @@ public abstract class Binding { public static final ReferenceBinding[] ANY_EXCEPTION = new ReferenceBinding[] { null }; // special handler for all exceptions public static final FieldBinding[] NO_FIELDS = new FieldBinding[0]; public static final MethodBinding[] NO_METHODS = new MethodBinding[0]; - public static final ReferenceBinding[] NO_PERMITTEDTYPES = new ReferenceBinding[0]; + public static final ReferenceBinding[] NO_PERMITTED_TYPES = new ReferenceBinding[0]; public static final ReferenceBinding[] NO_SUPERINTERFACES = new ReferenceBinding[0]; public static final ReferenceBinding[] NO_MEMBER_TYPES = new ReferenceBinding[0]; public static final TypeVariableBinding[] NO_TYPE_VARIABLES = new TypeVariableBinding[0]; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java index b46d9c0eda..ab897083c9 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java @@ -35,7 +35,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; @@ -324,7 +323,8 @@ void computeLocalVariablePositions(int ilocal, int initOffset, CodeStream codeSt // could be optimized out, but does need to preserve unread variables ? if (!generateCurrentLocalVar) { if ((local.declaration != null && compilerOptions().preserveAllLocalVariables) || - local.isPatternVariable()) { // too much voodoo around pattern codegen. Having warned, just treat them as used. + local.isPatternVariable() || // too much voodoo around pattern codegen. Having warned, just treat them as used. + local.isResourceVariable()) { generateCurrentLocalVar = true; // force it to be preserved in the generated code if (local.useFlag == LocalVariableBinding.UNUSED) local.useFlag = LocalVariableBinding.USED; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BoundSet.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BoundSet.java index f8ed82ef4d..c0833acc58 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BoundSet.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BoundSet.java @@ -19,20 +19,9 @@ import static java.util.function.Function.identity; import static java.util.stream.Collectors.toMap; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; import java.util.stream.Stream; - import org.eclipse.jdt.internal.compiler.ast.Wildcard; import org.eclipse.jdt.internal.compiler.util.Tuples.Pair; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java index 210778ac1e..f23989aa0e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java @@ -33,26 +33,11 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.lookup; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; -import java.util.Set; - import org.eclipse.jdt.core.compiler.CharOperation; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.LambdaExpression; -import org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression; -import org.eclipse.jdt.internal.compiler.ast.RecordComponent; -import org.eclipse.jdt.internal.compiler.ast.SingleTypeReference; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; -import org.eclipse.jdt.internal.compiler.ast.TypeParameter; -import org.eclipse.jdt.internal.compiler.ast.TypeReference; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.env.AccessRestriction; import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; @@ -107,7 +92,7 @@ void buildAnonymousTypeBinding(SourceTypeBinding enclosingType, ReferenceBinding } } anonymousType.typeBits |= inheritedBits; - anonymousType.setPermittedTypes(Binding.NO_PERMITTEDTYPES); // JLS 15 JEP 360 Preview - Sec 15.9.5 + anonymousType.setPermittedTypes(Binding.NO_PERMITTED_TYPES); if (supertype.isInterface()) { anonymousType.setSuperClass(getJavaLangObject()); anonymousType.setSuperInterfaces(new ReferenceBinding[] { supertype }); @@ -119,7 +104,7 @@ void buildAnonymousTypeBinding(SourceTypeBinding enclosingType, ReferenceBinding anonymousType.tagBits |= TagBits.HierarchyHasProblems; anonymousType.setSuperInterfaces(Binding.NO_SUPERINTERFACES); } if (supertype.isSealed()) { - problemReporter().sealedAnonymousClassCannotExtendSealedType(typeReference, supertype); + problemReporter().anonymousClassCannotExtendSealedType(typeReference, supertype); anonymousType.tagBits |= TagBits.HierarchyHasProblems; anonymousType.setSuperInterfaces(Binding.NO_SUPERINTERFACES); } @@ -127,7 +112,6 @@ void buildAnonymousTypeBinding(SourceTypeBinding enclosingType, ReferenceBinding } else { anonymousType.setSuperClass(supertype); anonymousType.setSuperInterfaces(Binding.NO_SUPERINTERFACES); - checkForEnumSealedPreview(supertype, anonymousType); TypeReference typeReference = this.referenceContext.allocation.type; if (typeReference != null) { // no check for enum constant body this.referenceContext.superclass = typeReference; @@ -150,7 +134,7 @@ void buildAnonymousTypeBinding(SourceTypeBinding enclosingType, ReferenceBinding anonymousType.tagBits |= TagBits.HierarchyHasProblems; anonymousType.setSuperClass(getJavaLangObject()); } else if (supertype.isSealed()) { - problemReporter().sealedAnonymousClassCannotExtendSealedType(typeReference, supertype); + problemReporter().anonymousClassCannotExtendSealedType(typeReference, supertype); anonymousType.tagBits |= TagBits.HierarchyHasProblems; anonymousType.setSuperClass(getJavaLangObject()); } @@ -163,27 +147,6 @@ void buildAnonymousTypeBinding(SourceTypeBinding enclosingType, ReferenceBinding anonymousType.verifyMethods(environment().methodVerifier()); } - private void checkForEnumSealedPreview(ReferenceBinding supertype, LocalTypeBinding anonymousType) { - if (!JavaFeature.SEALED_CLASSES.isSupported(compilerOptions()) - || !supertype.isEnum() - || !(supertype instanceof SourceTypeBinding)) - return; - - SourceTypeBinding sourceSuperType = (SourceTypeBinding) supertype; - ReferenceBinding[] permTypes = sourceSuperType.permittedTypes(); - int sz = permTypes == null ? 0 : permTypes.length; - if (sz == 0) { - permTypes = new ReferenceBinding[] {anonymousType}; - } else { - System.arraycopy(permTypes, 0, - permTypes = new ReferenceBinding[sz + 1], 0, - sz); - permTypes[sz] = anonymousType; - } - anonymousType.modifiers |= ClassFileConstants.AccFinal; // JLS 15 / sealed preview/Sec 8.9.1 - sourceSuperType.setPermittedTypes(permTypes); - } - void buildComponents() { SourceTypeBinding sourceType = this.referenceContext.binding; if (!sourceType.isRecord()) return; @@ -332,7 +295,7 @@ private LocalTypeBinding buildLocalType(SourceTypeBinding enclosingType, Package this.referenceContext.initializerScope = new MethodScope(this, this.referenceContext, false); // build the binding or the local type - LocalTypeBinding localType = new LocalTypeBinding(this, enclosingType, innermostSwitchCase()); + LocalTypeBinding localType = new LocalTypeBinding(this, enclosingType, enclosingSwitchLabel()); this.referenceContext.binding = localType; checkAndSetModifiers(); buildTypeVariables(); @@ -390,7 +353,6 @@ void buildLocalTypeBinding(SourceTypeBinding enclosingType) { LocalTypeBinding localType = buildLocalType(enclosingType, enclosingType.fPackage); connectTypeHierarchy(); - connectImplicitPermittedTypes(); if (compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5) { checkParameterizedTypeBounds(); checkParameterizedSuperTypeCollisions(); @@ -629,13 +591,12 @@ private void checkAndSetModifiers() { CompilerOptions options = compilerOptions(); boolean is16Plus = compilerOptions().sourceLevel >= ClassFileConstants.JDK16; boolean isSealedSupported = JavaFeature.SEALED_CLASSES.isSupported(options); - boolean flagSealedNonModifiers = isSealedSupported && - (modifiers & (ExtraCompilerModifiers.AccSealed | ExtraCompilerModifiers.AccNonSealed)) != 0; + boolean hierarchySealed = (modifiers & (ExtraCompilerModifiers.AccSealed | ExtraCompilerModifiers.AccNonSealed)) != 0; switch (modifiers & (ExtraCompilerModifiers.AccSealed | ExtraCompilerModifiers.AccNonSealed | ClassFileConstants.AccFinal)) { case ExtraCompilerModifiers.AccSealed, ExtraCompilerModifiers.AccNonSealed, ClassFileConstants.AccFinal, ClassFileConstants.AccDefault : break; default : - problemReporter().IllegalModifierCombinationForType(sourceType); + problemReporter().illegalModifierCombinationForType(sourceType); break; } if (sourceType.isRecord()) { @@ -673,7 +634,7 @@ private void checkAndSetModifiers() { } final int UNEXPECTED_MODIFIERS =~(ClassFileConstants.AccEnum | ClassFileConstants.AccStrictfp); if ((modifiers & ExtraCompilerModifiers.AccJustFlag & UNEXPECTED_MODIFIERS) != 0 - || flagSealedNonModifiers) { + || hierarchySealed) { problemReporter().illegalModifierForLocalEnumDeclaration(sourceType); return; } @@ -694,8 +655,19 @@ private void checkAndSetModifiers() { if (compilerOptions().complianceLevel < ClassFileConstants.JDK9) modifiers |= ClassFileConstants.AccFinal; // set AccEnum flag for anonymous body of enum constants - if (this.referenceContext.allocation.type == null) + if (this.referenceContext.allocation.type == null) { modifiers |= ClassFileConstants.AccEnum; + // 8.1.1.4 local enum classes are implicitly static - we can't trust isLocalType() which answers true for all anonymous types. + Scope scope = this; + while ((scope = scope.parent) != null) { + if (scope instanceof MethodScope methodScope) { + if (methodScope.referenceContext instanceof TypeDeclaration) + continue; + modifiers |= ClassFileConstants.AccStatic; + break; + } + } + } } else if (this.parent.referenceContext() instanceof TypeDeclaration) { TypeDeclaration typeDecl = (TypeDeclaration) this.parent.referenceContext(); if (TypeDeclaration.kind(typeDecl.modifiers) == TypeDeclaration.INTERFACE_DECL) { @@ -773,7 +745,7 @@ private void checkAndSetModifiers() { | ClassFileConstants.AccStrictfp | ClassFileConstants.AccAnnotation | ((is16Plus && this.parent instanceof ClassScope) ? ClassFileConstants.AccStatic : 0)); if ((realModifiers & UNEXPECTED_MODIFIERS) != 0 - || flagSealedNonModifiers) + || hierarchySealed) problemReporter().localStaticsIllegalVisibilityModifierForInterfaceLocalType(sourceType); // if ((modifiers & ClassFileConstants.AccStatic) != 0) { // problemReporter().recordIllegalStaticModifierForLocalClassOrInterface(sourceType); @@ -795,24 +767,23 @@ private void checkAndSetModifiers() { modifiers |= ClassFileConstants.AccSynthetic; } modifiers |= ClassFileConstants.AccAbstract; - } else if ((realModifiers & ClassFileConstants.AccEnum) != 0) { + } else if ((realModifiers & ClassFileConstants.AccEnum) != 0) { // detect abnormal cases for enums if (isMemberType) { // includes member types defined inside local types - final int UNEXPECTED_MODIFIERS = ~(ClassFileConstants.AccPublic | ClassFileConstants.AccPrivate | ClassFileConstants.AccProtected | ClassFileConstants.AccStatic | ClassFileConstants.AccStrictfp | ClassFileConstants.AccEnum); - if ((realModifiers & UNEXPECTED_MODIFIERS) != 0 || flagSealedNonModifiers) { + final int UNEXPECTED_MODIFIERS = ~(ClassFileConstants.AccPublic | ClassFileConstants.AccPrivate + | ClassFileConstants.AccProtected | ClassFileConstants.AccStatic + | ClassFileConstants.AccStrictfp | ClassFileConstants.AccEnum); + if ((realModifiers & UNEXPECTED_MODIFIERS) != 0 || hierarchySealed) { problemReporter().illegalModifierForMemberEnum(sourceType); modifiers &= ~ClassFileConstants.AccAbstract; // avoid leaking abstract modifier realModifiers &= ~ClassFileConstants.AccAbstract; // modifiers &= ~(realModifiers & UNEXPECTED_MODIFIERS); // realModifiers = modifiers & ExtraCompilerModifiers.AccJustFlag; } - } else if (sourceType.isLocalType()) { -// if (flagSealedNonModifiers) -// problemReporter().illegalModifierForLocalEnum(sourceType); - // each enum constant is an anonymous local type and its modifiers were already checked as an enum constant field - } else { - final int UNEXPECTED_MODIFIERS = ~(ClassFileConstants.AccPublic | ClassFileConstants.AccStrictfp | ClassFileConstants.AccEnum); - if ((realModifiers & UNEXPECTED_MODIFIERS) != 0 || flagSealedNonModifiers) + } else if (!sourceType.isLocalType()) { // local types already handled earlier. + final int UNEXPECTED_MODIFIERS = ~(ClassFileConstants.AccPublic | ClassFileConstants.AccStrictfp + | ClassFileConstants.AccEnum); + if ((realModifiers & UNEXPECTED_MODIFIERS) != 0 || hierarchySealed) problemReporter().illegalModifierForEnum(sourceType); } if (!sourceType.isAnonymousType()) { @@ -827,14 +798,16 @@ private void checkAndSetModifiers() { TypeDeclaration typeDeclaration = this.referenceContext; FieldDeclaration[] fields = typeDeclaration.fields; int fieldsLength = fields == null ? 0 : fields.length; - if (fieldsLength == 0) break checkAbstractEnum; // has no constants so must implement the method itself + if (fieldsLength == 0) + break checkAbstractEnum; // has no constants so must implement the method itself AbstractMethodDeclaration[] methods = typeDeclaration.methods; int methodsLength = methods == null ? 0 : methods.length; // TODO (kent) cannot tell that the superinterfaces are empty or that their methods are implemented boolean definesAbstractMethod = typeDeclaration.superInterfaces != null; for (int i = 0; i < methodsLength && !definesAbstractMethod; i++) definesAbstractMethod = methods[i].isAbstract(); - if (!definesAbstractMethod) break checkAbstractEnum; // all methods have bodies + if (!definesAbstractMethod) + break checkAbstractEnum; // all methods have bodies boolean needAbstractBit = false; for (int i = 0; i < fieldsLength; i++) { FieldDeclaration fieldDecl = fields[i]; @@ -846,8 +819,10 @@ private void checkAndSetModifiers() { } } } - // tag this enum as abstract since an abstract method must be implemented AND all enum constants define an anonymous body - // as a result, each of its anonymous constants will see it as abstract and must implement each inherited abstract method + // tag this enum as abstract since an abstract method must be implemented AND all enum constants + // define an anonymous body + // as a result, each of its anonymous constants will see it as abstract and must implement each + // inherited abstract method if (needAbstractBit) { modifiers |= ClassFileConstants.AccAbstract; } @@ -912,7 +887,7 @@ private void checkAndSetModifiers() { } else if (sourceType.isLocalType()) { final int UNEXPECTED_MODIFIERS = ~(ClassFileConstants.AccAbstract | ClassFileConstants.AccFinal | ClassFileConstants.AccStrictfp | ((is16Plus && this.parent instanceof ClassScope) ? ClassFileConstants.AccStatic : 0)); - if ((realModifiers & UNEXPECTED_MODIFIERS) != 0 || flagSealedNonModifiers) + if ((realModifiers & UNEXPECTED_MODIFIERS) != 0 || hierarchySealed) problemReporter().illegalModifierForLocalClass(sourceType); } else { final int UNEXPECTED_MODIFIERS = ~(ClassFileConstants.AccPublic | ClassFileConstants.AccAbstract | ClassFileConstants.AccFinal | ClassFileConstants.AccStrictfp); @@ -1200,7 +1175,7 @@ private boolean connectSuperclass() { if (sourceType.id == TypeIds.T_JavaLangObject) { // handle the case of redefining java.lang.Object up front sourceType.setSuperClass(null); sourceType.setSuperInterfaces(Binding.NO_SUPERINTERFACES); - sourceType.setPermittedTypes(Binding.NO_PERMITTEDTYPES); + sourceType.setPermittedTypes(Binding.NO_PERMITTED_TYPES); if (!sourceType.isClass()) problemReporter().objectMustBeClass(sourceType); if (this.referenceContext.superclass != null || (this.referenceContext.superInterfaces != null && this.referenceContext.superInterfaces.length > 0)) @@ -1234,6 +1209,14 @@ private boolean connectSuperclass() { } else { return connectRecordSuperclass(); } + } else if (superclass.isSealed() && sourceType.isLocalType()) { + sourceType.setSuperClass(superclass); + problemReporter().localTypeMayNotBePermittedType(sourceType, superclassRef, superclass); + return false; + } else if (superclass.isSealed() && !(sourceType.isFinal() || sourceType.isSealed() || sourceType.isNonSealed())) { + sourceType.setSuperClass(superclass); + problemReporter().permittedTypeNeedsModifier(sourceType, this.referenceContext, superclass); + return false; } else if ((superclass.tagBits & TagBits.HierarchyHasProblems) != 0 || !superclassRef.resolvedType.isValidBinding()) { sourceType.setSuperClass(superclass); @@ -1295,85 +1278,92 @@ private boolean connectEnumSuperclass() { } return !foundCycle; } - private void connectImplicitPermittedTypes(SourceTypeBinding sourceType) { - List types = new ArrayList<>(); - for (TypeDeclaration typeDecl : this.referenceCompilationUnit().types) { - types.addAll(sourceType.collectAllTypeBindings(typeDecl, this.compilationUnitScope())); - } - Set permSubTypes = new LinkedHashSet<>(); - for (ReferenceBinding type : types) { - if (!TypeBinding.equalsEquals(type, sourceType) && type.findSuperTypeOriginatingFrom(sourceType) != null) { - permSubTypes.add(type); - } - } - if (sourceType.isSealed() && sourceType.isLocalType()) { - // bug xxxx flag Error and return; - } - if (permSubTypes.size() == 0) { - if (!sourceType.isLocalType() && !sourceType.isRecord() && !sourceType.isEnum()) // error flagged already - problemReporter().sealedSealedTypeMissingPermits(sourceType, this.referenceContext); - return; - } - sourceType.setPermittedTypes(permSubTypes.toArray(new ReferenceBinding[0])); - } - void connectImplicitPermittedTypes() { - TypeDeclaration typeDecl = this.referenceContext; - SourceTypeBinding sourceType = typeDecl.binding; - if (sourceType.id == TypeIds.T_JavaLangObject) // already handled - return; - if (sourceType.isSealed() && (typeDecl.permittedTypes == null || - typeDecl.permittedTypes.length == 0 || typeDecl.permittedTypes[0].isImplicit())) { - connectImplicitPermittedTypes(sourceType); - } - ReferenceBinding[] memberTypes = sourceType.memberTypes; - if (memberTypes != null && memberTypes != Binding.NO_MEMBER_TYPES) { - for (ReferenceBinding memberType : memberTypes) - ((SourceTypeBinding) memberType).scope.connectImplicitPermittedTypes(); + + /* Check that the permitted subtype and the sealed type are located in close proximity: either in the same module (if the superclass is in a named module) + * or in the same package (if the superclass is in the unnamed module) + * Return true, if all is well. Report error and return false otherwise, + */ + private boolean checkSealingProximity(ReferenceBinding subType, TypeReference subTypeReference, ReferenceBinding sealedType) { + final PackageBinding sealedTypePackage = sealedType.getPackage(); + final ModuleBinding sealedTypeModule = sealedType.module(); + if (subType.getPackage() != sealedTypePackage) { + if (sealedTypeModule.isUnnamed()) + problemReporter().permittedTypeOutsideOfPackage(subType, sealedType, subTypeReference, sealedTypePackage); + else if (subType.module() != sealedTypeModule) + problemReporter().permittedTypeOutsideOfModule(subType, sealedType, subTypeReference, sealedTypeModule); } + return true; } + void connectPermittedTypes() { SourceTypeBinding sourceType = this.referenceContext.binding; - sourceType.setPermittedTypes(Binding.NO_PERMITTEDTYPES); - if (sourceType.id == TypeIds.T_JavaLangObject || sourceType.isEnum()) // already handled - return; if (this.referenceContext.permittedTypes != null) { + sourceType.setPermittedTypes(Binding.NO_PERMITTED_TYPES); try { sourceType.tagBits |= TagBits.SealingTypeHierarchy; + if (!sourceType.isSealed()) + problemReporter().missingSealedModifier(sourceType, this.referenceContext); int length = this.referenceContext.permittedTypes.length; ReferenceBinding[] permittedTypeBindings = new ReferenceBinding[length]; int count = 0; nextPermittedType : for (int i = 0; i < length; i++) { TypeReference permittedTypeRef = this.referenceContext.permittedTypes[i]; ReferenceBinding permittedType = findPermittedtype(permittedTypeRef); - if (permittedType == null) { // detected cycle + if (permittedType == null || !permittedType.isValidBinding()) { continue nextPermittedType; } - if (!isPermittedTypeInAllowedFormat(sourceType, permittedTypeRef, permittedType)) - continue nextPermittedType; - // check for simple interface collisions - // Check for a duplicate interface once the name is resolved, otherwise we may be confused (i.e. a.b.I and c.d.I) + if (sourceType.isClass()) { + ReferenceBinding superClass = permittedType.superclass(); + superClass = superClass == null ? null : superClass.actualType(); + if (!TypeBinding.equalsEquals(sourceType, superClass)) + problemReporter().sealedClassNotDirectSuperClassOf(permittedType, permittedTypeRef, sourceType); + } else if (sourceType.isInterface()) { + ReferenceBinding[] superInterfaces = permittedType.superInterfaces(); + boolean hierarchyOK = false; + if (superInterfaces != null) { + for (ReferenceBinding superInterface : superInterfaces) { + superInterface = superInterface == null ? null : superInterface.actualType(); + if (TypeBinding.equalsEquals(sourceType, superInterface)) { + hierarchyOK = true; + break; + } + } + if (!hierarchyOK) + problemReporter().sealedInterfaceNotDirectSuperInterfaceOf(permittedType, permittedTypeRef, sourceType); + } + } + + checkSealingProximity(permittedType, permittedTypeRef, sourceType); + for (int j = 0; j < i; j++) { if (TypeBinding.equalsEquals(permittedTypeBindings[j], permittedType)) { - problemReporter().sealedDuplicateTypeInPermits(sourceType, permittedTypeRef, permittedType); + problemReporter().duplicatePermittedType(permittedTypeRef, permittedType); continue nextPermittedType; } } - // only want to reach here when no errors are reported permittedTypeBindings[count++] = permittedType; } - // hold onto all correctly resolved superinterfaces if (count > 0) { if (count != length) System.arraycopy(permittedTypeBindings, 0, permittedTypeBindings = new ReferenceBinding[count], 0, count); sourceType.setPermittedTypes(permittedTypeBindings); } else { - sourceType.setPermittedTypes(Binding.NO_PERMITTEDTYPES); + sourceType.setPermittedTypes(Binding.NO_PERMITTED_TYPES); } } finally { sourceType.tagBits &= ~TagBits.SealingTypeHierarchy; } + } else { + ReferenceBinding[] permittedTypes = sourceType.permittedTypes(); + if (permittedTypes == null || permittedTypes.length == 0) { + sourceType.setPermittedTypes(Binding.NO_PERMITTED_TYPES); + if (sourceType.isSealed()) { + if (!sourceType.isLocalType() && !sourceType.isRecord() && !sourceType.isEnum()) // error flagged alread + problemReporter().missingPermitsClause(sourceType, this.referenceContext); + } + } } ReferenceBinding[] memberTypes = sourceType.memberTypes; if (memberTypes != null && memberTypes != Binding.NO_MEMBER_TYPES) { @@ -1382,29 +1372,6 @@ void connectPermittedTypes() { } } - private boolean isPermittedTypeInAllowedFormat(SourceTypeBinding sourceType, TypeReference permittedTypeRef, - ReferenceBinding permittedType) { - if (!(permittedType.isMemberType() && permittedTypeRef instanceof SingleTypeReference)) - return true; - ReferenceBinding enclosingType = permittedType.enclosingType(); - while (enclosingType != null) { - if (TypeBinding.equalsEquals(sourceType, enclosingType)) { - CompilationUnitScope cu = this.compilationUnitScope(); - if (cu.imports != null || cu.imports.length > 0) { - for (ImportBinding ib : cu.imports) { - Binding resolvedImport = cu.resolveSingleImport(ib, Binding.TYPE); - if (resolvedImport instanceof TypeBinding && - TypeBinding.equalsEquals(permittedType, (TypeBinding) resolvedImport)) - return true; - } - } - return false; - } - enclosingType = enclosingType.enclosingType(); - } - return true; - } - private boolean connectRecordSuperclass() { SourceTypeBinding sourceType = this.referenceContext.binding; ReferenceBinding rootRecordType = getJavaLangRecord(); @@ -1428,70 +1395,89 @@ private boolean connectRecordSuperclass() { // GROOVY private->protected protected boolean connectSuperInterfaces() { SourceTypeBinding sourceType = this.referenceContext.binding; - sourceType.setSuperInterfaces(Binding.NO_SUPERINTERFACES); - if (this.referenceContext.superInterfaces == null) { - if (sourceType.isAnnotationType() && compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5) { // do not connect if source < 1.5 as annotation already got flagged as syntax error) { - ReferenceBinding annotationType = getJavaLangAnnotationAnnotation(); - boolean foundCycle = detectHierarchyCycle(sourceType, annotationType, null); - sourceType.setSuperInterfaces(new ReferenceBinding[] { annotationType }); - return !foundCycle; - } - return true; - } - if (sourceType.id == TypeIds.T_JavaLangObject) // already handled the case of redefining java.lang.Object - return true; - + boolean hasSealedSupertype = sourceType.superclass == null ? false : sourceType.superclass.isSealed(); boolean noProblems = true; - int length = this.referenceContext.superInterfaces.length; - ReferenceBinding[] interfaceBindings = new ReferenceBinding[length]; - int count = 0; - nextInterface : for (int i = 0; i < length; i++) { - TypeReference superInterfaceRef = this.referenceContext.superInterfaces[i]; - ReferenceBinding superInterface = findSupertype(superInterfaceRef); - if (superInterface == null) { // detected cycle - sourceType.tagBits |= TagBits.HierarchyHasProblems; - noProblems = false; - continue nextInterface; + try { + sourceType.setSuperInterfaces(Binding.NO_SUPERINTERFACES); + if (this.referenceContext.superInterfaces == null) { + if (sourceType.isAnnotationType() && compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5) { // do not connect if source < 1.5 as annotation already got flagged as syntax error) { + ReferenceBinding annotationType = getJavaLangAnnotationAnnotation(); + boolean foundCycle = detectHierarchyCycle(sourceType, annotationType, null); + sourceType.setSuperInterfaces(new ReferenceBinding[] { annotationType }); + return !foundCycle; + } + return true; } + if (sourceType.id == TypeIds.T_JavaLangObject) // already handled the case of redefining java.lang.Object + return true; - // check for simple interface collisions - // Check for a duplicate interface once the name is resolved, otherwise we may be confused (i.e. a.b.I and c.d.I) - for (int j = 0; j < i; j++) { - if (TypeBinding.equalsEquals(interfaceBindings[j], superInterface)) { - problemReporter().duplicateSuperinterface(sourceType, superInterfaceRef, superInterface); + int length = this.referenceContext.superInterfaces.length; + ReferenceBinding[] interfaceBindings = new ReferenceBinding[length]; + int count = 0; + nextInterface : for (int i = 0; i < length; i++) { + TypeReference superInterfaceRef = this.referenceContext.superInterfaces[i]; + ReferenceBinding superInterface = findSupertype(superInterfaceRef); + if (superInterface == null) { // detected cycle sourceType.tagBits |= TagBits.HierarchyHasProblems; noProblems = false; continue nextInterface; } + + if (superInterface.isSealed()) + hasSealedSupertype = true; + + // check for simple interface collisions + // Check for a duplicate interface once the name is resolved, otherwise we may be confused (i.e. a.b.I and c.d.I) + for (int j = 0; j < i; j++) { + if (TypeBinding.equalsEquals(interfaceBindings[j], superInterface)) { + problemReporter().duplicateSuperinterface(sourceType, superInterfaceRef, superInterface); + sourceType.tagBits |= TagBits.HierarchyHasProblems; + noProblems = false; + continue nextInterface; + } + } + if (!superInterface.isInterface() && (superInterface.tagBits & TagBits.HasMissingType) == 0) { + problemReporter().superinterfaceMustBeAnInterface(sourceType, superInterfaceRef, superInterface); + sourceType.tagBits |= TagBits.HierarchyHasProblems; + noProblems = false; + continue nextInterface; + } else if (superInterface.isAnnotationType()){ + problemReporter().annotationTypeUsedAsSuperinterface(sourceType, superInterfaceRef, superInterface); + } + if ((superInterface.tagBits & TagBits.HasDirectWildcard) != 0) { + problemReporter().superTypeCannotUseWildcard(sourceType, superInterfaceRef, superInterface); + sourceType.tagBits |= TagBits.HierarchyHasProblems; + noProblems = false; + continue nextInterface; + } + if ((superInterface.tagBits & TagBits.HierarchyHasProblems) != 0 + || !superInterfaceRef.resolvedType.isValidBinding()) { + sourceType.tagBits |= TagBits.HierarchyHasProblems; // propagate if missing supertype + noProblems &= superInterfaceRef.resolvedType.isValidBinding(); + } + if (superInterface.isSealed() && sourceType.isLocalType()) { + problemReporter().localTypeMayNotBePermittedType(sourceType, superInterfaceRef, superInterface); + noProblems = false; + } else if (superInterface.isSealed() && !(sourceType.isFinal() || sourceType.isSealed() || sourceType.isNonSealed())) { + problemReporter().permittedTypeNeedsModifier(sourceType, this.referenceContext, superInterface); + noProblems = false; + } + + // only want to reach here when no errors are reported + sourceType.typeBits |= (superInterface.typeBits & TypeIds.InheritableBits); + interfaceBindings[count++] = superInterface; } - if (!superInterface.isInterface() && (superInterface.tagBits & TagBits.HasMissingType) == 0) { - problemReporter().superinterfaceMustBeAnInterface(sourceType, superInterfaceRef, superInterface); - sourceType.tagBits |= TagBits.HierarchyHasProblems; - noProblems = false; - continue nextInterface; - } else if (superInterface.isAnnotationType()){ - problemReporter().annotationTypeUsedAsSuperinterface(sourceType, superInterfaceRef, superInterface); - } - if ((superInterface.tagBits & TagBits.HasDirectWildcard) != 0) { - problemReporter().superTypeCannotUseWildcard(sourceType, superInterfaceRef, superInterface); - sourceType.tagBits |= TagBits.HierarchyHasProblems; - noProblems = false; - continue nextInterface; + // hold onto all correctly resolved superinterfaces + if (count > 0) { + if (count != length) + System.arraycopy(interfaceBindings, 0, interfaceBindings = new ReferenceBinding[count], 0, count); + sourceType.setSuperInterfaces(interfaceBindings); } - if ((superInterface.tagBits & TagBits.HierarchyHasProblems) != 0 - || !superInterfaceRef.resolvedType.isValidBinding()) { - sourceType.tagBits |= TagBits.HierarchyHasProblems; // propagate if missing supertype - noProblems &= superInterfaceRef.resolvedType.isValidBinding(); + } finally { + if (sourceType.isNonSealed() && !hasSealedSupertype) { + if (!sourceType.isRecord() && !sourceType.isLocalType() && !sourceType.isEnum() && !sourceType.isSealed()) // avoid double jeopardy + problemReporter().disallowedNonSealedModifier(sourceType, this.referenceContext); } - // only want to reach here when no errors are reported - sourceType.typeBits |= (superInterface.typeBits & TypeIds.InheritableBits); - interfaceBindings[count++] = superInterface; - } - // hold onto all correctly resolved superinterfaces - if (count > 0) { - if (count != length) - System.arraycopy(interfaceBindings, 0, interfaceBindings = new ReferenceBinding[count], 0, count); - sourceType.setSuperInterfaces(interfaceBindings); } return noProblems; } @@ -1699,7 +1685,7 @@ private ReferenceBinding findSupertype(TypeReference typeReference) { } catch (AbortCompilation e) { SourceTypeBinding sourceType = this.referenceContext.binding; if (sourceType.superInterfaces == null) sourceType.setSuperInterfaces(Binding.NO_SUPERINTERFACES); // be more resilient for hierarchies (144976) - if (sourceType.permittedTypes == null) sourceType.setPermittedTypes(Binding.NO_PERMITTEDTYPES); + if (sourceType.permittedTypes == null) sourceType.setPermittedTypes(Binding.NO_PERMITTED_TYPES); e.updateContext(typeReference, referenceCompilationUnit().compilationResult); throw e; } finally { @@ -1724,10 +1710,10 @@ private ReferenceBinding findPermittedtype(TypeReference typeReference) { } typeReference.bits |= ASTNode.IgnoreRawTypeCheck; ReferenceBinding permittedType = (ReferenceBinding) typeReference.resolveType(this); - return permittedType; + return permittedType != null ? permittedType.actualType() : permittedType; // while permitted classes/interfaces cannot be parameterized with type arguments, they are not raw either } catch (AbortCompilation e) { SourceTypeBinding sourceType = this.referenceContext.binding; - if (sourceType.permittedTypes == null) sourceType.setPermittedTypes(Binding.NO_PERMITTEDTYPES); + if (sourceType.permittedTypes == null) sourceType.setPermittedTypes(Binding.NO_PERMITTED_TYPES); e.updateContext(typeReference, referenceCompilationUnit().compilationResult); throw e; } finally { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java index d97ee6ec95..b8749862d0 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java @@ -28,16 +28,23 @@ import java.util.Map; import java.util.Set; import java.util.function.Predicate; - import org.eclipse.jdt.core.compiler.CharOperation; -import org.eclipse.jdt.internal.compiler.ast.*; +import org.eclipse.jdt.internal.compiler.ast.ASTNode; +import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; +import org.eclipse.jdt.internal.compiler.ast.ImportReference; +import org.eclipse.jdt.internal.compiler.ast.Invocation; +import org.eclipse.jdt.internal.compiler.ast.ModuleDeclaration; +import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; +import org.eclipse.jdt.internal.compiler.ast.TypeReference; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.env.AccessRestriction; import org.eclipse.jdt.internal.compiler.env.IUpdatableModule; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.JavaFeature; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; -import org.eclipse.jdt.internal.compiler.util.*; +import org.eclipse.jdt.internal.compiler.util.HashtableOfObject; +import org.eclipse.jdt.internal.compiler.util.HashtableOfType; +import org.eclipse.jdt.internal.compiler.util.ObjectVector; public class CompilationUnitScope extends Scope { @@ -277,14 +284,20 @@ void checkAndSetImports() { int numberOfImports = numberOfStatements + defaultImports.length; for (int i = 0; i < numberOfStatements; i++) { ImportReference importReference = this.referenceContext.imports[i]; - if ((importReference.bits & ASTNode.OnDemand) != 0 && !importReference.isStatic()) { - if (CharOperation.equals(TypeConstants.JAVA_LANG, importReference.tokens)) { - numberOfImports--; - } else if ((importReference.modifiers & ClassFileConstants.AccModule) != 0 && - this.referenceContext.isSimpleCompilationUnit() && - CharOperation.equals(TypeConstants.JAVA_BASE, importReference.tokens)) { - numberOfImports--; - } + if ((importReference.bits & ASTNode.OnDemand) != 0) { + if (importReference.isStatic()) { + if (CharOperation.equals(TypeConstants.JAVA_IO_IO, importReference.tokens)) { + numberOfImports--; + } + } else { + if (CharOperation.equals(TypeConstants.JAVA_LANG, importReference.tokens)) { + numberOfImports--; + } else if ((importReference.modifiers & ClassFileConstants.AccModule) != 0 && + this.referenceContext.isSimpleCompilationUnit() && + CharOperation.equals(TypeConstants.JAVA_BASE, importReference.tokens)) { + numberOfImports--; + } + } } } ImportBinding[] resolvedImports = new ImportBinding[numberOfImports]; @@ -303,6 +316,7 @@ void checkAndSetImports() { return false; } return (CharOperation.equals(TypeConstants.JAVA_LANG, imp.tokens) || + (CharOperation.equals(TypeConstants.JAVA_IO_IO, imp.tokens) && imp.isStatic()) || ((imp.modifiers & ClassFileConstants.AccModule) != 0 && CharOperation.equals(TypeConstants.JAVA_BASE, imp.tokens))); }; @@ -475,8 +489,6 @@ void sealTypeHierarchy() { for (SourceTypeBinding sourceType : this.topLevelTypes) { sourceType.scope.connectPermittedTypes(); } - for (SourceTypeBinding topLevelType : this.topLevelTypes) - topLevelType.scope.connectImplicitPermittedTypes(); } void integrateAnnotationsInHierarchy() { // Only now that all hierarchy information is built we're ready for ... @@ -839,13 +851,24 @@ private MethodBinding findStaticMethod(ReferenceBinding currentType, char[] sele } // GROOVY package->protected protected ImportBinding[] getDefaultImports() { + ImportBinding javaIOImport = null; if (JavaFeature.IMPLICIT_CLASSES_AND_INSTANCE_MAIN_METHODS.isSupported(this.environment.globalOptions) && this.referenceContext.isSimpleCompilationUnit()) { ModuleBinding module = this.environment.getModule(CharOperation.concatWith(TypeConstants.JAVA_BASE, '.')); + Binding javaioIO = findSingleImport(TypeConstants.JAVA_IO_IO, Binding.TYPE, false); + if (javaioIO != null) { + javaIOImport = new ImportBinding(TypeConstants.JAVA_IO_IO, true, javaioIO, null) { + @Override + public boolean isStatic() { + return true; + } + }; + } if (module != null) { ImportBinding javaBase = new ImportBinding(TypeConstants.JAVA_BASE, true, module, null); // No need for the java.lang.* as module java.base covers it - return new ImportBinding[] {javaBase}; + return javaIOImport != null ? new ImportBinding[] {javaBase, javaIOImport}: + new ImportBinding[] {javaBase}; // this module import is not cached, there shouldn't be many files needing it. } } @@ -855,7 +878,10 @@ protected ImportBinding[] getDefaultImports() { Binding importBinding = this.environment.getTopLevelPackage(TypeConstants.JAVA); if (importBinding != null) importBinding = ((PackageBinding) importBinding).getTypeOrPackage(TypeConstants.JAVA_LANG[1], module(), false); - + ImportBinding[] implicitImports = javaIOImport != null ? new ImportBinding[2] : new ImportBinding[1]; + if (javaIOImport != null) { + implicitImports[1] = javaIOImport; + } if (importBinding == null || !importBinding.isValidBinding()) { // create a proxy for the missing BinaryType problemReporter().isClassPathCorrect( @@ -864,8 +890,11 @@ protected ImportBinding[] getDefaultImports() { this.environment.missingClassFileLocation, false, null/*resolving j.l.O is not specific to any referencing type*/); BinaryTypeBinding missingObject = this.environment.createMissingType(null, TypeConstants.JAVA_LANG_OBJECT); importBinding = missingObject.fPackage; + implicitImports[0] = new ImportBinding(TypeConstants.JAVA_LANG, true, importBinding, null); + return implicitImports; } - return this.environment.root.defaultImports = new ImportBinding[] {new ImportBinding(TypeConstants.JAVA_LANG, true, importBinding, null)}; + implicitImports[0] = new ImportBinding(TypeConstants.JAVA_LANG, true, importBinding, null); + return this.environment.root.defaultImports = implicitImports; } // NOT Public API public final Binding getImport(char[][] compoundName, boolean onDemand, int modifiers) { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintExceptionFormula.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintExceptionFormula.java index d7d0c3e327..04e33d0866 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintExceptionFormula.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintExceptionFormula.java @@ -21,7 +21,6 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; - import org.eclipse.jdt.internal.compiler.ast.FunctionalExpression; import org.eclipse.jdt.internal.compiler.ast.LambdaExpression; import org.eclipse.jdt.internal.compiler.ast.ReferenceExpression; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java index 2bce82c25e..3ee7f51ec0 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java @@ -21,17 +21,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; - -import org.eclipse.jdt.internal.compiler.ast.Argument; -import org.eclipse.jdt.internal.compiler.ast.ConditionalExpression; -import org.eclipse.jdt.internal.compiler.ast.Expression; -import org.eclipse.jdt.internal.compiler.ast.ExpressionContext; -import org.eclipse.jdt.internal.compiler.ast.Invocation; -import org.eclipse.jdt.internal.compiler.ast.LambdaExpression; -import org.eclipse.jdt.internal.compiler.ast.MessageSend; -import org.eclipse.jdt.internal.compiler.ast.ReferenceExpression; -import org.eclipse.jdt.internal.compiler.ast.SwitchExpression; -import org.eclipse.jdt.internal.compiler.ast.Wildcard; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18.SuspendedInferenceRecord; /** @@ -158,9 +148,9 @@ public Object reduce(InferenceContext18 inferenceContext) throws InferenceFailur }; } else if (this.left instanceof SwitchExpression) { SwitchExpression se = (SwitchExpression) this.left; - ConstraintFormula[] cfs = new ConstraintFormula[se.resultExpressions.size()]; + ConstraintFormula[] cfs = new ConstraintFormula[se.resultExpressions().size()]; int i = 0; - for (Expression re : se.resultExpressions) { + for (Expression re : se.resultExpressions()) { cfs[i++] = new ConstraintExpressionFormula(re, this.right, this.relation, this.isSoft); } return cfs; @@ -552,7 +542,7 @@ Collection inputVariables(final InferenceContext18 context) { } else if (this.left instanceof SwitchExpression && this.left.isPolyExpression()) { SwitchExpression expr = (SwitchExpression) this.left; Set variables = new LinkedHashSet<>(); - for (Expression re : expr.resultExpressions) { + for (Expression re : expr.resultExpressions()) { variables.addAll(new ConstraintExpressionFormula(re, this.right, COMPATIBLE).inputVariables(context)); } return variables; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintTypeFormula.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintTypeFormula.java index 7b7346deac..432a70e482 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintTypeFormula.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ConstraintTypeFormula.java @@ -17,7 +17,6 @@ import java.util.ArrayList; import java.util.List; - import org.eclipse.jdt.internal.compiler.ast.Invocation; import org.eclipse.jdt.internal.compiler.ast.Wildcard; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ElementValuePair.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ElementValuePair.java index 72ddc15e3b..9ae8aa2fbc 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ElementValuePair.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ElementValuePair.java @@ -15,7 +15,13 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.lookup; -import org.eclipse.jdt.internal.compiler.ast.*; +import org.eclipse.jdt.internal.compiler.ast.Annotation; +import org.eclipse.jdt.internal.compiler.ast.ArrayInitializer; +import org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess; +import org.eclipse.jdt.internal.compiler.ast.Expression; +import org.eclipse.jdt.internal.compiler.ast.FieldReference; +import org.eclipse.jdt.internal.compiler.ast.NameReference; +import org.eclipse.jdt.internal.compiler.ast.Reference; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.Constant; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ExternalAnnotationSuperimposer.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ExternalAnnotationSuperimposer.java index ae7e323598..a2291494de 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ExternalAnnotationSuperimposer.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ExternalAnnotationSuperimposer.java @@ -20,7 +20,6 @@ import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; - import org.eclipse.jdt.internal.compiler.ast.Argument; import org.eclipse.jdt.internal.compiler.classfmt.ExternalAnnotationProvider; import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.java index aa7b0fdd1a..c28b24760d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.java @@ -57,5 +57,5 @@ public interface ExtraCompilerModifiers { // modifier constant final int AccImplementing = ASTNode.Bit30; // record fact a method implements another one (it is concrete and overrides an abstract one) final int AccImplicitlyDeclared = ASTNode.Bit30; // used for implicitly declared classes final int AccGenericSignature = ASTNode.Bit31; // record fact a type/method/field involves generics in its signature (and need special signature attr) - final int AccOutOfFlowScope = ASTNode.Bit29; + final int AccOutOfFlowScope = ASTNode.Bit29; // used to signal pattern binding variables not being live. } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java index a8a32fefc7..8da5132c9b 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ImplicitNullAnnotationVerifier.java @@ -17,7 +17,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java index 96595c5f56..f3ff9a39ec 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java @@ -14,29 +14,9 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.lookup; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - +import java.util.*; import org.eclipse.jdt.core.compiler.CharOperation; -import org.eclipse.jdt.internal.compiler.ast.AllocationExpression; -import org.eclipse.jdt.internal.compiler.ast.ConditionalExpression; -import org.eclipse.jdt.internal.compiler.ast.Expression; -import org.eclipse.jdt.internal.compiler.ast.FunctionalExpression; -import org.eclipse.jdt.internal.compiler.ast.Invocation; -import org.eclipse.jdt.internal.compiler.ast.LambdaExpression; -import org.eclipse.jdt.internal.compiler.ast.RecordPattern; -import org.eclipse.jdt.internal.compiler.ast.ReferenceExpression; -import org.eclipse.jdt.internal.compiler.ast.SwitchExpression; -import org.eclipse.jdt.internal.compiler.ast.Wildcard; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.lookup.TypeConstants.BoundCheckStatus; import org.eclipse.jdt.internal.compiler.util.Sorting; @@ -599,7 +579,7 @@ private ReductionResult addJDK_8153748ConstraintsFromExpression(Expression argum } else if (argument instanceof SwitchExpression) { SwitchExpression se = (SwitchExpression) argument; ReductionResult result = ReductionResult.FALSE; - for (Expression re : se.resultExpressions) { + for (Expression re : se.resultExpressions()) { result = addJDK_8153748ConstraintsFromExpression(re, parameter, method, substitution); if (result == ReductionResult.FALSE) break; @@ -743,7 +723,7 @@ private boolean addConstraintsToC_OneExpr(Expression expri, Set applicablePermTypes = new ArrayList<>(); - for (ReferenceBinding pt : permTypes) { - ReferenceBinding permittedTypeAvatar = pt; - if (pt.isRawType()) { - ReferenceBinding ptRef = pt.actualType(); - ReferenceBinding enclosingType1 = ptRef.enclosingType(); - if (enclosingType1 != null) { - // don't use TypeSystem.getParameterizedType below as this is just for temporary check. - ParameterizedTypeBinding ptb = new ParameterizedTypeBinding(ptRef, this.arguments, ptRef.enclosingType(), this.environment); - ptb.superclass(); - ptb.superInterfaces(); - permittedTypeAvatar = ptb; + List permittedTypes = new ArrayList<>(); + for (ReferenceBinding pt : this.type.permittedTypes()) { + TypeBinding sooper = pt.findSuperTypeOriginatingFrom(this); + if (sooper == null || !sooper.isValidBinding() || sooper.isProvablyDistinct(this)) + continue; + TypeBinding current = this; + Map map = new HashMap<>(); + do { + if (sooper.isParameterizedType() && current.isParameterizedType()) { + for (int i = 0, length = sooper.typeArguments().length; i < length; i++) { + TypeBinding t = sooper.typeArguments()[i]; + if (t instanceof TypeVariableBinding tvb) { + map.put(tvb, current.typeArguments()[i]); + } + } } - } - if (permittedTypeAvatar.isCompatibleWith(this)) - applicablePermTypes.add(pt); + current = current.enclosingType(); + sooper = sooper.enclosingType(); + } while (current != null); + + Substitution substitution = new Substitution() { + @Override + public LookupEnvironment environment() { + return ParameterizedTypeBinding.this.environment; + } + @Override + public boolean isRawSubstitution() { + return false; + } + @Override + public TypeBinding substitute(TypeVariableBinding typeVariable) { + TypeBinding retVal = map.get(typeVariable.unannotated()); + if (retVal == null) { + retVal = ParameterizedTypeBinding.this.environment.createWildcard((ReferenceBinding) typeVariable.declaringElement, typeVariable.rank, null, null, Wildcard.UNBOUND); + map.put(typeVariable, retVal); + } + return retVal; + } + }; + permittedTypes.add((ReferenceBinding) Scope.substitute(substitution, pt)); } - return applicablePermTypes.toArray(new ReferenceBinding[0]); + + return permittedTypes.toArray(new ReferenceBinding[0]); } @Override diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.java index 82e59da9fa..1321945527 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/PolyTypeBinding.java @@ -17,7 +17,6 @@ package org.eclipse.jdt.internal.compiler.lookup; import org.eclipse.jdt.internal.compiler.ast.Expression; -import org.eclipse.jdt.internal.compiler.ast.LambdaExpression; public class PolyTypeBinding extends TypeBinding { @@ -75,8 +74,7 @@ public char[] readableName() { @Override public char[] shortReadableName() { - return this.expression instanceof LambdaExpression ? - ((LambdaExpression) this.expression).printExpression(0, new StringBuilder(), true).toString().toCharArray() : readableName(); + return this.expression.printExpression(0, new StringBuilder(), true).toString().toCharArray(); } @Override diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.java index f7f390d0ff..07343f825e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.java @@ -15,7 +15,6 @@ package org.eclipse.jdt.internal.compiler.lookup; import java.lang.reflect.Field; - import org.eclipse.jdt.core.compiler.CharOperation; @SuppressWarnings("rawtypes") diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.java index 97a04883ce..a4e0006352 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.java @@ -22,7 +22,6 @@ package org.eclipse.jdt.internal.compiler.lookup; import java.util.Set; - import org.eclipse.jdt.core.compiler.CharOperation; /** diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java index ba9099ffed..6125e14bf3 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java @@ -53,20 +53,18 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.lookup; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.LambdaExpression; import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import org.eclipse.jdt.internal.compiler.impl.JavaFeature; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable; @@ -2109,11 +2107,6 @@ public ReferenceBinding superclass() { return null; } -@Override -public ReferenceBinding[] permittedTypes() { - return Binding.NO_PERMITTEDTYPES; -} - @Override public ReferenceBinding[] superInterfaces() { return Binding.NO_SUPERINTERFACES; @@ -2377,10 +2370,8 @@ public MethodBinding getSingleAbstractMethod(Scope scope, boolean replaceWildcar return this.singleAbstractMethod[index]; } else { this.singleAbstractMethod = new MethodBinding[2]; - // Sec 9.8 of sealed preview - A functional interface is an interface that is not declared sealed... - if (JavaFeature.SEALED_CLASSES.isSupported(scope.compilerOptions()) - && this.isSealed()) - return this.singleAbstractMethod[index] = samProblemBinding; + if (this.isSealed()) + return this.singleAbstractMethod[index] = samProblemBinding; // JLS 9.8 } if (this.compoundName != null) @@ -2556,24 +2547,24 @@ public boolean hasEnclosingInstanceContext() { return false; } -@Override -public List getAllEnumerableReferenceTypes() { +public List getAllEnumerableAvatars() { if (!isSealed()) - return Collections.emptyList(); + throw new UnsupportedOperationException("Operation valid only on sealed types!"); //$NON-NLS-1$ Set permSet = new HashSet<>(Arrays.asList(permittedTypes())); - if (isClass() && (!isAbstract())) + if (isClass() && canBeInstantiated()) permSet.add(this); Set oldSet = new HashSet<>(permSet); do { for (ReferenceBinding type : permSet) { - oldSet.addAll(Arrays.asList(type.permittedTypes())); + if (type.isSealed()) + oldSet.addAll(Arrays.asList(type.permittedTypes())); } Set tmp = oldSet; oldSet = permSet; permSet = tmp; } while (oldSet.size() != permSet.size()); - return Arrays.asList(permSet.toArray(new ReferenceBinding[0])); + return new ArrayList<>(permSet); } // 5.1.6.1 Allowed Narrowing Reference Conversion diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/Scope.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/Scope.java index fed443c289..c9d349e604 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/Scope.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/Scope.java @@ -65,10 +65,15 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.lookup; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.function.Function; import java.util.function.Supplier; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; @@ -1149,6 +1154,18 @@ public final ClassScope enclosingClassScope() { return null; // may answer null if no type around } + public ClassScope enclosingInstanceScope() { + Scope scope = this; + while (true) { + scope = scope.parent; + if (scope == null || scope instanceof MethodScope ms && ms.isStatic) { + return null; + } else if (scope instanceof ClassScope cs) { + return cs; + } + } + } + public final ClassScope enclosingTopMostClassScope() { Scope scope = this; while (scope != null) { @@ -3816,18 +3833,41 @@ public boolean hasErasedCandidatesCollisions(TypeBinding one, TypeBinding two, M } /** - * Returns the immediately enclosing switchCase statement (carried by closest blockScope), + * Returns the immediately enclosing case statement (carried by closest blockScope), */ - public CaseStatement innermostSwitchCase() { + public CaseStatement enclosingSwitchLabel() { Scope scope = this; do { - if (scope instanceof BlockScope) - return ((BlockScope) scope).enclosingCase; + if (scope instanceof BlockScope bs) + return bs.enclosingCase; scope = scope.parent; } while (scope != null); return null; } + /** + * Returns the immediately enclosing switch expression (carried by closest blockScope), + */ + public SwitchExpression enclosingSwitchExpression() { + Scope current = this; + do { + switch(current.kind) { + case METHOD_SCOPE : + case CLASS_SCOPE : + case COMPILATION_UNIT_SCOPE : + case MODULE_SCOPE : + return null; + case BLOCK_SCOPE: { + BlockScope bs = (BlockScope) current; + if (bs.enclosingCase != null && bs.enclosingCase.swich instanceof SwitchExpression se) + return se; + break; + } + } + } while ((current = current.parent) != null); + return null; + } + // Tie break IS running to determine the most specific method binding. protected boolean isAcceptableMethod(MethodBinding one, MethodBinding two) { TypeBinding[] oneParams = one.parameters; @@ -5770,6 +5810,8 @@ public TypeBinding getMatchingUninitializedType(TypeBinding targetClass, boolean || (currentTarget instanceof ReferenceBinding currentRefBind && !currentRefBind.hasEnclosingInstanceContext())) { break; } + if (currentTarget.isStatic() || currentTarget.isLocalType()) + break; currentTarget = currentTarget.enclosingType(); } currentEnclosing = currentEnclosing.parent.classScope(); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SortedCompoundNameVector.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SortedCompoundNameVector.java index f6d2a7d4b8..5589fc8404 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SortedCompoundNameVector.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SortedCompoundNameVector.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.internal.compiler.lookup; import java.util.Arrays; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.util.SortedCharArrays; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SortedSimpleNameVector.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SortedSimpleNameVector.java index 2cd0179488..a8930bbd24 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SortedSimpleNameVector.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SortedSimpleNameVector.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.internal.compiler.lookup; import java.util.Arrays; - import org.eclipse.jdt.internal.compiler.util.SortedCharArrays; /** diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SourceModuleBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SourceModuleBinding.java index aaa78bed80..b6186780d4 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SourceModuleBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SourceModuleBinding.java @@ -17,7 +17,6 @@ import java.util.LinkedHashMap; import java.util.function.IntFunction; import java.util.stream.Stream; - import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.ModuleDeclaration; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java index b640af00b1..7931ab4797 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java @@ -56,36 +56,19 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.lookup; -import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; -import java.util.LinkedHashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; - import org.eclipse.jdt.core.compiler.CharOperation; -import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Annotation; -import org.eclipse.jdt.internal.compiler.ast.Argument; -import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.LambdaExpression; -import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.RecordComponent; -import org.eclipse.jdt.internal.compiler.ast.ReferenceExpression; -import org.eclipse.jdt.internal.compiler.ast.SwitchStatement; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; -import org.eclipse.jdt.internal.compiler.ast.TypeParameter; -import org.eclipse.jdt.internal.compiler.ast.TypeReference; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.ast.TypeReference.AnnotationPosition; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.classfmt.ExternalAnnotationProvider; @@ -1170,239 +1153,49 @@ private void checkAnnotationsInType() { void faultInTypesForFieldsAndMethods() { if (!isPrototype()) throw new IllegalStateException(); - checkPermitsInType(); + if (!this.isLocalType()) + complainIfUnpermittedSubtyping(); // this has nothing to do with fields and methods but time is ripe for this check. checkAnnotationsInType(); internalFaultInTypeForFieldsAndMethods(); } -private Map.Entry getFirstSealedSuperTypeOrInterface(TypeDeclaration typeDecl) { - boolean isAnySuperTypeSealed = typeDecl.superclass != null && this.superclass != null ? this.superclass.isSealed() : false; - if (isAnySuperTypeSealed) - return new AbstractMap.SimpleEntry<>(typeDecl.superclass, this.superclass); +private boolean isAnUnpermittedSubtypeOf(ReferenceBinding superType) { - ReferenceBinding[] superInterfaces1 = this.superInterfaces(); - int l = superInterfaces1 != null ? superInterfaces1.length : 0; - for (int i = 0; i < l; ++i) { - ReferenceBinding superInterface = superInterfaces1[i]; - if (superInterface.isSealed()) { - return new AbstractMap.SimpleEntry<>(typeDecl.superInterfaces[i], superInterface); - } + if (superType == null || !superType.isSealed()) + return false; + + for (ReferenceBinding permittedType : superType.actualType().permittedTypes()) { + if (TypeBinding.equalsEquals(this, permittedType)) + return false; } - return null; + + return true; } -// TODO: Optimize the multiple loops - defer until the feature becomes standard. -private void checkPermitsInType() { +private void complainIfUnpermittedSubtyping() { + + // Diagnose unauthorized subtyping: This cannot be correctly hoisted into ClassScope.{ connectSuperclass() | connectSuperInterfaces() | connectPermittedTypes() } + // but can be taken up now + TypeDeclaration typeDecl = this.scope.referenceContext; - if (this.isInterface()) { - if (isSealed() && isNonSealed()) { - this.scope.problemReporter().sealedInterfaceIsSealedAndNonSealed(this, typeDecl); - return; - } - } - boolean hasPermittedTypes = this.permittedTypes != null && this.permittedTypes.length > 0; - if (hasPermittedTypes) { - if (!this.isSealed()) - this.scope.problemReporter().sealedMissingSealedModifier(this, typeDecl); - ModuleBinding sourceModuleBinding = this.module(); - boolean isUnnamedModule = sourceModuleBinding.isUnnamed(); - if (isUnnamedModule) { - PackageBinding sourceTypePackage = this.getPackage(); - for (int i =0, l = this.permittedTypes.length; i < l; i++) { - ReferenceBinding permType = this.permittedTypes[i]; - if (!permType.isValidBinding()) continue; - if (sourceTypePackage != permType.getPackage()) { - TypeReference permittedTypeRef = typeDecl.permittedTypes[i]; - this.scope.problemReporter().sealedPermittedTypeOutsideOfPackage(permType, this, permittedTypeRef, sourceTypePackage); - } - } - } else { - for (int i = 0, l = this.permittedTypes.length; i < l; i++) { - ReferenceBinding permType = this.permittedTypes[i]; - if (!permType.isValidBinding()) continue; - ModuleBinding permTypeModule = permType.module(); - if (permTypeModule != null && sourceModuleBinding != permTypeModule) { - TypeReference permittedTypeRef = typeDecl.permittedTypes[i]; - this.scope.problemReporter().sealedPermittedTypeOutsideOfModule(permType, this, permittedTypeRef, sourceModuleBinding); - } - } - } + if (this.isAnUnpermittedSubtypeOf(this.superclass)) { + this.scope.problemReporter().sealedSupertypeDoesNotPermit(this, typeDecl.superclass, this.superclass); } - Map.Entry sealedEntry = getFirstSealedSuperTypeOrInterface(typeDecl); - boolean foundSealedSuperTypeOrInterface = sealedEntry != null; - if (this.isLocalType()) { - if (this.isSealed() || this.isNonSealed()) - return; // already handled elsewhere - if (foundSealedSuperTypeOrInterface) { - this.scope.problemReporter().sealedLocalDirectSuperTypeSealed(this, sealedEntry.getKey(), sealedEntry.getValue()); - return; - } - } else if (this.isNonSealed()) { - if (!foundSealedSuperTypeOrInterface) { - if (this.isClass() && !this.isRecord()) // record to give only illegal modifier error. - this.scope.problemReporter().sealedDisAllowedNonSealedModifierInClass(this, typeDecl); - else if (this.isInterface()) - this.scope.problemReporter().sealedDisAllowedNonSealedModifierInInterface(this, typeDecl); - } - } - if (foundSealedSuperTypeOrInterface) { - if (!(this.isFinal() || this.isSealed() || this.isNonSealed())) { - if (this.isClass()) - this.scope.problemReporter().sealedMissingClassModifier(this, typeDecl, sealedEntry.getValue()); - else if (this.isInterface()) - this.scope.problemReporter().sealedMissingInterfaceModifier(this, typeDecl, sealedEntry.getValue()); - } - if (!typeDecl.isRecord() && typeDecl.superclass != null && !checkPermitsAndAdd(this.superclass)) { - reportSealedSuperTypeDoesNotPermitProblem(typeDecl.superclass, this.superclass); - } - for (int i = 0, l = this.superInterfaces.length; i < l; ++i) { - ReferenceBinding superInterface = this.superInterfaces[i]; - if (superInterface != null && !checkPermitsAndAdd(superInterface)) { - TypeReference superInterfaceRef = typeDecl.superInterfaces[i]; - reportSealedSuperTypeDoesNotPermitProblem(superInterfaceRef, superInterface); - } + for (int i = 0, l = this.superInterfaces.length; i < l; ++i) { + ReferenceBinding superInterface = this.superInterfaces[i]; + if (this.isAnUnpermittedSubtypeOf(superInterface)) { + TypeReference superInterfaceRef = typeDecl.superInterfaces[i]; + this.scope.problemReporter().sealedSupertypeDoesNotPermit(this, superInterfaceRef, superInterface); } } + for (ReferenceBinding memberType : this.memberTypes) - ((SourceTypeBinding) memberType).checkPermitsInType(); + ((SourceTypeBinding) memberType).complainIfUnpermittedSubtyping(); - if (this.scope.referenceContext.permittedTypes == null) { - // Ignore implicitly permitted case - return; - } - // In case of errors, be safe. - int l = this.permittedTypes.length <= this.scope.referenceContext.permittedTypes.length ? - this.permittedTypes.length : this.scope.referenceContext.permittedTypes.length; - for (int i = 0; i < l; i++) { - TypeReference permittedTypeRef = this.scope.referenceContext.permittedTypes[i]; - ReferenceBinding permittedType = this.permittedTypes[i]; - if (permittedType == null || !permittedType.isValidBinding()) - continue; - if (this.isClass()) { - ReferenceBinding permSuperType = permittedType.superclass(); - permSuperType = permSuperType.actualType(); - if (!TypeBinding.equalsEquals(this, permSuperType)) { - this.scope.problemReporter().sealedNotDirectSuperClass(permittedType, permittedTypeRef, this); - continue; - } - } else if (this.isInterface()) { - ReferenceBinding[] permSuperInterfaces = permittedType.superInterfaces(); - boolean foundSuperInterface = false; - if (permSuperInterfaces != null) { - for (ReferenceBinding psi : permSuperInterfaces) { - psi = psi.actualType(); - if (TypeBinding.equalsEquals(this, psi)) { - foundSuperInterface = true; - break; - } - } - if (!foundSuperInterface) { - this.scope.problemReporter().sealedNotDirectSuperInterface(permittedType, permittedTypeRef, this); - continue; - } - } - } - } return; } -private void reportSealedSuperTypeDoesNotPermitProblem(TypeReference superTypeRef, TypeBinding superType) { - ModuleBinding sourceModuleBinding = this.module(); - boolean isUnnamedModule = sourceModuleBinding.isUnnamed(); - boolean isClass = false; - if (superType.isClass()) { - isClass = true; - } - boolean sealedSuperTypeDoesNotPermit = false; - ReferenceBinding superReferenceBinding = null; - if (superType instanceof ReferenceBinding) { - superReferenceBinding = (ReferenceBinding) superType; - if (isUnnamedModule) { - PackageBinding superTypePackage = superReferenceBinding.getPackage(); - PackageBinding pkg = this.getPackage(); - sealedSuperTypeDoesNotPermit = pkg!= null && pkg.equals(superTypePackage); - } else { - ModuleBinding superTypeModule = superReferenceBinding.module(); - ModuleBinding mod = this.module(); - sealedSuperTypeDoesNotPermit = mod!= null && mod.equals(superTypeModule); - } - } - if (sealedSuperTypeDoesNotPermit) { - if (isClass) { - this.scope.problemReporter().sealedSuperClassDoesNotPermit(this, superTypeRef, superType); - } else { - this.scope.problemReporter().sealedSuperInterfaceDoesNotPermit(this, superTypeRef, superType); - } - } else { - if (superReferenceBinding instanceof SourceTypeBinding && isUnnamedModule) { - PackageBinding superTypePackage = superReferenceBinding.getPackage(); - if (isClass) { - this.scope.problemReporter().sealedSuperClassInDifferentPackage(this, superTypeRef, superType, superTypePackage); - } else { - this.scope.problemReporter().sealedSuperInterfaceInDifferentPackage(this, superTypeRef, superType, superTypePackage); - } - } else { - if (isClass) { - this.scope.problemReporter().sealedSuperClassDisallowed(this, superTypeRef, superType); - } else { - this.scope.problemReporter().sealedSuperInterfaceDisallowed(this, superTypeRef, superType); - } - } - } -} - -public List collectAllTypeBindings(TypeDeclaration typeDecl, CompilationUnitScope unitScope) { - class TypeBindingsCollector extends ASTVisitor { - List types = new ArrayList<>(); - @Override - public boolean visit( - TypeDeclaration localTypeDeclaration, - BlockScope scope1) { - checkAndAddBinding(localTypeDeclaration.binding); - return true; - } - @Override - public boolean visit( - TypeDeclaration memberTypeDeclaration, - ClassScope scope1) { - checkAndAddBinding(memberTypeDeclaration.binding); - return true; - } - @Override - public boolean visit( - TypeDeclaration typeDeclaration, - CompilationUnitScope scope1) { - checkAndAddBinding(typeDeclaration.binding); - return true; // do nothing by default, keep traversing - } - private void checkAndAddBinding(SourceTypeBinding stb) { - if (stb != null) - this.types.add(stb); - } - } - TypeBindingsCollector typeCollector = new TypeBindingsCollector(); - typeDecl.traverse(typeCollector, unitScope); - return typeCollector.types; -} - -private boolean checkPermitsAndAdd(ReferenceBinding superType) { - if (superType == null - || superType.equals(this.scope.getJavaLangObject()) - || !superType.isSealed()) - return true; - if (superType.isSealed()) { - superType = superType.actualType(); - ReferenceBinding[] superPermittedTypes = superType.permittedTypes(); - for (ReferenceBinding permittedType : superPermittedTypes) { - permittedType = permittedType.actualType(); - if (permittedType.isValidBinding() && TypeBinding.equalsEquals(this, permittedType)) - return true; - } - } - return false; -} - @Override public RecordComponentBinding[] components() { if (!this.isRecordDeclaration) @@ -3359,6 +3152,22 @@ public ReferenceBinding[] setPermittedTypes(ReferenceBinding [] permittedTypes) return this.permittedTypes = permittedTypes; } +private void setImplicitPermittedType(SourceTypeBinding permittedType) { + ReferenceBinding[] typesPermitted = this.permittedTypes(); + int sz = typesPermitted == null ? 0 : typesPermitted.length; + if (this.scope.referenceCompilationUnit() == permittedType.scope.referenceCompilationUnit()) { + if (sz == 0) { + typesPermitted = new ReferenceBinding[] { permittedType }; + } else { + System.arraycopy(typesPermitted, 0, typesPermitted = new ReferenceBinding[sz + 1], 0, sz); + typesPermitted[sz] = permittedType; + } + this.setPermittedTypes(typesPermitted); + } else if (sz == 0) { + this.setPermittedTypes(Binding.NO_PERMITTED_TYPES); + } +} + /** * Propagates writes to all annotated variants so the clones evolve along. */ @@ -3373,6 +3182,11 @@ public ReferenceBinding setSuperClass(ReferenceBinding superClass) { annotatedType.superclass = superClass; } } + if (superClass != null && superClass.actualType() instanceof SourceTypeBinding sourceSuperType && sourceSuperType.isSealed() && sourceSuperType.scope.referenceContext.permittedTypes == null) { + sourceSuperType.setImplicitPermittedType(this); + if (this.isAnonymousType() && superClass.isEnum()) + this.modifiers |= ClassFileConstants.AccFinal; + } return this.superclass = superClass; } @@ -3390,6 +3204,12 @@ public ReferenceBinding[] setSuperInterfaces(ReferenceBinding [] superInterfaces annotatedType.superInterfaces = superInterfaces; } } + for (int i = 0, length = superInterfaces == null ? 0 : superInterfaces.length; i < length; i++) { + ReferenceBinding superInterface = superInterfaces[i]; + if (superInterface.actualType() instanceof SourceTypeBinding sourceSuperType && sourceSuperType.isSealed() && sourceSuperType.scope.referenceContext.permittedTypes == null) { + sourceSuperType.setImplicitPermittedType(this); + } + } return this.superInterfaces = superInterfaces; } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java index ee1dc7a62f..f61f2f9688 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java @@ -19,7 +19,6 @@ import java.util.List; import java.util.Set; import java.util.function.Consumer; - import org.eclipse.jdt.core.compiler.CharOperation; public class SplitPackageBinding extends PackageBinding { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java index 728f94ee94..d49df8d099 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java @@ -20,7 +20,6 @@ package org.eclipse.jdt.internal.compiler.lookup; import java.util.stream.Stream; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java index 3746eafca0..594ea2ecf6 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java @@ -1,5 +1,6 @@ +// GROOVY PATCHED /******************************************************************************* - * Copyright (c) 2000, 2023 IBM Corporation and others. + * Copyright (c) 2000, 2024 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -38,11 +39,9 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.lookup; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.Wildcard; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; @@ -103,6 +102,8 @@ abstract public class TypeBinding extends Binding { public final static VoidTypeBinding VOID = new VoidTypeBinding(); + public final static TypeBinding [] NUMERIC_TYPES = // // Order sensitive to determine the type in numeric promotion + new TypeBinding [] {TypeBinding.DOUBLE, TypeBinding.FLOAT, TypeBinding.LONG, TypeBinding.INT, TypeBinding.SHORT, TypeBinding.BYTE, TypeBinding.CHAR }; public TypeBinding() { super(); @@ -682,6 +683,20 @@ public boolean isBoxedPrimitiveType() { } } +public TypeBinding unboxedType() { + return switch (this.id) { + case TypeIds.T_JavaLangBoolean -> TypeBinding.BOOLEAN; + case TypeIds.T_JavaLangByte -> TypeBinding.BYTE; + case TypeIds.T_JavaLangCharacter -> TypeBinding.CHAR; + case TypeIds.T_JavaLangShort -> TypeBinding.SHORT; + case TypeIds.T_JavaLangDouble -> TypeBinding.DOUBLE; + case TypeIds.T_JavaLangFloat -> TypeBinding.FLOAT; + case TypeIds.T_JavaLangInteger -> TypeBinding.INT; + case TypeIds.T_JavaLangLong -> TypeBinding.LONG; + default -> this; + }; +} + /** * Returns true if parameterized type AND not of the form {@code List} */ @@ -704,6 +719,10 @@ public boolean isRecord() { return false; } +public boolean isRecordWithComponents() { // do records without components make sense ?? + return isRecord() && components() != null && components().length > 0; // GROOVY edit +} + /* Answer true if the receiver type can be assigned to the argument type (right) */ public boolean isCompatibleWith(TypeBinding right) { @@ -1760,7 +1779,7 @@ public ReferenceBinding superclass() { } public ReferenceBinding[] permittedTypes() { - return Binding.NO_PERMITTEDTYPES; + return Binding.NO_PERMITTED_TYPES; } public ReferenceBinding[] superInterfaces() { @@ -1811,9 +1830,4 @@ public boolean isNonDenotable() { public boolean isSealed() { return false; } - -public List getAllEnumerableReferenceTypes() { - return Collections.emptyList(); -} - } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java index 7bf3164ab1..3897dc2442 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java @@ -130,6 +130,7 @@ public interface TypeConstants { // JEP 360 Sealed char[] PERMITS = "permits".toCharArray(); //$NON-NLS-1$ char[] SEALED = "sealed".toCharArray(); //$NON-NLS-1$ + char[] NON_SEALED = "non-sealed".toCharArray(); //$NON-NLS-1$ String KEYWORD_EXTENDS = "extends"; //$NON-NLS-1$ String IMPLEMENTS = "implements"; //$NON-NLS-1$ @@ -157,7 +158,7 @@ public interface TypeConstants { char[] SPRING = "springframework".toCharArray(); //$NON-NLS-1$ // Constant compound names - char[][] JAVA_BASE = {JAVA, BASE}; + char[][] JAVA_BASE = {JAVA, BASE}; char[][] JAVA_LANG = {JAVA, LANG}; char[][] JAVA_IO = {JAVA, IO}; char[][] JAVA_LANG_ANNOTATION = {JAVA, LANG, ANNOTATION}; @@ -224,6 +225,7 @@ public interface TypeConstants { char[][] JAVA_IO_IOEXCEPTION = new char[][] { JAVA, IO, "IOException".toCharArray()};//$NON-NLS-1$ char[][] JAVA_IO_OBJECTOUTPUTSTREAM = new char[][] { JAVA, IO, "ObjectOutputStream".toCharArray()}; //$NON-NLS-1$ char[][] JAVA_IO_OBJECTINPUTSTREAM = new char[][] { JAVA, IO, "ObjectInputStream".toCharArray()}; //$NON-NLS-1$ + char[][] JAVA_IO_IO = new char[][] {JAVA, IO, "IO".toCharArray()}; //$NON-NLS-1$ char[][] JAVA_NIO_FILE_FILES = new char[][] { JAVA, "nio".toCharArray(), "file".toCharArray(), "Files".toCharArray() }; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ // javax.rmi.CORBA.Stub char[][] JAVAX_RMI_CORBA_STUB = new char[][] { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java index e403cbcd52..c7de83d7ea 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java @@ -22,7 +22,6 @@ import java.util.HashMap; import java.util.function.Consumer; import java.util.function.Supplier; - import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable; import org.eclipse.jdt.internal.compiler.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java index d61b7108cc..22e3782929 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java @@ -43,18 +43,18 @@ package org.eclipse.jdt.internal.compiler.lookup; import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.function.Consumer; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching; -import org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching.CheckMode; import org.eclipse.jdt.internal.compiler.ast.TypeParameter; import org.eclipse.jdt.internal.compiler.ast.TypeReference; import org.eclipse.jdt.internal.compiler.ast.Wildcard; +import org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching.CheckMode; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.lookup.TypeConstants.BoundCheckStatus; @@ -155,7 +155,7 @@ private TypeConstants.BoundCheckStatus internalBoundCheck(Substitution substitut return BoundCheckStatus.OK; BoundCheckStatus nullStatus = BoundCheckStatus.OK; - boolean checkNullAnnotations = scope.environment().usesNullTypeAnnotations() && (location == null || (location.bits & ASTNode.InsideJavadoc) == 0); + boolean checkNullAnnotations = scope != null && scope.environment().usesNullTypeAnnotations() && (location == null || (location.bits & ASTNode.InsideJavadoc) == 0); if (argumentType.kind() == Binding.WILDCARD_TYPE) { WildcardBinding wildcard = (WildcardBinding) argumentType; @@ -745,6 +745,29 @@ public boolean isSealed() { return false; } + + @Override + public ReferenceBinding[] permittedTypes() { + Set permittedTypes = new HashSet<>(); + if (this.superclass != null && this.superclass.isSealed()) { + for (ReferenceBinding pt : this.superclass.permittedTypes()) { + if (boundCheck(null, pt, null, null) != BoundCheckStatus.MISMATCH) + permittedTypes.add(pt); + } + } + if (this.superInterfaces != null && this.superInterfaces != Binding.NO_SUPERINTERFACES) { + for (int i = 0, length = this.superInterfaces.length; i < length; i++) { + if (this.superInterfaces[i].isSealed()) { + for (ReferenceBinding pt : this.superInterfaces[i].permittedTypes()) { + if (boundCheck(null, pt, null, null) != BoundCheckStatus.MISMATCH) + permittedTypes.add(pt); + } + } + } + } + return permittedTypes.toArray(new ReferenceBinding[0]); + } + // /** // * Returns the original type variable for a given variable. // * Only different from receiver for type variables of generic methods of parameterized types diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.java index a2e14d3e1f..2a69d855e2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/WildcardBinding.java @@ -29,7 +29,6 @@ import java.util.List; import java.util.Set; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.ast.Wildcard; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java index 1e102e5a90..378489a710 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java @@ -24,7 +24,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.InvalidInputException; import org.eclipse.jdt.internal.compiler.ast.TypeReference; @@ -180,9 +179,15 @@ protected boolean commentParse() { int lastStarPosition = -1; // Init scanner position + this.markdown = this.source[this.javadocStart + 1] == '/'; this.linePtr = getLineNumber(this.firstTagPosition); - int realStart = this.linePtr==1 ? this.javadocStart : this.scanner.getLineEnd(this.linePtr-1)+1; - if (realStart < this.javadocStart) realStart = this.javadocStart; + int realStart = this.javadocStart; + if (!this.markdown) { + realStart = this.linePtr==1 ? this.javadocStart : this.scanner.getLineEnd(this.linePtr-1)+1; + if (realStart < this.javadocStart) realStart = this.javadocStart; + } else { + this.linePtr = getLineNumber(realStart); + } this.scanner.resetTo(realStart, this.javadocEnd); this.index = realStart; if (realStart == this.javadocStart) { @@ -191,7 +196,6 @@ protected boolean commentParse() { } int previousPosition = this.index; char nextCharacter = 0; - this.markdown = this.source[this.javadocStart + 1] == '/'; this.markdownHelper = IMarkdownCommentHelper.create(this); if (realStart == this.javadocStart) { nextCharacter = readChar(); // second '*' or '/' diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/IMarkdownCommentHelper.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/IMarkdownCommentHelper.java index 5ee6b613b0..279c7cd9c8 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/IMarkdownCommentHelper.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/IMarkdownCommentHelper.java @@ -138,8 +138,9 @@ public void recordFenceChar(char previous, char next, boolean lineStarted) { int required = this.insideFencedCodeBlock ? this.fenceLength : 3; if (++this.fenceCharCount == required) { this.insideFencedCodeBlock^=true; - this.fenceLength = this.fenceCharCount; } + if (this.insideFencedCodeBlock && this.fenceCharCount >= this.fenceLength) + this.fenceLength = this.fenceCharCount; } @Override diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java index 454507f805..ec096bc468 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java @@ -16,27 +16,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.InvalidInputException; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.Expression; -import org.eclipse.jdt.internal.compiler.ast.IJavadocTypeReference; -import org.eclipse.jdt.internal.compiler.ast.Javadoc; -import org.eclipse.jdt.internal.compiler.ast.JavadocAllocationExpression; -import org.eclipse.jdt.internal.compiler.ast.JavadocArgumentExpression; -import org.eclipse.jdt.internal.compiler.ast.JavadocArrayQualifiedTypeReference; -import org.eclipse.jdt.internal.compiler.ast.JavadocArraySingleTypeReference; -import org.eclipse.jdt.internal.compiler.ast.JavadocFieldReference; -import org.eclipse.jdt.internal.compiler.ast.JavadocImplicitTypeReference; -import org.eclipse.jdt.internal.compiler.ast.JavadocMessageSend; -import org.eclipse.jdt.internal.compiler.ast.JavadocModuleReference; -import org.eclipse.jdt.internal.compiler.ast.JavadocQualifiedTypeReference; -import org.eclipse.jdt.internal.compiler.ast.JavadocReturnStatement; -import org.eclipse.jdt.internal.compiler.ast.JavadocSingleNameReference; -import org.eclipse.jdt.internal.compiler.ast.JavadocSingleTypeReference; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; -import org.eclipse.jdt.internal.compiler.ast.TypeReference; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.java index 2218d63ac6..2a81d0a194 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/JavadocTagConstants.java @@ -245,8 +245,8 @@ public static char[][][] levelTagsToChar3d(LevelTags[] input) { public static final char[][][] IN_SNIPPET_TAGS = { - // since 18 - { TAG_HIGHLIGHT, TAG_REPLACE, TAG_LINK } + //since 18 + { TAG_HIGHLIGHT, TAG_REPLACE, TAG_LINK } }; public final static int IN_SNIPPET_TAGS_LENGTH = IN_SNIPPET_TAGS.length; public final static int INLINE_TAGS_LENGTH = INLINE_TAGS.length; @@ -261,40 +261,40 @@ public static char[][][] levelTagsToChar3d(LevelTags[] input) { public final static short TAG_TYPE_IN_SNIPPET = 4; public final static short TAG_TYPE_INLINE_BLOCK = (short) (TAG_TYPE_INLINE | TAG_TYPE_BLOCK); public static final short[] JAVADOC_TAG_TYPE = { - TAG_TYPE_NONE, // NO_TAG_VALUE = 0; - TAG_TYPE_BLOCK, // TAG_DEPRECATED_VALUE = 1; - TAG_TYPE_BLOCK, // TAG_PARAM_VALUE = 2; - TAG_TYPE_BLOCK, // TAG_RETURN_VALUE = 3; - TAG_TYPE_BLOCK, // TAG_THROWS_VALUE = 4; - TAG_TYPE_BLOCK, // TAG_EXCEPTION_VALUE = 5; - TAG_TYPE_BLOCK, // TAG_SEE_VALUE = 6; - TAG_TYPE_INLINE, // TAG_LINK_VALUE = 7; - TAG_TYPE_INLINE, // TAG_LINKPLAIN_VALUE = 8; - TAG_TYPE_INLINE, // TAG_INHERITDOC_VALUE = 9; - TAG_TYPE_INLINE, // TAG_VALUE_VALUE = 10; - TAG_TYPE_BLOCK, // TAG_CATEGORY_VALUE = 11; - TAG_TYPE_BLOCK, // TAG_AUTHOR_VALUE = 12; - TAG_TYPE_BLOCK, // TAG_SERIAL_VALUE = 13; - TAG_TYPE_BLOCK, // TAG_SERIAL_DATA_VALUE = 14; - TAG_TYPE_BLOCK, // TAG_SERIAL_FIELD_VALUE = 15; - TAG_TYPE_BLOCK, // TAG_SINCE_VALUE = 16; - TAG_TYPE_BLOCK, // TAG_VERSION_VALUE = 17; - TAG_TYPE_INLINE, // TAG_CODE_VALUE = 18; - TAG_TYPE_INLINE, // TAG_LITERAL_VALUE = 19; - TAG_TYPE_INLINE, // TAG_DOC_ROOT_VALUE = 20; - TAG_TYPE_INLINE, // TAG_DOC_SYSTEM_PROPERTY = 21 - TAG_TYPE_BLOCK, // TAG_USES_VALUE = 22; - TAG_TYPE_BLOCK, // TAG_PROVIDES_VALUE = 23; - TAG_TYPE_BLOCK, // TAG_HIDDEN_VALUE = 24; - TAG_TYPE_INLINE, // TAG_INDEX_VALUE = 25; - TAG_TYPE_INLINE, // TAG_SUMMARY_VALUE = 26; - TAG_TYPE_BLOCK, // TAG_API_NOTE = 27; - TAG_TYPE_BLOCK, // TAG_IMPL_SPEC = 28; - TAG_TYPE_BLOCK, // TAG_IMPL_NOTE = 29; - TAG_TYPE_INLINE, // TAG_SNIPPET_VALUE = 30; - TAG_TYPE_IN_SNIPPET,// TAG_HIGHLIGHT_VALUE = 31; - TAG_TYPE_IN_SNIPPET,// TAG_HIGHLIGHT_VALUE = 32; - }; + TAG_TYPE_NONE, // NO_TAG_VALUE = 0; + TAG_TYPE_BLOCK, // TAG_DEPRECATED_VALUE = 1; + TAG_TYPE_BLOCK, // TAG_PARAM_VALUE = 2; + TAG_TYPE_BLOCK, // TAG_RETURN_VALUE = 3; + TAG_TYPE_BLOCK, // TAG_THROWS_VALUE = 4; + TAG_TYPE_BLOCK, // TAG_EXCEPTION_VALUE = 5; + TAG_TYPE_BLOCK, // TAG_SEE_VALUE = 6; + TAG_TYPE_INLINE, // TAG_LINK_VALUE = 7; + TAG_TYPE_INLINE, // TAG_LINKPLAIN_VALUE = 8; + TAG_TYPE_INLINE, // TAG_INHERITDOC_VALUE = 9; + TAG_TYPE_INLINE, // TAG_VALUE_VALUE = 10; + TAG_TYPE_BLOCK, // TAG_CATEGORY_VALUE = 11; + TAG_TYPE_BLOCK, // TAG_AUTHOR_VALUE = 12; + TAG_TYPE_BLOCK, // TAG_SERIAL_VALUE = 13; + TAG_TYPE_BLOCK, // TAG_SERIAL_DATA_VALUE = 14; + TAG_TYPE_BLOCK, // TAG_SERIAL_FIELD_VALUE = 15; + TAG_TYPE_BLOCK, // TAG_SINCE_VALUE = 16; + TAG_TYPE_BLOCK, // TAG_VERSION_VALUE = 17; + TAG_TYPE_INLINE, // TAG_CODE_VALUE = 18; + TAG_TYPE_INLINE, // TAG_LITERAL_VALUE = 19; + TAG_TYPE_INLINE, // TAG_DOC_ROOT_VALUE = 20; + TAG_TYPE_INLINE, // TAG_DOC_SYSTEM_PROPERTY = 21 + TAG_TYPE_BLOCK, // TAG_USES_VALUE = 22; + TAG_TYPE_BLOCK, // TAG_PROVIDES_VALUE = 23; + TAG_TYPE_BLOCK, // TAG_HIDDEN_VALUE = 24; + TAG_TYPE_INLINE, // TAG_INDEX_VALUE = 25; + TAG_TYPE_INLINE, // TAG_SUMMARY_VALUE = 26; + TAG_TYPE_BLOCK, // TAG_API_NOTE = 27; + TAG_TYPE_BLOCK, // TAG_IMPL_SPEC = 28; + TAG_TYPE_BLOCK, // TAG_IMPL_NOTE = 29; + TAG_TYPE_INLINE, // TAG_SNIPPET_VALUE = 30; + TAG_TYPE_IN_SNIPPET,// TAG_HIGHLIGHT_VALUE = 31; + TAG_TYPE_IN_SNIPPET,// TAG_HIGHLIGHT_VALUE = 32; + }; // Same as above with a single difference for TAG_RETURN_VALUE // which can now be both TAG_TYPE_BLOCK and TAG_TYPE_INLINE => TAG_TYPE_INLINE_BLOCK // Should this become complex, meaning multiple JLS levels requiring different support, diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Parser.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Parser.java index 3414de2b25..8c86bd290c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Parser.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Parser.java @@ -38,21 +38,11 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.Stack; +import java.lang.Runtime.Version; +import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.InvalidInputException; import org.eclipse.jdt.internal.compiler.ASTVisitor; @@ -944,7 +934,7 @@ protected int actFromTokenOrSynthetic(int previousAct) { private boolean tolerateDefaultClassMethods = false; private boolean processingLambdaParameterList = false; private boolean expectTypeAnnotation = false; -private boolean reparsingLambdaExpression = false; +private boolean reparsingFunctionalExpression = false; private Map recordNestedMethodLevels; private Map recordPatternSwitches; @@ -1177,7 +1167,7 @@ protected void checkAndSetModifiers(int flag){ problemReporter().StrictfpNotRequired(this.scanner.startPosition, this.scanner.currentPosition - 1); } - if ((this.modifiers & flag) != 0){ // duplicate modifier + if ((this.modifiers & flag) != 0) { // duplicate modifier this.modifiers |= ExtraCompilerModifiers.AccAlternateModifierProblem; } this.modifiers |= flag; @@ -1187,10 +1177,6 @@ protected void checkAndSetModifiers(int flag){ if (this.currentElement != null) { this.currentElement.addModifier(flag, this.modifiersSourceStart); } - if (flag == ExtraCompilerModifiers.AccSealed || flag == ExtraCompilerModifiers.AccNonSealed) { - problemReporter().validateJavaFeatureSupport(JavaFeature.SEALED_CLASSES, this.scanner.startPosition, - this.scanner.currentPosition - 1); - } } public void checkComment() { @@ -6683,6 +6669,18 @@ protected void consumeZeroTypeAnnotations() { // Name ::= SimpleName // TypeAnnotationsopt ::= $empty pushOnTypeAnnotationLengthStack(0); // signal absence of @308 annotations. + if (this.currentElement instanceof RecoveredAnnotation ann) { + if (ann.parent instanceof RecoveredMethod meth + && !meth.foundOpeningBrace + && this.currentToken == TokenNameRPAREN) { + // take note of an incomplete annotation "@Ann(v=)": + meth.incompleteParameterAnnotationSeen = true; + } + if (this.identifierPtr > ann.identifierPtr) { + ann.hasPendingMemberValueName = true; + ann.errorToken = this.currentToken; + } + } } // BEGIN_AUTOGENERATED_REGION_CONSUME_RULE // This method is part of an automatic generation : do NOT edit-modify @@ -9418,7 +9416,7 @@ private void consumeTextBlock() { private TextBlock createTextBlock(char[] allchars, int start, int end) { TextBlock textBlock; if (this.recordStringLiterals && - !this.reparsingLambdaExpression && + !this.reparsingFunctionalExpression && this.checkExternalizeStrings && this.lastPosistion < this.scanner.currentPosition && !this.statementRecoveryActivated) { @@ -9473,7 +9471,7 @@ protected void consumeCaseLabelExpr() { if (!this.parsingJava14Plus) { problemReporter().arrowInCaseStatementsNotSupported(caseStatement); } - caseStatement.isExpr = true; + caseStatement.isSwitchRule = true; } protected void consumeDefaultLabelExpr() { // SwitchLabelDefaultExpr ::= 'default' '->' @@ -9482,88 +9480,7 @@ protected void consumeDefaultLabelExpr() { if (!this.parsingJava14Plus) { problemReporter().arrowInCaseStatementsNotSupported(defaultStatement); } - defaultStatement.isExpr = true; -} -protected void collectResultExpressionsYield(SwitchExpression s) { - if (s.resultExpressions != null) - return; // already calculated. - - class ResultExpressionsCollector extends ASTVisitor { - Stack targetSwitchExpressions; - Stack tryStatements; - public ResultExpressionsCollector(SwitchExpression se) { - if (this.targetSwitchExpressions == null) - this.targetSwitchExpressions = new Stack<>(); - this.targetSwitchExpressions.push(se); - } - @Override - public boolean visit(SwitchExpression switchExpression, BlockScope blockScope) { - if (switchExpression.resultExpressions == null) - switchExpression.resultExpressions = new ArrayList<>(0); - this.targetSwitchExpressions.push(switchExpression); - return false; - } - @Override - public void endVisit(SwitchExpression switchExpression, BlockScope blockScope) { - this.targetSwitchExpressions.pop(); - } - @Override - public boolean visit(YieldStatement yieldStatement, BlockScope blockScope) { - SwitchExpression targetSwitchExpression = this.targetSwitchExpressions.peek(); - if (yieldStatement.expression != null) { - targetSwitchExpression.resultExpressions.add(yieldStatement.expression); - yieldStatement.switchExpression = this.targetSwitchExpressions.peek(); - } else { - // flag an error while resolving - yieldStatement.switchExpression = targetSwitchExpression; - } - return true; - } - @Override - public boolean visit(SwitchStatement stmt, BlockScope blockScope) { - return true; - } - @Override - public boolean visit(TypeDeclaration stmt, BlockScope blockScope) { - return false; - } - @Override - public boolean visit(LambdaExpression stmt, BlockScope blockScope) { - return false; - } - @Override - public boolean visit(TryStatement stmt, BlockScope blockScope) { - if (this.tryStatements == null) - this.tryStatements = new Stack<>(); - this.tryStatements.push(stmt); - SwitchExpression targetSwitchExpression = this.targetSwitchExpressions.peek(); - targetSwitchExpression.containsTry = true; - return true; - } - @Override - public void endVisit(TryStatement stmt, BlockScope blockScope) { - this.tryStatements.pop(); - } - } - s.resultExpressions = new ArrayList<>(0); // indicates processed - int l = s.statements == null ? 0 : s.statements.length; - for (int i = 0; i < l; ++i) { - Statement stmt = s.statements[i]; - if (stmt instanceof CaseStatement caseStatement) { - if (!caseStatement.isExpr) continue; - stmt = s.statements[++i]; - if (stmt instanceof Expression expression && expression.isTrulyExpression()) { - s.resultExpressions.add(expression); - continue; - } else if (stmt instanceof ThrowStatement) { - // TODO: Throw Expression Processing. Anything to be done here for resolve? - continue; - } - } - // break statement and block statement of SwitchLabelRule or block statement of ':' - ResultExpressionsCollector reCollector = new ResultExpressionsCollector(s); - stmt.traverse(reCollector, null); - } + defaultStatement.isSwitchRule = true; } protected void consumeSwitchExpression() { // SwitchExpression ::= 'switch' '(' Expression ')' OpenBlock SwitchExpressionBlock @@ -9574,7 +9491,6 @@ protected void consumeSwitchExpression() { if (!this.parsingJava14Plus) { problemReporter().switchExpressionsNotSupported(s); } - collectResultExpressionsYield(s); pushOnExpressionStack(s); } } @@ -9885,7 +9801,7 @@ protected void consumeToken(int type) { case TokenNameStringLiteral : StringLiteral stringLiteral; if (this.recordStringLiterals && - !this.reparsingLambdaExpression && + !this.reparsingFunctionalExpression && this.checkExternalizeStrings && this.lastPosistion < this.scanner.currentPosition && !this.statementRecoveryActivated) { @@ -9951,7 +9867,6 @@ protected void consumeToken(int type) { pushOnIntStack(this.scanner.startPosition); break; case TokenNameRestrictedIdentifierpermits: - problemReporter().validateJavaFeatureSupport(JavaFeature.SEALED_CLASSES, this.scanner.startPosition,this.scanner.currentPosition - 1); pushOnIntStack(this.scanner.startPosition); break; case TokenNamecase : @@ -11616,7 +11531,7 @@ public void getMethodBodies(CompilationUnitDeclaration unit) { CompilationResult compilationResult = unit.compilationResult; char[] contents = this.readManager != null ? this.readManager.getContents(compilationResult.compilationUnit) - : compilationResult.compilationUnit.getContents(); + : compilationResult.getContents(); this.scanner.setSource(contents, compilationResult); if (this.javadocParser != null && this.javadocParser.checkDocComment) { @@ -12848,6 +12763,21 @@ public CompilationUnitDeclaration parse( compilationResult, 0); + var problemReporterContext = this.problemReporter.referenceContext; + this.problemReporter.referenceContext = this.referenceContext; + if (this.problemReporter != null && this.options != null && this.options.requestedSourceVersion != null && !this.options.requestedSourceVersion.isBlank()) { + try { + var requestedVersion = Version.parse(this.options.requestedSourceVersion); + var latestVersion = Version.parse(CompilerOptions.getLatestVersion()); + if (requestedVersion.compareTo(latestVersion) > 0) { + this.problemReporter.tooRecentJavaVersion(requestedVersion.toString(), latestVersion.toString()); + } + } catch (Exception ex) { + this.problemReporter.abortDueToInternalError(ex.getMessage()); + } + } + this.problemReporter.referenceContext = problemReporterContext; + /* scanners initialization */ char[] contents; try { @@ -12856,6 +12786,7 @@ public CompilationUnitDeclaration parse( problemReporter().cannotReadSource(this.compilationUnit, abortException, this.options.verbose); contents = CharOperation.NO_CHAR; // pretend empty from thereon } + compilationResult.cacheContents(contents); this.scanner.setSource(contents); this.compilationUnit.sourceEnd = this.scanner.source.length - 1; if (end != -1) this.scanner.resetTo(start, end); @@ -13148,7 +13079,7 @@ public boolean visit(TypeDeclaration memberTypeDeclaration, ClassScope scope) { public Expression parseLambdaExpression(char[] source, int offset, int length, CompilationUnitDeclaration unit, boolean recordLineSeparators) { this.haltOnSyntaxError = true; // unexposed/unshared object, no threading concerns. - this.reparsingLambdaExpression = true; + this.reparsingFunctionalExpression = true; return parseExpression(source, offset, length, unit, recordLineSeparators); } @@ -13175,6 +13106,10 @@ public char[][] parsePackageDeclaration(char[] source, CompilationResult result) return this.compilationUnit.currentPackage == null ? null : this.compilationUnit.currentPackage.getImportName(); } +public Expression parseReferenceExpression(char[] source, int offset, int length, CompilationUnitDeclaration unit, boolean recordLineSeparators) { + this.reparsingFunctionalExpression = true; + return parseExpression(source, offset, length, unit, recordLineSeparators); +} public Expression parseExpression(char[] source, int offset, int length, CompilationUnitDeclaration unit, boolean recordLineSeparators) { initialize(); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredAnnotation.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredAnnotation.java index adcc3d7554..2de80c2dc2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredAnnotation.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredAnnotation.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008 IBM Corporation and others. + * Copyright (c) 2008, 2024 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -13,16 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.parser; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.Annotation; -import org.eclipse.jdt.internal.compiler.ast.Expression; -import org.eclipse.jdt.internal.compiler.ast.MarkerAnnotation; -import org.eclipse.jdt.internal.compiler.ast.MemberValuePair; -import org.eclipse.jdt.internal.compiler.ast.NormalAnnotation; -import org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation; -import org.eclipse.jdt.internal.compiler.ast.SingleNameReference; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; -import org.eclipse.jdt.internal.compiler.ast.TypeReference; +import org.eclipse.jdt.internal.compiler.ast.*; public class RecoveredAnnotation extends RecoveredElement { public static final int MARKER = 0; @@ -30,12 +21,13 @@ public class RecoveredAnnotation extends RecoveredElement { public static final int SINGLE_MEMBER = 2; private int kind; - private final int identifierPtr; + final int identifierPtr; private final int identifierLengthPtr; private final int sourceStart; public boolean hasPendingMemberValueName; public int memberValuPairEqualEnd = -1; public Annotation annotation; + public int errorToken; public RecoveredAnnotation(int identifierPtr, int identifierLengthPtr, int sourceStart, RecoveredElement parent, int bracketBalance) { super(parent, bracketBalance); @@ -79,16 +71,24 @@ public void updateFromParserState() { boolean needUpdateRParenPos = false; MemberValuePair pendingMemberValueName = null; + Expression singleValue = null; if (this.hasPendingMemberValueName && this.identifierPtr < parser.identifierPtr) { char[] memberValueName = parser.identifierStack[this.identifierPtr + 1]; long pos = parser.identifierPositionStack[this.identifierPtr + 1]; int start = (int) (pos >>> 32); int end = (int)pos; - int valueEnd = this.memberValuPairEqualEnd > -1 ? this.memberValuPairEqualEnd : end; - SingleNameReference fakeExpression = new SingleNameReference(RecoveryScanner.FAKE_IDENTIFIER, (((long) valueEnd + 1) << 32) + (valueEnd)); - pendingMemberValueName = new MemberValuePair(memberValueName, start, end, fakeExpression); + if (this.errorToken == TerminalTokens.TokenNameDOT) { + // do we need to consult identifierLengthStack to pull more than one name segment? + char[][] qname = new char[][] { memberValueName, RecoveryScanner.FAKE_IDENTIFIER }; + singleValue = new QualifiedNameReference(qname, new long[] {pos,pos}, start, end); + this.kind = SINGLE_MEMBER; + } else { + int valueEnd = this.memberValuPairEqualEnd > -1 ? this.memberValuPairEqualEnd : end; + SingleNameReference fakeExpression = new SingleNameReference(RecoveryScanner.FAKE_IDENTIFIER, (((long) valueEnd + 1) << 32) + (valueEnd)); + pendingMemberValueName = new MemberValuePair(memberValueName, start, end, fakeExpression); + } } parser.identifierPtr = this.identifierPtr; parser.identifierLengthPtr = this.identifierLengthPtr; @@ -145,9 +145,10 @@ public void updateFromParserState() { break; case SINGLE_MEMBER: - if (parser.expressionPtr > -1) { - Expression memberValue = parser.expressionStack[parser.expressionPtr--]; - + Expression memberValue = singleValue != null ? singleValue + : parser.expressionPtr > -1 ? parser.expressionStack[parser.expressionPtr--] + : null; + if (memberValue != null) { SingleMemberAnnotation singleMemberAnnotation = new SingleMemberAnnotation(typeReference, this.sourceStart); singleMemberAnnotation.memberValue = memberValue; singleMemberAnnotation.declarationSourceEnd = memberValue.sourceEnd; @@ -200,6 +201,10 @@ public void setKind(int kind) { this.kind = kind; } + public int sourceStart() { + return this.sourceStart; + } + @Override public int sourceEnd() { if (this.annotation == null) { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.java index aeca66c39b..0955d01a65 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.java @@ -14,11 +14,10 @@ import java.util.HashSet; import java.util.Set; - -import org.eclipse.jdt.core.compiler.*; +import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.Argument; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.Block; import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; import org.eclipse.jdt.internal.compiler.ast.ForeachStatement; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.java index 16b46aceb6..17af048265 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.java @@ -17,16 +17,7 @@ /** * Internal structure for parsing recovery */ -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Block; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ImportReference; -import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ModuleDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ModuleStatement; -import org.eclipse.jdt.internal.compiler.ast.Statement; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.util.Util; public class RecoveredElement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredField.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredField.java index 6af3c43bc6..2da6deefc8 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredField.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredField.java @@ -18,19 +18,7 @@ */ import java.util.HashSet; import java.util.Set; - -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration; -import org.eclipse.jdt.internal.compiler.ast.AllocationExpression; -import org.eclipse.jdt.internal.compiler.ast.Annotation; -import org.eclipse.jdt.internal.compiler.ast.ArrayInitializer; -import org.eclipse.jdt.internal.compiler.ast.ArrayQualifiedTypeReference; -import org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference; -import org.eclipse.jdt.internal.compiler.ast.Expression; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Statement; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; +import org.eclipse.jdt.internal.compiler.ast.*; public class RecoveredField extends RecoveredElement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredInitializer.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredInitializer.java index 597170efee..2eac69ebd0 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredInitializer.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredInitializer.java @@ -14,8 +14,7 @@ package org.eclipse.jdt.internal.compiler.parser; import java.util.Set; - -import org.eclipse.jdt.core.compiler.*; +import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.Block; import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.java index 3a2a178f90..af5c82bc1c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.java @@ -18,11 +18,10 @@ */ import java.util.HashSet; import java.util.Set; - +import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.ast.ArrayQualifiedTypeReference; import org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.Expression; import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration; import org.eclipse.jdt.internal.compiler.ast.Statement; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java index af2ff69e7e..9e5dea4a78 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java @@ -15,26 +15,11 @@ *******************************************************************************/ package org.eclipse.jdt.internal.compiler.parser; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; - -import org.eclipse.jdt.core.compiler.*; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Annotation; -import org.eclipse.jdt.internal.compiler.ast.Argument; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.Block; -import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration; -import org.eclipse.jdt.internal.compiler.ast.MemberValuePair; -import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Statement; -import org.eclipse.jdt.internal.compiler.ast.SuperReference; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; -import org.eclipse.jdt.internal.compiler.ast.TypeParameter; -import org.eclipse.jdt.internal.compiler.ast.TypeReference; +import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import org.eclipse.jdt.internal.compiler.util.Util; @@ -64,6 +49,8 @@ public class RecoveredMethod extends RecoveredElement implements TerminalTokens RecoveredAnnotation[] pendingAnnotations; int pendingAnnotationCount; + public boolean incompleteParameterAnnotationSeen = false; + public RecoveredMethod(AbstractMethodDeclaration methodDeclaration, RecoveredElement parent, int bracketBalance, Parser parser){ super(parent, bracketBalance, parser); this.methodDeclaration = methodDeclaration; @@ -113,6 +100,10 @@ public RecoveredElement add(Block nestedBlockDeclaration, int bracketBalanceValu */ @Override public RecoveredElement add(FieldDeclaration fieldDeclaration, int bracketBalanceValue) { + if (recoverAsArgument(fieldDeclaration)) { + resetPendingModifiers(); + return this; + } resetPendingModifiers(); /* local variables inside method can only be final and non void */ @@ -149,6 +140,37 @@ public RecoveredElement add(FieldDeclaration fieldDeclaration, int bracketBalanc // still inside method, treat as local variable return this; // ignore } + +private boolean recoverAsArgument(FieldDeclaration fieldDeclaration) { + if (!this.foundOpeningBrace + && this.methodDeclaration.declarationSourceEnd == 0 + && this.incompleteParameterAnnotationSeen) { // misparsed parameter? + long position = ((long) fieldDeclaration.sourceStart << 32)+fieldDeclaration.sourceEnd; + Argument arg = new Argument(fieldDeclaration.name, position, fieldDeclaration.type, fieldDeclaration.modifiers); + if (this.methodDeclaration.arguments == null) { + this.methodDeclaration.arguments = new Argument[] { arg }; + } else { + int len = this.methodDeclaration.arguments.length; + this.methodDeclaration.arguments = Arrays.copyOf(this.methodDeclaration.arguments, len+1); + this.methodDeclaration.arguments[len] = arg; + } + int annotCount = this.pendingAnnotationCount; + if (this.pendingAnnotations != null) { + int end = 0; + arg.annotations = new Annotation[annotCount]; + for (int i = 0; i < this.pendingAnnotationCount; i++) { + arg.annotations[i] = this.pendingAnnotations[i].annotation; + if (i == 0) + arg.declarationSourceStart = arg.annotations[i].sourceStart; + end = arg.sourceEnd; + } + if (end > 0) + this.methodDeclaration.bodyStart = end + 1; + } + return true; + } + return false; +} /* * Record a local declaration - regular method should have been created a block body */ @@ -622,6 +644,11 @@ public RecoveredElement addAnnotationName(int identifierPtr, int identifierLengt this.pendingAnnotations = new RecoveredAnnotation[5]; this.pendingAnnotationCount = 0; } else { + if (this.pendingAnnotationCount > 0) { + RecoveredAnnotation lastAnnot = this.pendingAnnotations[this.pendingAnnotationCount-1]; + if (lastAnnot.sourceStart() == annotationStart) + return this; + } if (this.pendingAnnotationCount == this.pendingAnnotations.length) { System.arraycopy( this.pendingAnnotations, diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.java index 903e47b371..44b0c0ed6f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.java @@ -18,7 +18,6 @@ */ import java.util.HashSet; import java.util.Set; - import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.Block; import org.eclipse.jdt.internal.compiler.ast.ForeachStatement; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredType.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredType.java index 47eaa52204..e0fb2107f7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredType.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredType.java @@ -18,19 +18,7 @@ import java.util.HashSet; import java.util.Set; - -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Annotation; -import org.eclipse.jdt.internal.compiler.ast.Block; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Initializer; -import org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression; -import org.eclipse.jdt.internal.compiler.ast.Statement; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; -import org.eclipse.jdt.internal.compiler.ast.TypeParameter; -import org.eclipse.jdt.internal.compiler.ast.TypeReference; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; /** @@ -340,23 +328,26 @@ public int bodyEnd(){ if (this.bodyEnd == 0) return this.typeDeclaration.declarationSourceEnd; return this.bodyEnd; } -public boolean bodyStartsAtHeaderEnd(){ - if (this.typeDeclaration.superInterfaces == null){ - if (this.typeDeclaration.superclass == null){ - if(this.typeDeclaration.typeParameters == null) { - return this.typeDeclaration.bodyStart == this.typeDeclaration.sourceEnd+1; + +public boolean bodyStartsAtHeaderEnd() { + if (this.typeDeclaration.permittedTypes == null) { + if (this.typeDeclaration.superInterfaces == null) { + if (this.typeDeclaration.superclass == null) { + if (this.typeDeclaration.typeParameters == null) { + return this.typeDeclaration.bodyStart == this.typeDeclaration.sourceEnd + 1; + } else { + return this.typeDeclaration.bodyStart == this.typeDeclaration.typeParameters[this.typeDeclaration.typeParameters.length - 1].sourceEnd + 1; + } } else { - return this.typeDeclaration.bodyStart == this.typeDeclaration.typeParameters[this.typeDeclaration.typeParameters.length-1].sourceEnd+1; + return this.typeDeclaration.bodyStart == this.typeDeclaration.superclass.sourceEnd + 1; } } else { - return this.typeDeclaration.bodyStart == this.typeDeclaration.superclass.sourceEnd+1; + return this.typeDeclaration.bodyStart + == this.typeDeclaration.superInterfaces[this.typeDeclaration.superInterfaces.length - 1].sourceEnd + 1; } } else { - if (this.typeDeclaration.permittedTypes != null) - return this.typeDeclaration.bodyStart - == this.typeDeclaration.permittedTypes[this.typeDeclaration.permittedTypes.length-1].sourceEnd+1; return this.typeDeclaration.bodyStart - == this.typeDeclaration.superInterfaces[this.typeDeclaration.superInterfaces.length-1].sourceEnd+1; + == this.typeDeclaration.permittedTypes[this.typeDeclaration.permittedTypes.length - 1].sourceEnd + 1; } } /* diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.java index 5cd686a5a7..8d4bcb29ee 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.java @@ -18,17 +18,7 @@ */ import java.util.HashSet; import java.util.Set; - -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.Block; -import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ExportsStatement; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ImportReference; -import org.eclipse.jdt.internal.compiler.ast.Initializer; -import org.eclipse.jdt.internal.compiler.ast.ModuleDeclaration; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; +import org.eclipse.jdt.internal.compiler.ast.*; public class RecoveredUnit extends RecoveredElement { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Scanner.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Scanner.java index 2760d441ae..8b539c17be 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Scanner.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Scanner.java @@ -190,7 +190,7 @@ enum ScanContext { private VanguardParser vanguardParser; ConflictedParser activeParser = null; private boolean consumingEllipsisAnnotations = false; - protected boolean multiCaseLabelComma = false; + public boolean multiCaseLabelComma = false; public static final int RoundBracket = 0; public static final int SquareBracket = 1; @@ -5615,9 +5615,6 @@ int disambiguatedRestrictedIdentifierWhen(int restrictedIdentifierToken) { TokenNameIdentifier : TokenNameRestrictedIdentifierWhen; } int disambiguatedRestrictedIdentifierYield(int restrictedIdentifierToken) { - // and here's the kludge - if (restrictedIdentifierToken != TokenNameRestrictedIdentifierYield) - return restrictedIdentifierToken; if (this.sourceLevel < ClassFileConstants.JDK14) return TokenNameIdentifier; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java index 78cc30c741..a2523a7cfa 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/ScannerHelper.java @@ -17,7 +17,6 @@ import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.IOException; - import org.eclipse.jdt.core.compiler.InvalidInputException; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/AbortCompilationUnit.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/AbortCompilationUnit.java index ab0807ac63..313bce99de 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/AbortCompilationUnit.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/AbortCompilationUnit.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.internal.compiler.problem; import java.io.IOException; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.internal.compiler.CompilationResult; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java index e4030abbc3..6bcb8eeff9 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java @@ -17,8 +17,8 @@ import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; - -import org.eclipse.jdt.core.compiler.*; +import org.eclipse.jdt.core.compiler.CategorizedProblem; +import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.compiler.IProblemFactory; import org.eclipse.jdt.internal.compiler.util.HashtableOfInt; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java index 8814fb691f..e0d1d9ae8d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java @@ -88,7 +88,6 @@ import java.util.Set; import java.util.function.Supplier; import java.util.stream.Collectors; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.IProblem; @@ -96,76 +95,7 @@ import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy; import org.eclipse.jdt.internal.compiler.IProblemFactory; -import org.eclipse.jdt.internal.compiler.ast.ASTNode; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration; -import org.eclipse.jdt.internal.compiler.ast.AllocationExpression; -import org.eclipse.jdt.internal.compiler.ast.Annotation; -import org.eclipse.jdt.internal.compiler.ast.AnnotationMethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.Argument; -import org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression; -import org.eclipse.jdt.internal.compiler.ast.ArrayInitializer; -import org.eclipse.jdt.internal.compiler.ast.ArrayQualifiedTypeReference; -import org.eclipse.jdt.internal.compiler.ast.ArrayReference; -import org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference; -import org.eclipse.jdt.internal.compiler.ast.Assignment; -import org.eclipse.jdt.internal.compiler.ast.BinaryExpression; -import org.eclipse.jdt.internal.compiler.ast.Block; -import org.eclipse.jdt.internal.compiler.ast.BranchStatement; -import org.eclipse.jdt.internal.compiler.ast.CaseStatement; -import org.eclipse.jdt.internal.compiler.ast.CastExpression; -import org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess; -import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; -import org.eclipse.jdt.internal.compiler.ast.CompoundAssignment; -import org.eclipse.jdt.internal.compiler.ast.ConditionalExpression; -import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration; -import org.eclipse.jdt.internal.compiler.ast.EqualExpression; -import org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall; -import org.eclipse.jdt.internal.compiler.ast.Expression; -import org.eclipse.jdt.internal.compiler.ast.ExpressionContext; -import org.eclipse.jdt.internal.compiler.ast.FakedTrackingVariable; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.FieldReference; -import org.eclipse.jdt.internal.compiler.ast.FunctionalExpression; -import org.eclipse.jdt.internal.compiler.ast.ImportReference; -import org.eclipse.jdt.internal.compiler.ast.Initializer; -import org.eclipse.jdt.internal.compiler.ast.InstanceOfExpression; -import org.eclipse.jdt.internal.compiler.ast.LabeledStatement; -import org.eclipse.jdt.internal.compiler.ast.LambdaExpression; -import org.eclipse.jdt.internal.compiler.ast.Literal; -import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration; -import org.eclipse.jdt.internal.compiler.ast.MemberValuePair; -import org.eclipse.jdt.internal.compiler.ast.MessageSend; -import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ModuleDeclaration; -import org.eclipse.jdt.internal.compiler.ast.ModuleReference; -import org.eclipse.jdt.internal.compiler.ast.NameReference; -import org.eclipse.jdt.internal.compiler.ast.NullAnnotationMatching; -import org.eclipse.jdt.internal.compiler.ast.NullLiteral; -import org.eclipse.jdt.internal.compiler.ast.OpensStatement; -import org.eclipse.jdt.internal.compiler.ast.PackageVisibilityStatement; -import org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference; -import org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference; -import org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression; -import org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference; -import org.eclipse.jdt.internal.compiler.ast.QualifiedSuperReference; -import org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference; -import org.eclipse.jdt.internal.compiler.ast.Receiver; -import org.eclipse.jdt.internal.compiler.ast.RecordComponent; -import org.eclipse.jdt.internal.compiler.ast.RecordPattern; -import org.eclipse.jdt.internal.compiler.ast.Reference; -import org.eclipse.jdt.internal.compiler.ast.ReferenceExpression; -import org.eclipse.jdt.internal.compiler.ast.ReturnStatement; -import org.eclipse.jdt.internal.compiler.ast.SingleNameReference; -import org.eclipse.jdt.internal.compiler.ast.Statement; -import org.eclipse.jdt.internal.compiler.ast.SwitchExpression; -import org.eclipse.jdt.internal.compiler.ast.SwitchStatement; -import org.eclipse.jdt.internal.compiler.ast.ThisReference; -import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; -import org.eclipse.jdt.internal.compiler.ast.TypeParameter; -import org.eclipse.jdt.internal.compiler.ast.TypeReference; -import org.eclipse.jdt.internal.compiler.ast.UnaryExpression; -import org.eclipse.jdt.internal.compiler.ast.Wildcard; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.env.AccessRestriction; import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; @@ -176,40 +106,8 @@ import org.eclipse.jdt.internal.compiler.impl.JavaFeature; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; import org.eclipse.jdt.internal.compiler.impl.StringConstant; -import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.CaptureBinding; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; -import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; -import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; -import org.eclipse.jdt.internal.compiler.lookup.InvocationSite; -import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; -import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.MethodScope; -import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; -import org.eclipse.jdt.internal.compiler.lookup.PackageBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons; -import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding; -import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; -import org.eclipse.jdt.internal.compiler.lookup.Scope; -import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.SplitPackageBinding; -import org.eclipse.jdt.internal.compiler.lookup.SyntheticArgumentBinding; -import org.eclipse.jdt.internal.compiler.lookup.TagBits; -import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; -import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; +import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.lookup.TypeConstants.DangerousMethod; -import org.eclipse.jdt.internal.compiler.lookup.TypeIds; -import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.VariableBinding; -import org.eclipse.jdt.internal.compiler.lookup.WildcardBinding; import org.eclipse.jdt.internal.compiler.parser.JavadocTagConstants; import org.eclipse.jdt.internal.compiler.parser.Parser; import org.eclipse.jdt.internal.compiler.parser.RecoveryScanner; @@ -304,6 +202,9 @@ public static int getIrritant(int problemID) { case IProblem.LocalVariableIsNeverUsed : return CompilerOptions.UnusedLocalVariable; + case IProblem.LambdaParameterIsNeverUsed : + return CompilerOptions.UnusedLambdaParameter; + case IProblem.ArgumentIsNeverUsed : return CompilerOptions.UnusedArgument; @@ -808,6 +709,7 @@ public static int getProblemCategory(int severity, int problemID) { return CategorizedProblem.CAT_NAME_SHADOWING_CONFLICT; case CompilerOptions.UnusedLocalVariable : + case CompilerOptions.UnusedLambdaParameter : case CompilerOptions.UnusedArgument : case CompilerOptions.UnusedExceptionParameter : case CompilerOptions.UnusedImport : @@ -925,6 +827,16 @@ public void abortDueToNotSupportedJavaVersion(String notSupportedVersion, String 0, 0); } +public void tooRecentJavaVersion(String notSupportedVersion, String firstSupportedVersion) { + String[] args = new String[] {notSupportedVersion, firstSupportedVersion}; + this.handle( + IProblem.JavaVersionTooRecent, + args, + args, + ProblemSeverities.Warning, + 0, + 0); +} public void abstractMethodCannotBeOverridden(SourceTypeBinding type, MethodBinding concreteMethod) { this.handle( @@ -1770,9 +1682,6 @@ public int computeSeverity(int problemID){ switch (problemID) { case IProblem.VarargsConflict : - case IProblem.SwitchExpressionsYieldUnqualifiedMethodWarning: - case IProblem.SwitchExpressionsYieldRestrictedGeneralWarning: - case IProblem.SwitchExpressionsYieldTypeDeclarationWarning: case IProblem.StrictfpNotRequired: return ProblemSeverities.Warning; case IProblem.TypeCollidesWithPackage : @@ -3455,7 +3364,7 @@ public void illegalVisibilityModifierCombinationForField(ReferenceBinding type, fieldDecl.sourceStart, fieldDecl.sourceEnd); } -public void IllegalModifierCombinationForType(SourceTypeBinding type) { +public void illegalModifierCombinationForType(SourceTypeBinding type) { String[] arguments = new String[] {new String(type.sourceName())}; this.handle( IProblem.IllegalModifierCombinationForType, @@ -5011,7 +4920,7 @@ else if (type instanceof ArrayBinding) { } } - if (type.isParameterizedType()) { + if (!(type instanceof MissingTypeBinding)) { List missingTypes = type.collectMissingTypes(null); if (missingTypes != null) { ReferenceContext savedContext = this.referenceContext; @@ -5342,82 +5251,7 @@ public void isClassPathCorrect(char[][] wellKnownTypeName, CompilationUnitDeclar private boolean isIdentifier(int token) { return token == TerminalTokens.TokenNameIdentifier; } -private boolean isRestrictedIdentifier(int token) { - switch(token) { - case TerminalTokens.TokenNameRestrictedIdentifierYield: - case TerminalTokens.TokenNameRestrictedIdentifierrecord: - case TerminalTokens.TokenNameRestrictedIdentifiersealed: - case TerminalTokens.TokenNameRestrictedIdentifierpermits: - case TerminalTokens.TokenNameRestrictedIdentifierWhen: - return true; - default: return false; - } -} -private boolean isKeyword(int token) { - switch(token) { - case TerminalTokens.TokenNameabstract: - case TerminalTokens.TokenNameassert: - case TerminalTokens.TokenNamebyte: - case TerminalTokens.TokenNamebreak: - case TerminalTokens.TokenNameboolean: - case TerminalTokens.TokenNamecase: - case TerminalTokens.TokenNamechar: - case TerminalTokens.TokenNamecatch: - case TerminalTokens.TokenNameclass: - case TerminalTokens.TokenNamecontinue: - case TerminalTokens.TokenNamedo: - case TerminalTokens.TokenNamedouble: - case TerminalTokens.TokenNamedefault: - case TerminalTokens.TokenNameelse: - case TerminalTokens.TokenNameextends: - case TerminalTokens.TokenNamefor: - case TerminalTokens.TokenNamefinal: - case TerminalTokens.TokenNamefloat: - case TerminalTokens.TokenNamefalse: - case TerminalTokens.TokenNamefinally: - case TerminalTokens.TokenNameif: - case TerminalTokens.TokenNameint: - case TerminalTokens.TokenNameimport: - case TerminalTokens.TokenNameinterface: - case TerminalTokens.TokenNameimplements: - case TerminalTokens.TokenNameinstanceof: - case TerminalTokens.TokenNamelong: - case TerminalTokens.TokenNamenew: - case TerminalTokens.TokenNamenon_sealed: - case TerminalTokens.TokenNamenull: - case TerminalTokens.TokenNamenative: - case TerminalTokens.TokenNamepublic: - case TerminalTokens.TokenNamepackage: - case TerminalTokens.TokenNameprivate: - case TerminalTokens.TokenNameprotected: - case TerminalTokens.TokenNamereturn: - case TerminalTokens.TokenNameshort: - case TerminalTokens.TokenNamesuper: - case TerminalTokens.TokenNamestatic: - case TerminalTokens.TokenNameswitch: - case TerminalTokens.TokenNamestrictfp: - case TerminalTokens.TokenNamesynchronized: - case TerminalTokens.TokenNametry: - case TerminalTokens.TokenNamethis: - case TerminalTokens.TokenNametrue: - case TerminalTokens.TokenNamethrow: - case TerminalTokens.TokenNamethrows: - case TerminalTokens.TokenNametransient: - case TerminalTokens.TokenNamevoid: - case TerminalTokens.TokenNamevolatile: - case TerminalTokens.TokenNamewhile: - return true; - case TerminalTokens.TokenNameRestrictedIdentifierYield: - case TerminalTokens.TokenNameRestrictedIdentifierrecord: - case TerminalTokens.TokenNameRestrictedIdentifiersealed: - case TerminalTokens.TokenNameRestrictedIdentifierpermits: - case TerminalTokens.TokenNameRestrictedIdentifierWhen: - // making explicit - not a (restricted) keyword but restricted identifier. - //$FALL-THROUGH$ - default: - return false; - } -} + private boolean isLiteral(int token) { return Scanner.isLiteral(token); } @@ -7539,7 +7373,7 @@ public void noSuchEnclosingInstance(TypeBinding targetType, ASTNode location, bo location.sourceStart, location instanceof LambdaExpression ? ((LambdaExpression)location).diagnosticsSourceEnd() : location.sourceEnd); } -public void notCompatibleTypesError(EqualExpression expression, TypeBinding leftType, TypeBinding rightType) { +public void notCompatibleTypesError(ASTNode location, TypeBinding leftType, TypeBinding rightType) { String leftName = new String(leftType.readableName()); String rightName = new String(rightType.readableName()); String leftShortName = new String(leftType.shortReadableName()); @@ -7548,28 +7382,18 @@ public void notCompatibleTypesError(EqualExpression expression, TypeBinding left leftShortName = leftName; rightShortName = rightName; } - this.handle( - IProblem.IncompatibleTypesInEqualityOperator, - new String[] {leftName, rightName }, - new String[] {leftShortName, rightShortName }, - expression.sourceStart, - expression.sourceEnd); -} -public void notCompatibleTypesError(Expression expression, TypeBinding leftType, TypeBinding rightType) { - String leftName = new String(leftType.readableName()); - String rightName = new String(rightType.readableName()); - String leftShortName = new String(leftType.shortReadableName()); - String rightShortName = new String(rightType.shortReadableName()); - if (leftShortName.equals(rightShortName)){ - leftShortName = leftName; - rightShortName = rightName; + int problemId = IProblem.IncompatibleTypesInEqualityOperator; + if (location instanceof Pattern p && p.getEnclosingPattern() instanceof RecordPattern) { + problemId = IProblem.PatternTypeMismatch; + } else if (location instanceof InstanceOfExpression) { + problemId = IProblem.IncompatibleTypesInConditionalOperator; } this.handle( - IProblem.IncompatibleTypesInConditionalOperator, + problemId, new String[] {leftName, rightName }, new String[] {leftShortName, rightShortName }, - expression.sourceStart, - expression.sourceEnd); + location.sourceStart, + location.sourceEnd); } public void notCompatibleTypesErrorInForeach(Expression expression, TypeBinding leftType, TypeBinding rightType) { String leftName = new String(leftType.readableName()); @@ -7789,7 +7613,7 @@ public void parseError( String[] possibleTokens) { if (possibleTokens.length == 0) { //no suggestion available - if (isKeyword(currentToken)) { + if (Scanner.isKeyword(currentToken)) { String[] arguments = new String[] {new String(currentTokenSource)}; this.handle( IProblem.ParsingErrorOnKeywordNoSuggestion, @@ -7822,7 +7646,7 @@ public void parseError( list.append('"'); } - if (isKeyword(currentToken)) { + if (Scanner.isKeyword(currentToken)) { String[] arguments = new String[] {new String(currentTokenSource), list.toString()}; this.handle( IProblem.ParsingErrorOnKeyword, @@ -8678,14 +8502,14 @@ private void syntaxError( return; } String eTokenName; - if (isKeyword(currentKind) || + if (Scanner.isKeyword(currentKind) || isLiteral(currentKind) || isIdentifier(currentKind)) { eTokenName = new String(currentTokenSource); } else { eTokenName = errorTokenName; } - if (isRestrictedIdentifier(currentKind)) + if (TerminalTokens.isRestrictedKeyword(currentKind)) eTokenName = replaceIfSynthetic(eTokenName); String[] arguments; @@ -8793,21 +8617,21 @@ public void typeCastError(CastExpression expression, TypeBinding leftType, TypeB expression.sourceStart, expression.sourceEnd); } -public void unsafeCastInInstanceof(Expression expression, TypeBinding leftType, TypeBinding rightType) { - String leftName = new String(leftType.readableName()); - String rightName = new String(rightType.readableName()); - String leftShortName = new String(leftType.shortReadableName()); - String rightShortName = new String(rightType.shortReadableName()); - if (leftShortName.equals(rightShortName)){ - leftShortName = leftName; - rightShortName = rightName; +public void unsafeCastInTestingContext(ASTNode location, TypeBinding castType, TypeBinding expressionType) { + String castName = new String(castType.readableName()); + String exprName = new String(expressionType.readableName()); + String castShortName = new String(castType.shortReadableName()); + String exprShortName = new String(expressionType.shortReadableName()); + if (castShortName.equals(exprShortName)){ + castShortName = castName; + exprShortName = exprName; } this.handle( IProblem.UnsafeCast, - new String[] { rightName, leftName }, - new String[] { rightShortName, leftShortName }, - expression.sourceStart, - expression.sourceEnd); + new String[] { exprName, castName }, + new String[] { exprShortName, castShortName }, + location.sourceStart, + location.sourceEnd); } public void typeCollidesWithEnclosingType(TypeDeclaration typeDecl) { String[] arguments = new String[] {new String(typeDecl.name)}; @@ -9693,6 +9517,18 @@ public void unusedLocalVariable(LocalDeclaration localDecl) { localDecl.sourceStart, localDecl.sourceEnd); } +public void unusedLambdaParameter(LocalDeclaration localDecl) { + int severity = computeSeverity(IProblem.LambdaParameterIsNeverUsed); + if (severity == ProblemSeverities.Ignore) return; + String[] arguments = new String[] {new String(localDecl.name)}; + this.handle( + IProblem.LambdaParameterIsNeverUsed, + arguments, + arguments, + severity, + localDecl.sourceStart, + localDecl.sourceEnd); +} public void unusedObjectAllocation(AllocationExpression allocationExpression) { this.handle( IProblem.UnusedObjectAllocation, @@ -9969,7 +9805,7 @@ public boolean validateRestrictedKeywords(char[] name, ASTNode node) { close(); } } -//Returns true if the problem is handled and reported (only errors considered and not warnings) +// Returns true if the problem is handled and reported (only errors considered and not warnings) public boolean validateJavaFeatureSupport(JavaFeature feature, int sourceStart, int sourceEnd) { boolean versionInRange = feature.getCompliance() <= this.options.sourceLevel; String version = CompilerOptions.versionFromJdkLevel(feature.getCompliance()); @@ -11940,24 +11776,15 @@ public void moduleDoesNotReadOther(ImportReference importReference, ModuleBindin importReference.sourceStart, importReference.sourceEnd); } -public void switchExpressionIncompatibleResultExpressions(SwitchExpression expression) { - TypeBinding type = expression.resultExpressions.get(0).resolvedType; +public void incompatibleSwitchExpressionResults(SwitchExpression expression) { this.handle( IProblem.SwitchExpressionsYieldIncompatibleResultExpressionTypes, - new String[] {new String(type.readableName())}, - new String[] {new String(type.shortReadableName())}, - expression.sourceStart, - expression.sourceEnd); -} -public void switchExpressionEmptySwitchBlock(SwitchExpression expression) { - this.handle( - IProblem.SwitchExpressionsYieldEmptySwitchBlock, NoArgument, NoArgument, expression.sourceStart, expression.sourceEnd); } -public void switchExpressionNoResultExpressions(SwitchExpression expression) { +public void unyieldingSwitchExpression(SwitchExpression expression) { this.handle( IProblem.SwitchExpressionsYieldNoResultExpression, NoArgument, @@ -11965,15 +11792,7 @@ public void switchExpressionNoResultExpressions(SwitchExpression expression) { expression.sourceStart, expression.sourceEnd); } -public void switchExpressionSwitchLabeledBlockCompletesNormally(Block block) { - this.handle( - IProblem.SwitchExpressionaYieldSwitchLabeledBlockCompletesNormally, - NoArgument, - NoArgument, - block.sourceEnd - 1, - block.sourceEnd); -} -public void switchExpressionLastStatementCompletesNormally(Statement stmt) { +public void switchExpressionBlockCompletesNormally(Statement stmt) { this.handle( IProblem.SwitchExpressionaYieldSwitchLabeledBlockCompletesNormally, NoArgument, @@ -11981,23 +11800,7 @@ public void switchExpressionLastStatementCompletesNormally(Statement stmt) { stmt.sourceEnd - 1, stmt.sourceEnd); } -public void switchExpressionIllegalLastStatement(Statement stmt) { - this.handle( - IProblem.SwitchExpressionsYieldIllegalLastStatement, - NoArgument, - NoArgument, - stmt.sourceStart, - stmt.sourceEnd); -} -public void switchExpressionTrailingSwitchLabels(Statement stmt) { - this.handle( - IProblem.SwitchExpressionsYieldTrailingSwitchLabels, - NoArgument, - NoArgument, - stmt.sourceStart, - stmt.sourceEnd); -} -public void switchExpressionMixedCase(ASTNode statement) { +public void arrowColonMixup(ASTNode statement) { this.handle( IProblem.SwitchPreviewMixedCase, NoArgument, @@ -12005,24 +11808,7 @@ public void switchExpressionMixedCase(ASTNode statement) { statement.sourceStart, statement.sourceEnd); } -// Is this redundant ?? See switchExpressionsBreakOutOfSwitchExpression -public void switchExpressionBreakNotAllowed(ASTNode statement) { - this.handle( - IProblem.SwitchExpressionsYieldBreakNotAllowed, - NoArgument, - NoArgument, - statement.sourceStart, - statement.sourceEnd); -} -public void switchExpressionsYieldUnqualifiedMethodWarning(ASTNode statement) { - this.handle( - IProblem.SwitchExpressionsYieldUnqualifiedMethodWarning, - NoArgument, - NoArgument, - statement.sourceStart, - statement.sourceEnd); -} -public void switchExpressionsYieldUnqualifiedMethodError(ASTNode statement) { +public void unqualifiedYieldMethod(ASTNode statement) { this.handle( IProblem.SwitchExpressionsYieldUnqualifiedMethodError, NoArgument, @@ -12030,7 +11816,7 @@ public void switchExpressionsYieldUnqualifiedMethodError(ASTNode statement) { statement.sourceStart, statement.sourceEnd); } -public void switchExpressionsYieldOutsideSwitchExpression(ASTNode statement) { +public void yieldOutsideSwitchExpression(ASTNode statement) { this.handle( IProblem.SwitchExpressionsYieldOutsideSwitchExpression, NoArgument, @@ -12038,38 +11824,6 @@ public void switchExpressionsYieldOutsideSwitchExpression(ASTNode statement) { statement.sourceStart, statement.sourceEnd); } -public void switchExpressionsYieldRestrictedGeneralWarning(ASTNode statement) { - this.handle( - IProblem.SwitchExpressionsYieldRestrictedGeneralWarning, - NoArgument, - NoArgument, - statement.sourceStart, - statement.sourceEnd); -} -public void switchExpressionsYieldIllegalStatement(ASTNode statement) { - this.handle( - IProblem.SwitchExpressionsYieldIllegalStatement, - NoArgument, - NoArgument, - statement.sourceStart, - statement.sourceEnd); -} -public void switchExpressionsYieldTypeDeclarationWarning(ASTNode statement) { - this.handle( - IProblem.SwitchExpressionsYieldTypeDeclarationWarning, - NoArgument, - NoArgument, - statement.sourceStart, - statement.sourceEnd); -} -public void switchExpressionsYieldTypeDeclarationError(ASTNode statement) { - this.handle( - IProblem.SwitchExpressionsYieldTypeDeclarationError, - NoArgument, - NoArgument, - statement.sourceStart, - statement.sourceEnd); -} public void multiConstantCaseLabelsNotSupported(ASTNode statement) { this.handle( IProblem.MultiConstantCaseLabelsNotSupported, @@ -12094,7 +11848,7 @@ public void switchExpressionsNotSupported(ASTNode statement) { statement.sourceStart, statement.sourceEnd); } -public void switchExpressionsBreakOutOfSwitchExpression(ASTNode statement) { +public void breakOutOfSwitchExpression(ASTNode statement) { this.handle( IProblem.SwitchExpressionsBreakOutOfSwitchExpression, NoArgument, @@ -12102,7 +11856,7 @@ public void switchExpressionsBreakOutOfSwitchExpression(ASTNode statement) { statement.sourceStart, statement.sourceEnd); } -public void switchExpressionsContinueOutOfSwitchExpression(ASTNode statement) { +public void continueOutOfSwitchExpression(ASTNode statement) { this.handle( IProblem.SwitchExpressionsContinueOutOfSwitchExpression, NoArgument, @@ -12110,7 +11864,7 @@ public void switchExpressionsContinueOutOfSwitchExpression(ASTNode statement) { statement.sourceStart, statement.sourceEnd); } -public void switchExpressionsReturnWithinSwitchExpression(ASTNode statement) { +public void returnOutOfSwitchExpression(ASTNode statement) { this.handle( IProblem.SwitchExpressionsReturnWithinSwitchExpression, NoArgument, @@ -12414,140 +12168,80 @@ public void illegalModifierForLocalEnumDeclaration(SourceTypeBinding type) { type.sourceStart(), type.sourceEnd()); } -private void sealedMissingModifier(int problem, SourceTypeBinding type, TypeDeclaration typeDecl, TypeBinding superTypeBinding) { + +public void permittedTypeNeedsModifier(SourceTypeBinding type, TypeDeclaration typeDecl, TypeBinding superTypeBinding) { String name = new String(type.sourceName()); String superTypeFullName = new String(superTypeBinding.readableName()); String superTypeShortName = new String(superTypeBinding.shortReadableName()); if (superTypeShortName.equals(name)) superTypeShortName = superTypeFullName; this.handle( - problem, + type.isClass() ? IProblem.SealedMissingClassModifier : IProblem.SealedMissingInterfaceModifier, new String[] {superTypeFullName, name}, new String[] {superTypeShortName, name}, typeDecl.sourceStart, typeDecl.sourceEnd); } -public void sealedMissingClassModifier(SourceTypeBinding type, TypeDeclaration typeDecl, TypeBinding superTypeBinding) { - sealedMissingModifier(IProblem.SealedMissingClassModifier, type, typeDecl, superTypeBinding); -} -public void sealedMissingInterfaceModifier(SourceTypeBinding type, TypeDeclaration typeDecl, TypeBinding superTypeBinding) { - sealedMissingModifier(IProblem.SealedMissingInterfaceModifier, type, typeDecl, superTypeBinding); -} -public void sealedDisAllowedNonSealedModifierInClass(SourceTypeBinding type, TypeDeclaration typeDecl) { +public void disallowedNonSealedModifier(SourceTypeBinding type, TypeDeclaration typeDecl) { String name = new String(type.sourceName()); this.handle( - IProblem.SealedDisAllowedNonSealedModifierInClass, + type.isClass() ? IProblem.SealedDisAllowedNonSealedModifierInClass : IProblem.SealedDisAllowedNonSealedModifierInInterface, new String[] { name }, new String[] { name }, typeDecl.sourceStart, typeDecl.sourceEnd); } -private void sealedSuperTypeDoesNotPermit(int problem, SourceTypeBinding type, TypeReference superType, TypeBinding superTypeBinding) { - String name = new String(type.sourceName()); - String superTypeFullName = new String(superTypeBinding.readableName()); - String superTypeShortName = new String(superTypeBinding.shortReadableName()); - if (superTypeShortName.equals(name)) superTypeShortName = superTypeFullName; - this.handle( - problem, - new String[] {name, superTypeFullName}, - new String[] {name, superTypeShortName}, - superType.sourceStart, - superType.sourceEnd); -} - -public void sealedSuperTypeInDifferentPackage(int problem, SourceTypeBinding type, TypeReference curType, TypeBinding superTypeBinding, PackageBinding superPackageBinding) { - String typeName = new String(type.sourceName); - String name = new String(superTypeBinding.sourceName()); - String packageName = superPackageBinding.compoundName == CharOperation.NO_CHAR_CHAR ? "default" : //$NON-NLS-1$ - CharOperation.toString(superPackageBinding.compoundName); - String[] arguments = new String[] {typeName, packageName, name}; - this.handle(problem, - arguments, - arguments, - curType.sourceStart, - curType.sourceEnd); -} - -public void sealedSuperTypeDisallowed(int problem, SourceTypeBinding type, TypeReference curType, TypeBinding superTypeBinding) { - String typeName = new String(type.sourceName); - String name = new String(superTypeBinding.sourceName()); - String[] arguments = new String[] {typeName, name}; - this.handle(problem, - arguments, - arguments, - curType.sourceStart, - curType.sourceEnd); -} - -public void sealedSuperClassDoesNotPermit(SourceTypeBinding type, TypeReference superType, TypeBinding superTypeBinding) { - sealedSuperTypeDoesNotPermit(IProblem.SealedSuperClassDoesNotPermit, type, superType, superTypeBinding); -} - -public void sealedSuperClassInDifferentPackage(SourceTypeBinding type, TypeReference curType, TypeBinding superTypeBinding, PackageBinding superPackageBinding) { - sealedSuperTypeInDifferentPackage(IProblem.SealedSuperTypeInDifferentPackage, type, curType, superTypeBinding, superPackageBinding); -} - -public void sealedSuperClassDisallowed(SourceTypeBinding type, TypeReference curType, TypeBinding superTypeBinding) { - sealedSuperTypeDisallowed(IProblem.SealedSuperTypeDisallowed, type, curType, superTypeBinding); -} - -public void sealedSuperInterfaceDoesNotPermit(SourceTypeBinding type, TypeReference superType, TypeBinding superTypeBinding) { +public void sealedSupertypeDoesNotPermit(SourceTypeBinding type, TypeReference superType, TypeBinding superTypeBinding) { String name = new String(type.sourceName()); String superTypeFullName = new String(superTypeBinding.readableName()); String superTypeShortName = new String(superTypeBinding.shortReadableName()); - String keyword = type.isClass() ? new String(TypeConstants.IMPLEMENTS) : new String(TypeConstants.KEYWORD_EXTENDS); if (superTypeShortName.equals(name)) superTypeShortName = superTypeFullName; - this.handle( - IProblem.SealedSuperInterfaceDoesNotPermit, - new String[] {name, superTypeFullName, keyword}, - new String[] {name, superTypeShortName, keyword}, - superType.sourceStart, - superType.sourceEnd); -} - -public void sealedSuperInterfaceInDifferentPackage(SourceTypeBinding type, TypeReference curType, TypeBinding superTypeBinding, PackageBinding superPackageBinding) { - sealedSuperTypeInDifferentPackage(IProblem.SealedSuperTypeInDifferentPackage, type, curType, superTypeBinding, superPackageBinding); -} - -public void sealedSuperInterfaceDisallowed(SourceTypeBinding type, TypeReference curType, TypeBinding superTypeBinding) { - sealedSuperTypeDisallowed(IProblem.SealedSuperTypeDisallowed, type, curType, superTypeBinding); + if (superTypeBinding.isClass()) { + this.handle( + IProblem.SealedSuperClassDoesNotPermit, + new String[] {name, superTypeFullName}, + new String[] {name, superTypeShortName}, + superType.sourceStart, + superType.sourceEnd); + } else { + String keyword = type.isClass() ? new String(TypeConstants.IMPLEMENTS) : new String(TypeConstants.KEYWORD_EXTENDS); + this.handle( + IProblem.SealedSuperInterfaceDoesNotPermit, + new String[] {name, superTypeFullName, keyword}, + new String[] {name, superTypeShortName, keyword}, + superType.sourceStart, + superType.sourceEnd); + } } -public void sealedMissingSealedModifier(SourceTypeBinding type, ASTNode node) { +public void missingSealedModifier(SourceTypeBinding type, ASTNode node) { String name = new String(type.sourceName()); this.handle(IProblem.SealedMissingSealedModifier, new String[] { name }, new String[] { name }, node.sourceStart, node.sourceEnd); } -public void sealedDuplicateTypeInPermits(SourceTypeBinding type, TypeReference reference, ReferenceBinding superType) { +public void duplicatePermittedType(TypeReference reference, ReferenceBinding superType) { this.handle( IProblem.SealedDuplicateTypeInPermits, - new String[] { - new String(superType.readableName()), - new String(type.sourceName())}, - new String[] { - new String(superType.shortReadableName()), - new String(type.sourceName())}, + new String[] { new String(superType.readableName()) }, + new String[] { new String(superType.shortReadableName()) }, reference.sourceStart, reference.sourceEnd); } -public void sealedNotDirectSuperClass(ReferenceBinding type, TypeReference reference, SourceTypeBinding superType) { - this.handle( - IProblem.SealedNotDirectSuperClass, - new String[] { - new String(type.sourceName()), - new String(superType.readableName())}, - new String[] { - new String(type.sourceName()), - new String(superType.readableName())}, - reference.sourceStart, - reference.sourceEnd); +public void sealedClassNotDirectSuperClassOf(ReferenceBinding type, TypeReference reference, SourceTypeBinding superType) { + if ((type.tagBits & TagBits.HierarchyHasProblems) == 0 && (superType.tagBits & TagBits.HierarchyHasProblems) == 0) { + this.handle(IProblem.SealedNotDirectSuperClass, + new String[] { new String(type.sourceName()), new String(superType.readableName()) }, + new String[] { new String(type.sourceName()), new String(superType.readableName()) }, + reference.sourceStart, reference.sourceEnd); + } } -public void sealedPermittedTypeOutsideOfModule(ReferenceBinding permType, SourceTypeBinding type, ASTNode node, ModuleBinding moduleBinding) { + +public void permittedTypeOutsideOfModule(ReferenceBinding permType, ReferenceBinding sealedType, ASTNode node, ModuleBinding moduleBinding) { String permTypeName = new String(permType.sourceName); - String name = new String(type.sourceName()); + String name = new String(sealedType.sourceName()); String moduleName = new String(moduleBinding.name()); String[] arguments = new String[] {permTypeName, moduleName, name}; this.handle(IProblem.SealedPermittedTypeOutsideOfModule, @@ -12556,15 +12250,10 @@ public void sealedPermittedTypeOutsideOfModule(ReferenceBinding permType, Source node.sourceStart, node.sourceEnd); } -public void sealedPermittedTypeOutsideOfModule(SourceTypeBinding type, ASTNode node) { - String name = new String(type.sourceName()); - this.handle(IProblem.SealedPermittedTypeOutsideOfModule, new String[] { name }, new String[] { name }, - node.sourceStart, node.sourceEnd); -} -public void sealedPermittedTypeOutsideOfPackage(ReferenceBinding permType, SourceTypeBinding type, ASTNode node, PackageBinding packageBinding) { +public void permittedTypeOutsideOfPackage(ReferenceBinding permType, ReferenceBinding sealedType, ASTNode node, PackageBinding packageBinding) { String permTypeName = new String(permType.sourceName); - String name = new String(type.sourceName()); + String name = new String(sealedType.sourceName()); String packageName = packageBinding.compoundName == CharOperation.NO_CHAR_CHAR ? "default" : //$NON-NLS-1$ CharOperation.toString(packageBinding.compoundName); String[] arguments = new String[] {permTypeName, packageName, name}; @@ -12575,45 +12264,22 @@ public void sealedPermittedTypeOutsideOfPackage(ReferenceBinding permType, Sourc node.sourceEnd); } -public void sealedSealedTypeMissingPermits(SourceTypeBinding type, ASTNode node) { +public void missingPermitsClause(SourceTypeBinding type, ASTNode node) { String name = new String(type.sourceName()); this.handle(IProblem.SealedSealedTypeMissingPermits, new String[] { name }, new String[] { name }, node.sourceStart, node.sourceEnd); } -public void sealedInterfaceIsSealedAndNonSealed(SourceTypeBinding type, ASTNode node) { - String name = new String(type.sourceName()); - this.handle(IProblem.SealedInterfaceIsSealedAndNonSealed, - new String[] { name }, - new String[] { name }, - node.sourceStart, - node.sourceEnd); -} - -public void sealedDisAllowedNonSealedModifierInInterface(SourceTypeBinding type, TypeDeclaration typeDecl) { - String name = new String(type.sourceName()); - this.handle( - IProblem.SealedDisAllowedNonSealedModifierInInterface, - new String[] { name }, - new String[] { name }, - typeDecl.sourceStart, - typeDecl.sourceEnd); -} - -public void sealedNotDirectSuperInterface(ReferenceBinding type, TypeReference reference, SourceTypeBinding superType) { - this.handle( - IProblem.SealedNotDirectSuperInterface, - new String[] { - new String(type.sourceName()), - new String(superType.readableName())}, - new String[] { - new String(type.sourceName()), - new String(superType.readableName())}, - reference.sourceStart, - reference.sourceEnd); +public void sealedInterfaceNotDirectSuperInterfaceOf(ReferenceBinding type, TypeReference reference, SourceTypeBinding superType) { + if ((type.tagBits & TagBits.HierarchyHasProblems) == 0 && (superType.tagBits & TagBits.HierarchyHasProblems) == 0) { + this.handle(IProblem.SealedNotDirectSuperInterface, + new String[] { new String(type.sourceName()), new String(superType.readableName()) }, + new String[] { new String(type.sourceName()), new String(superType.readableName()) }, + reference.sourceStart, reference.sourceEnd); + } } -public void sealedLocalDirectSuperTypeSealed(SourceTypeBinding type, TypeReference superclass, TypeBinding superTypeBinding) { +public void localTypeMayNotBePermittedType(SourceTypeBinding type, TypeReference superclass, TypeBinding superTypeBinding) { String name = new String(type.sourceName()); String superTypeFullName = new String(superTypeBinding.readableName()); String superTypeShortName = new String(superTypeBinding.shortReadableName()); @@ -12625,7 +12291,8 @@ public void sealedLocalDirectSuperTypeSealed(SourceTypeBinding type, TypeReferen superclass.sourceStart, superclass.sourceEnd); } -public void sealedAnonymousClassCannotExtendSealedType(TypeReference reference, TypeBinding type) { + +public void anonymousClassCannotExtendSealedType(TypeReference reference, TypeBinding type) { this.handle( IProblem.SealedAnonymousClassCannotExtendSealedType, new String[] {new String(type.readableName())}, @@ -12633,6 +12300,17 @@ public void sealedAnonymousClassCannotExtendSealedType(TypeReference reference, reference.sourceStart, reference.sourceEnd); } + +public void functionalInterfaceMayNotBeSealed(TypeDeclaration type) { + TypeBinding binding = type.binding; + this.handle( + IProblem.FunctionalInterfaceMayNotbeSealed, + new String[] {new String(binding.readableName()), }, + new String[] {new String(binding.shortReadableName()),}, + type.sourceStart, + type.sourceEnd); +} + public void StrictfpNotRequired(int sourceStart, int sourceEnd) { this.handle( IProblem.StrictfpNotRequired, @@ -12735,14 +12413,6 @@ public void recordPatternSignatureMismatch(TypeBinding type, ASTNode element) { element.sourceStart, element.sourceEnd); } -public void incompatiblePatternType(ASTNode element, TypeBinding type, TypeBinding expected) { - this.handle( - IProblem.PatternTypeMismatch, - new String[] {new String(type.readableName()), new String(expected.readableName())}, - new String[] {new String(type.shortReadableName()), new String(expected.readableName())}, - element.sourceStart, - element.sourceEnd); -} public void cannotInferRecordPatternTypes(RecordPattern pattern) { String arguments [] = new String [] { pattern.toString() }; this.handle( diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/messages.properties b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/messages.properties index 06008e016d..b1d22ac876 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/messages.properties +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/problem/messages.properties @@ -294,6 +294,7 @@ 272 = Text block is not properly closed with the delimiter 280 = Discouraged access: {0} +281 = The value of the lambda parameter {0} is not used 300 = The interface {0} cannot define an initializer 301 = Duplicate modifier for the type {0} @@ -907,6 +908,7 @@ 1107 = The Java feature ''{0}'' is only available with source level {1} and above 1108 = You are using an API that is part of a preview feature and may be removed in future 1109 = Compiling for Java version ''{0}'' is no longer supported. Minimal supported version is ''{1}'' +1110 = Compiling for Java version ''{0}'' is not supported yet. Using ''{1}'' instead # more programming problems: 1200 = Unlikely argument type {0} for {1} on a {2} 1201 = Unlikely argument type for equals(): {0} seems to be unrelated to {2} @@ -1012,46 +1014,48 @@ 1513 = 'var' cannot be used with type arguments # Switch-Expressions Java 12 Preview -1600 = Incompatible switch results expressions {0} -1601 = A switch expression should have a non-empty switch block -1602 = A switch expression should have at least one result expression -1603 = A switch labeled block in a switch expression should not complete normally -1604 = The last statement of a switch block in a switch expression should not complete normally -1605 = Trailing switch labels are not allowed in a switch expression. -1606 = Mixing of different kinds of case statements '->' and ':' is not allowed within a switch -1607 = A switch expression should have a default case -1608 = Switch expressions are allowed only at source level 12 or above -1609 = Switch Case Labels with '->' are allowed only at source level 12 or above -1610 = Break of a switch expression should have a value -1611 = A Switch expression should cover all possible values -1612 = 'continue' or 'return' cannot be the last statement in a Switch expression case body +###[obsolete] 1600 = Incompatible switch results expressions {0} +###[obsolete] 1601 = A switch expression should have a non-empty switch block +###[obsolete] 1602 = A switch expression should have at least one result expression +###[obsolete] 1603 = A switch labeled block in a switch expression should not complete normally +###[obsolete] 1604 = The last statement of a switch block in a switch expression should not complete normally +###[obsolete] 1605 = Trailing switch labels are not allowed in a switch expression. +###[obsolete] 1606 = Mixing of different kinds of case statements '->' and ':' is not allowed within a switch +###[obsolete] 1607 = A switch expression should have a default case +###[obsolete] 1608 = Switch expressions are allowed only at source level 12 or above +###[obsolete] 1609 = Switch Case Labels with '->' are allowed only at source level 12 or above +###[obsolete] 1610 = Break of a switch expression should have a value +###[obsolete] 1611 = A Switch expression should cover all possible values +###[obsolete] 1612 = 'continue' or 'return' cannot be the last statement in a Switch expression case body # Switch-Expressions Java 14 -1700 = Incompatible switch results expressions {0} -1701 = A switch expression should have a non-empty switch block +1700 = Incompatible results expressions in switch +###[obsolete] 1701 = A switch expression should have a non-empty switch block 1702 = A switch expression should have at least one result expression 1703 = A switch labeled block in a switch expression should not complete normally -1704 = The last statement of a switch block in a switch expression should not complete normally -1705 = Trailing switch labels are not allowed in a switch expression. -1706 = Mixing of different kinds of case statements '->' and ':' is not allowed within a switch +###[obsolete] 1704 = The last statement of a switch block in a switch expression should not complete normally +###[obsolete] 1705 = Trailing switch labels are not allowed in a switch expression. +1706 = Mixing of '->' and ':' case statement styles is not allowed within a switch 1707 = A switch expression should have a default case -1708 = yield of a switch expression should have a value +###[obsolete] 1708 = yield of a switch expression should have a value 1709 = A Switch expression should cover all possible values -1710 = 'continue' or 'return' cannot be the last statement in a Switch expression case body -1711 = break out of switch expression not allowed -1712 = yield may be disallowed in future - qualify method calls to avoid this message +###[obsolete] 1710 = 'continue' or 'return' cannot be the last statement in a Switch expression case body +###[obsolete] 1711 = break out of switch expression not allowed +###[obsolete] 1712 = yield may be disallowed in future - qualify method calls to avoid this message 1713 = restricted identifier yield not allowed here - method calls need to be qualified 1714 = yield outside of switch expression -1715 = yield is a restricted keyword and may be disallowed in future -1716 = yield statement is illegal here -1717 = yield may be a restricted identifier in future and may be disallowed as a type name -1718 = yield is a restricted identifier and cannot be used as type name +###[obsolete] 1715 = yield is a restricted keyword and may be disallowed in future +###[obsolete] 1716 = yield statement is illegal here +###[obsolete] 1717 = yield may be a restricted identifier in future and may be disallowed as a type name +###[obsolete] 1718 = yield is a restricted identifier and cannot be used as type name 1719 = Multi-constant case labels supported from Java 14 onwards only 1720 = Arrow in case statement supported from Java 14 onwards only 1721 = Switch Expressions are supported from Java 14 onwards only 1722 = Breaking out of switch expressions not permitted 1723 = Continue out of switch expressions not permitted 1724 = Return within switch expressions not permitted + + # Java 15 Preview - begin # Records 1730 = Illegal modifier for the record {0}; only public, private, protected, static, final and strictfp are permitted @@ -1129,25 +1133,26 @@ # Java 16 1820 = {0} is a value-based type which is a discouraged argument for the synchronized statement -# Java 15 Preview - cont -1850 = The class {1} with a sealed direct superclass or a sealed direct superinterface {0} should be declared either final, sealed, or non-sealed -1851 = A class {0} declared as non-sealed should have either a sealed direct superclass or a sealed direct superinterface -1852 = The type {0} extending a sealed class {1} should be a permitted subtype of {1} -1853 = The type {0} that {2} a sealed interface {1} should be a permitted subtype of {1} +# Sealed types - Java 17 +1850 = The class {1} with a sealed direct supertype {0} should be declared either final, sealed, or non-sealed +1851 = The non-sealed class {0} must have a sealed direct supertype +1852 = The class {0} cannot extend the class {1} as it is not a permitted subtype of {1} +1853 = The type {0} that {2} the sealed interface {1} should be a permitted subtype of {1} 1854 = A type declaration {0} that has a permits clause should have a sealed modifier 1855 = The interface {1} with a sealed direct superinterface {0} should be declared either sealed or non-sealed -1856 = Duplicate type {0} for the type {1} in the permits clause -1857 = Permitted class {0} does not declare {1} as direct super class +1856 = Duplicate permitted type {0} +1857 = Permitted type {0} does not declare {1} as a direct supertype 1858 = Permitted type {0} in a named module {1} should be declared in the same module {1} of declaring type {2} 1859 = Permitted type {0} in an unnamed module should be declared in the same package {1} of declaring type {2} -1860 = Sealed class or interface lacks the permits clause and no class or interface from the same compilation unit declares {0} as its direct superclass or superinterface -1861 = An interface {0} is declared both sealed and non-sealed -1862 = An interface {0} declared as non-sealed should have a sealed direct superinterface +1860 = Sealed type {0} lacks a permits clause and no type from the same compilation unit declares {0} as its direct supertype +###[obsolete] 1861 = An interface {0} is declared both sealed and non-sealed +1862 = The non-sealed interface {0} must have a sealed direct superinterface 1863 = Permitted type {0} does not declare {1} as direct super interface -1864 = A local class {1} cannot have a sealed direct superclass or a sealed direct superinterface {0} +1864 = The local type {1} may not have a sealed supertype {0} 1865 = An anonymous class cannot subclass a sealed type {0} -1866 = Sealed type {2} and sub type {0} in an unnamed module should be declared in the same package {1} -1867 = Sealed type {1} cannot be super type of {0} as it is from a different package or split package or module +###[obsolete] 1866 = Sealed type {2} and sub type {0} in an unnamed module should be declared in the same package {1} +###[obsolete] 1867 = Sealed type {1} cannot be super type of {0} as it is from a different package or split package or module +1868 = A functional interface may not be declared sealed # Switch Patterns - Java 21 1900 = Local variable {0} referenced from a guard must be final or effectively final diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/Archive.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/Archive.java index 73b55cee43..b3bc201bc3 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/Archive.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/Archive.java @@ -26,7 +26,6 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; - import org.eclipse.jdt.internal.compiler.util.JRTUtil; /** diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ArchiveFileObject.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ArchiveFileObject.java index 09626e4659..43058523c1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ArchiveFileObject.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ArchiveFileObject.java @@ -25,11 +25,9 @@ import java.nio.charset.Charset; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; - import javax.lang.model.element.Modifier; import javax.lang.model.element.NestingKind; import javax.tools.JavaFileObject; - import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseBatchRequestor.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseBatchRequestor.java index eb21f23e64..0e63154858 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseBatchRequestor.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseBatchRequestor.java @@ -15,7 +15,6 @@ import javax.tools.DiagnosticListener; import javax.tools.JavaFileObject; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.ICompilerRequestor; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompiler.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompiler.java index c6c4c40f32..e423b8a552 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompiler.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompiler.java @@ -30,7 +30,6 @@ import java.util.Locale; import java.util.Set; import java.util.WeakHashMap; - import javax.annotation.processing.Processor; import javax.lang.model.SourceVersion; import javax.tools.DiagnosticListener; @@ -39,7 +38,6 @@ import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.StandardLocation; - import org.eclipse.jdt.internal.compiler.batch.Main; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerImpl.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerImpl.java index fbb8d0bb2e..3ebe575228 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerImpl.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerImpl.java @@ -37,7 +37,6 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Stream; - import javax.annotation.processing.Processor; import javax.tools.Diagnostic; import javax.tools.DiagnosticListener; @@ -46,7 +45,6 @@ import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.StandardLocation; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.CompilationProgress; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerRequestor.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerRequestor.java index 28fcf01cf7..516ded99ca 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerRequestor.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseCompilerRequestor.java @@ -16,7 +16,6 @@ import javax.tools.DiagnosticListener; import javax.tools.JavaFileObject; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.batch.BatchCompilerRequestor; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseDiagnostic.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseDiagnostic.java index 26aa09be1e..cbd1b6e37d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseDiagnostic.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseDiagnostic.java @@ -15,10 +15,8 @@ import java.io.File; import java.util.Locale; - import javax.tools.Diagnostic; import javax.tools.JavaFileObject; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.internal.compiler.problem.DefaultProblem; import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseFileManager.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseFileManager.java index 765dbb9825..9ad9b94caf 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseFileManager.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseFileManager.java @@ -24,29 +24,13 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.MissingResourceException; -import java.util.Objects; -import java.util.ResourceBundle; -import java.util.ServiceLoader; -import java.util.Set; -import java.util.StringTokenizer; - +import java.util.*; import javax.lang.model.SourceVersion; import javax.tools.FileObject; import javax.tools.JavaFileObject; import javax.tools.JavaFileObject.Kind; import javax.tools.StandardJavaFileManager; import javax.tools.StandardLocation; - import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; import org.eclipse.jdt.internal.compiler.batch.FileSystem; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseFileObject.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseFileObject.java index c870341251..323b9e7455 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseFileObject.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/EclipseFileObject.java @@ -15,27 +15,12 @@ package org.eclipse.jdt.internal.compiler.tool; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Reader; -import java.io.Writer; +import java.io.*; import java.net.URI; import java.nio.charset.Charset; - import javax.lang.model.element.Modifier; import javax.lang.model.element.NestingKind; import javax.tools.SimpleJavaFileObject; - import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ExceptionDiagnostic.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ExceptionDiagnostic.java index 5afe834969..b22b7f78d8 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ExceptionDiagnostic.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ExceptionDiagnostic.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.internal.compiler.tool; import java.util.Locale; - import javax.tools.Diagnostic; import javax.tools.JavaFileObject; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/JrtFileSystem.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/JrtFileSystem.java index c475f2946a..5910a0ad96 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/JrtFileSystem.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/JrtFileSystem.java @@ -33,9 +33,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.zip.ZipException; - import javax.tools.JavaFileObject; - import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; import org.eclipse.jdt.internal.compiler.tool.ModuleLocationHandler.ModuleLocationWrapper; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ModuleLocationHandler.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ModuleLocationHandler.java index e751a4519e..9a72071bda 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ModuleLocationHandler.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/ModuleLocationHandler.java @@ -23,7 +23,6 @@ import java.util.List; import java.util.Map; import java.util.Set; - import javax.tools.JavaFileManager.Location; import javax.tools.StandardLocation; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/PathFileObject.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/PathFileObject.java index af6e2e0ce9..288504bc82 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/PathFileObject.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/PathFileObject.java @@ -23,11 +23,9 @@ import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; - import javax.lang.model.element.Modifier; import javax.lang.model.element.NestingKind; import javax.tools.JavaFileObject; - import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/Util.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/Util.java index d710d4157e..213bcb06ea 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/Util.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/tool/Util.java @@ -23,7 +23,6 @@ import java.nio.charset.IllegalCharsetNameException; import java.nio.charset.UnsupportedCharsetException; import java.util.ArrayList; - import javax.tools.FileObject; /** diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/HashtableOfObject.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/HashtableOfObject.java index 1976b30c50..9919c4c832 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/HashtableOfObject.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/HashtableOfObject.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.internal.compiler.util; import java.util.Arrays; - import org.eclipse.jdt.core.compiler.CharOperation; /** diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/JRTUtil.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/JRTUtil.java index c58937029d..19265d1fd1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/JRTUtil.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/JRTUtil.java @@ -21,23 +21,13 @@ import java.io.UncheckedIOException; import java.net.URI; import java.nio.channels.ClosedByInterruptException; -import java.nio.file.FileSystem; -import java.nio.file.FileSystemAlreadyExistsException; -import java.nio.file.FileSystemNotFoundException; -import java.nio.file.FileSystems; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.NoSuchFileException; -import java.nio.file.Path; -import java.nio.file.ProviderNotFoundException; -import java.nio.file.SimpleFileVisitor; +import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; - import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/JrtFileSystem.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/JrtFileSystem.java index 8a33f3432f..2f3b126d41 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/JrtFileSystem.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/JrtFileSystem.java @@ -30,7 +30,6 @@ import java.util.Map; import java.util.function.Predicate; import java.util.stream.Stream; - import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; @@ -326,7 +325,7 @@ synchronized void cachePackage(String packageName, String module) { } /** - * @return JDK release string (something like 1.8.0_05) read from the "release" file from JDK home + * @return JDK release string (something like 1.8.0_05) read from the "release" file from JDK home * directory */ public String getJdkRelease() { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/Sorting.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/Sorting.java index 262cdcbfd6..78e5395218 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/Sorting.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/Sorting.java @@ -15,7 +15,6 @@ import java.util.Arrays; import java.util.Comparator; - import org.eclipse.jdt.internal.compiler.lookup.InferenceVariable; import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/TextBlockUtil.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/TextBlockUtil.java new file mode 100644 index 0000000000..5e0642812c --- /dev/null +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/TextBlockUtil.java @@ -0,0 +1,272 @@ +/******************************************************************************* + * Copyright (c) 2024 IBM Corporation. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.compiler.util; + +import java.util.ArrayList; +import java.util.List; +import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.core.compiler.InvalidInputException; +import org.eclipse.jdt.internal.compiler.parser.ScannerHelper; + +public class TextBlockUtil { + + private static char[] normalize(char[] content) { + StringBuilder result = new StringBuilder(); + boolean isCR = false; + for (char c : content) { + switch (c) { + case '\r': + result.append(c); + isCR = true; + break; + case '\n': + if (!isCR) { + result.append(c); + } + isCR = false; + break; + default: + result.append(c); + isCR = false; + break; + } + } + return result.toString().toCharArray(); + } + // This method is for handling the left over escaped characters during the first + // scanning (scanForStringLiteral). Admittedly this goes over the text block + // content again char by char, but this is required in order to correctly + // treat all the white space and line endings + private static boolean getLineContent(StringBuilder result, char[] line, int start, int end, boolean merge, boolean lastLine) { + int lastPointer = 0; + for(int i = start; i < end;) { + char c = line[i]; + if (c != '\\') { + i++; + continue; + } + if (i < end) { + if (lastPointer + 1 <= i) { + result.append(CharOperation.subarray(line, lastPointer == 0 ? start : lastPointer, i)); + } + char next = line[++i]; + switch (next) { + case '\\' : + result.append('\\'); + if (i == end) + merge = false; + break; + case 's' : + result.append(' '); + break; + case '"': + result.append('"'); + break; + case 'b' : + result.append('\b'); + break; + case 'n' : + result.append('\n'); + break; + case 'r' : + result.append('\r'); + break; + case 't' : + result.append('\t'); + break; + case 'f' : + result.append('\f'); + break; + default : + // Direct copy from Scanner#scanEscapeCharacter + int pos = i + 1; + int number = ScannerHelper.getHexadecimalValue(next); + if (number >= 0 && number <= 7) { + boolean zeroToThreeNot = number > 3; + try { + if (pos <= end && ScannerHelper.isDigit(next = line[pos])) { + pos++; + int digit = ScannerHelper.getHexadecimalValue(next); + if (digit >= 0 && digit <= 7) { + number = (number * 8) + digit; + if (pos <= end && ScannerHelper.isDigit(next = line[pos])) { + pos++; + if (zeroToThreeNot) { + // has read \NotZeroToThree OctalDigit Digit --> ignore last character + } else { + digit = ScannerHelper.getHexadecimalValue(next); + if (digit >= 0 && digit <= 7){ // has read \ZeroToThree OctalDigit OctalDigit + number = (number * 8) + digit; + } else { + // has read \ZeroToThree OctalDigit NonOctalDigit --> ignore last character + } + } + } else { + // has read \OctalDigit NonDigit--> ignore last character + } + } else { + // has read \OctalDigit NonOctalDigit--> ignore last character + } + } else { + // has read \OctalDigit --> ignore last character + } + } catch (InvalidInputException e) { + // Unlikely as this has already been processed in scanForStringLiteral() + } + if (number < 255) { + next = (char) number; + } + result.append(next); + lastPointer = i = pos; + continue; + } else { + // Dealing with just '\' + result.append(c); + lastPointer = i; + continue; + } + } + lastPointer = ++i; + } + } + end = merge ? end : end >= line.length ? end : end + 1; + char[] chars = lastPointer == 0 ? + CharOperation.subarray(line, start, end) : + CharOperation.subarray(line, lastPointer, end); + // The below check is because CharOperation.subarray tend to return null when the + // boundaries produce a zero sized char[] + if (chars != null && chars.length > 0) + result.append(chars); + return (!merge && !lastLine); + } + /** + * Converts the given string content into separate lines by + *
    + *
  • Normalizing all the CR and CRLT to LF
  • + *
  • Split them with LF as delimiters
  • + *
+ * @param all + * @return an array or lines, each line represented by char[] + */ + public static char[][] convertTextBlockToLines(char[] all) { + // 1. Normalize, i.e. convert all CR CRLF to LF + all = normalize(all); + // 2. Split into lines. Consider both \n and \r as line separators + char[][] lines = CharOperation.splitOn('\n', all); + int size = lines.length; + List list = new ArrayList<>(lines.length); + for(int i = 0; i < lines.length; i++) { + char[] line = lines[i]; + if (i + 1 == size && line.length == 0) { + list.add(line); + break; + } + char[][] sub = CharOperation.splitOn('\r', line); + if (sub.length == 0) { + list.add(line); + } else { + for (char[] cs : sub) { + list.add(cs); + } + } + } + size = list.size(); + lines = list.toArray(new char[size][]); + return lines; + } + /** + * Computes the common whitespace prefix of the given set of lines + * and returns. Only non empty lines, except the last line, are + * considered for this. + * + * @param lines + * @return the common whitespace prefix + */ + public static int getWhitespacePrefix(char[][] lines) { + int prefix = -1; + int size = lines.length; + for(int i = 0; i < size; i++) { + char[] line = lines[i]; + boolean blank = true; + int whitespaces = 0; + for (char c : line) { + if (blank) { + if (ScannerHelper.isWhitespace(c)) { + whitespaces++; + } else { + blank = false; + } + } + } + // The last line with closing delimiter is part of the + // determining line list even if empty + if (!blank || (i+1 == size)) { + if (prefix < 0 || whitespaces < prefix) { + prefix = whitespaces; + } + } + } + return prefix == -1 ? 0 : prefix; + } + + public static char[] formatTextBlock(char[][] lines, int indent) { + return formatTextBlock(lines, indent, false, false); + } + public static char[] formatTextBlock(char[][] lines, int indent, boolean followsExp, boolean precedesExp) { + // Handle incidental white space + // Split into lines and identify determining lines + // Remove the common white space prefix + // Handle escape sequences that are not already done in getNextToken0() + int size = lines.length; + StringBuilder result = new StringBuilder(); + boolean newLine = false; + for(int i = 0; i < size; i++) { + if (i > 0) + followsExp = false; + char[] l = lines[i]; + int length = l.length; + int prefix = followsExp ? 0 : indent; + // Remove the common prefix from each line + // And remove all trailing whitespace + // Finally append the \n at the end of the line (except the last line) + int trail = length; + // Only the last line is really prefixed to the embedded + // expression in a string template + if (!precedesExp || i < (size -1)) { + for(;trail > 0;) { + if (!ScannerHelper.isWhitespace(l[trail-1])) { + break; + } + trail--; + } + } + if (i >= (size -1)) { + if (newLine) result.append('\n'); + if (trail < prefix) + continue; + newLine = getLineContent(result, l, prefix, trail-1, false, true); + } else { + if (i > 0 && newLine) + result.append('\n'); + if (trail <= prefix) { + newLine = true; + } else { + boolean merge = length > 0 && l[length - 1] == '\\'; + newLine = getLineContent(result, l, prefix, trail-1, merge, false); + } + } + } + return result.toString().toCharArray(); + } +} diff --git a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/Util.java b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/Util.java index 4e2281fd30..40f106f11f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/Util.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/util/Util.java @@ -35,7 +35,6 @@ import java.util.StringTokenizer; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ClassFile; import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/.settings/org.eclipse.jdt.ui.prefs b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/.settings/org.eclipse.jdt.ui.prefs index ab1a682988..240c95e1a7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/.settings/org.eclipse.jdt.ui.prefs +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/.settings/org.eclipse.jdt.ui.prefs @@ -1,5 +1,10 @@ eclipse.preferences.version=1 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder= +org.eclipse.jdt.ui.ondemandthreshold=10 +org.eclipse.jdt.ui.staticondemandthreshold=10 +sp_cleanup.add_all=false sp_cleanup.add_default_serial_version_id=true sp_cleanup.add_generated_serial_version_id=false sp_cleanup.add_missing_annotations=false @@ -9,30 +14,79 @@ sp_cleanup.add_missing_nls_tags=false sp_cleanup.add_missing_override_annotations=true sp_cleanup.add_missing_override_annotations_interface_methods=true sp_cleanup.add_serial_version_id=false +sp_cleanup.also_simplify_lambda=false sp_cleanup.always_use_blocks=true sp_cleanup.always_use_parentheses_in_expressions=false sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.array_with_curly=false +sp_cleanup.arrays_fill=false +sp_cleanup.bitwise_conditional_expression=false +sp_cleanup.boolean_literal=false +sp_cleanup.boolean_value_rather_than_comparison=false +sp_cleanup.break_loop=false +sp_cleanup.collection_cloning=false +sp_cleanup.comparing_on_criteria=false +sp_cleanup.comparison_statement=false +sp_cleanup.controlflow_merge=false sp_cleanup.convert_functional_interfaces=false sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false +sp_cleanup.convert_to_switch_expressions=false sp_cleanup.correct_indentation=false +sp_cleanup.do_while_rather_than_while=false +sp_cleanup.double_negation=false +sp_cleanup.else_if=false +sp_cleanup.embedded_if=false +sp_cleanup.evaluate_nullable=false +sp_cleanup.extract_increment=false sp_cleanup.format_source_code=false sp_cleanup.format_source_code_changes_only=false +sp_cleanup.hash=false +sp_cleanup.if_condition=false sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.instanceof=false +sp_cleanup.instanceof_keyword=false +sp_cleanup.invert_equals=false +sp_cleanup.join=false +sp_cleanup.lazy_logical_operator=false sp_cleanup.make_local_variable_final=false sp_cleanup.make_parameters_final=false sp_cleanup.make_private_fields_final=true sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=false +sp_cleanup.map_cloning=false +sp_cleanup.merge_conditional_blocks=false +sp_cleanup.multi_catch=false sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.no_string_creation=false +sp_cleanup.no_super=false +sp_cleanup.number_suffix=false +sp_cleanup.objects_equals=false sp_cleanup.on_save_use_additional_actions=true -sp_cleanup.organize_imports=false +sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false +sp_cleanup.operand_factorization=false +sp_cleanup.organize_imports=true +sp_cleanup.overridden_assignment=false +sp_cleanup.overridden_assignment_move_decl=false +sp_cleanup.plain_replacement=false +sp_cleanup.precompile_regex=false +sp_cleanup.primitive_comparison=false +sp_cleanup.primitive_parsing=false +sp_cleanup.primitive_rather_than_wrapper=false +sp_cleanup.primitive_serialization=false +sp_cleanup.pull_out_if_from_if_else=false +sp_cleanup.pull_up_assignment=false +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=false sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.reduce_indentation=false +sp_cleanup.redundant_comparator=false +sp_cleanup.redundant_falling_through_block_end=false sp_cleanup.remove_private_constructors=true sp_cleanup.remove_redundant_modifiers=false sp_cleanup.remove_redundant_semicolons=true @@ -40,23 +94,60 @@ sp_cleanup.remove_redundant_type_arguments=true sp_cleanup.remove_trailing_whitespaces=true sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_method_parameters=false sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.replace_deprecated_calls=false +sp_cleanup.return_expression=false +sp_cleanup.simplify_boolean_if_else=false +sp_cleanup.simplify_lambda_expression_and_method_ref=false +sp_cleanup.single_used_field=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false +sp_cleanup.standard_comparison=false +sp_cleanup.static_inner_class=false +sp_cleanup.strictly_equal_or_different=false +sp_cleanup.stringbuffer_to_stringbuilder=false +sp_cleanup.stringbuilder=false +sp_cleanup.stringbuilder_for_local_vars=false +sp_cleanup.stringconcat_stringbuffer_stringbuilder=false +sp_cleanup.stringconcat_to_textblock=false +sp_cleanup.substring=false +sp_cleanup.switch=false +sp_cleanup.system_property=false +sp_cleanup.system_property_boolean=false +sp_cleanup.system_property_file_encoding=false +sp_cleanup.system_property_file_separator=false +sp_cleanup.system_property_javaspecversion=false +sp_cleanup.system_property_javaversion=false +sp_cleanup.system_property_line_separator=false +sp_cleanup.system_property_path_separator=false +sp_cleanup.ternary_operator=false +sp_cleanup.try_with_resource=false +sp_cleanup.unlooped_while=false +sp_cleanup.unreachable_block=false sp_cleanup.update_ibm_copyright_to_current_year=true sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=false sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=false sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_string_is_blank=false sp_cleanup.use_this_for_non_static_field_access=false sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true +sp_cleanup.use_unboxing=false +sp_cleanup.use_var=false +sp_cleanup.useless_continue=false +sp_cleanup.useless_return=false +sp_cleanup.valueof_rather_than_instantiation=false diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/META-INF/MANIFEST.MF b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/META-INF/MANIFEST.MF index 802d4f8c7e..41ecd36247 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/META-INF/MANIFEST.MF +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.jdt.core.tests.builder.mockcompiler; singleton:=true -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.0.100.qualifier Bundle-Vendor: %providerName Bundle-Localization: plugin Fragment-Host: org.eclipse.jdt.core diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/pom.xml b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/pom.xml index f0f232d05d..f593853f66 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/pom.xml +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/pom.xml @@ -20,6 +20,6 @@ ../tests-pom/ org.eclipse.jdt.core.tests.builder.mockcompiler - 1.0.0-SNAPSHOT + 1.0.100-SNAPSHOT eclipse-plugin diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/src/org/eclipse/jdt/core/tests/builder/mockcompiler/MockCompilerFactory.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/src/org/eclipse/jdt/core/tests/builder/mockcompiler/MockCompilerFactory.java index e72e2d34b0..ac5fb40d72 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/src/org/eclipse/jdt/core/tests/builder/mockcompiler/MockCompilerFactory.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder.mockcompiler/src/org/eclipse/jdt/core/tests/builder/mockcompiler/MockCompilerFactory.java @@ -16,7 +16,6 @@ import java.util.HashSet; import java.util.Set; import java.util.function.Consumer; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.Compiler; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/.settings/org.eclipse.jdt.ui.prefs b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/.settings/org.eclipse.jdt.ui.prefs index ab1a682988..240c95e1a7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/.settings/org.eclipse.jdt.ui.prefs +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/.settings/org.eclipse.jdt.ui.prefs @@ -1,5 +1,10 @@ eclipse.preferences.version=1 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder= +org.eclipse.jdt.ui.ondemandthreshold=10 +org.eclipse.jdt.ui.staticondemandthreshold=10 +sp_cleanup.add_all=false sp_cleanup.add_default_serial_version_id=true sp_cleanup.add_generated_serial_version_id=false sp_cleanup.add_missing_annotations=false @@ -9,30 +14,79 @@ sp_cleanup.add_missing_nls_tags=false sp_cleanup.add_missing_override_annotations=true sp_cleanup.add_missing_override_annotations_interface_methods=true sp_cleanup.add_serial_version_id=false +sp_cleanup.also_simplify_lambda=false sp_cleanup.always_use_blocks=true sp_cleanup.always_use_parentheses_in_expressions=false sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.array_with_curly=false +sp_cleanup.arrays_fill=false +sp_cleanup.bitwise_conditional_expression=false +sp_cleanup.boolean_literal=false +sp_cleanup.boolean_value_rather_than_comparison=false +sp_cleanup.break_loop=false +sp_cleanup.collection_cloning=false +sp_cleanup.comparing_on_criteria=false +sp_cleanup.comparison_statement=false +sp_cleanup.controlflow_merge=false sp_cleanup.convert_functional_interfaces=false sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false +sp_cleanup.convert_to_switch_expressions=false sp_cleanup.correct_indentation=false +sp_cleanup.do_while_rather_than_while=false +sp_cleanup.double_negation=false +sp_cleanup.else_if=false +sp_cleanup.embedded_if=false +sp_cleanup.evaluate_nullable=false +sp_cleanup.extract_increment=false sp_cleanup.format_source_code=false sp_cleanup.format_source_code_changes_only=false +sp_cleanup.hash=false +sp_cleanup.if_condition=false sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.instanceof=false +sp_cleanup.instanceof_keyword=false +sp_cleanup.invert_equals=false +sp_cleanup.join=false +sp_cleanup.lazy_logical_operator=false sp_cleanup.make_local_variable_final=false sp_cleanup.make_parameters_final=false sp_cleanup.make_private_fields_final=true sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=false +sp_cleanup.map_cloning=false +sp_cleanup.merge_conditional_blocks=false +sp_cleanup.multi_catch=false sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.no_string_creation=false +sp_cleanup.no_super=false +sp_cleanup.number_suffix=false +sp_cleanup.objects_equals=false sp_cleanup.on_save_use_additional_actions=true -sp_cleanup.organize_imports=false +sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false +sp_cleanup.operand_factorization=false +sp_cleanup.organize_imports=true +sp_cleanup.overridden_assignment=false +sp_cleanup.overridden_assignment_move_decl=false +sp_cleanup.plain_replacement=false +sp_cleanup.precompile_regex=false +sp_cleanup.primitive_comparison=false +sp_cleanup.primitive_parsing=false +sp_cleanup.primitive_rather_than_wrapper=false +sp_cleanup.primitive_serialization=false +sp_cleanup.pull_out_if_from_if_else=false +sp_cleanup.pull_up_assignment=false +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=false sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.reduce_indentation=false +sp_cleanup.redundant_comparator=false +sp_cleanup.redundant_falling_through_block_end=false sp_cleanup.remove_private_constructors=true sp_cleanup.remove_redundant_modifiers=false sp_cleanup.remove_redundant_semicolons=true @@ -40,23 +94,60 @@ sp_cleanup.remove_redundant_type_arguments=true sp_cleanup.remove_trailing_whitespaces=true sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_method_parameters=false sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.replace_deprecated_calls=false +sp_cleanup.return_expression=false +sp_cleanup.simplify_boolean_if_else=false +sp_cleanup.simplify_lambda_expression_and_method_ref=false +sp_cleanup.single_used_field=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false +sp_cleanup.standard_comparison=false +sp_cleanup.static_inner_class=false +sp_cleanup.strictly_equal_or_different=false +sp_cleanup.stringbuffer_to_stringbuilder=false +sp_cleanup.stringbuilder=false +sp_cleanup.stringbuilder_for_local_vars=false +sp_cleanup.stringconcat_stringbuffer_stringbuilder=false +sp_cleanup.stringconcat_to_textblock=false +sp_cleanup.substring=false +sp_cleanup.switch=false +sp_cleanup.system_property=false +sp_cleanup.system_property_boolean=false +sp_cleanup.system_property_file_encoding=false +sp_cleanup.system_property_file_separator=false +sp_cleanup.system_property_javaspecversion=false +sp_cleanup.system_property_javaversion=false +sp_cleanup.system_property_line_separator=false +sp_cleanup.system_property_path_separator=false +sp_cleanup.ternary_operator=false +sp_cleanup.try_with_resource=false +sp_cleanup.unlooped_while=false +sp_cleanup.unreachable_block=false sp_cleanup.update_ibm_copyright_to_current_year=true sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=false sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=false sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_string_is_blank=false sp_cleanup.use_this_for_non_static_field_access=false sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true +sp_cleanup.use_unboxing=false +sp_cleanup.use_var=false +sp_cleanup.useless_continue=false +sp_cleanup.useless_return=false +sp_cleanup.valueof_rather_than_instantiation=false diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/META-INF/MANIFEST.MF b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/META-INF/MANIFEST.MF index 44d87654e4..36d181b9c7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/META-INF/MANIFEST.MF +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/META-INF/MANIFEST.MF @@ -14,7 +14,6 @@ Require-Bundle: org.junit;bundle-version="3.8.1", org.eclipse.core.runtime;bundle-version="[3.29.0,4.0.0)", org.eclipse.test;bundle-version="[3.6.0,4.0.0)", org.eclipse.test.performance;bundle-version="[3.1.0,4.0.0)", - org.eclipse.jdt.annotation;bundle-version="[1.1.0,2.0.0)";resolution:=optional, org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional Bundle-RequiredExecutionEnvironment: JavaSE-17 Eclipse-BundleShape: dir diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AbstractLeakTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AbstractLeakTest.java index 9aa043fd8b..ac77bf7edf 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AbstractLeakTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AbstractLeakTest.java @@ -25,7 +25,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AbstractMethodTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AbstractMethodTests.java index 8b9ae5ba9c..e371d1adde 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AbstractMethodTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AbstractMethodTests.java @@ -19,9 +19,7 @@ import java.io.StringWriter; import java.util.Arrays; import java.util.Comparator; - -import junit.framework.*; - +import junit.framework.Test; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AnnotationDependencyTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AnnotationDependencyTests.java index 83fb8ea450..b4da162ae7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AnnotationDependencyTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/AnnotationDependencyTests.java @@ -17,22 +17,19 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; -import java.io.File; +import java.io.IOException; import junit.framework.Test; - import org.eclipse.core.resources.IMarker; -import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.compiler.CategorizedProblem; +import org.eclipse.jdt.core.tests.compiler.regression.AbstractNullAnnotationTest; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import org.osgi.framework.Bundle; /** * Tests to verify that annotation changes cause recompilation of dependent types. @@ -145,17 +142,19 @@ private void addAnnotationType() { void setupProjectForNullAnnotations() throws JavaModelException { // add the org.eclipse.jdt.annotation library (bin/ folder or jar) to the project: - Bundle[] bundles = Platform.getBundles("org.eclipse.jdt.annotation","[1.1.0,2.0.0)"); - File bundleFile = FileLocator.getBundleFileLocation(bundles[0]).get(); - String annotationsLib = bundleFile.isDirectory() ? bundleFile.getPath()+"/bin" : bundleFile.getPath(); - IJavaProject javaProject = env.getJavaProject(this.projectPath); - IClasspathEntry[] rawClasspath = javaProject.getRawClasspath(); - int len = rawClasspath.length; - System.arraycopy(rawClasspath, 0, rawClasspath = new IClasspathEntry[len+1], 0, len); - rawClasspath[len] = JavaCore.newLibraryEntry(new Path(annotationsLib), null, null); - javaProject.setRawClasspath(rawClasspath, null); - - javaProject.setOption(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, JavaCore.ENABLED); + try { + String annotationsLib = AbstractNullAnnotationTest.getAnnotationV1LibPath(); + IJavaProject javaProject = env.getJavaProject(this.projectPath); + IClasspathEntry[] rawClasspath = javaProject.getRawClasspath(); + int len = rawClasspath.length; + System.arraycopy(rawClasspath, 0, rawClasspath = new IClasspathEntry[len+1], 0, len); + rawClasspath[len] = JavaCore.newLibraryEntry(new Path(annotationsLib), null, null); + javaProject.setRawClasspath(rawClasspath, null); + + javaProject.setOption(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, JavaCore.ENABLED); + } catch (IOException ioe) { + throw new JavaModelException(ioe, -13); + } } /** diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BasicBuildTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BasicBuildTests.java index 031337dc67..5f3528b4d9 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BasicBuildTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BasicBuildTests.java @@ -30,9 +30,7 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; - -import junit.framework.*; - +import junit.framework.Test; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; @@ -49,10 +47,10 @@ import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.IEclipsePreferences; -import org.eclipse.jdt.core.compiler.*; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.tests.builder.mockcompiler.MockCompilerFactory; import org.eclipse.jdt.core.tests.builder.mockcompiler.MockCompilerFactory.MockCompiler; import org.eclipse.jdt.core.tests.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug530366Test.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug530366Test.java index 2ce83f0666..6b3325d86b 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug530366Test.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug530366Test.java @@ -18,7 +18,7 @@ import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths; - +import junit.framework.Test; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; @@ -26,7 +26,6 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.tests.util.Util; -import junit.framework.Test; public class Bug530366Test extends BuilderTests { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug531382Test.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug531382Test.java index bdb1edb261..44b52cd1a0 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug531382Test.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug531382Test.java @@ -13,6 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; +import junit.framework.Test; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.runtime.CoreException; @@ -25,8 +26,6 @@ import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.core.builder.AbstractImageBuilder; -import junit.framework.Test; - public class Bug531382Test extends BuilderTests { private IPath project; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug544921Test.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug544921Test.java index 5ffa764741..cdbec202be 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug544921Test.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug544921Test.java @@ -13,12 +13,11 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; +import junit.framework.Test; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.tests.util.Util; -import junit.framework.Test; - public class Bug544921Test extends BuilderTests { public Bug544921Test(String name) { super(name); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug549457Test.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug549457Test.java index 2f3b1c1e7a..9bcca265af 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug549457Test.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug549457Test.java @@ -13,6 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; +import junit.framework.Test; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -28,8 +29,6 @@ import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.core.JavaProject; -import junit.framework.Test; - public class Bug549457Test extends BuilderTests { private IPath project; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug549646Test.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug549646Test.java index f661339d08..9d1461bcd7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug549646Test.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug549646Test.java @@ -13,14 +13,13 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; +import junit.framework.Test; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import junit.framework.Test; - public class Bug549646Test extends BuilderTests { public Bug549646Test(String name) { super(name); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug561287Test.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug561287Test.java index 5a167f18e2..81aba321df 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug561287Test.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug561287Test.java @@ -13,14 +13,13 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; +import junit.framework.Test; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.core.builder.AbstractImageBuilder; -import junit.framework.Test; - public class Bug561287Test extends BuilderTests { public Bug561287Test(String name) { super(name); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug562420Test.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug562420Test.java index 7756442520..4943aaf11a 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug562420Test.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug562420Test.java @@ -14,6 +14,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; +import junit.framework.Test; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; @@ -21,8 +22,6 @@ import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import junit.framework.Test; - public class Bug562420Test extends BuilderTests { public Bug562420Test(String name) { super(name); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug564905Test.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug564905Test.java index abfb2346ff..a55a0af225 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug564905Test.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug564905Test.java @@ -21,7 +21,7 @@ import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; - +import junit.framework.Test; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; @@ -33,7 +33,6 @@ import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.tests.util.Util; -import junit.framework.Test; public class Bug564905Test extends BuilderTests { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug571363Test.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug571363Test.java index 726fb39c47..ab8079b1aa 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug571363Test.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/Bug571363Test.java @@ -16,14 +16,13 @@ import java.io.File; import java.io.IOException; import java.net.URL; - +import junit.framework.Test; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.tests.util.Util; -import junit.framework.Test; public class Bug571363Test extends BuilderTests { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuilderTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuilderTests.java index 4bd8a4c557..d6f72bbd9d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuilderTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuilderTests.java @@ -13,7 +13,9 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; -import static org.eclipse.jdt.core.tests.util.AbstractCompilerTest.*; +import static org.eclipse.jdt.core.tests.util.AbstractCompilerTest.F_12; +import static org.eclipse.jdt.core.tests.util.AbstractCompilerTest.F_9; +import static org.eclipse.jdt.core.tests.util.AbstractCompilerTest.getPossibleComplianceLevels; import java.io.FileInputStream; import java.io.IOException; @@ -25,6 +27,8 @@ import java.util.Enumeration; import java.util.Hashtable; import java.util.List; +import junit.framework.Test; +import junit.framework.TestSuite; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IClasspathEntry; @@ -37,9 +41,6 @@ import org.eclipse.jdt.internal.compiler.Compiler; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import junit.framework.Test; -import junit.framework.TestSuite; - /** * Base class for Java image builder tests */ diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuilderTests11.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuilderTests11.java index 3586462d05..8609adcd37 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuilderTests11.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuilderTests11.java @@ -13,6 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; +import junit.framework.Test; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; @@ -20,8 +21,6 @@ import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import junit.framework.Test; - /** * Test tries to compile trivial snippet with --release option on Java 11 as host */ diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java index 69fcced568..bc9b6bf4d5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/BuildpathTests.java @@ -20,7 +20,7 @@ import java.util.HashMap; import java.util.Hashtable; import java.util.List; - +import junit.framework.Test; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; @@ -40,8 +40,6 @@ import org.eclipse.jdt.internal.core.JavaModelManager; import org.eclipse.jdt.internal.core.JavaProject; -import junit.framework.Test; - @SuppressWarnings({"unchecked", "rawtypes"}) public class BuildpathTests extends BuilderTests { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/CompressedWriterTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/CompressedWriterTest.java index 0188e5670f..01b5d078a6 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/CompressedWriterTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/CompressedWriterTest.java @@ -18,12 +18,10 @@ import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.util.Arrays; - +import junit.framework.Test; import org.eclipse.jdt.internal.core.builder.CompressedReader; import org.eclipse.jdt.internal.core.builder.CompressedWriter; -import junit.framework.Test; - public class CompressedWriterTest extends BuilderTests { private CompressedWriter writer; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/CopyResourceTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/CopyResourceTests.java index 58d2a067f3..1fe4c16962 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/CopyResourceTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/CopyResourceTests.java @@ -13,7 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; -import junit.framework.*; +import junit.framework.Test; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.tests.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/DependencyTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/DependencyTests.java index 1afd8bec1f..9034e70d83 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/DependencyTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/DependencyTests.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.core.tests.builder; import junit.framework.Test; - import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/EfficiencyTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/EfficiencyTests.java index 02237c6eae..ef22d6fe6c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/EfficiencyTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/EfficiencyTests.java @@ -13,7 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; -import junit.framework.*; +import junit.framework.Test; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.tests.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ErrorsTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ErrorsTests.java index 2bca1e0cb1..573208511a 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ErrorsTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ErrorsTests.java @@ -21,9 +21,7 @@ import java.util.Arrays; import java.util.Comparator; import java.util.Hashtable; - import junit.framework.Test; - import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ExecutionTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ExecutionTests.java index 0cc33c5ca5..23a06cfeac 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ExecutionTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ExecutionTests.java @@ -13,7 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; -import junit.framework.*; +import junit.framework.Test; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.tests.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/FriendDependencyTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/FriendDependencyTests.java index 0f8cdc472a..6a3887f97d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/FriendDependencyTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/FriendDependencyTests.java @@ -13,10 +13,8 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; -import junit.framework.Test; - import java.util.Map; - +import junit.framework.Test; import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable; import org.eclipse.jdt.internal.core.JavaModelManager; import org.eclipse.jdt.internal.core.builder.ReferenceCollection; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/GetResourcesTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/GetResourcesTests.java index 4d96d4921c..8560fd60a1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/GetResourcesTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/GetResourcesTests.java @@ -17,7 +17,6 @@ import java.io.StringWriter; import java.util.Arrays; import java.util.Comparator; - import junit.framework.Test; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/IncrementalTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/IncrementalTests.java index 1e728adad9..b6b56c6550 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/IncrementalTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/IncrementalTests.java @@ -14,9 +14,7 @@ package org.eclipse.jdt.core.tests.builder; import java.util.Hashtable; - import junit.framework.Test; - import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; @@ -1666,4 +1664,65 @@ public final class Child extends Parent { env.removeProject(projectPath); } + public void testExhaustiveness() throws JavaModelException { + String javaVersion = System.getProperty("java.version"); + if (javaVersion != null && JavaCore.compareJavaVersions(javaVersion, "18") < 0) + return; + + IPath projectPath = env.addProject("Project", "18"); + env.addExternalJars(projectPath, Util.getJavaClassLibs()); + + // remove old package fragment root so that names don't collide + env.removePackageFragmentRoot(projectPath, ""); + + IPath root = env.addPackageFragmentRoot(projectPath, "src"); + env.setOutputFolder(projectPath, "bin"); + + IPath pathToX = env.addClass(root, "", "X", + """ + public class X { + + public static void main(String[] args) { + E e = E.getE(); + + String s = switch (e) { + case A -> "A"; + case B -> "B"; + case C -> "C"; + }; + System.out.println(s); + } + } + """); + + env.addClass(root, "", "E", + """ + public enum E { + A, B, C; + static E getE() { + return C; + } + } + """); + + fullBuild(projectPath); + expectingNoProblems(); + executeClass(projectPath, "X", "C", ""); + + env.addClass(root, "", "E", + """ + public enum E { + A, B, C, D; + static E getE() { + return D; + } + } + """); + + + incrementalBuild(projectPath); + expectingSpecificProblemFor(pathToX, new Problem("E", "A Switch expression should cover all possible values", pathToX, 100, 101, CategorizedProblem.CAT_SYNTAX, IMarker.SEVERITY_ERROR)); //$NON-NLS-1$ //$NON-NLS-2$ + env.removeProject(projectPath); + } + } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/IncrementalTests18.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/IncrementalTests18.java index 49aec360d5..16cd12e0b3 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/IncrementalTests18.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/IncrementalTests18.java @@ -15,9 +15,7 @@ import java.io.File; import java.io.IOException; - import junit.framework.Test; - import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/LeakTestsAfter9.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/LeakTestsAfter9.java index f9c569a8bf..fe55890924 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/LeakTestsAfter9.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/LeakTestsAfter9.java @@ -13,9 +13,8 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; -import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; - import junit.framework.Test; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; public class LeakTestsAfter9 extends AbstractLeakTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/LeakTestsBefore9.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/LeakTestsBefore9.java index 05dca1ac94..1b3729486f 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/LeakTestsBefore9.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/LeakTestsBefore9.java @@ -13,9 +13,8 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; -import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; - import junit.framework.Test; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; public class LeakTestsBefore9 extends AbstractLeakTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/MultiProjectTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/MultiProjectTests.java index ff54e8e7e1..5539f73bec 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/MultiProjectTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/MultiProjectTests.java @@ -14,7 +14,7 @@ package org.eclipse.jdt.core.tests.builder; import java.util.Hashtable; - +import junit.framework.Test; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; @@ -28,8 +28,6 @@ import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.test.OrderedTestSuite; -import junit.framework.Test; - @SuppressWarnings({"rawtypes", "unchecked"}) public class MultiProjectTests extends BuilderTests { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/MultiSourceFolderAndOutputFolderTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/MultiSourceFolderAndOutputFolderTests.java index 70a32574b9..ac2c164621 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/MultiSourceFolderAndOutputFolderTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/MultiSourceFolderAndOutputFolderTests.java @@ -13,8 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; -import junit.framework.*; - +import junit.framework.Test; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.JavaModelException; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/OutputFolderTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/OutputFolderTests.java index 7da9c868fe..43a730327d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/OutputFolderTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/OutputFolderTests.java @@ -13,8 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; -import junit.framework.*; - +import junit.framework.Test; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.tests.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/PackageInfoTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/PackageInfoTest.java index 76af70f3ee..ad6abd620a 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/PackageInfoTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/PackageInfoTest.java @@ -17,9 +17,7 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.Arrays; - import junit.framework.Test; - import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/PackageTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/PackageTests.java index 693a4b3f83..21b0d842e3 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/PackageTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/PackageTests.java @@ -14,9 +14,7 @@ package org.eclipse.jdt.core.tests.builder; import java.io.File; - -import junit.framework.*; - +import junit.framework.Test; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java index bb4e9864a3..5888438fe5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ParticipantBuildTests.java @@ -15,16 +15,41 @@ import static org.junit.Assert.assertArrayEquals; -import java.io.*; -import java.util.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.concurrent.atomic.AtomicInteger; -import junit.framework.*; - -import org.eclipse.core.runtime.*; -import org.eclipse.core.resources.*; -import org.eclipse.jdt.core.*; -import org.eclipse.jdt.core.compiler.*; -import org.eclipse.jdt.core.dom.*; +import junit.framework.Test; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.compiler.BuildContext; +import org.eclipse.jdt.core.compiler.CategorizedProblem; +import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.core.compiler.CompilationParticipant; +import org.eclipse.jdt.core.compiler.IProblem; +import org.eclipse.jdt.core.dom.AST; +import org.eclipse.jdt.core.dom.ASTParser; +import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.IAnnotationBinding; +import org.eclipse.jdt.core.dom.IMemberValuePairBinding; +import org.eclipse.jdt.core.dom.IMethodBinding; +import org.eclipse.jdt.core.dom.ITypeBinding; +import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.tests.builder.participants.TestCompilationParticipant1; import org.eclipse.jdt.core.tests.builder.participants.TestCompilationParticipant2; import org.eclipse.jdt.core.tests.builder.participants.TestCompilationParticipant3; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ReferenceCollectionTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ReferenceCollectionTest.java index 2312604e09..8e98a67663 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ReferenceCollectionTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/ReferenceCollectionTest.java @@ -18,12 +18,10 @@ import java.lang.reflect.Field; import java.util.Arrays; import java.util.Collections; - +import junit.framework.Test; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.core.builder.ReferenceCollection; -import junit.framework.Test; - public class ReferenceCollectionTest extends BuilderTests { public ReferenceCollectionTest(String name) { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/StateTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/StateTest.java index ebefc8675f..fa84e07c13 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/StateTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/StateTest.java @@ -24,7 +24,7 @@ import java.util.Arrays; import java.util.Map; import java.util.Set; - +import junit.framework.Test; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IncrementalProjectBuilder; @@ -47,8 +47,6 @@ import org.eclipse.jdt.internal.core.builder.ReferenceCollection; import org.eclipse.jdt.internal.core.builder.State; -import junit.framework.Test; - public class StateTest extends BuilderTests { public StateTest(String name) { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/StaticFinalTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/StaticFinalTests.java index 7a6f77556a..54a74bb68d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/StaticFinalTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/StaticFinalTests.java @@ -13,7 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; -import junit.framework.*; +import junit.framework.Test; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.tests.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/TestAttributeBuilderTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/TestAttributeBuilderTests.java index e05cb78d6c..23d1a0a8ca 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/TestAttributeBuilderTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/TestAttributeBuilderTests.java @@ -14,12 +14,11 @@ package org.eclipse.jdt.core.tests.builder; import java.util.HashMap; - +import junit.framework.Test; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.tests.util.Util; -import junit.framework.Test; public class TestAttributeBuilderTests extends BuilderTests { static { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/TestingEnvironment.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/TestingEnvironment.java index b1315d77b9..d2f0a434ae 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/TestingEnvironment.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/TestingEnvironment.java @@ -13,23 +13,39 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.jobs.Job; - -import org.eclipse.jdt.core.*; +import org.eclipse.jdt.core.IAccessRule; +import org.eclipse.jdt.core.IClasspathAttribute; +import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.IJavaModelMarker; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.core.tests.util.Util; - import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.core.ClasspathEntry; import org.eclipse.jdt.internal.core.JavaModelManager; import org.eclipse.jdt.internal.core.JavaProject; -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.*; - public class TestingEnvironment { private boolean isOpen = false; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/ParticipantBase.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/ParticipantBase.java index 44619e08a9..1a2a2950c0 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/ParticipantBase.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/ParticipantBase.java @@ -15,7 +15,6 @@ import java.io.ByteArrayInputStream; import java.util.Optional; - import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.compiler.BuildContext; import org.eclipse.jdt.core.compiler.CompilationParticipant; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant1.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant1.java index 7cde1983ba..564edcfa99 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant1.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant1.java @@ -13,7 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder.participants; -import org.eclipse.jdt.core.compiler.*; +import org.eclipse.jdt.core.compiler.CompilationParticipant; /** * Participant that depends on {@link TestCompilationParticipant3} diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant2.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant2.java index 352cf0e75f..249feb1181 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant2.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant2.java @@ -13,7 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder.participants; -import org.eclipse.jdt.core.compiler.*; +import org.eclipse.jdt.core.compiler.CompilationParticipant; /** * Participant without dependency on other participants diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant3.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant3.java index 8a646f3334..49bb64a5d6 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant3.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.builder/src/org/eclipse/jdt/core/tests/builder/participants/TestCompilationParticipant3.java @@ -13,7 +13,7 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.builder.participants; -import org.eclipse.jdt.core.compiler.*; +import org.eclipse.jdt.core.compiler.CompilationParticipant; /** * Participant that depends on {@link TestCompilationParticipant2} diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/.settings/org.eclipse.jdt.ui.prefs b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/.settings/org.eclipse.jdt.ui.prefs index cc05ab3605..abebd98cc6 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/.settings/org.eclipse.jdt.ui.prefs +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/.settings/org.eclipse.jdt.ui.prefs @@ -1,6 +1,10 @@ -#Thu Nov 04 13:38:45 EDT 2010 eclipse.preferences.version=1 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder= +org.eclipse.jdt.ui.ondemandthreshold=10 +org.eclipse.jdt.ui.staticondemandthreshold=10 +sp_cleanup.add_all=false sp_cleanup.add_default_serial_version_id=true sp_cleanup.add_generated_serial_version_id=false sp_cleanup.add_missing_annotations=false @@ -10,47 +14,140 @@ sp_cleanup.add_missing_nls_tags=false sp_cleanup.add_missing_override_annotations=true sp_cleanup.add_missing_override_annotations_interface_methods=true sp_cleanup.add_serial_version_id=false +sp_cleanup.also_simplify_lambda=false sp_cleanup.always_use_blocks=true sp_cleanup.always_use_parentheses_in_expressions=false sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.array_with_curly=false +sp_cleanup.arrays_fill=false +sp_cleanup.bitwise_conditional_expression=false +sp_cleanup.boolean_literal=false +sp_cleanup.boolean_value_rather_than_comparison=false +sp_cleanup.break_loop=false +sp_cleanup.collection_cloning=false +sp_cleanup.comparing_on_criteria=false +sp_cleanup.comparison_statement=false +sp_cleanup.controlflow_merge=false +sp_cleanup.convert_functional_interfaces=false sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false +sp_cleanup.convert_to_switch_expressions=false sp_cleanup.correct_indentation=false +sp_cleanup.do_while_rather_than_while=false +sp_cleanup.double_negation=false +sp_cleanup.else_if=false +sp_cleanup.embedded_if=false +sp_cleanup.evaluate_nullable=false +sp_cleanup.extract_increment=false sp_cleanup.format_source_code=false sp_cleanup.format_source_code_changes_only=false +sp_cleanup.hash=false +sp_cleanup.if_condition=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.instanceof=false +sp_cleanup.instanceof_keyword=false +sp_cleanup.invert_equals=false +sp_cleanup.join=false +sp_cleanup.lazy_logical_operator=false sp_cleanup.make_local_variable_final=false sp_cleanup.make_parameters_final=false sp_cleanup.make_private_fields_final=true sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=false +sp_cleanup.map_cloning=false +sp_cleanup.merge_conditional_blocks=false +sp_cleanup.multi_catch=false sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.no_string_creation=false +sp_cleanup.no_super=false +sp_cleanup.number_suffix=false +sp_cleanup.objects_equals=false sp_cleanup.on_save_use_additional_actions=true -sp_cleanup.organize_imports=false +sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false +sp_cleanup.operand_factorization=false +sp_cleanup.organize_imports=true +sp_cleanup.overridden_assignment=false +sp_cleanup.overridden_assignment_move_decl=false +sp_cleanup.plain_replacement=false +sp_cleanup.precompile_regex=false +sp_cleanup.primitive_comparison=false +sp_cleanup.primitive_parsing=false +sp_cleanup.primitive_rather_than_wrapper=false +sp_cleanup.primitive_serialization=false +sp_cleanup.pull_out_if_from_if_else=false +sp_cleanup.pull_up_assignment=false +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=false sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.reduce_indentation=false +sp_cleanup.redundant_comparator=false +sp_cleanup.redundant_falling_through_block_end=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=true sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=false sp_cleanup.remove_unnecessary_nls_tags=false sp_cleanup.remove_unused_imports=false sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_method_parameters=false sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.replace_deprecated_calls=false +sp_cleanup.return_expression=false +sp_cleanup.simplify_boolean_if_else=false +sp_cleanup.simplify_lambda_expression_and_method_ref=false +sp_cleanup.single_used_field=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false +sp_cleanup.standard_comparison=false +sp_cleanup.static_inner_class=false +sp_cleanup.strictly_equal_or_different=false +sp_cleanup.stringbuffer_to_stringbuilder=false +sp_cleanup.stringbuilder=false +sp_cleanup.stringbuilder_for_local_vars=false +sp_cleanup.stringconcat_stringbuffer_stringbuilder=false +sp_cleanup.stringconcat_to_textblock=false +sp_cleanup.substring=false +sp_cleanup.switch=false +sp_cleanup.system_property=false +sp_cleanup.system_property_boolean=false +sp_cleanup.system_property_file_encoding=false +sp_cleanup.system_property_file_separator=false +sp_cleanup.system_property_javaspecversion=false +sp_cleanup.system_property_javaversion=false +sp_cleanup.system_property_line_separator=false +sp_cleanup.system_property_path_separator=false +sp_cleanup.ternary_operator=false +sp_cleanup.try_with_resource=false +sp_cleanup.unlooped_while=false +sp_cleanup.unreachable_block=false sp_cleanup.update_ibm_copyright_to_current_year=true +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=false sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false +sp_cleanup.use_lambda=false sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_string_is_blank=false sp_cleanup.use_this_for_non_static_field_access=false sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true +sp_cleanup.use_unboxing=false +sp_cleanup.use_var=false +sp_cleanup.useless_continue=false +sp_cleanup.useless_return=false +sp_cleanup.valueof_rather_than_instantiation=false diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF index 740a11849d..7f6c34a4b9 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF @@ -22,7 +22,6 @@ Require-Bundle: org.junit;bundle-version="3.8.1", org.eclipse.test;bundle-version="[3.6.0,4.0.0)", org.eclipse.test.performance;bundle-version="[3.10.0,4.0.0)", org.eclipse.core.resources;bundle-version="[3.21.0,4.0.0)", - org.eclipse.jdt.annotation;bundle-version="[1.1.0,2.0.0)";resolution:=optional, org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional Import-Package: jakarta.annotation;version="[2.1.0,3.0.0)" Bundle-RequiredExecutionEnvironment: JavaSE-17 diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/build.properties b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/build.properties index cfa629f680..1693443f0a 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/build.properties +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/build.properties @@ -17,7 +17,8 @@ bin.includes = test.xml,\ .,\ META-INF/,\ plugin.properties,\ - workspace/ + workspace/,\ + lib/org.eclipse.jdt.annotation_1.2.100.v20241001-0914.jar source.. = src/ output.. = bin/ src.includes = about.html diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/lib/org.eclipse.jdt.annotation_1.2.100.v20241001-0914.jar b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/lib/org.eclipse.jdt.annotation_1.2.100.v20241001-0914.jar new file mode 100644 index 0000000000000000000000000000000000000000..5db80bf23997e8099bcccaf96f89db7089f5efa9 GIT binary patch literal 18693 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 KcdUXxKm9+qNSJc~ literal 0 HcmV?d00001 diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/CharDeduplicationTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/CharDeduplicationTest.java index 3982827bd9..c2495f5331 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/CharDeduplicationTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/CharDeduplicationTest.java @@ -24,12 +24,10 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.LongStream; - -import org.eclipse.jdt.core.tests.junit.extension.TestCase; -import org.eclipse.jdt.internal.compiler.util.CharDeduplication; - import junit.framework.Test; import junit.framework.TestSuite; +import org.eclipse.jdt.core.tests.junit.extension.TestCase; +import org.eclipse.jdt.internal.compiler.util.CharDeduplication; public class CharDeduplicationTest extends TestCase { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/DeduplicationUtilTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/DeduplicationUtilTest.java index fb914bd939..0b9e729f45 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/DeduplicationUtilTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/DeduplicationUtilTest.java @@ -16,12 +16,10 @@ import java.util.Arrays; import java.util.List; import java.util.function.Supplier; - -import org.eclipse.jdt.core.tests.junit.extension.TestCase; -import org.eclipse.jdt.internal.core.util.DeduplicationUtil; - import junit.framework.Test; import junit.framework.TestSuite; +import org.eclipse.jdt.core.tests.junit.extension.TestCase; +import org.eclipse.jdt.internal.core.util.DeduplicationUtil; public class DeduplicationUtilTest extends TestCase { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/IrritantSetTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/IrritantSetTest.java index 89168c741d..82cd29b871 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/IrritantSetTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/IrritantSetTest.java @@ -13,11 +13,10 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler; -import org.eclipse.jdt.core.tests.junit.extension.TestCase; -import org.eclipse.jdt.internal.compiler.impl.IrritantSet; - import junit.framework.Test; import junit.framework.TestSuite; +import org.eclipse.jdt.core.tests.junit.extension.TestCase; +import org.eclipse.jdt.internal.compiler.impl.IrritantSet; public class IrritantSetTest extends TestCase { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/map/CharArrayMapperTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/map/CharArrayMapperTest.java index d977b1968a..e0fdd676c7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/map/CharArrayMapperTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/map/CharArrayMapperTest.java @@ -18,16 +18,14 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; - +import junit.framework.Test; +import junit.framework.TestSuite; import org.eclipse.jdt.core.tests.junit.extension.TestCase; import org.eclipse.jdt.internal.compiler.util.CharArrayHashMap; import org.eclipse.jdt.internal.compiler.util.CharArrayMap; import org.eclipse.jdt.internal.compiler.util.CharArrayMapper; import org.eclipse.jdt.internal.compiler.util.CharDelegateMap; -import junit.framework.Test; -import junit.framework.TestSuite; - public class CharArrayMapperTest extends TestCase { public CharArrayMapperTest(String testName) { super(testName); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractCompletionTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractCompletionTest.java index e5c8b3d767..f8a77be0f2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractCompletionTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractCompletionTest.java @@ -14,14 +14,16 @@ package org.eclipse.jdt.core.tests.compiler.parser; import java.util.Locale; - +import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; +import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.codeassist.complete.CompletionOnMemberAccess; import org.eclipse.jdt.internal.codeassist.complete.CompletionParser; import org.eclipse.jdt.internal.codeassist.complete.CompletionScanner; import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.ASTNode; +import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; import org.eclipse.jdt.internal.compiler.ast.Initializer; @@ -32,9 +34,6 @@ import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; -import org.eclipse.jdt.core.compiler.CharOperation; -import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; -import org.eclipse.jdt.core.tests.util.Util; public abstract class AbstractCompletionTest extends AbstractCompilerTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractSelectionTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractSelectionTest.java index 94a796db91..269a2eac67 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractSelectionTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractSelectionTest.java @@ -14,13 +14,15 @@ package org.eclipse.jdt.core.tests.compiler.parser; import java.util.Locale; - +import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; +import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.codeassist.select.SelectionParser; import org.eclipse.jdt.internal.codeassist.select.SelectionScanner; import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.ASTNode; +import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.Block; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; @@ -31,9 +33,6 @@ import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; -import org.eclipse.jdt.core.compiler.CharOperation; -import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; -import org.eclipse.jdt.core.tests.util.Util; public abstract class AbstractSelectionTest extends AbstractCompilerTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractSyntaxTreeTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractSyntaxTreeTest.java index 3936585a6b..5027da99bf 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractSyntaxTreeTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AbstractSyntaxTreeTest.java @@ -20,7 +20,6 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Locale; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.core.tests.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AnnotationCompletionParserTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AnnotationCompletionParserTest.java index 1caff14a6c..35766c8132 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AnnotationCompletionParserTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AnnotationCompletionParserTest.java @@ -15,9 +15,7 @@ import java.util.Map; - import junit.framework.Test; - import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AnnotationDietRecoveryTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AnnotationDietRecoveryTest.java index 74684811d4..18ba54146a 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AnnotationDietRecoveryTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/AnnotationDietRecoveryTest.java @@ -15,9 +15,7 @@ import java.util.Locale; import java.util.Map; - import junit.framework.Test; - import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.codeassist.complete.CompletionParser; @@ -40,6 +38,10 @@ public class AnnotationDietRecoveryTest extends AbstractCompilerTest { private static final boolean CHECK_ALL_PARSE = true; public static boolean optimizeStringLiterals = false; + static { +// TESTS_NAMES = new String[] { "test0025" }; + } + public AnnotationDietRecoveryTest(String testName){ super(testName); } @@ -1212,7 +1214,7 @@ public void test0024() { "public class X {\n" + " public X() {\n" + " }\n" + - " void foo(int param1) {\n" + + " void foo(int param1, @AnAnnotation(name) int param2) {\n" + " }\n" + "}\n"; @@ -1222,7 +1224,7 @@ public void test0024() { " public X() {\n" + " super();\n" + " }\n" + - " void foo(int param1) {\n" + + " void foo(int param1, @AnAnnotation(name) int param2) {\n" + " }\n" + "}\n"; @@ -1231,7 +1233,13 @@ public void test0024() { expectedDietUnitToString; String expectedCompletionDietUnitToString = - expectedDietUnitToString; + "package a;\n" + + "public class X {\n" + + " public X() {\n" + + " }\n" + + " void foo(int param1) {\n" + + " }\n" + + "}\n"; String testName = ""; checkParse( @@ -1256,7 +1264,7 @@ public void test0025() { "public class X {\n" + " public X() {\n" + " }\n" + - " void foo(int param1) {\n" + + " void foo(int param1, @AnAnnotation(name = $missing$) int param2) {\n" + " }\n" + "}\n"; @@ -1266,7 +1274,7 @@ public void test0025() { " public X() {\n" + " super();\n" + " }\n" + - " void foo(int param1) {\n" + + " void foo(int param1, @AnAnnotation(name = $missing$) int param2) {\n" + " }\n" + "}\n"; @@ -1274,7 +1282,13 @@ public void test0025() { expectedDietUnitToString; String expectedCompletionDietUnitToString = - expectedDietUnitToString; + "package a;\n" + + "public class X {\n" + + " public X() {\n" + + " }\n" + + " void foo(int param1) {\n" + + " }\n" + + "}\n"; String testName = ""; checkParse( @@ -1299,7 +1313,7 @@ public void test0026() { "public class X {\n" + " public X() {\n" + " }\n" + - " void foo(int param1) {\n" + + " void foo(int param1, @AnAnnotation @AnAnnotation1(name1 = \"a\",name2 = $missing$) int param2) {\n" + " }\n" + "}\n"; @@ -1309,7 +1323,7 @@ public void test0026() { " public X() {\n" + " super();\n" + " }\n" + - " void foo(int param1) {\n" + + " void foo(int param1, @AnAnnotation @AnAnnotation1(name1 = \"a\",name2 = $missing$) int param2) {\n" + " }\n" + "}\n"; @@ -1317,7 +1331,13 @@ public void test0026() { expectedDietUnitToString; String expectedCompletionDietUnitToString = - expectedDietUnitToString; + "package a;\n" + + "public class X {\n" + + " public X() {\n" + + " }\n" + + " void foo(int param1) {\n" + + " }\n" + + "}\n"; String testName = ""; checkParse( diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/CompletionParserTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/CompletionParserTest.java index 0ffda81af7..9d0b381a9c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/CompletionParserTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/CompletionParserTest.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.core.tests.compiler.parser; import junit.framework.Test; - import org.eclipse.jdt.internal.codeassist.complete.InvalidCursorLocation; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java index c5a67965da..cc26d4ffda 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java @@ -15,7 +15,6 @@ package org.eclipse.jdt.core.tests.compiler.parser; import junit.framework.Test; - import org.eclipse.jdt.core.tests.compiler.regression.AbstractRegressionTest; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DietCompletionTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DietCompletionTest.java index 95a31bba31..63c2d0fa8b 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DietCompletionTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DietCompletionTest.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.core.tests.compiler.parser; import junit.framework.Test; - import org.eclipse.jdt.internal.codeassist.complete.InvalidCursorLocation; public class DietCompletionTest extends AbstractCompletionTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DietRecoveryTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DietRecoveryTest.java index 40f4bd99df..b817b3f7b2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DietRecoveryTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DietRecoveryTest.java @@ -14,9 +14,7 @@ package org.eclipse.jdt.core.tests.compiler.parser; import java.util.Locale; - import junit.framework.Test; - import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.codeassist.complete.CompletionParser; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DocumentElementParserTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DocumentElementParserTest.java index 60294655a2..d7f960392a 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DocumentElementParserTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DocumentElementParserTest.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.core.tests.compiler.parser; import java.util.Locale; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DualParseSyntaxErrorTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DualParseSyntaxErrorTest.java index 76aa0c2cae..7fbeb163f2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DualParseSyntaxErrorTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DualParseSyntaxErrorTest.java @@ -16,7 +16,6 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.Locale; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.core.tests.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/EnumCompletionParserTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/EnumCompletionParserTest.java index 487089a185..a98cacc6bd 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/EnumCompletionParserTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/EnumCompletionParserTest.java @@ -15,9 +15,7 @@ import java.util.Map; - import junit.framework.Test; - import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/EnumDietRecoveryTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/EnumDietRecoveryTest.java index cb0733ac82..9568f5ed3c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/EnumDietRecoveryTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/EnumDietRecoveryTest.java @@ -15,7 +15,6 @@ import java.util.Locale; import java.util.Map; - import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.codeassist.complete.CompletionParser; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/GenericDietRecoveryTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/GenericDietRecoveryTest.java index b28326a788..e1c7c0e630 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/GenericDietRecoveryTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/GenericDietRecoveryTest.java @@ -17,7 +17,6 @@ import java.util.Locale; import java.util.Map; - import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.codeassist.complete.CompletionParser; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/GenericsCompletionParserTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/GenericsCompletionParserTest.java index 26b6855c59..e8df3922c2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/GenericsCompletionParserTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/GenericsCompletionParserTest.java @@ -14,9 +14,7 @@ package org.eclipse.jdt.core.tests.compiler.parser; import java.util.Map; - import junit.framework.Test; - import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; @SuppressWarnings({ "unchecked", "rawtypes" }) diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/JavadocCompletionParserTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/JavadocCompletionParserTest.java index 8f47442d60..f720ee8f7c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/JavadocCompletionParserTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/JavadocCompletionParserTest.java @@ -16,9 +16,7 @@ import java.util.Locale; import java.util.Map; import java.util.StringTokenizer; - import junit.framework.Test; - import org.eclipse.jdt.internal.codeassist.complete.CompletionJavadoc; import org.eclipse.jdt.internal.codeassist.complete.CompletionOnJavadocTag; import org.eclipse.jdt.internal.codeassist.complete.CompletionParser; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/LambdaExpressionSyntaxTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/LambdaExpressionSyntaxTest.java index 1b4e8d303f..9501870f86 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/LambdaExpressionSyntaxTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/LambdaExpressionSyntaxTest.java @@ -16,7 +16,6 @@ import java.io.File; import java.io.IOException; import junit.framework.Test; - import org.eclipse.jdt.core.tests.util.CompilerTestSetup; @SuppressWarnings({ "rawtypes" }) diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/MarkdownCompletionParserTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/MarkdownCompletionParserTest.java index caea480cbd..05b414427b 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/MarkdownCompletionParserTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/MarkdownCompletionParserTest.java @@ -16,9 +16,7 @@ import java.util.Locale; import java.util.Map; import java.util.StringTokenizer; - import junit.framework.Test; - import org.eclipse.jdt.internal.codeassist.complete.CompletionJavadoc; import org.eclipse.jdt.internal.codeassist.complete.CompletionOnJavadocTag; import org.eclipse.jdt.internal.codeassist.complete.CompletionParser; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ModuleDeclarationSyntaxTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ModuleDeclarationSyntaxTest.java index eba8e24387..59f77e84af 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ModuleDeclarationSyntaxTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ModuleDeclarationSyntaxTest.java @@ -14,13 +14,11 @@ package org.eclipse.jdt.core.tests.compiler.parser; import java.io.IOException; - +import junit.framework.Test; import org.eclipse.jdt.core.tests.util.CompilerTestSetup; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import junit.framework.Test; - public class ModuleDeclarationSyntaxTest extends AbstractSyntaxTreeTest { public ModuleDeclarationSyntaxTest(String name, String referenceCompiler, diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ParserTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ParserTest.java index 7eb91f142c..a741d75094 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ParserTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ParserTest.java @@ -15,7 +15,6 @@ import java.util.Hashtable; import java.util.Map; - import org.eclipse.jdt.core.tests.compiler.regression.AbstractRegressionTest; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ParserTest1_7.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ParserTest1_7.java index fa56093a9c..3554eb4fd9 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ParserTest1_7.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ParserTest1_7.java @@ -15,9 +15,7 @@ import java.util.Locale; import java.util.Map; - import junit.framework.Test; - import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.compiler.CompilationResult; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/PatternMatchingSelectionTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/PatternMatchingSelectionTest.java index fb71e96767..d481376801 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/PatternMatchingSelectionTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/PatternMatchingSelectionTest.java @@ -13,11 +13,10 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler.parser; +import junit.framework.Test; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import junit.framework.Test; - public class PatternMatchingSelectionTest extends AbstractSelectionTest { static { // TESTS_NUMBERS = new int[] { 1 }; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ReferenceExpressionSyntaxTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ReferenceExpressionSyntaxTest.java index dc50fe3dd8..2d6c3681e2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ReferenceExpressionSyntaxTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ReferenceExpressionSyntaxTest.java @@ -16,7 +16,6 @@ import java.io.File; import java.io.IOException; import junit.framework.Test; - import org.eclipse.jdt.core.tests.util.CompilerTestSetup; @SuppressWarnings({ "rawtypes" }) diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/RunCompletionParserTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/RunCompletionParserTests.java index 453c92abd4..36320340e5 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/RunCompletionParserTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/RunCompletionParserTests.java @@ -15,14 +15,12 @@ import java.util.ArrayList; import java.util.List; - +import junit.framework.Test; +import junit.framework.TestSuite; import org.eclipse.jdt.core.tests.junit.extension.TestCase; import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import junit.framework.Test; -import junit.framework.TestSuite; - @SuppressWarnings({ "unchecked", "rawtypes" }) public class RunCompletionParserTests extends junit.framework.TestCase { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionJavadocTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionJavadocTest.java index 2103c28a88..dc18284ad1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionJavadocTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionJavadocTest.java @@ -15,7 +15,7 @@ import java.util.Locale; import java.util.Map; - +import junit.framework.Test; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.codeassist.select.SelectionJavadoc; import org.eclipse.jdt.internal.codeassist.select.SelectionParser; @@ -37,8 +37,6 @@ import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; -import junit.framework.Test; - /** * Class to test selection in Javadoc comments. * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=54968" diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionMarkdownTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionMarkdownTest.java index 6df23d9bee..cfbb9b3d37 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionMarkdownTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionMarkdownTest.java @@ -15,7 +15,7 @@ import java.util.Locale; import java.util.Map; - +import junit.framework.Test; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.codeassist.select.SelectionJavadoc; import org.eclipse.jdt.internal.codeassist.select.SelectionParser; @@ -37,8 +37,6 @@ import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; -import junit.framework.Test; - @SuppressWarnings({ "unchecked", "rawtypes" }) public class SelectionMarkdownTest extends AbstractSelectionTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest10.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest10.java index 5ed1fbe246..e40446eda7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest10.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest10.java @@ -15,9 +15,8 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler.parser; -import org.eclipse.jdt.core.JavaModelException; - import junit.framework.Test; +import org.eclipse.jdt.core.JavaModelException; public class SelectionParserTest10 extends AbstractSelectionTest { static { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest12.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest12.java index 21b8dc8fe6..a49f5acdf1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest12.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest12.java @@ -13,9 +13,8 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler.parser; -import org.eclipse.jdt.core.JavaModelException; - import junit.framework.Test; +import org.eclipse.jdt.core.JavaModelException; public class SelectionParserTest12 extends AbstractSelectionTest { static { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest13.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest13.java index 7573841857..ea69892ad3 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest13.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest13.java @@ -13,9 +13,8 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler.parser; -import org.eclipse.jdt.core.JavaModelException; - import junit.framework.Test; +import org.eclipse.jdt.core.JavaModelException; public class SelectionParserTest13 extends AbstractSelectionTest { static { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest18.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest18.java index a0d6e786c4..0949a34719 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest18.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest18.java @@ -13,9 +13,8 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler.parser; -import org.eclipse.jdt.core.JavaModelException; - import junit.framework.Test; +import org.eclipse.jdt.core.JavaModelException; public class SelectionParserTest18 extends AbstractSelectionTest { static { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest9.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest9.java index c96f67973f..61e446b260 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest9.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest9.java @@ -13,9 +13,8 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler.parser; -import org.eclipse.jdt.core.JavaModelException; - import junit.framework.Test; +import org.eclipse.jdt.core.JavaModelException; public class SelectionParserTest9 extends AbstractSelectionTest { static { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionTest2.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionTest2.java index 2270f501e4..a86f06020a 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionTest2.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionTest2.java @@ -14,14 +14,13 @@ package org.eclipse.jdt.core.tests.compiler.parser; import java.util.Locale; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.codeassist.select.SelectionParser; import org.eclipse.jdt.internal.codeassist.select.SelectionScanner; import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.ASTNode; +import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; import org.eclipse.jdt.internal.compiler.ast.Initializer; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SingleCompletionTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SingleCompletionTest.java index b503ee295b..02d965897d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SingleCompletionTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SingleCompletionTest.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.core.tests.compiler.parser; import java.lang.reflect.InvocationTargetException; - import junit.framework.TestCase; /** diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SourceElementParserTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SourceElementParserTest.java index ea146e1a7a..f290cfdc0c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SourceElementParserTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SourceElementParserTest.java @@ -15,9 +15,7 @@ import java.util.Locale; import java.util.Map; - import junit.framework.Test; - import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StatementRecoveryTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StatementRecoveryTest.java index 5a6fbfcbf3..3b7a7fed34 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StatementRecoveryTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StatementRecoveryTest.java @@ -14,9 +14,7 @@ package org.eclipse.jdt.core.tests.compiler.parser; import java.util.Locale; - import junit.framework.Test; - import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.compiler.CompilationResult; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StatementRecoveryTest_1_5.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StatementRecoveryTest_1_5.java index aa9c14af65..b37e6f3f45 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StatementRecoveryTest_1_5.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StatementRecoveryTest_1_5.java @@ -15,9 +15,7 @@ import java.util.Locale; import java.util.Map; - import junit.framework.Test; - import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.compiler.CompilationResult; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StringLiteralTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StringLiteralTest.java index df340d8bce..49d63718cb 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StringLiteralTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/StringLiteralTest.java @@ -1,14 +1,12 @@ package org.eclipse.jdt.core.tests.compiler.parser; import java.util.List; - +import junit.framework.TestCase; import org.eclipse.jdt.internal.compiler.ast.CharLiteral; import org.eclipse.jdt.internal.compiler.ast.ExtendedStringLiteral; import org.eclipse.jdt.internal.compiler.ast.StringLiteral; import org.eclipse.jdt.internal.compiler.ast.StringLiteralConcatenation; -import junit.framework.TestCase; - public class StringLiteralTest extends TestCase { public void testAppend() { StringLiteral l1 = new StringLiteral(new char[] { 'a' }, 2, 3, 4); diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SyntaxErrorTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SyntaxErrorTest.java index 7ace4ce4cf..f1f2b2fb2a 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SyntaxErrorTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SyntaxErrorTest.java @@ -14,7 +14,6 @@ package org.eclipse.jdt.core.tests.compiler.parser; import java.util.Locale; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.core.tests.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TestAll.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TestAll.java index 4de1a26c99..53c7c579fc 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TestAll.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TestAll.java @@ -18,15 +18,13 @@ import java.util.ArrayList; import java.util.List; - +import junit.framework.Test; +import junit.framework.TestSuite; import org.eclipse.jdt.core.tests.compiler.regression.JEP286ReservedWordTest; import org.eclipse.jdt.core.tests.junit.extension.TestCase; import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import junit.framework.Test; -import junit.framework.TestSuite; - /** * Run all parser regression tests */ diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TypeAnnotationSyntaxTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TypeAnnotationSyntaxTest.java index 4f2a40076d..9046b97a3e 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TypeAnnotationSyntaxTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TypeAnnotationSyntaxTest.java @@ -26,17 +26,7 @@ import junit.framework.Test; import org.eclipse.jdt.core.tests.util.CompilerTestSetup; import org.eclipse.jdt.internal.compiler.ASTVisitor; -import org.eclipse.jdt.internal.compiler.ast.Annotation; -import org.eclipse.jdt.internal.compiler.ast.Argument; -import org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference; -import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; -import org.eclipse.jdt.internal.compiler.ast.MarkerAnnotation; -import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration; -import org.eclipse.jdt.internal.compiler.ast.NormalAnnotation; -import org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference; -import org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation; -import org.eclipse.jdt.internal.compiler.ast.SingleTypeReference; -import org.eclipse.jdt.internal.compiler.ast.TypeReference; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.lookup.BlockScope; import org.eclipse.jdt.internal.compiler.lookup.ClassScope; import org.eclipse.jdt.internal.compiler.lookup.MethodScope; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ASTImplTests.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ASTImplTests.java index daece46ee1..2f409d9fa7 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ASTImplTests.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ASTImplTests.java @@ -14,26 +14,11 @@ package org.eclipse.jdt.core.tests.compiler.regression; import junit.framework.Test; - import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; -import org.eclipse.jdt.internal.compiler.ast.Argument; -import org.eclipse.jdt.internal.compiler.ast.BinaryExpression; -import org.eclipse.jdt.internal.compiler.ast.CharLiteral; -import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; -import org.eclipse.jdt.internal.compiler.ast.CombinedBinaryExpression; -import org.eclipse.jdt.internal.compiler.ast.ExtendedStringLiteral; -import org.eclipse.jdt.internal.compiler.ast.JavadocSingleTypeReference; -import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration; -import org.eclipse.jdt.internal.compiler.ast.MarkerAnnotation; -import org.eclipse.jdt.internal.compiler.ast.MemberValuePair; -import org.eclipse.jdt.internal.compiler.ast.NormalAnnotation; -import org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation; -import org.eclipse.jdt.internal.compiler.ast.SingleNameReference; -import org.eclipse.jdt.internal.compiler.ast.StringLiteral; -import org.eclipse.jdt.internal.compiler.ast.StringLiteralConcatenation; +import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.batch.CompilationUnit; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractBatchCompilerTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractBatchCompilerTest.java index 03db79c588..8dc9fb52c2 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractBatchCompilerTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractBatchCompilerTest.java @@ -21,7 +21,6 @@ import java.io.PrintWriter; import java.io.StringReader; import java.util.ArrayList; - import org.eclipse.jdt.core.compiler.CompilationProgress; import org.eclipse.jdt.core.compiler.batch.BatchCompiler; import org.eclipse.jdt.core.tests.util.Util; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractComparableTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractComparableTest.java index eeb34632cd..af8a668507 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractComparableTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractComparableTest.java @@ -20,10 +20,8 @@ package org.eclipse.jdt.core.tests.compiler.regression; import java.util.Map; - -import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; - import junit.framework.Test; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; @SuppressWarnings({ "unchecked", "rawtypes" }) public class AbstractComparableTest extends AbstractRegressionTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractModuleCompilationTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractModuleCompilationTest.java index 738ef09d3f..01c796c31c 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractModuleCompilationTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractModuleCompilationTest.java @@ -27,10 +27,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; - -import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; - import junit.framework.AssertionFailedError; +import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; public abstract class AbstractModuleCompilationTest extends AbstractBatchCompilerTest { @@ -130,7 +128,7 @@ protected Set runConformModuleTest(String[] testFiles, String commandLin protected Set runConformModuleTest(String[] testFiles, String commandLine, String expectedFailureOutOutputString, String expectedFailureErrOutputString, boolean shouldFlushOutputDirectory, String output, JavacTestOptions options, String javacCommandLine) { runConformTest(testFiles, commandLine, expectedFailureOutOutputString, expectedFailureErrOutputString, shouldFlushOutputDirectory); - if (RUN_JAVAC) { + if (shouldRunJavac()) { File outputDir = new File(output); final Set outFiles = new HashSet<>(); walkOutFiles(output, outFiles, true); @@ -214,7 +212,7 @@ protected void runNegativeModuleTest(String[] testFiles, String commandLine, Str void runNegativeModuleTest(String[] testFiles, String commandLine, String expectedFailureOutOutputString, String expectedFailureErrOutputString, boolean shouldFlushOutputDirectory, String javacErrorMatch, String output, JavacTestOptions options) { runNegativeTest(testFiles, commandLine, expectedFailureOutOutputString, expectedFailureErrOutputString, shouldFlushOutputDirectory); - if (RUN_JAVAC) { + if (shouldRunJavac()) { String[] testFileNames = new String[testFiles.length/2]; for (int i = 0; i < testFileNames.length; i++) { testFileNames[i] = testFiles[i*2]; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractNullAnnotationTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractNullAnnotationTest.java index 9b6c6edda8..a66a72c4f1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractNullAnnotationTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractNullAnnotationTest.java @@ -15,11 +15,11 @@ import java.io.File; import java.io.IOException; +import java.net.URL; import java.util.Map; - import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.osgi.framework.Bundle; @@ -90,16 +90,24 @@ protected void setUpAnnotationLib() throws IOException { int len = defaultLibs.length; this.LIBS = new String[len+1]; System.arraycopy(defaultLibs, 0, this.LIBS, 0, len); - String version = this.complianceLevel >= ClassFileConstants.JDK1_8 ? "[2.0.0,3.0.0)" : "[1.1.0,2.0.0)"; - Bundle[] bundles = org.eclipse.jdt.core.tests.compiler.Activator.getPackageAdmin().getBundles("org.eclipse.jdt.annotation", version); - File bundleFile = FileLocator.getBundleFileLocation(bundles[0]).get(); - if (bundleFile.isDirectory()) - this.LIBS[len] = bundleFile.getPath()+"/bin"; - else - this.LIBS[len] = bundleFile.getPath(); + this.LIBS[len] = getAnnotationLibPath(); } } + protected String getAnnotationLibPath() throws IOException { + Bundle bundle = Platform.getBundle("org.eclipse.jdt.annotation"); + File bundleFile = FileLocator.getBundleFileLocation(bundle).get(); + if (bundleFile.isDirectory()) + return bundleFile.getPath()+"/bin"; + else + return bundleFile.getPath(); + } + + public static String getAnnotationV1LibPath() throws IOException { + URL libEntry = Platform.getBundle("org.eclipse.jdt.core.tests.compiler").getEntry("/lib/org.eclipse.jdt.annotation_1.2.100.v20241001-0914.jar"); + return FileLocator.toFileURL(libEntry).getPath(); + } + // Conditionally augment problem detection settings static boolean setNullRelatedOptions = true; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java index 32acd25484..0c79b36d87 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java @@ -23,34 +23,16 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler.regression; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.PrintWriter; +import java.io.*; import java.net.URL; import java.nio.charset.Charset; import java.nio.file.Files; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; - +import junit.framework.Test; +import junit.framework.TestSuite; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; @@ -559,18 +541,24 @@ static int minorFromRawVersion (String version, String rawVersion) { } if (version == JavaCore.VERSION_21) { switch (rawVersion) { - case "21": return 0; + case "21": return 0000; + case "21.0.1": return 0100; + case "21.0.2": return 0200; } } if (version == JavaCore.VERSION_22) { - if ("22".equals(rawVersion)) { - return 0000; + switch (rawVersion) { + case "22": return 0000; + case "22.0.1": return 0100; + case "22.0.2": return 0200; } } if (version == JavaCore.VERSION_23) { switch(rawVersion) { case "23-ea", "23": return 0000; + case "23.0.1": return 0100; + case "23.0.2": return 0200; } } throw new RuntimeException("unknown raw javac version: " + rawVersion); @@ -802,28 +790,28 @@ public boolean clears(int mismatch) { return this.mismatchType == 0 || (this.mismatchType & mismatch) == mismatch; // one excuse can clear multiple mismatches } public static Excuse - EclipseHasSomeMoreWarnings = RUN_JAVAC ? - new Excuse(MismatchType.EclipseWarningsJavacNone) : null, - EclipseWarningConfiguredAsError = RUN_JAVAC ? - new Excuse(MismatchType.EclipseErrorsJavacWarnings | MismatchType.EclipseErrorsJavacNone) : null, - JavacCompilesBogusReferencedFileAgain = RUN_JAVAC ? - new Excuse(MismatchType.EclipseErrorsJavacNone) : null, + EclipseHasSomeMoreWarnings = + new Excuse(MismatchType.EclipseWarningsJavacNone), + EclipseWarningConfiguredAsError = + new Excuse(MismatchType.EclipseErrorsJavacWarnings | MismatchType.EclipseErrorsJavacNone), + JavacCompilesBogusReferencedFileAgain = + new Excuse(MismatchType.EclipseErrorsJavacNone), // bugs not found on javac bug site, but points to a javac bug. - JavacDoesNotCompileCorrectSource = RUN_JAVAC ? - new JavacHasABug(MismatchType.JavacErrorsEclipseNone) : null, + JavacDoesNotCompileCorrectSource = + new JavacHasABug(MismatchType.JavacErrorsEclipseNone), /* A General Excuse - Revisit periodically */ - JavacCompilesIncorrectSource = RUN_JAVAC ? + JavacCompilesIncorrectSource = new JavacHasABug(MismatchType.EclipseErrorsJavacNone | MismatchType.EclipseErrorsJavacWarnings | - MismatchType.EclipseWarningsJavacNone) : null, - JavacGeneratesIncorrectCode = RUN_JAVAC ? - new JavacHasABug(MismatchType.StandardOutputMismatch) : null, - JavacHasWarningsEclipseNotConfigured = RUN_JAVAC ? - new JavacHasABug(MismatchType.JavacWarningsEclipseNone) : null, - JavacHasErrorsEclipseHasWarnings = RUN_JAVAC ? - new JavacHasABug(MismatchType.JavacErrorsEclipseWarnings) : null, - JavacHasErrorsEclipseHasNone = RUN_JAVAC ? - new JavacHasABug(MismatchType.JavacErrorsEclipseNone) : null; + MismatchType.EclipseWarningsJavacNone), + JavacGeneratesIncorrectCode = + new JavacHasABug(MismatchType.StandardOutputMismatch), + JavacHasWarningsEclipseNotConfigured = + new JavacHasABug(MismatchType.JavacWarningsEclipseNone), + JavacHasErrorsEclipseHasWarnings = + new JavacHasABug(MismatchType.JavacErrorsEclipseWarnings), + JavacHasErrorsEclipseHasNone = + new JavacHasABug(MismatchType.JavacErrorsEclipseNone); } Excuse excuseFor(JavacCompiler compiler) { return null; @@ -834,88 +822,88 @@ public static class DubiousOutcome extends Excuse { super(mismatchType); } public static DubiousOutcome - EclipseErrorsJavacNone = RUN_JAVAC ? - new DubiousOutcome(MismatchType.EclipseErrorsJavacNone) : null, - JavacErrorsEclipseNone = RUN_JAVAC ? - new DubiousOutcome(MismatchType.JavacErrorsEclipseNone) : null, - JDK8319461 = RUN_JAVAC ? // https://bugs.openjdk.org/browse/JDK-8319461 - new DubiousOutcome(MismatchType.JavacErrorsEclipseNone) : null; + EclipseErrorsJavacNone = + new DubiousOutcome(MismatchType.EclipseErrorsJavacNone), + JavacErrorsEclipseNone = + new DubiousOutcome(MismatchType.JavacErrorsEclipseNone), + JDK8319461 = // https://bugs.openjdk.org/browse/JDK-8319461 + new DubiousOutcome(MismatchType.JavacErrorsEclipseNone); } public static class EclipseHasABug extends Excuse { EclipseHasABug(int mismatchType) { super(mismatchType); } public static EclipseHasABug - EclipseBug159851 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=159851 + EclipseBug159851 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=159851 new EclipseHasABug(MismatchType.JavacErrorsEclipseNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance < ClassFileConstants.JDK1_7 ? this : null; } - } : null, - EclipseBug177715 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=177715 + }, + EclipseBug177715 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=177715 new EclipseHasABug(MismatchType.JavacErrorsEclipseNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance < ClassFileConstants.JDK1_8 ? this : null; // in 1.8 rejected by both compilers } - } : null, - EclipseBug207935 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=207935 - new EclipseHasABug(MismatchType.EclipseErrorsJavacNone | MismatchType.EclipseWarningsJavacNone) : null, - EclipseBug216558 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=216558 - new EclipseHasABug(MismatchType.JavacErrorsEclipseNone) : null, - EclipseBug235550 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235550 - new EclipseHasABug(MismatchType.JavacErrorsEclipseNone) : null, - EclipseBug235809 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235809 - new EclipseHasABug(MismatchType.StandardOutputMismatch) : null, - EclipseBug236217 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=236217 + }, + EclipseBug207935 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=207935 + new EclipseHasABug(MismatchType.EclipseErrorsJavacNone | MismatchType.EclipseWarningsJavacNone), + EclipseBug216558 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=216558 + new EclipseHasABug(MismatchType.JavacErrorsEclipseNone), + EclipseBug235550 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235550 + new EclipseHasABug(MismatchType.JavacErrorsEclipseNone), + EclipseBug235809 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235809 + new EclipseHasABug(MismatchType.StandardOutputMismatch), + EclipseBug236217 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=236217 new EclipseHasABug(MismatchType.JavacErrorsEclipseNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance < ClassFileConstants.JDK1_8 ? this : null; // in 1.8 accepted by both compilers } - } : null, - EclipseBug236236 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=236236 + }, + EclipseBug236236 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=236236 new EclipseHasABug(MismatchType.EclipseErrorsJavacNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance > ClassFileConstants.JDK1_5 ? this : null; } - }: null, - EclipseBug236242 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=236242 + }, + EclipseBug236242 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=236242 new EclipseHasABug(MismatchType.EclipseErrorsJavacWarnings) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance == ClassFileConstants.JDK1_7 ? this : null; } - }: null, - EclipseBug236243 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=236243 + }, + EclipseBug236243 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=236243 new EclipseHasABug(MismatchType.EclipseErrorsJavacNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance > ClassFileConstants.JDK1_6 ? this : null; } - }: null, - EclipseBug236379 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=236379 + }, + EclipseBug236379 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=236379 new EclipseHasABug(MismatchType.EclipseWarningsJavacNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance > ClassFileConstants.JDK1_5 ? null : this; } - }: null, - EclipseBug424410 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=424410 - new EclipseHasABug(MismatchType.JavacErrorsEclipseNone) : null, - EclipseBug427719 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427719 - new EclipseHasABug(MismatchType.JavacErrorsEclipseWarnings) : null, - EclipseBug421922 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=421922 - new EclipseHasABug(MismatchType.EclipseErrorsJavacNone) : null, - EclipseBug428061 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=428061 + }, + EclipseBug424410 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=424410 + new EclipseHasABug(MismatchType.JavacErrorsEclipseNone), + EclipseBug427719 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427719 + new EclipseHasABug(MismatchType.JavacErrorsEclipseWarnings), + EclipseBug421922 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=421922 + new EclipseHasABug(MismatchType.EclipseErrorsJavacNone), + EclipseBug428061 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=428061 new EclipseHasABug(MismatchType.JavacErrorsEclipseNone | - MismatchType.JavacErrorsEclipseWarnings) : null, - EclipseBug510528 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=510528 - new EclipseHasABug(MismatchType.JavacErrorsEclipseNone) : null, - EclipseBug531531 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=531531 - new EclipseHasABug(MismatchType.EclipseErrorsJavacNone) : null; + MismatchType.JavacErrorsEclipseWarnings), + EclipseBug510528 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=510528 + new EclipseHasABug(MismatchType.JavacErrorsEclipseNone), + EclipseBug531531 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=531531 + new EclipseHasABug(MismatchType.EclipseErrorsJavacNone); } // Justification based upon: // - Eclipse bugs opened to investigate differences and closed as INVALID @@ -929,96 +917,96 @@ public static class EclipseJustification extends Excuse { super(mismatchType); } public static final EclipseJustification - EclipseBug72704 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=72704 - new EclipseJustification(MismatchType.EclipseErrorsJavacNone) : null, - EclipseBug83902 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=83902 + EclipseBug72704 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=72704 + new EclipseJustification(MismatchType.EclipseErrorsJavacNone), + EclipseBug83902 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=83902 new EclipseJustification(MismatchType.EclipseWarningsJavacNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance > ClassFileConstants.JDK1_5 ? this : null; } - } : null, - EclipseBug83902b = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=83902 - new EclipseJustification(MismatchType.JavacErrorsEclipseWarnings) : null, - EclipseBug95021 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=95021 + }, + EclipseBug83902b = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=83902 + new EclipseJustification(MismatchType.JavacErrorsEclipseWarnings), + EclipseBug95021 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=95021 new EclipseJustification(MismatchType.JavacErrorsEclipseNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance == ClassFileConstants.JDK1_7 ? this : null; } // WORK consider adding reversed pivots - } : null, - EclipseBug126712 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=126712 & http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6342411 + }, + EclipseBug126712 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=126712 & http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6342411 new EclipseJustification(MismatchType.StandardOutputMismatch) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance > ClassFileConstants.JDK1_5 ? this : null; } // WORK consider adding reversed pivots - } : null, - EclipseBug126744 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=126744 - new EclipseJustification(MismatchType.JavacErrorsEclipseNone) : null, - EclipseBug151275 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=151275 + }, + EclipseBug126744 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=126744 + new EclipseJustification(MismatchType.JavacErrorsEclipseNone), + EclipseBug151275 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=151275 new EclipseJustification(MismatchType.JavacErrorsEclipseNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance < ClassFileConstants.JDK1_7 ? this : null; } - } : null, - EclipseBug159214 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=159214 + }, + EclipseBug159214 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=159214 new EclipseJustification(MismatchType.EclipseErrorsJavacNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance == ClassFileConstants.JDK1_6 ? this : null; } // WORK consider adding reversed pivots - } : null, - EclipseBug169017 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=169017 + }, + EclipseBug169017 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=169017 new EclipseJustification(MismatchType.JavacErrorsEclipseNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance > ClassFileConstants.JDK1_5 ? this : null; } // WORK consider adding reversed pivots - } : null, - EclipseBug180789 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=180789 - new EclipseJustification(MismatchType.EclipseErrorsJavacWarnings) : null, - EclipseBug218677 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=218677 + }, + EclipseBug180789 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=180789 + new EclipseJustification(MismatchType.EclipseErrorsJavacWarnings), + EclipseBug218677 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=218677 new EclipseJustification(MismatchType.EclipseErrorsJavacNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance > ClassFileConstants.JDK1_6 ? this : null; } // WORK consider adding reversed pivots - } : null, - EclipseBug234815 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=234815 + }, + EclipseBug234815 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=234815 new EclipseJustification(MismatchType.JavacErrorsEclipseNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance < ClassFileConstants.JDK1_7 ? this : null; } - }: null, - EclipseBug235543 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235543 - new EclipseJustification(MismatchType.EclipseErrorsJavacNone) : null, - EclipseBug235546 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235546 - new EclipseJustification(MismatchType.JavacErrorsEclipseNone) : null, - EclipseBug449063 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=449063 - new EclipseJustification(MismatchType.StandardOutputMismatch) : null, - EclipseBug561549 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=561549 + }, + EclipseBug235543 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235543 + new EclipseJustification(MismatchType.EclipseErrorsJavacNone), + EclipseBug235546 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235546 + new EclipseJustification(MismatchType.JavacErrorsEclipseNone), + EclipseBug449063 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=449063 + new EclipseJustification(MismatchType.StandardOutputMismatch), + EclipseBug561549 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=561549 new EclipseJustification(MismatchType.EclipseErrorsJavacNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance > ClassFileConstants.JDK9 ? this : null; } - } : null; + }; public static final EclipseJustification - EclipseJustification0001 = RUN_JAVAC ? + EclipseJustification0001 = new EclipseJustification(MismatchType.EclipseErrorsJavacNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance < ClassFileConstants.JDK1_7 ? this : null; } - } : null; + }; /* javac 1.6- properly detects duplicate attributes in annotations in the * simplest case (AnnotationTest#18b) but fails on a slightly more * complex one where the duplicate is within an embedded annotation; @@ -1091,39 +1079,39 @@ Excuse excuseFor(JavacCompiler compiler) { } // bugs that we know precisely of public static JavacHasABug - JavacBug4094180 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4094180 - new JavacHasABug(MismatchType.EclipseErrorsJavacNone) : null, - JavacBug4660984 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4660984 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=235555 - new JavacHasABug(MismatchType.JavacErrorsEclipseNone) : null, - JavacBug5042462 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5042462 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=208873 + JavacBug4094180 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4094180 + new JavacHasABug(MismatchType.EclipseErrorsJavacNone), + JavacBug4660984 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4660984 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=235555 + new JavacHasABug(MismatchType.JavacErrorsEclipseNone), + JavacBug5042462 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5042462 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=208873 new JavacHasABug( MismatchType.JavacErrorsEclipseNone, - ClassFileConstants.JDK1_7, 0 /* 1.7.0 b17 */) : null, - JavacBug5061359 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5061359 + ClassFileConstants.JDK1_7, 0 /* 1.7.0 b17 */), + JavacBug5061359 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5061359 new JavacHasABug( MismatchType.EclipseErrorsJavacNone, - ClassFileConstants.JDK1_7, 0 /* 1.7.0 b03 */) : null, - JavacBug6302954 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6302954 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=98379 + ClassFileConstants.JDK1_7, 0 /* 1.7.0 b03 */), + JavacBug6302954 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6302954 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=98379 new JavacHasABug( MismatchType.JavacErrorsEclipseNone, - ClassFileConstants.JDK1_7, 0 /* 1.7.0 b03 */) : null, - JavacBug6400189 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6400189 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=106744 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=167952 + ClassFileConstants.JDK1_7, 0 /* 1.7.0 b03 */), + JavacBug6400189 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6400189 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=106744 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=167952 new JavacHasABug( MismatchType.EclipseErrorsJavacNone) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance == ClassFileConstants.JDK1_6 ? this : null; } - } : null, - JavacBug6500701 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6500701 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=209779 + }, + JavacBug6500701 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6500701 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=209779 new JavacHasABug( MismatchType.StandardOutputMismatch, - ClassFileConstants.JDK1_7, 0) : null, - JavacBug6531075 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6531075 + ClassFileConstants.JDK1_7, 0), + JavacBug6531075 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6531075 new JavacHasABug( MismatchType.StandardOutputMismatch, - ClassFileConstants.JDK1_7, 0) : null, // fixed in jdk7 b27; unfortunately, we do not have a distinct minor for this, hence former jdk7s will report an unused excuse - JavacBug6569404 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6569404 + ClassFileConstants.JDK1_7, 0), // fixed in jdk7 b27; unfortunately, we do not have a distinct minor for this, hence former jdk7s will report an unused excuse + JavacBug6569404 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6569404 new JavacHasABug( MismatchType.JavacErrorsEclipseNone) { @Override @@ -1131,68 +1119,72 @@ Excuse excuseFor(JavacCompiler compiler) { // present only in javac6 between 1.6.0_10_b08 and EOL return (compiler.compliance == ClassFileConstants.JDK1_6 && compiler.minor >= 10) ? this : null; } - } : null, - JavacBug6557661 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6557661 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=129261 + }, + JavacBug6557661 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6557661 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=129261 new JavacHasABug( - MismatchType.EclipseErrorsJavacNone) : null, - JavacBug6573446 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6573446 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=190945 + MismatchType.EclipseErrorsJavacNone), + JavacBug6573446 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6573446 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=190945 new JavacHasABug( - MismatchType.EclipseErrorsJavacNone) : null, - JavacBug6575821 = RUN_JAVAC ? // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6575821 + MismatchType.EclipseErrorsJavacNone), + JavacBug6575821 = // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6575821 new JavacHasABug( MismatchType.JavacErrorsEclipseNone, - ClassFileConstants.JDK1_6, 10 /* 1.6.0_10_b08 or better - maybe before */) : null, - JavacBug8033810 = RUN_JAVAC ? // https://bugs.openjdk.java.net/browse/JDK-8033810 - new JavacHasABug(MismatchType.EclipseErrorsJavacNone) : null, - JavacBug8144673 = RUN_JAVAC ? // https://bugs.openjdk.java.net/browse/JDK-8144673 - new JavacHasABug(MismatchType.JavacErrorsEclipseNone, ClassFileConstants.JDK9, 0100) : null, - JavacBug8204534 = RUN_JAVAC ? // https://bugs.openjdk.java.net/browse/JDK-8204534 - new JavacHasABug(MismatchType.EclipseErrorsJavacNone, ClassFileConstants.JDK11, 0000) : null, - JavacBug8207032 = RUN_JAVAC ? // https://bugs.openjdk.java.net/browse/JDK-8207032 - new JavacHasABug(MismatchType.EclipseErrorsJavacNone, ClassFileConstants.JDK11, 0000) : null, - JavacBug8044196 = RUN_JAVAC ? // likely https://bugs.openjdk.java.net/browse/JDK-8044196, intermittently masked by https://bugs.openjdk.java.net/browse/JDK-8029161 - new JavacHasABug(MismatchType.EclipseErrorsJavacNone, ClassFileConstants.JDK9, 0000, true) : null, - JavacBug6337964 = RUN_JAVAC ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=112433 - new JavacHasABug(MismatchType.JavacErrorsEclipseNone, ClassFileConstants.JDK1_6, 1045/*guessed*/, true) : null, - JavacBug8144832 = RUN_JAVAC ? // https://bugs.openjdk.java.net/browse/JDK-8144832 - new JavacHasABug(MismatchType.JavacErrorsEclipseNone, ClassFileConstants.JDK9, 0000) : null, - JavacBug8179483_switchExpression = RUN_JAVAC ? // https://bugs.openjdk.java.net/browse/JDK-8179483 - new JavacBug8179483(" --release 13 --enable-preview -Xlint:-preview") : null, - JavacBug8221413_switchExpression = RUN_JAVAC ? // https://bugs.openjdk.java.net/browse/JDK-8221413 - new JavacBug8221413(" --release 12 --enable-preview -Xlint:-preview") : null, - JavacBug8226510_switchExpression = RUN_JAVAC ? // https://bugs.openjdk.java.net/browse/JDK-8226510 - new JavacBug8226510(" --release 12 --enable-preview -Xlint:-preview") : null, - JavacBug8299416 = RUN_JAVAC ? // https://bugs.openjdk.java.net/browse/JDK-8299416 - new JavacBugExtraJavacOptionsPlusMismatch(" --release 20 --enable-preview -Xlint:-preview", - MismatchType.EclipseErrorsJavacNone| MismatchType.EclipseErrorsJavacWarnings) : null, - JavacBug8336255 = RUN_JAVAC ? // https://bugs.openjdk.org/browse/JDK-8336255 + ClassFileConstants.JDK1_6, 10 /* 1.6.0_10_b08 or better - maybe before */), + JavacBug8033810 = // https://bugs.openjdk.java.net/browse/JDK-8033810 + new JavacHasABug(MismatchType.EclipseErrorsJavacNone), + JavacBug8144673 = // https://bugs.openjdk.java.net/browse/JDK-8144673 + new JavacHasABug(MismatchType.JavacErrorsEclipseNone, ClassFileConstants.JDK9, 0100), + JavacBug8204534 = // https://bugs.openjdk.java.net/browse/JDK-8204534 + new JavacHasABug(MismatchType.EclipseErrorsJavacNone, ClassFileConstants.JDK11, 0000), + JavacBug8207032 = // https://bugs.openjdk.java.net/browse/JDK-8207032 + new JavacHasABug(MismatchType.EclipseErrorsJavacNone, ClassFileConstants.JDK11, 0000), + JavacBug8044196 = // likely https://bugs.openjdk.java.net/browse/JDK-8044196, intermittently masked by https://bugs.openjdk.java.net/browse/JDK-8029161 + new JavacHasABug(MismatchType.EclipseErrorsJavacNone, ClassFileConstants.JDK9, 0000, true), + JavacBug6337964 = // https://bugs.eclipse.org/bugs/show_bug.cgi?id=112433 + new JavacHasABug(MismatchType.JavacErrorsEclipseNone, ClassFileConstants.JDK1_6, 1045/*guessed*/, true), + JavacBug8144832 = // https://bugs.openjdk.java.net/browse/JDK-8144832 + new JavacHasABug(MismatchType.JavacErrorsEclipseNone, ClassFileConstants.JDK9, 0000), + JavacBug8179483_switchExpression = // https://bugs.openjdk.java.net/browse/JDK-8179483 + new JavacBug8179483(" --release 23 --enable-preview -Xlint:-preview"), + JavacBug8221413_switchExpression = // https://bugs.openjdk.java.net/browse/JDK-8221413 + new JavacBug8221413(" --release 12 --enable-preview -Xlint:-preview"), + JavacBug8226510_switchExpression = // https://bugs.openjdk.java.net/browse/JDK-8226510 + new JavacBug8226510(" --release 12 --enable-preview -Xlint:-preview"), +// JavacBug8299416 = // https://bugs.openjdk.java.net/browse/JDK-8299416 was active only in some builds of JDK 20 + JavacBug8336255 = // https://bugs.openjdk.org/browse/JDK-8336255 new JavacBugExtraJavacOptionsPlusMismatch(" --release 23 --enable-preview -Xlint:-preview", - MismatchType.JavacErrorsEclipseNone) : null; + MismatchType.JavacErrorsEclipseNone), + JavacBug8337980 = // https://bugs.openjdk.org/browse/JDK-8337980 + new JavacHasABug(MismatchType.EclipseErrorsJavacNone /* add pivot JDK24 */), + JavacBug8343306 = // https://bugs.openjdk.org/browse/JDK-8343306 + new JavacHasABug(MismatchType.EclipseErrorsJavacNone /* add pivot JDK24 */), + JavacBug8341408 = // https://bugs.openjdk.org/browse/JDK-8341408 + new JavacBug8341408(); // bugs that have been fixed but that we've not identified public static JavacHasABug - JavacBugFixed_6_10 = RUN_JAVAC ? + JavacBugFixed_6_10 = new JavacHasABug( 0 /* all */, - ClassFileConstants.JDK1_6, 1000 /* 1.6.0_10_b08 or better - maybe before */) : null, - JavacBugFixed_6_10_b24 = RUN_JAVAC ? + ClassFileConstants.JDK1_6, 1000 /* 1.6.0_10_b08 or better - maybe before */), + JavacBugFixed_6_10_b24 = new JavacHasABug( 0 /* all */, - ClassFileConstants.JDK1_6, 1010 /* 1.6.0_10_b24 or better - maybe before */) : null, - JavacBugFixed_7 = RUN_JAVAC ? + ClassFileConstants.JDK1_6, 1010 /* 1.6.0_10_b24 or better - maybe before */), + JavacBugFixed_7 = new JavacHasABug( 0 /* all */, - ClassFileConstants.JDK1_7, 0 /* 1.7.0_b24 or better - maybe before */) : null, - JavacBugFixed_901 = RUN_JAVAC ? + ClassFileConstants.JDK1_7, 0 /* 1.7.0_b24 or better - maybe before */), + JavacBugFixed_901 = new JavacHasABug( 0 /* all */, - ClassFileConstants.JDK9, 0100 /* 9.0.1 or better */) : null; + ClassFileConstants.JDK9, 0100 /* 9.0.1 or better */); // bugs that have neither been fixed nor formally identified but which outcomes are obvious enough to clear any doubts public static JavacHasABug - JavacThrowsAnException = RUN_JAVAC ? // some of these are transient - that is, depend on the system on which the test is run, aka stack overflow + JavacThrowsAnException = // some of these are transient - that is, depend on the system on which the test is run, aka stack overflow new JavacHasABug( - MismatchType.JavacErrorsEclipseNone) : null, - JavacThrowsAnExceptionForJava_1_5_0_16 = RUN_JAVAC ? + MismatchType.JavacErrorsEclipseNone), + JavacThrowsAnExceptionForJava_1_5_0_16 = new JavacHasABug( MismatchType.JavacErrorsEclipseNone) { @Override @@ -1200,27 +1192,25 @@ Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance != ClassFileConstants.JDK1_5 || compiler.minor != 1600 ? null : this; } - }: null, - JavacThrowsAnExceptionForJava_since9_EclipseWarns = RUN_JAVAC ? + }, + JavacThrowsAnExceptionForJava_since9_EclipseWarns = new JavacHasABug( MismatchType.JavacErrorsEclipseWarnings) { @Override Excuse excuseFor(JavacCompiler compiler) { return compiler.compliance < ClassFileConstants.JDK9 ? null : this; } - }: null; + }; public static JavacHasABug - NoWarningForMissingJavadocTag = RUN_JAVAC ? - new JavacHasABug(MismatchType.EclipseErrorsJavacNone) - : null, - NoWarningForDuplicateJavadocTag = RUN_JAVAC ? - new JavacHasABug(MismatchType.EclipseErrorsJavacNone) - : null; + NoWarningForMissingJavadocTag = + new JavacHasABug(MismatchType.EclipseErrorsJavacNone), + NoWarningForDuplicateJavadocTag = + new JavacHasABug(MismatchType.EclipseErrorsJavacNone); } public static class JavacBug8179483 extends JavacHasABug { String extraJavacOptions; public JavacBug8179483(String extraJavacOptions) { - super(MismatchType.EclipseErrorsJavacWarnings); + super(MismatchType.EclipseErrorsJavacNone); this.extraJavacOptions = extraJavacOptions; } @Override @@ -1261,6 +1251,12 @@ String getCompilerOptions() { return super.getCompilerOptions() + this.extraJavacOptions; } } + public static class JavacBug8341408 extends JavacBugExtraJavacOptionsPlusMismatch { + public JavacBug8341408() { + super("--enable-preview -source 23 -Xlint:-preview", MismatchType.StandardOutputMismatch); +// FIXME this.pivotCompliance = ClassFileConstants.JDK24; + } + } } // PREMATURE: Logger helps us monitor processes outputs (standard and error); @@ -1346,6 +1342,59 @@ public void run() { public AbstractRegressionTest(String name) { super(name); } + + /* argument 'inheritedDepth' is not exposed in original API, therefore these helpers are copied below with this arg added */ + protected static void buildMinimalComplianceTestSuite(int minimalCompliance, int inheritedDepth, TestSuite suite, Class evaluationTestClass) { + int complianceLevels = getPossibleComplianceLevels(); + for (int[] map : complianceTestLevelMapping) { + if ((complianceLevels & map[0]) != 0) { + long complianceLevelForJavaVersion = ClassFileConstants.getComplianceLevelForJavaVersion(map[1]); + checkCompliance(evaluationTestClass, minimalCompliance, suite, complianceLevels, inheritedDepth, map[0], map[1], getVersionString(complianceLevelForJavaVersion)); + } + } + } + protected static void checkCompliance(Class evaluationTestClass, int minimalCompliance, TestSuite suite, int complianceLevels, int inheritedDepth, + int abstractCompilerTestCompliance, int classFileConstantsVersion, String release) { + int lev = complianceLevels & abstractCompilerTestCompliance; + if (lev != 0) { + if (lev < minimalCompliance) { + System.err.println("Cannot run "+evaluationTestClass.getName()+" at compliance " + release + "!"); + } else { + suite.addTest(buildUniqueComplianceTestSuite(evaluationTestClass, ClassFileConstants.getComplianceLevelForJavaVersion(classFileConstantsVersion), inheritedDepth)); + } + } + } + public static Test buildUniqueComplianceTestSuite(Class evaluationTestClass, long uniqueCompliance, int inheritedDepth) { + long highestLevel = highestComplianceLevels(); + if (highestLevel < uniqueCompliance) { + String complianceString; + if (highestLevel == ClassFileConstants.JDK10) + complianceString = "10"; + else if (highestLevel == ClassFileConstants.JDK9) + complianceString = "9"; + else if (highestLevel <= CompilerOptions.getFirstSupportedJdkLevel()) + complianceString = CompilerOptions.getFirstSupportedJavaVersion(); + else { + highestLevel = ClassFileConstants.getLatestJDKLevel(); + if (highestLevel > 0) { + complianceString = CompilerOptions.versionFromJdkLevel(highestLevel); + } else { + complianceString = "unknown"; + } + + } + + System.err.println("Cannot run "+evaluationTestClass.getName()+" at compliance "+complianceString+"!"); + return new TestSuite(); + } + TestSuite complianceSuite = new RegressionTestSetup(uniqueCompliance); + List tests = buildTestsList(evaluationTestClass, inheritedDepth); + for (int index=0, size=tests.size(); index(); - String jdkRoots = System.getProperty("jdk.roots"); - if (jdkRoots == null) { - javacCompilers.add(new JavacCompiler(jdkRootDirPath.toString())); - } else { - StringTokenizer tokenizer = new StringTokenizer(jdkRoots, File.pathSeparator); - while (tokenizer.hasMoreTokens()) { - javacCompilers.add(new JavacCompiler(tokenizer.nextToken())); - } - } + private void setupJavac() throws Exception { + // WORK make all needed inits once and for all + if (isFirst()) { + if (javacFullLog == null) { + // One time initialization of javac related concerns + // compute command lines and extract javac version + JAVAC_OUTPUT_DIR = new File(JAVAC_OUTPUT_DIR_NAME); + // WORK simplify jdk.root out + String jdkRootDirectory = System.getProperty("jdk.root"); + if (jdkRootDirectory == null) { + jdkRootDirPath = (new Path(Util.getJREDirectory())); // requires java >= 9 + } else { + jdkRootDirPath = new Path(jdkRootDirectory); } - // per class initialization - CURRENT_CLASS_NAME = getClass().getName(); - dualPrintln("***************************************************************************"); - System.out.print("* Comparison with Sun Javac compiler for class "); - dualPrintln(CURRENT_CLASS_NAME.substring(CURRENT_CLASS_NAME.lastIndexOf('.')+1) + - " (" + TESTS_COUNTERS.get(CURRENT_CLASS_NAME) + " tests)"); + + StringBuilder cmdLineHeader = new StringBuilder(jdkRootDirPath. + append("bin").append(JAVA_NAME).toString()); // PREMATURE replace JAVA_NAME and JAVAC_NAME with locals? depends on potential reuse + javaCommandLineHeader = cmdLineHeader.toString(); + cmdLineHeader = new StringBuilder(jdkRootDirPath. + append("bin").append(JAVAC_NAME).toString()); + cmdLineHeader.append(" -classpath . "); + // start with the current directory which contains the source files + String version = JavacCompiler.getVersion(cmdLineHeader.toString()); + cmdLineHeader.append(" -d "); + cmdLineHeader.append(JAVAC_OUTPUT_DIR_NAME.indexOf(" ") != -1 ? "\"" + JAVAC_OUTPUT_DIR_NAME + "\"" : JAVAC_OUTPUT_DIR_NAME); + String firstSupportedVersion = CompilerOptions.getFirstSupportedJavaVersion(); + cmdLineHeader.append(" -source " + firstSupportedVersion + " -deprecation -Xlint "); // enable recommended warnings + // WORK new javac system does not do that... reconsider + // REVIEW consider enabling all warnings instead? Philippe does not see + // this as ez to use (too many changes in logs) + javacCommandLineHeader = cmdLineHeader.toString(); + new File(Util.getOutputDirectory()).mkdirs(); + // TODO maxime check why this happens to miss in some cases + // WORK if we keep a full log, it should not mix javac versions... + javacFullLogFileName = Util.getOutputDirectory() + File.separatorChar + + version.replace(' ', '_') + "_" + + (new SimpleDateFormat("yyyyMMdd_HHmmss")).format(new Date()) + + ".txt"; + javacFullLog = + new PrintWriter(new FileOutputStream(javacFullLogFileName)); // static that is initialized once, closed at process end + javacFullLog.println(version); // so that the contents is self sufficient System.out.println("***************************************************************************"); - DIFF_COUNTERS[0] = 0; - DIFF_COUNTERS[1] = 0; - DIFF_COUNTERS[2] = 0; + System.out.println("* Sun Javac compiler output archived into file:"); + System.out.println("* " + javacFullLogFileName); + System.out.println("***************************************************************************"); + javacCompilers = new ArrayList<>(); + String jdkRoots = System.getProperty("jdk.roots"); + if (jdkRoots == null) { + javacCompilers.add(new JavacCompiler(jdkRootDirPath.toString())); + } else { + StringTokenizer tokenizer = new StringTokenizer(jdkRoots, File.pathSeparator); + while (tokenizer.hasMoreTokens()) { + javacCompilers.add(new JavacCompiler(tokenizer.nextToken())); + } + } } + // per class initialization + CURRENT_CLASS_NAME = getClass().getName(); + dualPrintln("***************************************************************************"); + System.out.print("* Comparison with Sun Javac compiler for class "); + dualPrintln(CURRENT_CLASS_NAME.substring(CURRENT_CLASS_NAME.lastIndexOf('.')+1) + + " (" + TESTS_COUNTERS.get(CURRENT_CLASS_NAME) + " tests)"); + System.out.println("***************************************************************************"); + DIFF_COUNTERS[0] = 0; + DIFF_COUNTERS[1] = 0; + DIFF_COUNTERS[2] = 0; } } @@ -4094,7 +4150,7 @@ protected void tearDown() throws Exception { Util.flushDirectoryContent(libDir); } super.tearDown(); - if (RUN_JAVAC) { + if (shouldRunJavac()) { if (JAVAC_OUTPUT_DIR.exists()) { Util.flushDirectoryContent(JAVAC_OUTPUT_DIR); } diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest9.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest9.java index 496592a596..869a418832 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest9.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest9.java @@ -16,7 +16,6 @@ import java.io.File; import java.util.HashMap; import java.util.Map; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.compiler.CompilationResult; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AmbiguousMethodTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AmbiguousMethodTest.java index 6d926945a2..dff14025be 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AmbiguousMethodTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AmbiguousMethodTest.java @@ -20,12 +20,10 @@ package org.eclipse.jdt.core.tests.compiler.regression; import java.util.Map; - +import junit.framework.Test; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import junit.framework.*; - @SuppressWarnings({ "unchecked", "rawtypes" }) public class AmbiguousMethodTest extends AbstractComparableTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java index 7470b3d02d..135fd371db 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java @@ -39,9 +39,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; - import junit.framework.Test; - import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.ToolFactory; import org.eclipse.jdt.core.compiler.CategorizedProblem; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ArrayTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ArrayTest.java index 729752045c..63c88b5f46 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ArrayTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ArrayTest.java @@ -17,9 +17,7 @@ package org.eclipse.jdt.core.tests.compiler.regression; import java.io.File; import java.util.Map; - import junit.framework.Test; - import org.eclipse.jdt.core.ToolFactory; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.core.util.ClassFileBytesDisassembler; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssertionTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssertionTest.java index 46fcf009f3..57c58ceb5b 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssertionTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssertionTest.java @@ -13,9 +13,8 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler.regression; -import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; - import junit.framework.Test; +import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; @SuppressWarnings({ "rawtypes" }) public class AssertionTest extends AbstractRegressionTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest.java index c313823475..fb59cf44a1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest.java @@ -17,13 +17,11 @@ package org.eclipse.jdt.core.tests.compiler.regression; import java.util.Map; - +import junit.framework.Test; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import junit.framework.Test; - @SuppressWarnings({ "unchecked", "rawtypes" }) public class AssignmentTest extends AbstractRegressionTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest_1_5.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest_1_5.java index 6dafc7c59e..d68a3497c1 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest_1_5.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest_1_5.java @@ -14,10 +14,8 @@ package org.eclipse.jdt.core.tests.compiler.regression; import java.util.Map; - -import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; - import junit.framework.Test; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; @SuppressWarnings({ "unchecked", "rawtypes" }) public class AssignmentTest_1_5 extends AbstractRegressionTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest_1_7.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest_1_7.java index d8b1b4bfbe..2508aa7456 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest_1_7.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest_1_7.java @@ -14,10 +14,8 @@ package org.eclipse.jdt.core.tests.compiler.regression; import java.util.Map; - -import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; - import junit.framework.Test; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; @SuppressWarnings({ "unchecked", "rawtypes" }) public class AssignmentTest_1_7 extends AbstractRegressionTest { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AutoBoxingTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AutoBoxingTest.java index 2d87860892..be2c6c4261 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AutoBoxingTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AutoBoxingTest.java @@ -15,9 +15,7 @@ import java.io.File; import java.util.Map; - import junit.framework.Test; - import org.eclipse.jdt.core.ToolFactory; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.core.util.ClassFileBytesDisassembler; diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AutomaticModuleNamingTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AutomaticModuleNamingTest.java index ccde5f7f52..b134464f78 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AutomaticModuleNamingTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AutomaticModuleNamingTest.java @@ -17,10 +17,8 @@ import static org.eclipse.jdt.internal.compiler.env.AutomaticModuleNaming.determineAutomaticModuleNameFromFileName; import java.io.File; - -import org.eclipse.jdt.core.tests.util.Util; - import junit.framework.Test; +import org.eclipse.jdt.core.tests.util.Util; public class AutomaticModuleNamingTest extends AbstractRegressionTest { static { diff --git a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java index 2fc06ed506..8ce9a1197d 100644 --- a/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java +++ b/jdt-patch/e434/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java @@ -47,9 +47,7 @@ import java.text.MessageFormat; import java.util.Iterator; import java.util.List; - import junit.framework.Test; - import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; @@ -57,9 +55,9 @@ import org.eclipse.jdt.internal.compiler.batch.ClasspathDirectory; import org.eclipse.jdt.internal.compiler.batch.ClasspathJar; import org.eclipse.jdt.internal.compiler.batch.FileSystem; +import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath; import org.eclipse.jdt.internal.compiler.batch.Main; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath; import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; @@ -1153,6 +1151,7 @@ public void test013() { "