summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java4
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/ant/GenerateAntApplication.java2
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java11
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/CompilerUtil.java180
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/InternedPath.java79
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/OutputPathFinder.java219
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/PackagingCompilerAdapter.java34
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ModuleChunk.java343
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/eclipse/EclipseSettingsBuilder.java47
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacSettingsBuilder.java92
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/BuildInstructionBase.java72
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/DependentJarsEvaluator.java44
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/DestinationInfo.java60
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/FileCopyInstructionImpl.java76
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarDestinationInfo.java55
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarInfo.java77
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarsBuilder.java283
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/progress/CompilerTask.java3
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java15
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java16
-rw-r--r--java/compiler/impl/src/com/intellij/openapi/projectRoots/impl/MockJdkWrapper.java2
-rw-r--r--java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerCompileItem.java86
-rw-r--r--java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java103
-rw-r--r--java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemExternalizer.java52
-rw-r--r--java/compiler/instrumentation-util/src/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenter.java85
-rw-r--r--java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildInstruction.java27
-rw-r--r--java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildInstructionVisitor.java30
-rw-r--r--java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipant.java33
-rw-r--r--java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantProvider.java37
-rw-r--r--java/compiler/openapi/src/com/intellij/openapi/compiler/make/FileCopyInstruction.java30
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/actions/QuickEvaluateActionHandler.java4
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java40
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java5
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java4
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java20
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java5
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/jdi/Bytecodes.java152
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/jdi/InstructionParser.java3
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java68
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/settings/DebuggerLaunchingConfigurable.java38
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java105
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java15
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/settings/JavaDebuggerSettings.java66
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java9
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java3
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java14
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointWithHighlighter.java7
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaExceptionBreakpointType.java12
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaFieldBreakpointType.java12
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaLineBreakpointType.java12
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaMethodBreakpointType.java12
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaWildcardMethodBreakpointType.java12
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java7
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java15
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java3
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/tree/render/BatchEvaluator.java3
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java17
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ToStringRenderer.java16
-rw-r--r--java/debugger/impl/src/org/jetbrains/java/debugger/breakpoints/properties/JavaBreakpointProperties.java13
-rw-r--r--java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java9
-rw-r--r--java/execution/impl/src/com/intellij/execution/remote/RemoteConfiguration.java11
-rw-r--r--java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java3
-rw-r--r--java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java217
-rw-r--r--java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java27
-rw-r--r--java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java152
-rw-r--r--java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java17
-rw-r--r--java/idea-ui/src/com/intellij/platform/templates/SaveProjectAsTemplateAction.java10
-rw-r--r--java/java-analysis-impl/java-analysis-impl.iml1
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java83
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java2
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java13
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java35
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java2
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java11
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Analysis.java398
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java485
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java167
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java264
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Contracts.java439
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ControlFlow.java1030
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Data.java226
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java390
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java291
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Solver.java440
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractInference.java77
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java185
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java36
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaPsiUtil.java35
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java133
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java3
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java77
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java170
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java46
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java2
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticalDataSearch.java34
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java87
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/unusedLibraries/UnusedLibrariesInspection.java14
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspectionBase.java21
-rw-r--r--java/java-analysis-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodUtil.java (renamed from java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodUtil.java)9
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java58
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java6
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java3
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java39
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java43
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java2
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java2
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFieldFromUsageFix.java16
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java3
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java19
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFix.java14
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java13
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/JavaSmartEnterProcessor.java54
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/PlainEnterProcessor.java42
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilder.java3
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/generation/GenerateDelegateHandler.java11
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java10
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java11
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/template/impl/ShortenToStaticImportProcessor.java13
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/unwrap/JavaMethodParameterUnwrapper.java12
-rw-r--r--java/java-impl/src/com/intellij/ide/projectView/impl/nodes/PackageUtil.java12
-rw-r--r--java/java-impl/src/com/intellij/ide/util/PackageUtil.java28
-rw-r--r--java/java-impl/src/com/intellij/openapi/roots/impl/JavaLanguageLevelPusher.java4
-rw-r--r--java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java16
-rw-r--r--java/java-impl/src/com/intellij/psi/impl/JavaCodeBlockModificationListener.java4
-rw-r--r--java/java-impl/src/com/intellij/psi/impl/JavaDirectoryIconProvider.java5
-rw-r--r--java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java2
-rw-r--r--java/java-impl/src/com/intellij/psi/impl/source/codeStyle/javadoc/JDParser.java10
-rw-r--r--java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaCharsetReferenceContributor.java52
-rw-r--r--java/java-impl/src/com/intellij/psi/util/proximity/KnownElementWeigher.java31
-rw-r--r--java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java5
-rw-r--r--java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java2
-rw-r--r--java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java3
-rw-r--r--java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java5
-rw-r--r--java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java9
-rw-r--r--java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java9
-rw-r--r--java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java21
-rw-r--r--java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHelper.java16
-rw-r--r--java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpDialog.java2
-rw-r--r--java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java2
-rw-r--r--java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java2
-rw-r--r--java/java-impl/src/com/intellij/spellchecker/LiteralExpressionTokenizer.java11
-rw-r--r--java/java-impl/src/com/intellij/testIntegration/BaseGenerateTestSupportMethodAction.java10
-rw-r--r--java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java2
-rw-r--r--java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnonymousClassBaseRefOccurenceIndex.java2
-rw-r--r--java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFieldNameIndex.java2
-rw-r--r--java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java2
-rw-r--r--java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodNameIndex.java2
-rw-r--r--java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodParameterTypesIndex.java2
-rw-r--r--java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java2
-rw-r--r--java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaSuperClassNameOccurenceIndex.java2
-rw-r--r--java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java40
-rw-r--r--java/java-psi-api/src/com/intellij/codeInsight/InferredAnnotationsManager.java40
-rw-r--r--java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java14
-rw-r--r--java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java10
-rw-r--r--java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java2
-rw-r--r--java/java-psi-api/src/com/intellij/psi/util/PsiFormatUtil.java34
-rw-r--r--java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java1
-rw-r--r--java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java2
-rw-r--r--java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java54
-rw-r--r--java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/ParameterNameFoldingManager.java153
-rw-r--r--java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java43
-rw-r--r--java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java83
-rw-r--r--java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java4
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/InheritanceImplUtil.java12
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java6
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java4
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaImportStatementElementType.java6
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightStubBuilder.java4
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java12
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java5
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java21
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java15
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java2
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaSourceUtil.java81
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/SourceUtil.java79
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ExpressionPsiElement.java21
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodElement.java18
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java8
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPackageStatementImpl.java4
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java2
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java13
-rw-r--r--java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail.java7
-rw-r--r--java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail_after.java7
-rw-r--r--java/java-tests/testData/codeInsight/completion/normal/SmartEnterNoNewLine.java9
-rw-r--r--java/java-tests/testData/codeInsight/completion/normal/SmartEnterNoNewLine_after.java9
-rw-r--r--java/java-tests/testData/codeInsight/completion/normal/SmartEnterWithNewLine.java9
-rw-r--r--java/java-tests/testData/codeInsight/completion/normal/SmartEnterWithNewLine_after.java11
-rw-r--r--java/java-tests/testData/codeInsight/completion/normal/UnimportedStaticInnerClass.java6
-rw-r--r--java/java-tests/testData/codeInsight/completion/normal/UnimportedStaticInnerClass_after.java8
-rw-r--r--java/java-tests/testData/codeInsight/completion/smartType/AutoImportExpectedType.java5
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/typeAnnotations.java1
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/IDEA127584.java22
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA127596.java9
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA126969.java15
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA127506.java24
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterShortenFQNs.java10
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeShortenFQNs.java8
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeObjectInferredButIntExpected.java16
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/afterMultipleMethodsMultipleFields.java17
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeMultipleMethodsMultipleFields.java18
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeMultipleMethodsOnReadOnly.java18
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/beforeInsideInterface.java7
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/afterStaticInInterface.java10
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/beforeStaticInInterface.java6
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterAmbiguityWithoutSuperMethods.java11
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeAmbiguityWithoutSuperMethods.java11
-rw-r--r--java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.html2
-rw-r--r--java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.java4
-rw-r--r--java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html6
-rw-r--r--java/java-tests/testData/codeInsight/javadocIG/pInsidePre.java10
-rw-r--r--java/java-tests/testData/codeInsight/nullityinferrer/afterMethodReturnValue.java1
-rw-r--r--java/java-tests/testData/codeInsight/template/postfix/templates/cast/ternary.java5
-rw-r--r--java/java-tests/testData/codeInsight/template/postfix/templates/cast/ternary_after.java5
-rw-r--r--java/java-tests/testData/codeInsight/typing/columnMode_after.java5
-rw-r--r--java/java-tests/testData/codeInsight/typing/columnMode_before.java5
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/annotations.xml345
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/event/annotations.xml5
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/beans/beancontext/annotations.xml79
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/io/annotations.xml395
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotation/annotations.xml5
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotations.xml1347
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/invoke/annotations.xml1872
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/net/annotations.xml422
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/security/annotations.xml132
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/sql/annotations.xml78
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/annotations.xml1533
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/annotations.xml5
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/atomic/annotations.xml98
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/locks/annotations.xml134
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/javax/swing/annotations.xml527
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/annotations.xml40
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/map/annotations.xml161
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/annotations.xml1581
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/builder/annotations.xml574
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enum/annotations.xml50
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enums/annotations.xml50
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/exception/annotations.xml72
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/math/annotations.xml309
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/mutable/annotations.xml192
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/text/annotations.xml422
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/time/annotations.xml481
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/anakia/annotations.xml108
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/annotations.xml29
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/annotations.xml89
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/implement/annotations.xml90
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/tools/annotations.xml39
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/context/annotations.xml37
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/convert/annotations.xml33
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/exception/annotations.xml17
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/io/annotations.xml8
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/annotations.xml98
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/directive/annotations.xml209
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/log/annotations.xml76
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/annotations.xml73
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/node/annotations.xml475
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/annotations.xml5
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/loader/annotations.xml102
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/visitor/annotations.xml245
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/servlet/annotations.xml23
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/annotations.xml14
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/ant/annotations.xml11
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/util/annotations.xml23
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/annotations.xml109
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/introspection/annotations.xml127
-rw-r--r--java/java-tests/testData/codeInspection/bytecodeAnalysis/src/Example.java43
-rw-r--r--java/java-tests/testData/compiler/notNullVerification/CustomExceptionType.java5
-rw-r--r--java/java-tests/testData/compiler/notNullVerification/annotations.jarbin10899 -> 22366 bytes
-rw-r--r--java/java-tests/testData/inspection/dataFlow/AlexBug/src/Test.java6
-rw-r--r--java/java-tests/testData/inspection/dataFlow/caseAndNpe/expected.xml5
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/AccessingSameArrayElements.java56
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/AssertThat.java18
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/CatchRuntimeException.java2
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ContractInferenceBewareOverriding.java21
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/FinalFieldDuringSuperInitialization.java20
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/GuavaCheckNotNull.java11
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/NumberComparisonsWhenValueIsKnown.java16
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences.java10
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_NotInComplexAssignment.java6
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_OverloadedCall.java14
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_OverloadedCall_after.java14
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithEnum.java7
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithEnum_after.java9
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithIntConstant.java10
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithIntConstant_after.java10
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithString.java8
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithString_after.java8
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_Switch.java22
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_after.java10
-rw-r--r--java/java-tests/testData/inspection/dataFlow/fixture/UseInferredContracts.java15
-rw-r--r--java/java-tests/testData/inspection/nullableProblems/GetterSetterProblems.java4
-rw-r--r--java/java-tests/testData/inspection/nullableProblems/NotNullCustomException.java8
-rw-r--r--java/java-tests/testData/inspection/nullableProblems/NotNullFieldNotInitialized.java9
-rw-r--r--java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java6
-rw-r--r--java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt91
-rw-r--r--java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.java6
-rw-r--r--java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.txt140
-rw-r--r--java/java-tests/testData/refactoring/inlineMethod/ThisNameConflict.java11
-rw-r--r--java/java-tests/testData/refactoring/inlineMethod/ThisNameConflict.java.after8
-rw-r--r--java/java-tests/testData/refactoring/pullUp/AsDefaultMethodOverAbstract.java12
-rw-r--r--java/java-tests/testData/refactoring/pullUp/AsDefaultMethodOverAbstract_after.java12
-rw-r--r--java/java-tests/testSrc/com/intellij/TestClassesFilterTest.java27
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java8
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy11
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy10
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy12
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java13
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java10
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java4
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java262
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java8
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateFieldFromUsageTest.java1
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RenameWrongReferenceTest.java16
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy85
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/intention/AddImportActionTest.groovy60
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java8
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy26
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/CastPostfixTemplateTest.java3
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/ContractInferenceFromSourceTest.groovy64
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java61
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java2
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java177
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisResultsHighlightingTest.java67
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisTest.java209
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectContract.java30
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectLeaking.java26
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectNoPsiKey.java26
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectNotNull.java26
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/LeakingParametersData.java43
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/Test01.java78
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/Test02.java (renamed from java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemOutputState.java)23
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/Test03.java (renamed from java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/ExplodedDestinationInfo.java)21
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/TestAnnotation.java26
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/TestConverterData.java81
-rw-r--r--java/java-tests/testSrc/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenterTest.java27
-rw-r--r--java/java-tests/testSrc/com/intellij/find/FindInEditorMultiCaretTest.java222
-rw-r--r--java/java-tests/testSrc/com/intellij/find/FindInEditorTest.java13
-rw-r--r--java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java223
-rw-r--r--java/java-tests/testSrc/com/intellij/psi/CodeFragmentsTest.java15
-rw-r--r--java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterBlankLinesTest.java32
-rw-r--r--java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java3
-rw-r--r--java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java4
-rw-r--r--java/jdkAnnotations/java/text/annotations.xml12
-rw-r--r--java/mockJDK-1.7/jre/lib/annotations.jarbin22215 -> 22366 bytes
-rw-r--r--java/openapi/src/com/intellij/ui/classFilter/ClassFilter.java16
-rw-r--r--java/openapi/src/com/intellij/ui/classFilter/ClassFilterEditor.java2
-rw-r--r--java/remote-servers/impl/remote-servers-java-impl.iml2
-rw-r--r--java/remote-servers/impl/src/META-INF/RemoteServersJava.xml7
-rw-r--r--java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java166
-rw-r--r--java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java36
-rw-r--r--java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java114
-rw-r--r--java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java48
-rw-r--r--java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionBase.java142
-rw-r--r--java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.form50
-rw-r--r--java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.java130
-rw-r--r--java/structuralsearch-java/src/META-INF/structuralsearch-java.xml6
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java296
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java557
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java661
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaCompiledPattern.java90
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchPredicateProvider.java62
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java1637
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/compiler/JavaCompilingVisitor.java589
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/BlockFilter.java42
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ClassFilter.java43
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/CommentFilter.java48
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ConstantFilter.java38
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/DeclarationFilter.java44
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ExpressionFilter.java39
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/JavaDocFilter.java33
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/JavaLexicalNodesFilter.java37
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/MethodFilter.java33
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/StatementFilter.java33
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/SymbolNodeFilter.java72
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypeFilter.java42
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypeParameterFilter.java43
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypedSymbolNodeFilter.java44
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/VariableFilter.java41
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DeclarationStatementHandler.java96
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DocDataHandler.java70
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/ExpressionHandler.java21
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/StatementHandler.java32
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/DocValuesIterator.java64
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/HierarchyNodeIterator.java128
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ExprTypePredicate.java95
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java38
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ReadPredicate.java28
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/WritePredicate.java33
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/CommentMatchingStrategy.java37
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/ExprMatchingStrategy.java51
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/JavaDocMatchingStrategy.java32
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/MatchingStrategyBase.java42
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/SymbolMatchingStrategy.java54
-rw-r--r--java/structuralsearch-java/structuralsearch-java.iml17
-rw-r--r--java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCaseUtil.java6
-rw-r--r--java/typeMigration/src/META-INF/TypeMigration.xml23
-rw-r--r--java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeConversionDescriptor.java101
-rw-r--r--java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeMigrationVariableTypeFixProvider.java61
-rw-r--r--java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ChangeClassParametersIntention.java124
-rw-r--r--java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToAtomicIntention.java218
-rw-r--r--java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToThreadLocalIntention.java145
-rw-r--r--java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/AtomicConversionRule.java420
-rw-r--r--java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/BoxingTypeConversionRule.java36
-rw-r--r--java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ElementToArrayConversionRule.java36
-rw-r--r--java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ListArrayConversionRule.java177
-rw-r--r--java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java231
-rw-r--r--java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/after.java.template10
-rw-r--r--java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/before.java.template10
-rw-r--r--java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/description.html5
-rw-r--r--java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/after.java.template4
-rw-r--r--java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/before.java.template3
-rw-r--r--java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/description.html5
-rw-r--r--java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/after.java.template15
-rw-r--r--java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/before.java.template10
-rw-r--r--java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/description.html5
-rw-r--r--java/typeMigration/test/com/intellij/codeInsight/ConvertToAtomicIntentionTest.java30
-rw-r--r--java/typeMigration/test/com/intellij/codeInsight/ConvertToThreadLocalIntentionTest.java30
-rw-r--r--java/typeMigration/test/com/intellij/refactoring/AllTypeMigrationTests.java26
-rw-r--r--java/typeMigration/test/com/intellij/refactoring/ChangeTypeSignatureTest.java148
-rw-r--r--java/typeMigration/test/com/intellij/refactoring/MigrateTypeSignatureTest.java561
-rw-r--r--java/typeMigration/test/com/intellij/refactoring/TypeMigrationByAtomicRuleTest.java100
-rw-r--r--java/typeMigration/test/com/intellij/refactoring/TypeMigrationByThreadLocalRuleTest.java44
-rw-r--r--java/typeMigration/test/com/intellij/refactoring/TypeMigrationTest.java883
-rw-r--r--java/typeMigration/test/com/intellij/refactoring/TypeMigrationTestBase.java193
-rw-r--r--java/typeMigration/test/com/intellij/refactoring/WildcardTypeMigrationTest.java170
-rw-r--r--java/typeMigration/testData/intentions/atomic/after1.java9
-rw-r--r--java/typeMigration/testData/intentions/atomic/after10.java10
-rw-r--r--java/typeMigration/testData/intentions/atomic/after12.java12
-rw-r--r--java/typeMigration/testData/intentions/atomic/after13.java6
-rw-r--r--java/typeMigration/testData/intentions/atomic/after14.java10
-rw-r--r--java/typeMigration/testData/intentions/atomic/after2.java9
-rw-r--r--java/typeMigration/testData/intentions/atomic/after3.java7
-rw-r--r--java/typeMigration/testData/intentions/atomic/after4.java9
-rw-r--r--java/typeMigration/testData/intentions/atomic/after5.java9
-rw-r--r--java/typeMigration/testData/intentions/atomic/after6.java6
-rw-r--r--java/typeMigration/testData/intentions/atomic/after7.java11
-rw-r--r--java/typeMigration/testData/intentions/atomic/after8.java11
-rw-r--r--java/typeMigration/testData/intentions/atomic/after9.java15
-rw-r--r--java/typeMigration/testData/intentions/atomic/afterExcl.java9
-rw-r--r--java/typeMigration/testData/intentions/atomic/afterTA1.java10
-rw-r--r--java/typeMigration/testData/intentions/atomic/before1.java7
-rw-r--r--java/typeMigration/testData/intentions/atomic/before10.java8
-rw-r--r--java/typeMigration/testData/intentions/atomic/before11.java8
-rw-r--r--java/typeMigration/testData/intentions/atomic/before12.java10
-rw-r--r--java/typeMigration/testData/intentions/atomic/before13.java4
-rw-r--r--java/typeMigration/testData/intentions/atomic/before14.java8
-rw-r--r--java/typeMigration/testData/intentions/atomic/before2.java7
-rw-r--r--java/typeMigration/testData/intentions/atomic/before3.java5
-rw-r--r--java/typeMigration/testData/intentions/atomic/before4.java7
-rw-r--r--java/typeMigration/testData/intentions/atomic/before5.java7
-rw-r--r--java/typeMigration/testData/intentions/atomic/before6.java4
-rw-r--r--java/typeMigration/testData/intentions/atomic/before7.java9
-rw-r--r--java/typeMigration/testData/intentions/atomic/before8.java9
-rw-r--r--java/typeMigration/testData/intentions/atomic/before9.java13
-rw-r--r--java/typeMigration/testData/intentions/atomic/beforeExcl.java7
-rw-r--r--java/typeMigration/testData/intentions/atomic/beforeTA1.java9
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/after1.java12
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/after2.java12
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/after3.java12
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/after4.java12
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/after5.java12
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/after6.java12
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/after7.java15
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/after8.java9
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/afterTA1.java14
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/before1.java7
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/before2.java7
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/before3.java7
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/before4.java7
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/before5.java7
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/before6.java7
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/before7.java10
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/before8.java4
-rw-r--r--java/typeMigration/testData/intentions/threadLocal/beforeTA1.java9
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/CompositeReturnType.java9
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/CompositeReturnType.java.after9
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/FieldTypeMigration.java12
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/FieldTypeMigration.java.after12
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage.java16
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage.java.after16
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage1.java17
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage1.java.after17
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ListTypeArguments.java4
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ListTypeArguments.java.after4
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/MethodReturnTypeMigration.java16
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/MethodReturnTypeMigration.java.after16
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration.java29
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration.java.after29
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration1.java29
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration1.java.after29
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration2.java31
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration2.java.after31
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter.java16
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter.java.after16
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter1.java20
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter1.java.after20
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter2.java12
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter2.java.after12
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType.java14
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType.java.after14
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType1.java15
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType1.java.after15
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType2.java14
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType2.java.after14
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy.java18
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy.java.after18
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy1.java19
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy1.java.after19
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy2.java18
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy2.java.after18
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsage.java15
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsage.java.after15
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsageConflict.java16
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsageConflict.java.after16
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/UsedInSuper.java9
-rw-r--r--java/typeMigration/testData/refactoring/changeTypeSignature/UsedInSuper.java.after9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/after/Expr.items33
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/after/Expr.java35
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/before/Expr.java35
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/after/Expr.items37
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/after/Expr.java54
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/before/Expr.java54
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/after/Ession.items17
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/after/Expr.java20
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/before/Expr.java20
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/after/Expr.items19
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/after/Expr.java26
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/before/Expr.java26
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/after/Expr.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/after/Expr.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/before/Expr.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/after/Expr.items8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/after/Expr.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/before/Expr.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/after/Expr.items30
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/after/Expr.java16
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/before/Expr.java16
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/after/Expr.items19
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/after/Expr.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/before/Expr.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/after/Expr.items15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/after/Expr.java8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/before/Expr.java8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/after/Expr.items58
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/after/Expr.java35
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/before/Expr.java35
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/after/Expr.items78
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/after/Expr.java42
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/before/Expr.java42
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/after/Expr.items98
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/after/Expr.java46
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/before/Expr.java46
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/after/Expr.items62
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/after/Expr.java35
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/before/Expr.java35
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/after/Expr.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/after/Expr.java5
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/before/Expr.java5
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/after/Expr.items8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/after/Expr.java5
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/before/Expr.java5
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/after/Expr.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/after/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/before/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/after/Expr.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/after/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/before/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/after/Expr.items17
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/after/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/before/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/after/Expr.items23
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/after/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/before/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/after/Expr.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/after/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/before/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/after/Expr.items8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/after/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/before/Expr.java9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/after/Expr.items35
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/after/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/before/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/after/Expr.items37
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/after/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/before/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/after/Expr.items36
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/after/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/before/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/after/Expr.items17
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/after/Expr.java13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/before/Expr.java13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/after/Expr.items16
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/after/Expr.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/before/Expr.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/after/Expr.items16
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/after/Expr.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/before/Expr.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/after/Expr.items17
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/after/Expr.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/before/Expr.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/after/Expr.items16
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/after/Expr.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/before/Expr.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/after/Expr.items16
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/after/Expr.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/before/Expr.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/after/Expr.items17
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/after/Expr.java13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/before/Expr.java13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/after/Expr.items36
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/after/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/before/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/after/Expr.items35
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/after/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/before/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/after/Expr.items33
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/after/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/before/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/after/Expr.items34
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/after/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/before/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/after/Expr.items37
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/after/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/before/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/after/Expr.items35
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/after/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/before/Expr.java27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/after/Expr.items22
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/after/Expr.java11
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/before/Expr.java11
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/after/Expr.items14
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/after/Expr.java11
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/before/Expr.java11
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/after/Expr.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/after/Expr.java8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/before/Expr.java8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/after/Expr.items25
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/after/Expr.java8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/before/Expr.java8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/after/Expr.items21
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/after/Expr.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/before/Expr.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/after/Expr.items34
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/after/Expr.java13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/before/Expr.java13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/after/Expr.items18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/after/Expr.java11
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/before/Expr.java11
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/after/Expr.items17
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/after/Expr.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/before/Expr.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/after/Expr.items16
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/after/Expr.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/before/Expr.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/after/Expr.items10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/after/Expr.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/before/Expr.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/after/Expr.items27
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/after/Expr.java21
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/before/Expr.java21
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/after/Expr.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/after/Expr.java5
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/before/Expr.java5
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/after/Expr.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/after/Expr.java5
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/before/Expr.java5
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/after/Expr.items10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/after/Expr.java5
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/before/Expr.java5
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/after/Overriding.java13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/after/Parent.items12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/before/Overriding.java13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/after/Child.items12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/after/Overriding.java13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/before/Overriding.java13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/after/Spec.items8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/after/Spec.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/before/Spec.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/after/Spec.items7
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/after/Spec.java3
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/before/Spec.java3
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/after/Type.items13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/after/Type.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/before/Type.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/after/Type.items13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/after/Type.items16
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/after/Type.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/before/Type.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/after/Type.items13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/after/Type.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/before/Type.java15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/after/Type.items10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/after/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/before/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/after/Type.items8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/after/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/before/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/after/Type.items11
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/after/Type.java8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/before/Type.java8
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/after/Type.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/after/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/before/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/after/Type.items15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/after/Type.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/after/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/before/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/after/Type.items13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/after/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/before/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/after/Type.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/after/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/before/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/after/Type.items13
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/after/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/before/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/after/Type.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/after/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/before/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/after/Type.items15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/after/Type.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/after/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/before/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/after/Type.items15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/after/Type.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/after/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/before/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/after/Type.items15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/after/Type.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/after/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/before/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/after/Type.items15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/after/Type.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/after/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/before/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/after/Type.items33
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/after/Type.java40
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/before/Type.java40
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/after/Type.items33
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/after/Type.java37
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/before/Type.java37
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/after/Type.items37
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/after/Type.java39
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/before/Type.java39
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/after/Type.items32
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/after/Type.java35
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/before/Type.java35
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/after/Type.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/after/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/before/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/after/Type.items9
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/after/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/before/Type.java10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/after/Type.items10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/after/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/before/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/after/Type.items10
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/after/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/before/Type.java6
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/after/Type.items26
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/after/Type.items22
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/after/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/before/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/after/Type.items26
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/after/Type.items26
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/after/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/before/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/after/Type.items25
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/after/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/before/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/after/Type.items21
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/after/Type.items23
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/after/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/before/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/after/Type.items23
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/after/Type.items24
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/after/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/before/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/after/Type.items22
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/after/Type.items22
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/after/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/before/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/after/Type.items25
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/after/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/before/Type.java12
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/after/Type.items17
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/after/Type.java14
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/before/Type.java14
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/after/Type.items15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/after/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/before/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/after/Type.items16
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/after/Type.java14
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/before/Type.java14
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/after/Type.items16
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/after/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/before/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/after/Type.items15
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/after/Type.java14
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/before/Type.java14
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/after/Type.items17
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/after/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/before/Type.java18
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t01/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t01/after/test.java39
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t01/before/test.java39
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t02/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t02/after/test.java20
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t02/before/test.java20
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t03/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t03/after/test.java22
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t03/before/test.java22
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t04/after/Test.items21
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t04/after/test.java22
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t04/before/test.java22
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t05/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t05/after/test.java22
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t05/before/test.java22
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t06/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t06/after/test.java25
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t06/before/test.java25
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t07/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t07/after/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t07/before/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t08/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t08/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t08/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t09/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t09/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t09/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t10/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t10/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t10/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t100/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t100/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t100/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t101/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t101/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t101/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t102/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t102/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t102/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t103/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t103/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t103/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t104/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t104/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t104/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t105/after/Test.items7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t105/after/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t105/before/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t106/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t106/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t106/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t107/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t107/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t107/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t108/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t108/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t108/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t109/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t109/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t109/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t11/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t11/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t11/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t110/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t110/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t110/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t111/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t111/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t111/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t112/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t112/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t112/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t113/after/Test.items7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t113/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t113/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t114/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t114/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t114/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t115/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t115/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t115/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t116/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t116/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t116/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t117/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t117/after/test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t117/before/test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t118/after/Test.items7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t118/after/test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t118/before/test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t119/after/Test.items7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t119/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t119/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t12/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t12/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t12/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t120/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t120/after/test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t120/before/test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t121/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t121/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t121/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t122/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t122/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t122/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t123/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t123/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t123/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t124/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t124/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t124/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t125/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t125/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t125/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t126/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t126/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t126/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t127/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t127/after/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t127/before/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t128/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t128/after/test.java16
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t128/before/test.java16
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t129/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t129/after/test.java16
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t129/before/test.java16
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t13/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t13/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t13/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t130/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t130/after/test.java18
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t130/before/test.java18
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t131/after/Test.items13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t131/after/test.java18
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t131/before/test.java18
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t132/after/Test.items15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t132/after/test.java25
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t132/before/test.java25
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t133/after/Test.items16
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t133/after/test.java33
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t133/before/test.java33
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t134/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t134/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t134/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t135/after/Test.items16
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t135/after/test.java19
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t135/before/test.java19
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t136/after/Test.items17
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t136/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t136/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t137/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t137/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t137/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t138/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t138/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t138/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t139/after/Test.items7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t139/after/test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t139/before/test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t14/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t14/after/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t14/before/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t15/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t15/after/test.java16
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t15/before/test.java16
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t16/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t16/after/test.java15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t16/before/test.java15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t17/after/Test.items18
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t17/after/test.java17
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t17/before/test.java17
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t18/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t18/after/test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t18/before/test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t19/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t19/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t19/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t20/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t20/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t20/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t21/after/Test.items14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t21/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t21/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t22/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t22/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t22/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t23/after/Test.items22
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t23/after/test.java15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t23/before/test.java15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t24/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t24/after/test.java14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t24/before/test.java14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t25/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t25/after/test.java15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t25/before/test.java15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t26/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t26/after/test.java15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t26/before/test.java15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t27/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t27/after/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t27/before/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t28/after/Test.items13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t28/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t28/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t29/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t29/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t29/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t30/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t30/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t30/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t31/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t31/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t31/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t32/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t32/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t32/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t33/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t33/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t33/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t34/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t34/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t34/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t35/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t35/after/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t35/before/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t36/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t36/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t36/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t37/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t37/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t37/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t38/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t38/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t38/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t39/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t39/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t39/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t40/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t40/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t40/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t41/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t41/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t41/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t42/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t42/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t42/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t43/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t43/after/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t43/before/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t44/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t44/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t44/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t45/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t45/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t45/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t46/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t46/after/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t46/before/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t47/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t47/after/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t47/before/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t48/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t48/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t48/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t49/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t49/after/test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t49/before/test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t50/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t50/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t50/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t51/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t51/after/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t51/before/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t52/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t52/after/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t52/before/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t53/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t53/after/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t53/before/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t54/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t54/after/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t54/before/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t55/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t55/after/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t55/before/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t56/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t56/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t56/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t57/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t57/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t57/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t58/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t58/after/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t58/before/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t59/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t59/after/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t59/before/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t60/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t60/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t60/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t61/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t61/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t61/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t62/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t62/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t62/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t63/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t63/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t63/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t64/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t64/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t64/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t65/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t65/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t65/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t66/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t66/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t66/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t67/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t67/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t67/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t68/after/Test.items17
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t68/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t68/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t69/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t69/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t69/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t70/after/Test.items18
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t70/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t70/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t71/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t71/after/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t71/before/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t72/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t72/after/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t72/before/test.java3
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t73/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t73/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t73/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t74/after/Test.items22
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t74/after/test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t74/before/test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t75/after/Test.items38
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t75/after/test.java12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t75/before/test.java12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t76/after/Test.items37
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t76/after/test.java12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t76/before/test.java12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t77/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t77/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t77/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t78/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t78/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t78/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t79/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t79/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t79/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t80/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t80/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t80/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t81/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t81/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t81/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t82/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t82/after/test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t82/before/test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t83/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t83/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t83/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t84/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t84/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t84/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t85/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t85/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t85/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t86/after/Test.items18
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t86/after/test.java16
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t86/before/test.java16
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t87/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t87/after/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t87/before/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t88/after/Test.items15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t88/after/test.java18
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t88/before/test.java18
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t89/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t89/after/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t89/before/test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t90/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t90/after/test.java24
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t90/before/test.java24
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t91/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t91/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t91/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t92/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t92/after/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t92/before/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t93/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t93/after/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t93/before/test.java8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t94/after/Test.items13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t94/after/test.java14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t94/before/test.java14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t95/after/Test.items13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t95/after/test.java14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t95/before/test.java14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t96/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t96/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t96/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t97/after/Test.items8
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t97/after/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t97/before/test.java4
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t98/after/Test.items21
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t98/after/test.java17
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t98/before/test.java17
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t99/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t99/after/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/t99/before/test.java6
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/typeAnno/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/typeAnno/after/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigration/typeAnno/before/test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/after/Test.items25
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/after/Test.java16
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/before/Test.java14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/after/Test.items19
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/after/Test.java14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/before/Test.java12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/after/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/before/Test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/after/Test.java12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/before/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/after/Test.items25
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/after/Test.java14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/before/Test.java12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/after/Test.items34
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/after/Test.java20
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/before/Test.java18
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/after/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/before/Test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/after/Test.items14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/after/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/before/Test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/after/Test.items26
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/after/Test.java15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/before/Test.java15
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/after/Test.items26
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/after/Test.java14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/before/Test.java14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/after/Test.items13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/after/Test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/before/Test.java10
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/after/Test.items25
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/after/Test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/before/Test.java13
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/after/Test.items35
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/after/Test.java19
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/before/Test.java19
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/after/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/before/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/after/Test.items14
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/after/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/before/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/after/Test.items22
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/after/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/before/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/after/Test.items22
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/after/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/before/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/after/Test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/before/Test.java9
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/after/Test.items22
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/after/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/before/Test.java11
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/assignmentExtends/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/assignmentExtends/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/assignmentExtends/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/assignmentSuper/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/assignmentSuper/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/assignmentSuper/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/consumerExtends/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/consumerExtends/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/consumerExtends/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/consumerSuper/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/consumerSuper/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/consumerSuper/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/after/Test.items12
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getExtends/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getExtends/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getExtends/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getSuper/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getSuper/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getSuper/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getUnbounded/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getUnbounded/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/getUnbounded/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/lengthSize/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/lengthSize/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/lengthSize/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerExtends/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerExtends/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerExtends/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerSuper/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerSuper/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerSuper/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerUnbounded/after/Test.items11
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerUnbounded/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/producerUnbounded/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/before/test.java5
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/Test.items9
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/before/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/after/Test.items10
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/after/test.java7
-rw-r--r--java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/before/test.java7
-rw-r--r--java/typeMigration/typeMigration.iml21
1377 files changed, 44205 insertions, 3719 deletions
diff --git a/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java b/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java
index 5cb7a2477315..ceebef6ac8f0 100644
--- a/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java
+++ b/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java
@@ -309,7 +309,9 @@ public class CompilerManagerImpl extends CompilerManager {
}
public void finished(boolean aborted, int errors, int warnings, final CompileContext compileContext) {
- myEventPublisher.compilationFinished(aborted, errors, warnings, compileContext);
+ if (!myProject.isDisposed()) {
+ myEventPublisher.compilationFinished(aborted, errors, warnings, compileContext);
+ }
if (myDelegate != null) {
myDelegate.finished(aborted, errors, warnings, compileContext);
}
diff --git a/java/compiler/impl/src/com/intellij/compiler/ant/GenerateAntApplication.java b/java/compiler/impl/src/com/intellij/compiler/ant/GenerateAntApplication.java
index b8a27b7818dc..5a957a28c2d3 100644
--- a/java/compiler/impl/src/com/intellij/compiler/ant/GenerateAntApplication.java
+++ b/java/compiler/impl/src/com/intellij/compiler/ant/GenerateAntApplication.java
@@ -61,7 +61,7 @@ public class GenerateAntApplication {
GenerateAntApplication.LOG.error(e);
}
finally {
- application.exit(true);
+ application.exit(true, true);
}
}
});
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
index 46584ef9c8bf..406d16574955 100644
--- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
+++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
@@ -176,17 +176,6 @@ public class CompileDriver {
}
}
- private static boolean containsFileIndexScopes(CompileScope scope) {
- if (scope instanceof CompositeScope) {
- for (CompileScope childScope : ((CompositeScope)scope).getScopes()) {
- if (containsFileIndexScopes(childScope)) {
- return true;
- }
- }
- }
- return scope instanceof FileIndexCompileScope;
- }
-
private void doRebuild(CompileStatusNotification callback, CompilerMessage message, final CompileScope compileScope) {
if (validateCompilerConfiguration(compileScope)) {
startup(compileScope, true, false, callback, message);
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompilerUtil.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompilerUtil.java
index 9b227da1dbf8..67bdb5209f39 100644
--- a/java/compiler/impl/src/com/intellij/compiler/impl/CompilerUtil.java
+++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompilerUtil.java
@@ -20,36 +20,24 @@
*/
package com.intellij.compiler.impl;
-import com.intellij.CommonBundle;
-import com.intellij.compiler.CompilerConfiguration;
-import com.intellij.compiler.impl.javaCompiler.ModuleChunk;
-import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.compiler.CompileContext;
import com.intellij.openapi.compiler.CompilerBundle;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
-import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.ui.Messages;
-import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.RefreshQueue;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.util.ThrowableRunnable;
-import com.intellij.util.containers.ContainerUtil;
-import gnu.trove.THashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.io.File;
-import java.io.FileFilter;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
public class CompilerUtil {
private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.impl.CompilerUtil");
@@ -62,51 +50,6 @@ public class CompilerUtil {
return path;
}
- public static void collectFiles(Collection<File> container, File rootDir, FileFilter fileFilter) {
- final File[] files = rootDir.listFiles(fileFilter);
- if (files == null) {
- return;
- }
- for (File file : files) {
- if (file.isDirectory()) {
- collectFiles(container, file, fileFilter);
- }
- else {
- container.add(file);
- }
- }
- }
-
- public static Map<Module, List<VirtualFile>> buildModuleToFilesMap(CompileContext context, VirtualFile[] files) {
- return buildModuleToFilesMap(context, Arrays.asList(files));
- }
-
-
- public static Map<Module, List<VirtualFile>> buildModuleToFilesMap(final CompileContext context, final List<VirtualFile> files) {
- //assertion: all files are different
- final Map<Module, List<VirtualFile>> map = new THashMap<Module, List<VirtualFile>>();
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- public void run() {
- for (VirtualFile file : files) {
- final Module module = context.getModuleByFile(file);
-
- if (module == null) {
- continue; // looks like file invalidated
- }
-
- List<VirtualFile> moduleFiles = map.get(module);
- if (moduleFiles == null) {
- moduleFiles = new ArrayList<VirtualFile>();
- map.put(module, moduleFiles);
- }
- moduleFiles.add(file);
- }
- }
- });
- return map;
- }
-
-
/**
* must not be called inside ReadAction
* @param files
@@ -167,58 +110,6 @@ public class CompilerUtil {
}
}
- public static void addLocaleOptions(final List<String> commandLine, final boolean launcherUsed) {
- // need to specify default encoding so that javac outputs messages in 'correct' language
- //noinspection HardCodedStringLiteral
- commandLine.add((launcherUsed? "-J" : "") + "-D" + CharsetToolkit.FILE_ENCODING_PROPERTY + "=" + CharsetToolkit.getDefaultSystemCharset().name());
- // javac's VM should use the same default locale that IDEA uses in order for javac to print messages in 'correct' language
- //noinspection HardCodedStringLiteral
- final String lang = System.getProperty("user.language");
- if (lang != null) {
- //noinspection HardCodedStringLiteral
- commandLine.add((launcherUsed? "-J" : "") + "-Duser.language=" + lang);
- }
- //noinspection HardCodedStringLiteral
- final String country = System.getProperty("user.country");
- if (country != null) {
- //noinspection HardCodedStringLiteral
- commandLine.add((launcherUsed? "-J" : "") + "-Duser.country=" + country);
- }
- //noinspection HardCodedStringLiteral
- final String region = System.getProperty("user.region");
- if (region != null) {
- //noinspection HardCodedStringLiteral
- commandLine.add((launcherUsed? "-J" : "") + "-Duser.region=" + region);
- }
- }
-
- public static void addTargetCommandLineSwitch(final ModuleChunk chunk, final List<String> commandLine) {
- String optionValue = null;
- CompilerConfiguration config = null;
- final Module[] modules = chunk.getModules();
- for (Module module : modules) {
- if (config == null) {
- config = CompilerConfiguration.getInstance(module.getProject());
- }
- final String moduleTarget = config.getBytecodeTargetLevel(module);
- if (moduleTarget == null) {
- continue;
- }
- if (optionValue == null) {
- optionValue = moduleTarget;
- }
- else {
- if (moduleTarget.compareTo(optionValue) < 0) {
- optionValue = moduleTarget; // use the lower possible target among modules that form the chunk
- }
- }
- }
- if (optionValue != null) {
- commandLine.add("-target");
- commandLine.add(optionValue);
- }
- }
-
public static void addSourceCommandLineSwitch(final Sdk jdk, LanguageLevel chunkLanguageLevel, @NonNls final List<String> commandLine) {
final String versionString = jdk.getVersionString();
if (StringUtil.isEmpty(versionString)) {
@@ -312,67 +203,4 @@ public class CompilerUtil {
public static void logDuration(final String activityName, long duration) {
LOG.info(activityName + " took " + duration + " ms: " + duration /60000 + " min " +(duration %60000)/1000 + "sec");
}
-
- public static void clearOutputDirectories(final Collection<File> outputDirectories) {
- final long start = System.currentTimeMillis();
- // do not delete directories themselves, or we'll get rootsChanged() otherwise
- final Collection<File> filesToDelete = new ArrayList<File>(outputDirectories.size() * 2);
- for (File outputDirectory : outputDirectories) {
- File[] files = outputDirectory.listFiles();
- if (files != null) {
- ContainerUtil.addAll(filesToDelete, files);
- }
- }
- if (filesToDelete.size() > 0) {
- FileUtil.asyncDelete(filesToDelete);
-
- // ensure output directories exist
- for (final File file : outputDirectories) {
- file.mkdirs();
- }
- final long clearStop = System.currentTimeMillis();
-
- refreshIODirectories(outputDirectories);
-
- final long refreshStop = System.currentTimeMillis();
-
- logDuration("Clearing output dirs", clearStop - start);
- logDuration("Refreshing output directories", refreshStop - clearStop);
- }
- }
-
- public static void computeIntersectingPaths(final Project project,
- final Collection<VirtualFile> outputPaths,
- final Collection<VirtualFile> result) {
- for (Module module : ModuleManager.getInstance(project).getModules()) {
- final ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
- final VirtualFile[] sourceRoots = rootManager.getSourceRoots();
- for (final VirtualFile outputPath : outputPaths) {
- for (VirtualFile sourceRoot : sourceRoots) {
- if (VfsUtilCore.isAncestor(outputPath, sourceRoot, true) || VfsUtilCore.isAncestor(sourceRoot, outputPath, false)) {
- result.add(outputPath);
- }
- }
- }
- }
- }
-
- public static boolean askUserToContinueWithNoClearing(Project project, Collection<VirtualFile> affectedOutputPaths) {
- final StringBuilder paths = new StringBuilder();
- for (final VirtualFile affectedOutputPath : affectedOutputPaths) {
- if (paths.length() > 0) {
- paths.append(",\n");
- }
- paths.append(affectedOutputPath.getPath().replace('/', File.separatorChar));
- }
- final int answer = Messages.showOkCancelDialog(project,
- CompilerBundle.message("warning.sources.under.output.paths", paths.toString()),
- CommonBundle.getErrorTitle(), Messages.getWarningIcon());
- if (answer == Messages.OK) { // ok
- return true;
- }
- else {
- return false;
- }
- }
}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/InternedPath.java b/java/compiler/impl/src/com/intellij/compiler/impl/InternedPath.java
deleted file mode 100644
index 7914dc29c2c1..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/InternedPath.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.compiler.impl;
-
-import com.intellij.util.StringBuilderSpinAllocator;
-import com.intellij.util.containers.StringInterner;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Eugene Zhuravlev
- * Date: Jun 21, 2006
- */
-public class InternedPath {
- private final @NotNull List<String> myValue;
-
- public InternedPath(StringInterner interner, String url, final char separator) {
- myValue = convert(interner, url, separator);
- }
-
- public String toString() {
- return join(myValue, '/');
- }
-
- public static List<String> convert(StringInterner interner, String value, char delim) {
- final List<String> result = new ArrayList<String>();
- int start = 0;
- final int len = value.length();
- for (int idx = 0; idx < len; idx++) {
- if (value.charAt(idx) == delim) {
- result.add(interner.intern(value.substring(start, idx)));
- start = idx + 1;
- }
- }
- if (start < value.length()) {
- result.add(interner.intern(value.substring(start)));
- }
- if (len > 0 && value.charAt(len-1) == delim) { // ends with delimiter
- result.add("");
- }
- return result;
- }
-
- public static String join(List<String> value, char separator) {
- final int size = value.size();
- if (size > 1) {
- final StringBuilder builder = StringBuilderSpinAllocator.alloc();
- try {
- builder.append(value.get(0));
- for (int idx = 1; idx < size; idx++) {
- builder.append(separator).append(value.get(idx));
- }
- return builder.toString();
- }
- finally {
- StringBuilderSpinAllocator.dispose(builder);
- }
- }
- else if (size == 1){
- return value.get(0);
- }
- return "";
- }
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/OutputPathFinder.java b/java/compiler/impl/src/com/intellij/compiler/impl/OutputPathFinder.java
deleted file mode 100644
index 6a712d131711..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/OutputPathFinder.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.compiler.impl;
-
-import com.intellij.openapi.util.Pair;
-import com.intellij.openapi.util.io.FileUtil;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Eugene Zhuravlev
- * Date: Apr 6, 2009
- */
-public class OutputPathFinder {
- private final Node myRoot = new Node("");
-
- public OutputPathFinder(Set<File> outputDirs) {
- for (File dir : outputDirs) {
- final String path = FileUtil.toSystemIndependentName(dir.getPath());
- Node node = myRoot;
- int idx = path.startsWith("/")? 1 : 0;
- int slashIndex = path.indexOf('/', idx);
-
- for (; slashIndex >= 0; slashIndex = path.indexOf('/', idx)) {
- final String name = path.substring(idx, slashIndex);
- node = node.addChild(name);
- idx = slashIndex + 1;
- }
-
- if (idx < path.length()) {
- node = node.addChild(path.substring(idx));
- }
-
- node.setData(path);
- }
- }
-
- @Nullable
- public String lookupOutputPath(File outputFile) {
- return lookupOutputPath(outputFile.getPath());
- }
-
- @Nullable
- public String lookupOutputPath(String filePath) {
- final String path = FileUtil.toSystemIndependentName(filePath);
- Node node = myRoot;
- int idx = path.startsWith("/")? 1 : 0;
-
- return findOutputPath(path, idx, node);
- }
-
- private static @Nullable String findOutputPath(final String path, int idx, Node node) {
- while (true) {
- final int slashIndex = path.indexOf('/', idx);
- final String name = slashIndex < idx? path.substring(idx) : path.substring(idx, slashIndex);
- node = node.getChild(name);
- if (node == null) {
- return null;
- }
- if (node.isOutputRoot()) {
- if (node.hasChildren() && slashIndex > idx) {
- final String candidate = findOutputPath(path, slashIndex + 1, node);
- if (candidate != null) {
- return candidate;
- }
- }
- return node.getData();
- }
- if (slashIndex < 0) {
- return null; // end of path reached
- }
- idx = slashIndex + 1;
- }
- }
-
- private static class Node {
- private final String myName;
- @Nullable
- private Object myChildren; // either a Node or a Map<String, Node> or a String or a Pair<String, Node or NodeMap>
-
- private Node(String name) {
- myName = name;
- }
-
- public String getName() {
- return myName;
- }
-
- public boolean isOutputRoot() {
- return myChildren instanceof String || myChildren instanceof Pair;
- }
-
- public boolean hasChildren() {
- return myChildren instanceof Map || myChildren instanceof Pair;
- }
-
- @Nullable
- public String getData() {
- if (myChildren instanceof String) {
- return (String)myChildren;
- }
- if (myChildren instanceof Pair) {
- //noinspection unchecked
- return (String)((Pair)myChildren).first;
- }
- return null;
- }
-
- public void setData(String path) {
- if (myChildren != null) {
- if (myChildren instanceof String) {
- myChildren = path;
- }
- else {
- myChildren = new Pair(path, myChildren instanceof Pair? ((Pair)myChildren).second : myChildren);
- }
- }
- else {
- myChildren = path;
- }
- }
-
- public Node addChild(String childName) {
- if (myChildren == null) {
- final Node node = new Node(childName);
- myChildren = node;
- return node;
- }
- if (myChildren instanceof String) {
- final Node node = new Node(childName);
- myChildren = new Pair(myChildren, node);
- return node;
- }
-
- final Map<String, Node> map;
- if (myChildren instanceof Map) {
- map = (Map<String, Node>)myChildren;
- }
- else if (myChildren instanceof Node) {
- final Node existingChild = (Node)myChildren;
- myChildren = map = new HashMap<String, Node>();
- map.put(existingChild.getName(), existingChild);
- }
- else { // myChildren is a Pair
- Object children = ((Pair)myChildren).second;
- if (children instanceof Map) {
- map = (Map<String, Node>)children;
- }
- else {
- final Node existingChild = (Node)children;
- myChildren = new Pair(((Pair)myChildren).first, map = new HashMap<String, Node>());
- map.put(existingChild.getName(), existingChild);
- }
- }
-
- Node node = map.get(childName);
- if (node == null) {
- map.put(childName, node = new Node(childName));
- }
- return node;
- }
-
- @Nullable
- public Node getChild(String childName) {
- final Object children = myChildren instanceof Pair? ((Pair)myChildren).second : myChildren;
- if (children instanceof Node) {
- final Node childNode = (Node)children;
- return childName.equals(childNode.getName())? childNode : null;
- }
- if (children instanceof Map) {
- return ((Map<String, Node>)myChildren).get(childName);
- }
- return null;
- }
- }
-
-
- public static void main(String[] args) {
- final Set<File> set = new HashSet<File>();
- set.add(new File("/a/b/c"));
- set.add(new File("a/b/d"));
- set.add(new File("a/b/e"));
- set.add(new File("/a/b/f/g"));
- set.add(new File("/a/b/f/g/zzz"));
-
- final OutputPathFinder finder = new OutputPathFinder(set);
-
- System.out.println(finder.lookupOutputPath(new File("a/b")));
- System.out.println(finder.lookupOutputPath(new File("a/b/c/dir1/dir2/File.class")));
- System.out.println(finder.lookupOutputPath(new File("a/b/d/dir1/dir2/File.class")));
- System.out.println(finder.lookupOutputPath(new File("a/b/jjjjj/dir1/dir2/File.class")));
- System.out.println(finder.lookupOutputPath(new File("a/b/e/File.class")));
- System.out.println(finder.lookupOutputPath(new File("a/b/File.class")));
-
- System.out.println(finder.lookupOutputPath(new File("/a/b/f/g/File.class")));
- System.out.println(finder.lookupOutputPath(new File("/a/b/f/g/ttt/yy/File.class")));
- System.out.println(finder.lookupOutputPath(new File("/a/b/f/g/zzz/File.class")));
- System.out.println(finder.lookupOutputPath(new File("/a/b/f/g/zzz/mmm/ttt/File.class")));
-
- }
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/PackagingCompilerAdapter.java b/java/compiler/impl/src/com/intellij/compiler/impl/PackagingCompilerAdapter.java
deleted file mode 100644
index d2f7826a1704..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/PackagingCompilerAdapter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.compiler.impl;
-
-import com.intellij.openapi.compiler.CompileContext;
-import com.intellij.openapi.compiler.PackagingCompiler;
-import com.intellij.openapi.compiler.ValidityState;
-import org.jetbrains.annotations.Nullable;
-
-public class PackagingCompilerAdapter extends FileProcessingCompilerAdapter{
- private final PackagingCompiler myCompiler;
-
- public PackagingCompilerAdapter(CompileContext compileContext, PackagingCompiler compiler) {
- super(compileContext, compiler);
- myCompiler = compiler;
- }
-
- public void processOutdatedItem(CompileContext context, String url, @Nullable ValidityState state) {
- myCompiler.processOutdatedItem(context, url, state);
- }
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ModuleChunk.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ModuleChunk.java
deleted file mode 100644
index 513c5dad5102..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ModuleChunk.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.compiler.impl.javaCompiler;
-
-import com.intellij.compiler.CompilerConfiguration;
-import com.intellij.compiler.CompilerConfigurationImpl;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.ex.CompileContextEx;
-import com.intellij.openapi.module.EffectiveLanguageLevelUtil;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.projectRoots.Sdk;
-import com.intellij.openapi.roots.JdkOrderEntry;
-import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.roots.OrderEntry;
-import com.intellij.openapi.roots.OrderEnumerator;
-import com.intellij.openapi.util.Computable;
-import com.intellij.openapi.util.Condition;
-import com.intellij.openapi.vfs.VfsUtil;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.pom.java.LanguageLevel;
-import com.intellij.util.Chunk;
-import com.intellij.util.PathsList;
-import com.intellij.util.StringBuilderSpinAllocator;
-import com.intellij.util.containers.ContainerUtil;
-import com.intellij.util.containers.OrderedSet;
-import gnu.trove.THashMap;
-import org.jetbrains.annotations.NotNull;
-
-import java.io.File;
-import java.util.*;
-
-/**
- * @author Eugene Zhuravlev
- * Date: Sep 29, 2004
- */
-public class ModuleChunk extends Chunk<Module> {
- private final CompileContextEx myContext;
- private final Map<Module, List<VirtualFile>> myModuleToFilesMap = new THashMap<Module, List<VirtualFile>>();
- private final Map<VirtualFile, VirtualFile> myTransformedToOriginalMap = new THashMap<VirtualFile, VirtualFile>();
- private int mySourcesFilter = ALL_SOURCES;
-
- public ModuleChunk(CompileContextEx context, Chunk<Module> chunk, Map<Module, List<VirtualFile>> moduleToFilesMap) {
- super(chunk.getNodes());
- myContext = context;
- for (final Module module : chunk.getNodes()) {
- final List<VirtualFile> files = moduleToFilesMap.get(module);
- // Important!!! Collections in the myModuleToFilesMap must be modifiable copies of the corresponding collections
- // from the moduleToFilesMap. This is needed to support SourceTransforming compilers
- myModuleToFilesMap.put(module, files == null ? Collections.<VirtualFile>emptyList() : new ArrayList<VirtualFile>(files));
- }
- }
-
- public static final int SOURCES = 0x1;
- public static final int TEST_SOURCES = 0x2;
- public static final int ALL_SOURCES = SOURCES | TEST_SOURCES;
-
- public void setSourcesFilter(int filter) {
- mySourcesFilter = filter;
- }
-
- public int getSourcesFilter() {
- return mySourcesFilter;
- }
-
- public void substituteWithTransformedVersion(Module module, int fileIndex, VirtualFile transformedFile) {
- final List<VirtualFile> moduleFiles = getFilesToCompile(module);
- final VirtualFile currentFile = moduleFiles.get(fileIndex);
- moduleFiles.set(fileIndex, transformedFile);
- VirtualFile originalFile = myTransformedToOriginalMap.remove(currentFile);
- if (originalFile == null) {
- originalFile = currentFile;
- }
- myTransformedToOriginalMap.put(transformedFile, originalFile);
- }
-
- public VirtualFile getOriginalFile(VirtualFile file) {
- final VirtualFile original = myTransformedToOriginalMap.get(file);
- return original != null? original : file;
- }
-
- @NotNull
- public List<VirtualFile> getFilesToCompile(Module forModule) {
- return myModuleToFilesMap.get(forModule);
- }
-
- @NotNull
- public List<VirtualFile> getFilesToCompile() {
- if (getModuleCount() == 0) {
- return Collections.emptyList();
- }
- final Set<Module> modules = getNodes();
-
- final List<VirtualFile> filesToCompile = new ArrayList<VirtualFile>();
- for (final Module module : modules) {
- final List<VirtualFile> moduleCompilableFiles = getFilesToCompile(module);
- if (mySourcesFilter == ALL_SOURCES) {
- filesToCompile.addAll(moduleCompilableFiles);
- }
- else {
- for (final VirtualFile file : moduleCompilableFiles) {
- VirtualFile originalFile = myTransformedToOriginalMap.get(file);
- if (originalFile == null) {
- originalFile = file;
- }
- if (mySourcesFilter == TEST_SOURCES) {
- if (myContext.isInTestSourceContent(originalFile)) {
- filesToCompile.add(file);
- }
- }
- else {
- if (!myContext.isInTestSourceContent(originalFile)) {
- filesToCompile.add(file);
- }
- }
- }
- }
- }
- return filesToCompile;
- }
-
- /**
- * @return the jdk. Assumes that the jdk is the same for all modules
- */
- public Sdk getJdk() {
- final Module module = getNodes().iterator().next();
- return ModuleRootManager.getInstance(module).getSdk();
- }
-
- public VirtualFile[] getSourceRoots() {
- return getSourceRoots(mySourcesFilter);
- }
-
- private VirtualFile[] getSourceRoots(final int sourcesFilter) {
- return ApplicationManager.getApplication().runReadAction(new Computable<VirtualFile[]>() {
- public VirtualFile[] compute() {
- return filterRoots(getAllSourceRoots(), getNodes().iterator().next().getProject(), sourcesFilter);
- }
- });
- }
-
- public VirtualFile[] getSourceRoots(final Module module) {
- if (!getNodes().contains(module)) {
- return VirtualFile.EMPTY_ARRAY;
- }
- return ApplicationManager.getApplication().runReadAction(new Computable<VirtualFile[]>() {
- public VirtualFile[] compute() {
- return filterRoots(myContext.getSourceRoots(module), module.getProject(), mySourcesFilter);
- }
- });
- }
-
- private VirtualFile[] filterRoots(VirtualFile[] roots, Project project, final int sourcesFilter) {
- final List<VirtualFile> filteredRoots = new ArrayList<VirtualFile>(roots.length);
- final CompilerConfigurationImpl compilerConfiguration = (CompilerConfigurationImpl)CompilerConfiguration.getInstance(project);
- for (final VirtualFile root : roots) {
- if (sourcesFilter != ALL_SOURCES) {
- if (myContext.isInTestSourceContent(root)) {
- if ((sourcesFilter & TEST_SOURCES) == 0) {
- continue;
- }
- }
- else {
- if ((sourcesFilter & SOURCES) == 0) {
- continue;
- }
- }
- }
- if (compilerConfiguration.isExcludedFromCompilation(root)) {
- continue;
- }
- filteredRoots.add(root);
- }
- return VfsUtil.toVirtualFileArray(filteredRoots);
- }
-
- private VirtualFile[] getAllSourceRoots() {
- final Set<Module> modules = getNodes();
- Set<VirtualFile> roots = new HashSet<VirtualFile>();
- for (final Module module : modules) {
- ContainerUtil.addAll(roots, myContext.getSourceRoots(module));
- }
- return VfsUtil.toVirtualFileArray(roots);
- }
-
- public String getCompilationClasspath() {
- final OrderedSet<VirtualFile> cpFiles = getCompilationClasspathFiles();
- return convertToStringPath(cpFiles);
-
- }
-
- public OrderedSet<VirtualFile> getCompilationClasspathFiles() {
- return getCompilationClasspathFiles(true);
- }
-
- public OrderedSet<VirtualFile> getCompilationClasspathFiles(final boolean exportedOnly) {
- final Set<Module> modules = getNodes();
-
- OrderedSet<VirtualFile> cpFiles = new OrderedSet<VirtualFile>();
- for (final Module module : modules) {
- Collections.addAll(cpFiles, orderEnumerator(module, exportedOnly, new AfterJdkOrderEntryCondition()).getClassesRoots());
- }
- return cpFiles;
- }
-
- private OrderEnumerator orderEnumerator(Module module, boolean exportedOnly, Condition<OrderEntry> condition) {
- OrderEnumerator enumerator = OrderEnumerator.orderEntries(module).compileOnly().satisfying(condition);
- if ((mySourcesFilter & TEST_SOURCES) == 0) {
- enumerator = enumerator.productionOnly();
- }
- enumerator = enumerator.recursively();
- return exportedOnly ? enumerator.exportedOnly() : enumerator;
- }
-
- public String getCompilationBootClasspath() {
- return convertToStringPath(getCompilationBootClasspathFiles());
- }
-
- public OrderedSet<VirtualFile> getCompilationBootClasspathFiles() {
- return getCompilationBootClasspathFiles(true);
- }
-
- public OrderedSet<VirtualFile> getCompilationBootClasspathFiles(final boolean exportedOnly) {
- final Set<Module> modules = getNodes();
- final OrderedSet<VirtualFile> cpFiles = new OrderedSet<VirtualFile>();
- final OrderedSet<VirtualFile> jdkFiles = new OrderedSet<VirtualFile>();
- for (final Module module : modules) {
- Collections.addAll(cpFiles, orderEnumerator(module, exportedOnly, new BeforeJdkOrderEntryCondition(module)).getClassesRoots());
- Collections.addAll(jdkFiles, OrderEnumerator.orderEntries(module).sdkOnly().getClassesRoots());
- }
- cpFiles.addAll(jdkFiles);
- return cpFiles;
- }
-
- private static String convertToStringPath(final OrderedSet<VirtualFile> cpFiles) {
- PathsList classpath = new PathsList();
- classpath.addVirtualFiles(cpFiles);
- return classpath.getPathsString();
- }
-
- //private String tryZipFor(String outputDir) {
- // final File zip = CompilerPathsEx.getZippedOutputPath(myContext.getProject(), outputDir);
- // if (zip.exists()) {
- // try {
- // myContext.commitZip(outputDir); // flush unsaved data if any
- // }
- // catch (IOException e) {
- // LOG.info(e);
- // }
- // return zip.getPath();
- // }
- // return outputDir;
- //}
-
- public int getModuleCount() {
- return getNodes().size();
- }
-
- public Module[] getModules() {
- final Set<Module> nodes = getNodes();
- return nodes.toArray(new Module[nodes.size()]);
- }
-
- public String getSourcePath() {
- return getSourcePath(mySourcesFilter);
- }
-
- public String getSourcePath(final int sourcesFilter) {
- if (getModuleCount() == 0) {
- return "";
- }
- final VirtualFile[] filteredRoots = getSourceRoots(sourcesFilter);
- final StringBuilder buffer = StringBuilderSpinAllocator.alloc();
- try {
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- public void run() {
- for (VirtualFile root : filteredRoots) {
- if (buffer.length() > 0) {
- buffer.append(File.pathSeparatorChar);
- }
- buffer.append(root.getPath().replace('/', File.separatorChar));
- }
- }
- });
- return buffer.toString();
- }
- finally {
- StringBuilderSpinAllocator.dispose(buffer);
- }
- }
-
- //the check for equal language levels is done elsewhere
- public LanguageLevel getLanguageLevel() {
- return EffectiveLanguageLevelUtil.getEffectiveLanguageLevel(getNodes().iterator().next());
- }
-
- public Project getProject() {
- return myContext.getProject();
- }
-
- private static class BeforeJdkOrderEntryCondition implements Condition<OrderEntry> {
- private boolean myJdkFound;
- private final Module myOwnerModule;
-
- private BeforeJdkOrderEntryCondition(Module ownerModule) {
- myOwnerModule = ownerModule;
- }
-
- @Override
- public boolean value(OrderEntry orderEntry) {
- if (orderEntry instanceof JdkOrderEntry && myOwnerModule.equals(orderEntry.getOwnerModule())) {
- myJdkFound = true;
- }
- return !myJdkFound;
- }
- }
-
- private static class AfterJdkOrderEntryCondition implements Condition<OrderEntry> {
- private boolean myJdkFound;
-
- @Override
- public boolean value(OrderEntry orderEntry) {
- if (orderEntry instanceof JdkOrderEntry) {
- myJdkFound = true;
- return false;
- }
- return myJdkFound;
- }
- }
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/eclipse/EclipseSettingsBuilder.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/eclipse/EclipseSettingsBuilder.java
deleted file mode 100644
index 7748223d0eac..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/eclipse/EclipseSettingsBuilder.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2000-2012 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.compiler.impl.javaCompiler.eclipse;
-
-import com.intellij.compiler.impl.javaCompiler.javac.JavacSettingsBuilder;
-import com.intellij.openapi.module.Module;
-import com.intellij.util.Chunk;
-import org.jetbrains.jps.model.java.compiler.EclipseCompilerOptions;
-
-import java.util.Collection;
-
-/**
- * @author Eugene Zhuravlev
- * Date: 9/27/12
- */
-public class EclipseSettingsBuilder extends JavacSettingsBuilder {
- public EclipseSettingsBuilder(final EclipseCompilerOptions options) {
- super(options);
- }
-
- @Override
- public EclipseCompilerOptions getOptions() {
- return (EclipseCompilerOptions)super.getOptions();
- }
-
- @Override
- public Collection<String> getOptions(Chunk<Module> chunk) {
- final Collection<String> options = super.getOptions(chunk);
- if (getOptions().PROCEED_ON_ERROR) {
- options.add("-proceedOnError");
- }
- return options;
- }
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacSettingsBuilder.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacSettingsBuilder.java
deleted file mode 100644
index 7be8e1da9fd4..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacSettingsBuilder.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.compiler.impl.javaCompiler.javac;
-
-import com.intellij.compiler.CompilerEncodingService;
-import com.intellij.compiler.impl.javaCompiler.ModuleChunk;
-import com.intellij.openapi.module.Module;
-import com.intellij.util.Chunk;
-import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerOptions;
-
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.StringTokenizer;
-
-public class JavacSettingsBuilder {
- private final JpsJavaCompilerOptions myOptions;
-
- public JavacSettingsBuilder(JpsJavaCompilerOptions options) {
- myOptions = options;
- }
-
- protected JpsJavaCompilerOptions getOptions() {
- return myOptions;
- }
-
- public Collection<String> getOptions(Chunk<Module> chunk) {
- List<String> options = new ArrayList<String>();
- if (getOptions().DEBUGGING_INFO) {
- options.add("-g");
- }
- if (getOptions().DEPRECATION) {
- options.add("-deprecation");
- }
- if (getOptions().GENERATE_NO_WARNINGS) {
- options.add("-nowarn");
- }
- boolean isEncodingSet = false;
- final StringTokenizer tokenizer = new StringTokenizer(getOptions().ADDITIONAL_OPTIONS_STRING, " \t\r\n");
- while(tokenizer.hasMoreTokens()) {
- final String token = tokenizer.nextToken();
- if(!acceptUserOption(token)) {
- continue;
- }
- options.add(token);
- if ("-encoding".equals(token)) {
- isEncodingSet = true;
- }
- }
- if (!isEncodingSet && acceptEncoding()) {
- final Charset charset = CompilerEncodingService.getPreferredModuleEncoding(chunk);
- if (charset != null) {
- options.add("-encoding");
- options.add(charset.name());
- }
- }
- return options;
- }
-
- protected boolean acceptUserOption(String token) {
- return !("-g".equals(token) || "-deprecation".equals(token) || "-nowarn".equals(token));
- }
-
- protected boolean acceptEncoding() {
- return true;
- }
-
- public String getOptionsString(final ModuleChunk chunk) {
- final StringBuilder options = new StringBuilder();
- for (String option : getOptions(chunk)) {
- if (options.length() > 0) {
- options.append(" ");
- }
- options.append(option);
- }
- return options.toString();
- }
-} \ No newline at end of file
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/BuildInstructionBase.java b/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/BuildInstructionBase.java
deleted file mode 100644
index 446dd2e37b28..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/BuildInstructionBase.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @author cdr
- */
-package com.intellij.compiler.impl.packagingCompiler;
-
-import com.intellij.openapi.compiler.make.BuildInstruction;
-import com.intellij.openapi.util.UserDataHolderBase;
-import com.intellij.openapi.util.io.FileUtil;
-import gnu.trove.THashSet;
-import org.jetbrains.annotations.NonNls;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-
-public abstract class BuildInstructionBase extends UserDataHolderBase implements BuildInstruction, Cloneable {
- private final String myOutputRelativePath;
- private Collection<File> myFilesToDelete;
-
- protected BuildInstructionBase(String outputRelativePath) {
- myOutputRelativePath = outputRelativePath;
- }
-
- public String getOutputRelativePath() {
- return myOutputRelativePath;
- }
-
- public BuildInstructionBase clone() {
- return (BuildInstructionBase)super.clone();
- }
-
- public void addFileToDelete(File file) {
- if (myFilesToDelete == null) {
- myFilesToDelete = new THashSet<File>();
- }
- myFilesToDelete.add(file);
- }
-
- public void collectFilesToDelete(Collection<File> filesToDelete) {
- if (myFilesToDelete != null) {
- filesToDelete.addAll(myFilesToDelete);
- }
- myFilesToDelete = null;
- }
-
- @NonNls
- public String toString() {
- return super.toString();
- }
-
- protected File createTempFile(final String prefix, final String suffix) throws IOException {
- final File tempFile = FileUtil.createTempFile(prefix + "___", suffix);
- addFileToDelete(tempFile);
- return tempFile;
- }
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/DependentJarsEvaluator.java b/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/DependentJarsEvaluator.java
deleted file mode 100644
index 9fa4e2c63de9..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/DependentJarsEvaluator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.intellij.compiler.impl.packagingCompiler;
-
-import com.intellij.openapi.util.Pair;
-
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-/**
- * @author nik
- */
-public class DependentJarsEvaluator {
- private final Set<JarInfo> myJars = new LinkedHashSet<JarInfo>();
-
- public void addJarWithDependencies(final JarInfo jarInfo) {
- if (myJars.add(jarInfo)) {
- for (JarDestinationInfo destination : jarInfo.getJarDestinations()) {
- addJarWithDependencies(destination.getJarInfo());
- }
- for (Pair<String, JarInfo> pair : jarInfo.getPackedJars()) {
- addJarWithDependencies(pair.getSecond());
- }
- }
- }
-
- public Set<JarInfo> getJars() {
- return myJars;
- }
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/DestinationInfo.java b/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/DestinationInfo.java
deleted file mode 100644
index abda98227402..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/DestinationInfo.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.compiler.impl.packagingCompiler;
-
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * @author nik
- */
-public abstract class DestinationInfo {
- private VirtualFile myOutputFile;
- private final String myOutputPath;
- private final String myOutputFilePath;
-
- protected DestinationInfo(@NotNull final String outputPath, @Nullable final VirtualFile outputFile, @NotNull String outputFilePath) {
- myOutputFilePath = outputFilePath;
- myOutputFile = outputFile;
- myOutputPath = outputPath;
- }
-
- @NotNull
- public String getOutputPath() {
- return myOutputPath;
- }
-
- @Nullable
- public VirtualFile getOutputFile() {
- return myOutputFile;
- }
-
- @NotNull
- public String getOutputFilePath() {
- return myOutputFilePath;
- }
-
- public void update() {
- if (myOutputFile != null && !myOutputFile.isValid()) {
- myOutputFile = null;
- }
- if (myOutputFile == null) {
- myOutputFile = LocalFileSystem.getInstance().findFileByPath(myOutputFilePath);
- }
- }
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/FileCopyInstructionImpl.java b/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/FileCopyInstructionImpl.java
deleted file mode 100644
index 64b58555f151..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/FileCopyInstructionImpl.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.compiler.impl.packagingCompiler;
-
-import com.intellij.openapi.compiler.make.BuildInstructionVisitor;
-import com.intellij.openapi.compiler.make.FileCopyInstruction;
-import com.intellij.openapi.util.io.FileUtil;
-
-import java.io.File;
-
-public class FileCopyInstructionImpl extends BuildInstructionBase implements FileCopyInstruction {
- private File myFile;
- private boolean myIsDirectory;
-
- public FileCopyInstructionImpl(File source, boolean isDirectory, String outputRelativePath) {
- super(outputRelativePath);
- setFile(source, isDirectory);
- }
-
- public boolean accept(BuildInstructionVisitor visitor) throws Exception {
- return visitor.visitFileCopyInstruction(this);
- }
-
- public String toString() {
- return "Copy " + getFile() + "->" + getOutputRelativePath();
- }
-
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof FileCopyInstruction)) return false;
-
- final FileCopyInstruction item = (FileCopyInstruction) o;
-
- if (getFile() != null ? !FileUtil.filesEqual(getFile(), item.getFile()) : item.getFile() != null) return false;
-
- if (getOutputRelativePath() != null) {
- if (!getOutputRelativePath().equals( item.getOutputRelativePath() )) return false;
- } else if ( item.getOutputRelativePath() != null ) {
- return false;
- }
-
- return true;
- }
-
- public int hashCode() {
- return (getFile() != null ? getFile().hashCode() : 0) +
- (getOutputRelativePath() != null ? getOutputRelativePath().hashCode():0);
- }
-
- public File getFile() {
- return myFile;
- }
-
- public boolean isDirectory() {
- return myIsDirectory;
- }
-
- private void setFile(File file, boolean isDirectory) {
- myFile = file;
- myIsDirectory = isDirectory;
- }
-
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarDestinationInfo.java b/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarDestinationInfo.java
deleted file mode 100644
index 5cc45c19278e..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarDestinationInfo.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.intellij.compiler.impl.packagingCompiler;
-
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.JarFileSystem;
-
-/**
- * @author nik
- */
-public class JarDestinationInfo extends DestinationInfo {
- private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.impl.packagingCompiler.JarDestinationInfo");
- private final String myPathInJar;
- private final JarInfo myJarInfo;
-
- public JarDestinationInfo(final String pathInJar, final JarInfo jarInfo, DestinationInfo jarDestination) {
- super(appendPathInJar(jarDestination.getOutputPath(), pathInJar), jarDestination.getOutputFile(), jarDestination.getOutputFilePath());
- LOG.assertTrue(!pathInJar.startsWith(".."), pathInJar);
- myPathInJar = StringUtil.startsWithChar(pathInJar, '/') ? pathInJar : "/" + pathInJar;
- myJarInfo = jarInfo;
- }
-
- private static String appendPathInJar(String outputPath, String pathInJar) {
- LOG.assertTrue(outputPath.length() > 0 && outputPath.charAt(outputPath.length() - 1) != '/');
- LOG.assertTrue(pathInJar.length() > 0 && pathInJar.charAt(0) != '/');
- return outputPath + JarFileSystem.JAR_SEPARATOR + pathInJar;
- }
-
- public String getPathInJar() {
- return myPathInJar;
- }
-
- public JarInfo getJarInfo() {
- return myJarInfo;
- }
-
- public String toString() {
- return myPathInJar + "(" + getOutputPath() + ")";
- }
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarInfo.java b/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarInfo.java
deleted file mode 100644
index 7626ca13469b..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarInfo.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.intellij.compiler.impl.packagingCompiler;
-
-import com.intellij.openapi.util.Pair;
-import com.intellij.openapi.vfs.VirtualFile;
-
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-/**
- * @author nik
- */
-public class JarInfo {
- private final List<Pair<String, VirtualFile>> myPackedFiles;
- private final LinkedHashSet<Pair<String, JarInfo>> myPackedJars;
- private final List<DestinationInfo> myDestinations;
-
- public JarInfo() {
- myDestinations = new ArrayList<DestinationInfo>();
- myPackedFiles = new ArrayList<Pair<String, VirtualFile>>();
- myPackedJars = new LinkedHashSet<Pair<String, JarInfo>>();
- }
-
- public void addDestination(DestinationInfo info) {
- myDestinations.add(info);
- if (info instanceof JarDestinationInfo) {
- JarDestinationInfo destinationInfo = (JarDestinationInfo)info;
- destinationInfo.getJarInfo().myPackedJars.add(Pair.create(destinationInfo.getPathInJar(), this));
- }
- }
-
- public void addContent(String pathInJar, VirtualFile sourceFile) {
- myPackedFiles.add(Pair.create(pathInJar, sourceFile));
- }
-
- public List<Pair<String, VirtualFile>> getPackedFiles() {
- return myPackedFiles;
- }
-
- public LinkedHashSet<Pair<String, JarInfo>> getPackedJars() {
- return myPackedJars;
- }
-
- public List<JarDestinationInfo> getJarDestinations() {
- final ArrayList<JarDestinationInfo> list = new ArrayList<JarDestinationInfo>();
- for (DestinationInfo destination : myDestinations) {
- if (destination instanceof JarDestinationInfo) {
- list.add((JarDestinationInfo)destination);
- }
- }
- return list;
- }
-
- public List<DestinationInfo> getAllDestinations() {
- return myDestinations;
- }
-
- public String getPresentableDestination() {
- return !myDestinations.isEmpty() ? myDestinations.get(0).getOutputPath() : "";
- }
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarsBuilder.java b/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarsBuilder.java
deleted file mode 100644
index c543abe674cc..000000000000
--- a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/JarsBuilder.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright 2000-2014 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.intellij.compiler.impl.packagingCompiler;
-
-import com.intellij.openapi.compiler.CompileContext;
-import com.intellij.openapi.compiler.CompilerBundle;
-import com.intellij.openapi.compiler.CompilerMessageCategory;
-import com.intellij.openapi.deployment.DeploymentUtil;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.util.Couple;
-import com.intellij.openapi.util.Pair;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.VfsUtil;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.packaging.impl.compiler.ArtifactCompilerUtil;
-import com.intellij.util.ArrayUtil;
-import com.intellij.util.graph.CachingSemiGraph;
-import com.intellij.util.graph.DFSTBuilder;
-import com.intellij.util.graph.GraphGenerator;
-import com.intellij.util.io.ZipUtil;
-import gnu.trove.THashSet;
-import org.jetbrains.annotations.NonNls;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.*;
-import java.util.*;
-import java.util.jar.JarFile;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-/**
- * @author nik
- */
-public class JarsBuilder {
- private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.impl.packagingCompiler.JarsBuilder");
- private final Set<JarInfo> myJarsToBuild;
- private final FileFilter myFileFilter;
- private final CompileContext myContext;
- private Map<JarInfo, File> myBuiltJars;
-
- public JarsBuilder(Set<JarInfo> jarsToBuild, FileFilter fileFilter, CompileContext context) {
- DependentJarsEvaluator evaluator = new DependentJarsEvaluator();
- for (JarInfo jarInfo : jarsToBuild) {
- evaluator.addJarWithDependencies(jarInfo);
- }
- myJarsToBuild = evaluator.getJars();
- myFileFilter = fileFilter;
- myContext = context;
- }
-
- public boolean buildJars(Set<String> writtenPaths) throws IOException {
- myContext.getProgressIndicator().setText(CompilerBundle.message("packaging.compiler.message.building.archives"));
-
- final JarInfo[] sortedJars = sortJars();
- if (sortedJars == null) {
- return false;
- }
-
- myBuiltJars = new HashMap<JarInfo, File>();
- try {
- for (JarInfo jar : sortedJars) {
- myContext.getProgressIndicator().checkCanceled();
- buildJar(jar);
- }
-
- myContext.getProgressIndicator().setText(CompilerBundle.message("packaging.compiler.message.copying.archives"));
- copyJars(writtenPaths);
- }
- finally {
- deleteTemporaryJars();
- }
-
-
- return true;
- }
-
- private void deleteTemporaryJars() {
- for (File file : myBuiltJars.values()) {
- FileUtil.delete(file);
- }
- }
-
- private void copyJars(final Set<String> writtenPaths) throws IOException {
- for (Map.Entry<JarInfo, File> entry : myBuiltJars.entrySet()) {
- File fromFile = entry.getValue();
- boolean first = true;
- for (DestinationInfo destination : entry.getKey().getAllDestinations()) {
- if (destination instanceof ExplodedDestinationInfo) {
- File toFile = new File(FileUtil.toSystemDependentName(destination.getOutputPath()));
-
- if (first) {
- first = false;
- renameFile(fromFile, toFile, writtenPaths);
- fromFile = toFile;
- }
- else {
- DeploymentUtil.getInstance().copyFile(fromFile, toFile, myContext, writtenPaths, myFileFilter);
- }
-
- }
- }
- }
- }
-
- private static void renameFile(final File fromFile, final File toFile, final Set<String> writtenPaths) throws IOException {
- FileUtil.rename(fromFile, toFile);
- writtenPaths.add(toFile.getPath());
- }
-
- @Nullable
- private JarInfo[] sortJars() {
- final DFSTBuilder<JarInfo> builder = new DFSTBuilder<JarInfo>(GraphGenerator.create(CachingSemiGraph.create(new JarsGraph())));
- if (!builder.isAcyclic()) {
- final Couple<JarInfo> dependency = builder.getCircularDependency();
- String message = CompilerBundle.message("packaging.compiler.error.cannot.build.circular.dependency.found.between.0.and.1",
- dependency.getFirst().getPresentableDestination(),
- dependency.getSecond().getPresentableDestination());
- myContext.addMessage(CompilerMessageCategory.ERROR, message, null, -1, -1);
- return null;
- }
-
- JarInfo[] jars = myJarsToBuild.toArray(new JarInfo[myJarsToBuild.size()]);
- Arrays.sort(jars, builder.comparator());
- jars = ArrayUtil.reverseArray(jars);
- return jars;
- }
-
- public Set<JarInfo> getJarsToBuild() {
- return myJarsToBuild;
- }
-
- private void buildJar(final JarInfo jar) throws IOException {
- if (jar.getPackedFiles().isEmpty() && jar.getPackedJars().isEmpty()) {
- myContext.addMessage(CompilerMessageCategory.WARNING, "Archive '" + jar.getPresentableDestination() + "' has no files so it won't be created", null, -1, -1);
- return;
- }
-
- myContext.getProgressIndicator()
- .setText(CompilerBundle.message("packaging.compiler.message.building.0", jar.getPresentableDestination()));
- File jarFile = FileUtil.createTempFile("artifactCompiler", "tmp");
- myBuiltJars.put(jar, jarFile);
-
- FileUtil.createParentDirs(jarFile);
-
- VirtualFile manifestFile = null;
- for (Pair<String, VirtualFile> pair : jar.getPackedFiles()) {
- if (pair.getFirst().equals(JarFile.MANIFEST_NAME)) {
- manifestFile = pair.getSecond();
- }
- }
- final JarOutputStream jarOutputStream = createJarOutputStream(jarFile, manifestFile);
-
- try {
- final THashSet<String> writtenPaths = new THashSet<String>();
- for (Pair<String, VirtualFile> pair : jar.getPackedFiles()) {
- if (pair.getFirst().equals(JarFile.MANIFEST_NAME)) continue;
- final VirtualFile sourceFile = pair.getSecond();
- if (sourceFile.isInLocalFileSystem()) {
- File file = VfsUtil.virtualToIoFile(sourceFile);
- addFileToJar(jarOutputStream, file, pair.getFirst(), writtenPaths);
- }
- else {
- extractFileAndAddToJar(jarOutputStream, sourceFile, pair.getFirst(), writtenPaths);
- }
- }
-
- for (Pair<String, JarInfo> nestedJar : jar.getPackedJars()) {
- File nestedJarFile = myBuiltJars.get(nestedJar.getSecond());
- if (nestedJarFile != null) {
- addFileToJar(jarOutputStream, nestedJarFile, nestedJar.getFirst(), writtenPaths);
- }
- else {
- LOG.debug("nested jar file " + nestedJar.getFirst() + " for " + jar.getPresentableDestination() + " not found");
- }
- }
- }
- finally {
- jarOutputStream.close();
- }
- }
-
- private static JarOutputStream createJarOutputStream(File jarFile, VirtualFile manifestFile) throws IOException {
- final BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(jarFile));
- final JarOutputStream jarOutputStream;
- if (manifestFile != null) {
- final InputStream manifestStream = manifestFile.getInputStream();
- try {
- jarOutputStream = new JarOutputStream(outputStream, new Manifest(manifestStream));
- }
- finally {
- manifestStream.close();
- }
- }
- else {
- jarOutputStream = new JarOutputStream(outputStream);
- }
- return jarOutputStream;
- }
-
- private void extractFileAndAddToJar(JarOutputStream jarOutputStream, VirtualFile sourceFile, String relativePath, THashSet<String> writtenPaths)
- throws IOException {
- relativePath = addParentDirectories(jarOutputStream, writtenPaths, relativePath);
- myContext.getProgressIndicator().setText2(relativePath);
- if (!writtenPaths.add(relativePath)) return;
-
- final BufferedInputStream input = ArtifactCompilerUtil.getJarEntryInputStream(sourceFile, myContext);
- if (input == null) return;
-
- ZipEntry entry = new ZipEntry(relativePath);
- entry.setTime(ArtifactCompilerUtil.getJarFile(sourceFile).lastModified());
- jarOutputStream.putNextEntry(entry);
- FileUtil.copy(input, jarOutputStream);
- jarOutputStream.closeEntry();
- }
-
- private void addFileToJar(final @NotNull JarOutputStream jarOutputStream, final @NotNull File file, @NotNull String relativePath,
- final @NotNull THashSet<String> writtenPaths) throws IOException {
- if (!file.exists()) {
- return;
- }
-
- relativePath = addParentDirectories(jarOutputStream, writtenPaths, relativePath);
- myContext.getProgressIndicator().setText2(relativePath);
- ZipUtil.addFileToZip(jarOutputStream, file, relativePath, writtenPaths, myFileFilter);
- }
-
- private static String addParentDirectories(JarOutputStream jarOutputStream, THashSet<String> writtenPaths, String relativePath) throws IOException {
- while (StringUtil.startsWithChar(relativePath, '/')) {
- relativePath = relativePath.substring(1);
- }
- int i = relativePath.indexOf('/');
- while (i != -1) {
- String prefix = relativePath.substring(0, i+1);
- if (!writtenPaths.contains(prefix) && prefix.length() > 1) {
- addEntry(jarOutputStream, prefix);
- writtenPaths.add(prefix);
- }
- i = relativePath.indexOf('/', i + 1);
- }
- return relativePath;
- }
-
- private static void addEntry(final ZipOutputStream output, @NonNls final String relativePath) throws IOException {
- ZipEntry e = new ZipEntry(relativePath);
- e.setMethod(ZipEntry.STORED);
- e.setSize(0);
- e.setCrc(0);
- output.putNextEntry(e);
- output.closeEntry();
- }
-
- private class JarsGraph implements GraphGenerator.SemiGraph<JarInfo> {
- public Collection<JarInfo> getNodes() {
- return myJarsToBuild;
- }
-
- public Iterator<JarInfo> getIn(final JarInfo n) {
- Set<JarInfo> ins = new HashSet<JarInfo>();
- for (JarDestinationInfo destination : n.getJarDestinations()) {
- ins.add(destination.getJarInfo());
- }
- return ins.iterator();
- }
- }
-}
diff --git a/java/compiler/impl/src/com/intellij/compiler/progress/CompilerTask.java b/java/compiler/impl/src/com/intellij/compiler/progress/CompilerTask.java
index 395a7a711398..f568f2d06364 100644
--- a/java/compiler/impl/src/com/intellij/compiler/progress/CompilerTask.java
+++ b/java/compiler/impl/src/com/intellij/compiler/progress/CompilerTask.java
@@ -463,6 +463,9 @@ public class CompilerTask extends Task.Backgroundable {
}
private void removeAllContents(Project project, Content notRemove) {
+ if (project.isDisposed()) {
+ return;
+ }
final MessageView messageView = MessageView.SERVICE.getInstance(project);
Content[] contents = messageView.getContentManager().getContents();
for (Content content : contents) {
diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java
index c32d9ecda313..03ff006eea40 100644
--- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java
+++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java
@@ -28,6 +28,7 @@ import com.intellij.execution.process.*;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.ide.DataManager;
import com.intellij.ide.PowerSaveMode;
+import com.intellij.ide.file.BatchFileChangeListener;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.application.Application;
@@ -246,7 +247,13 @@ public class BuildManager implements ApplicationComponent{
for (VFileEvent event : events) {
final VirtualFile eventFile = event.getFile();
- if (eventFile == null || ProjectCoreUtil.isProjectOrWorkspaceFile(eventFile)) {
+ if (eventFile == null) {
+ continue;
+ }
+ if (!eventFile.isValid()) {
+ return true; // should be deleted
+ }
+ if (ProjectCoreUtil.isProjectOrWorkspaceFile(eventFile)) {
continue;
}
@@ -268,6 +275,12 @@ public class BuildManager implements ApplicationComponent{
});
+ conn.subscribe(BatchFileChangeListener.TOPIC, new BatchFileChangeListener.Adapter() {
+ public void batchChangeStarted(Project project) {
+ cancelAutoMakeTasks(project);
+ }
+ });
+
EditorFactory.getInstance().getEventMulticaster().addDocumentListener(new DocumentAdapter() {
@Override
public void documentChanged(DocumentEvent e) {
diff --git a/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java b/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java
index e4df975348d9..6a8c9740df80 100644
--- a/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java
+++ b/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java
@@ -48,8 +48,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
*/
public abstract class DefaultMessageHandler implements BuilderMessageHandler {
private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.server.DefaultMessageHandler");
+ public static final long CONSTANT_SEARCH_TIME_LIMIT = 60 * 1000L; // one minute
private final Project myProject;
private final SequentialTaskExecutor myTaskExecutor = new SequentialTaskExecutor(PooledThreadExecutor.INSTANCE);
+ private volatile long myConstantSearchTime = 0L;
protected DefaultMessageHandler(Project project) {
myProject = project;
@@ -119,14 +121,25 @@ public abstract class DefaultMessageHandler implements BuilderMessageHandler {
boolean canceled = false;
final Ref<Boolean> isSuccess = Ref.create(Boolean.TRUE);
final Set<String> affectedPaths = Collections.synchronizedSet(new HashSet<String>()); // PsiSearchHelper runs multiple threads
+ final long searchStart = System.currentTimeMillis();
try {
- if (isDumbMode()) {
+ if (myConstantSearchTime > CONSTANT_SEARCH_TIME_LIMIT) {
+ // skipping constant search and letting the build rebuild dependent modules
+ isSuccess.set(Boolean.FALSE);
+ LOG.debug("Total constant search time exceeded time limit for this build session");
+ }
+ else if(isDumbMode()) {
// do not wait until dumb mode finishes
isSuccess.set(Boolean.FALSE);
LOG.debug("Constant search task: cannot search in dumb mode");
}
else {
final String qualifiedName = ownerClassName.replace('$', '.');
+
+ handleCompileMessage(sessionId, CmdlineProtoUtil.createCompileProgressMessageResponse(
+ "Searching for usages of changed/removed constants for class " + qualifiedName
+ ).getCompileMessage());
+
final PsiClass[] classes = ApplicationManager.getApplication().runReadAction(new Computable<PsiClass[]>() {
public PsiClass[] compute() {
return JavaPsiFacade.getInstance(myProject).findClasses(qualifiedName, GlobalSearchScope.allScope(myProject));
@@ -202,6 +215,7 @@ public abstract class DefaultMessageHandler implements BuilderMessageHandler {
throw e;
}
finally {
+ myConstantSearchTime += (System.currentTimeMillis() - searchStart);
if (!canceled) {
notifyConstantSearchFinished(channel, sessionId, ownerClassName, fieldName, isSuccess, affectedPaths);
}
diff --git a/java/compiler/impl/src/com/intellij/openapi/projectRoots/impl/MockJdkWrapper.java b/java/compiler/impl/src/com/intellij/openapi/projectRoots/impl/MockJdkWrapper.java
index c5b6c66754f2..779df52e49e3 100644
--- a/java/compiler/impl/src/com/intellij/openapi/projectRoots/impl/MockJdkWrapper.java
+++ b/java/compiler/impl/src/com/intellij/openapi/projectRoots/impl/MockJdkWrapper.java
@@ -93,7 +93,7 @@ public final class MockJdkWrapper implements Sdk {
@NotNull
public SdkModificator getSdkModificator() {
- return null;
+ return myDelegate.getSdkModificator();
}
public Sdk getDelegate() {
diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerCompileItem.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerCompileItem.java
deleted file mode 100644
index b4e1865f46ff..000000000000
--- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerCompileItem.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2000-2010 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.packaging.impl.compiler;
-
-import com.intellij.openapi.compiler.generic.VirtualFileCompileItem;
-import com.intellij.compiler.impl.packagingCompiler.DestinationInfo;
-import com.intellij.openapi.util.Pair;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.SmartList;
-import com.intellij.util.io.DataExternalizer;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.List;
-
-/**
- * @author nik
- */
-public class ArtifactCompilerCompileItem extends VirtualFileCompileItem<ArtifactPackagingItemOutputState> {
- public static final DataExternalizer<ArtifactPackagingItemOutputState> OUTPUT_EXTERNALIZER = new ArtifactPackagingItemExternalizer();
- private final List<DestinationInfo> myDestinations = new SmartList<DestinationInfo>();
-
- public ArtifactCompilerCompileItem(VirtualFile file) {
- super(file);
- }
-
- public void addDestination(DestinationInfo info) {
- myDestinations.add(info);
- }
-
- public List<DestinationInfo> getDestinations() {
- return myDestinations;
- }
-
- @NotNull
- @Override
- public ArtifactPackagingItemOutputState computeOutputState() {
- final SmartList<Pair<String, Long>> pairs = new SmartList<Pair<String, Long>>();
- for (DestinationInfo destination : myDestinations) {
- destination.update();
- final VirtualFile outputFile = destination.getOutputFile();
- long timestamp = outputFile != null ? outputFile.getTimeStamp() : -1;
- pairs.add(Pair.create(destination.getOutputPath(), timestamp));
- }
- return new ArtifactPackagingItemOutputState(pairs);
- }
-
- @Override
- public boolean isOutputUpToDate(@NotNull ArtifactPackagingItemOutputState state) {
- final SmartList<Pair<String, Long>> cachedDestinations = state.myDestinations;
- if (cachedDestinations.size() != myDestinations.size()) {
- return false;
- }
-
- for (DestinationInfo info : myDestinations) {
- final VirtualFile outputFile = info.getOutputFile();
- long timestamp = outputFile != null ? outputFile.getTimeStamp() : -1;
- final String path = info.getOutputPath();
- boolean found = false;
- //todo[nik] use map if list contains many items
- for (Pair<String, Long> cachedDestination : cachedDestinations) {
- if (cachedDestination.first.equals(path)) {
- if (cachedDestination.second != timestamp) return false;
- found = true;
- break;
- }
- }
- if (!found) return false;
- }
-
- return true;
- }
-
-}
diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java
index 0c2a15172c99..d4070de6b844 100644
--- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java
+++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java
@@ -15,129 +15,26 @@
*/
package com.intellij.packaging.impl.compiler;
-import com.intellij.facet.Facet;
-import com.intellij.facet.FacetManager;
-import com.intellij.facet.FacetRootsProvider;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.application.Result;
-import com.intellij.openapi.compiler.CompileContext;
-import com.intellij.openapi.compiler.CompilerMessageCategory;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.JarFileSystem;
-import com.intellij.openapi.vfs.VfsUtilCore;
-import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactManager;
-import com.intellij.packaging.elements.PackagingElement;
-import com.intellij.packaging.elements.PackagingElementResolvingContext;
-import com.intellij.packaging.impl.artifacts.ArtifactUtil;
-import com.intellij.packaging.impl.elements.FileOrDirectoryCopyPackagingElement;
-import com.intellij.util.Processor;
-import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.ParametersMessage.TargetTypeBuildScope;
import org.jetbrains.jps.incremental.artifacts.ArtifactBuildTargetType;
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
/**
* @author nik
*/
public class ArtifactCompilerUtil {
- private static final Logger LOG = Logger.getInstance("#com.intellij.packaging.impl.compiler.ArtifactCompilerUtil");
-
private ArtifactCompilerUtil() {
}
- @Nullable
- public static BufferedInputStream getJarEntryInputStream(VirtualFile sourceFile, final CompileContext context) throws IOException {
- final String fullPath = sourceFile.getPath();
- final int jarEnd = fullPath.indexOf(JarFileSystem.JAR_SEPARATOR);
- LOG.assertTrue(jarEnd != -1, fullPath);
- String pathInJar = fullPath.substring(jarEnd + JarFileSystem.JAR_SEPARATOR.length());
- String jarPath = fullPath.substring(0, jarEnd);
- final ZipFile jarFile = new ZipFile(new File(FileUtil.toSystemDependentName(jarPath)));
- final ZipEntry entry = jarFile.getEntry(pathInJar);
- if (entry == null) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot extract '" + pathInJar + "' from '" + jarFile.getName() + "': entry not found", null, -1, -1);
- return null;
- }
-
- return new BufferedInputStream(jarFile.getInputStream(entry)) {
- @Override
- public void close() throws IOException {
- super.close();
- jarFile.close();
- }
- };
- }
-
- public static File getJarFile(VirtualFile jarEntry) {
- String fullPath = jarEntry.getPath();
- return new File(FileUtil.toSystemDependentName(fullPath.substring(fullPath.indexOf(JarFileSystem.JAR_SEPARATOR))));
- }
-
-
- @NotNull
- public static Set<VirtualFile> getArtifactOutputsContainingSourceFiles(final @NotNull Project project) {
- final List<VirtualFile> allOutputs = new ArrayList<VirtualFile>();
- for (Artifact artifact : ArtifactManager.getInstance(project).getArtifacts()) {
- ContainerUtil.addIfNotNull(artifact.getOutputFile(), allOutputs);
- }
-
- final Set<VirtualFile> roots = new HashSet<VirtualFile>();
- final PackagingElementResolvingContext context = ArtifactManager.getInstance(project).getResolvingContext();
- for (Artifact artifact : ArtifactManager.getInstance(project).getArtifacts()) {
- Processor<PackagingElement<?>> processor = new Processor<PackagingElement<?>>() {
- @Override
- public boolean process(@NotNull PackagingElement<?> element) {
- if (element instanceof FileOrDirectoryCopyPackagingElement<?>) {
- final VirtualFile file = ((FileOrDirectoryCopyPackagingElement)element).findFile();
- if (file != null) {
- roots.add(file);
- }
- }
- return true;
- }
- };
- ArtifactUtil.processRecursivelySkippingIncludedArtifacts(artifact, processor, context);
- }
-
- final Module[] modules = ModuleManager.getInstance(project).getModules();
- for (Module module : modules) {
- final Facet[] facets = FacetManager.getInstance(module).getAllFacets();
- for (Facet facet : facets) {
- if (facet instanceof FacetRootsProvider) {
- roots.addAll(((FacetRootsProvider)facet).getFacetRoots());
- }
- }
- }
-
- final Set<VirtualFile> affectedOutputPaths = new HashSet<VirtualFile>();
- for (VirtualFile output : allOutputs) {
- for (VirtualFile root : roots) {
- if (VfsUtilCore.isAncestor(output, root, false)) {
- affectedOutputPaths.add(output);
- }
- }
- }
- return affectedOutputPaths;
- }
public static boolean containsArtifacts(List<TargetTypeBuildScope> scopes) {
for (TargetTypeBuildScope scope : scopes) {
diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemExternalizer.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemExternalizer.java
deleted file mode 100644
index 175cdca3ea9e..000000000000
--- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemExternalizer.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2000-2014 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.packaging.impl.compiler;
-
-import com.intellij.openapi.util.Pair;
-import com.intellij.util.SmartList;
-import com.intellij.util.io.DataExternalizer;
-import com.intellij.util.io.IOUtil;
-import org.jetbrains.annotations.NotNull;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-
-/**
-* @author nik
-*/
-public class ArtifactPackagingItemExternalizer implements DataExternalizer<ArtifactPackagingItemOutputState> {
- @Override
- public void save(@NotNull DataOutput out, ArtifactPackagingItemOutputState value) throws IOException {
- out.writeInt(value.myDestinations.size());
- for (Pair<String, Long> pair : value.myDestinations) {
- IOUtil.writeUTF(out, pair.getFirst());
- out.writeLong(pair.getSecond());
- }
- }
-
- @Override
- public ArtifactPackagingItemOutputState read(@NotNull DataInput in) throws IOException {
- int size = in.readInt();
- SmartList<Pair<String, Long>> destinations = new SmartList<Pair<String, Long>>();
- while (size-- > 0) {
- String path = IOUtil.readUTF(in);
- long outputTimestamp = in.readLong();
- destinations.add(Pair.create(path, outputTimestamp));
- }
- return new ArtifactPackagingItemOutputState(destinations);
- }
-}
diff --git a/java/compiler/instrumentation-util/src/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenter.java b/java/compiler/instrumentation-util/src/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenter.java
index 3bc0dc093fc8..686791e94c04 100644
--- a/java/compiler/instrumentation-util/src/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenter.java
+++ b/java/compiler/instrumentation-util/src/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenter.java
@@ -15,11 +15,11 @@
*/
package com.intellij.compiler.notNullVerification;
+import com.sun.istack.internal.NotNull;
+import com.sun.istack.internal.Nullable;
import org.jetbrains.org.objectweb.asm.*;
-import java.util.ArrayList;
import java.util.LinkedHashMap;
-import java.util.List;
import java.util.Map;
/**
@@ -100,6 +100,15 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode
myClassName = name;
}
+ private static class NotNullState {
+ @Nullable String message;
+ @NotNull String exceptionType;
+
+ NotNullState(String exceptionType) {
+ this.exceptionType = exceptionType;
+ }
+ }
+
@Override
public MethodVisitor visitMethod(final int access, final String name, String desc, String signature, String[] exceptions) {
final Type[] args = Type.getArgumentTypes(desc);
@@ -107,29 +116,32 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode
final MethodVisitor v = cv.visitMethod(access, name, desc, signature, exceptions);
final Map<Integer, String> paramNames = myMethodParamNames.get(myClassName + '.' + name + desc);
return new MethodVisitor(Opcodes.ASM5, v) {
-
- private final List<Integer> myNotNullParams = new ArrayList<Integer>();
+ private final Map<Integer, NotNullState> myNotNullParams = new LinkedHashMap<Integer, NotNullState>();
private int mySyntheticCount = 0;
- private boolean myIsNotNull = false;
- private String myMessage = null;
+ private NotNullState myMethodNotNull;
private Label myStartGeneratedCodeLabel;
+ private AnnotationVisitor collectNotNullArgs(AnnotationVisitor base, final NotNullState state) {
+ return new AnnotationVisitor(Opcodes.ASM5, base) {
+ @Override
+ public void visit(String methodName, Object o) {
+ if (ANNOTATION_DEFAULT_METHOD.equals(methodName) && !((String) o).isEmpty()) {
+ state.message = (String) o;
+ }
+ else if ("exception".equals(methodName) && o instanceof Type && !((Type)o).getClassName().equals(Exception.class.getName())) {
+ state.exceptionType = ((Type)o).getInternalName();
+ }
+ super.visit(methodName, o);
+ }
+ };
+ }
+
public AnnotationVisitor visitParameterAnnotation(final int parameter, final String anno, final boolean visible) {
AnnotationVisitor av = mv.visitParameterAnnotation(parameter, anno, visible);
if (isReferenceType(args[parameter]) && anno.equals(NOT_NULL_TYPE)) {
- myNotNullParams.add(new Integer(parameter));
- av = new AnnotationVisitor(Opcodes.ASM5, av) {
- @Override
- public void visit(String methodName, Object o) {
- if(ANNOTATION_DEFAULT_METHOD.equals(methodName)) {
- String message = (String) o;
- if(!message.isEmpty()) {
- myMessage = message;
- }
- }
- super.visit(methodName, o);
- }
- };
+ NotNullState state = new NotNullState(IAE_CLASS_NAME);
+ myNotNullParams.put(new Integer(parameter), state);
+ av = collectNotNullArgs(av, state);
}
else if (anno.equals(SYNTHETIC_TYPE)) {
// see http://forge.ow2.org/tracker/?aid=307392&group_id=23&atid=100023&func=detail
@@ -143,19 +155,8 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode
public AnnotationVisitor visitAnnotation(String anno, boolean isRuntime) {
AnnotationVisitor av = mv.visitAnnotation(anno, isRuntime);
if (isReferenceType(returnType) && anno.equals(NOT_NULL_TYPE)) {
- myIsNotNull = true;
- av = new AnnotationVisitor(Opcodes.ASM5, av) {
- @Override
- public void visit(String methodName, Object o) {
- if(ANNOTATION_DEFAULT_METHOD.equals(methodName)) {
- String message = (String) o;
- if(!message.isEmpty()) {
- myMessage = message;
- }
- }
- super.visit(methodName, o);
- }
- };
+ myMethodNotNull = new NotNullState(ISE_CLASS_NAME);
+ av = collectNotNullArgs(av, myMethodNotNull);
}
return av;
@@ -167,7 +168,8 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode
myStartGeneratedCodeLabel = new Label();
mv.visitLabel(myStartGeneratedCodeLabel);
}
- for (Integer param : myNotNullParams) {
+ for (Map.Entry<Integer, NotNullState> entry : myNotNullParams.entrySet()) {
+ Integer param = entry.getKey();
int var = ((access & ACC_STATIC) == 0) ? 1 : 0;
for (int i = 0; i < param; ++i) {
var += args[i].getSize();
@@ -177,14 +179,15 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode
Label end = new Label();
mv.visitJumpInsn(IFNONNULL, end);
+ NotNullState state = entry.getValue();
String paramName = paramNames == null ? null : paramNames.get(param);
- String descrPattern = myMessage != null
- ? myMessage
+ String descrPattern = state.message != null
+ ? state.message
: paramName != null ? NULL_ARG_MESSAGE_NAMED : NULL_ARG_MESSAGE_INDEXED;
- String[] args = myMessage != null
+ String[] args = state.message != null
? EMPTY_STRING_ARRAY
: new String[]{paramName != null ? paramName : String.valueOf(param - mySyntheticCount), myClassName, name};
- generateThrow(IAE_CLASS_NAME, end, descrPattern, args);
+ generateThrow(state.exceptionType, end, descrPattern, args);
}
}
@@ -199,13 +202,13 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode
@Override
public void visitInsn(int opcode) {
if (opcode == ARETURN) {
- if (myIsNotNull) {
+ if (myMethodNotNull != null) {
mv.visitInsn(DUP);
final Label skipLabel = new Label();
mv.visitJumpInsn(IFNONNULL, skipLabel);
- String descrPattern = myMessage != null ? myMessage : NULL_RESULT_MESSAGE;
- String[] args = myMessage != null ? EMPTY_STRING_ARRAY : new String[]{myClassName, name};
- generateThrow(ISE_CLASS_NAME, skipLabel, descrPattern, args);
+ String descrPattern = myMethodNotNull.message != null ? myMethodNotNull.message : NULL_RESULT_MESSAGE;
+ String[] args = myMethodNotNull.message != null ? EMPTY_STRING_ARRAY : new String[]{myClassName, name};
+ generateThrow(myMethodNotNull.exceptionType, skipLabel, descrPattern, args);
}
}
diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildInstruction.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildInstruction.java
deleted file mode 100644
index eed2e77c8030..000000000000
--- a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildInstruction.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.openapi.compiler.make;
-
-/**
- * @deprecated this class is part of the obsolete build system which runs as part of the IDE process. Since IDEA 12 plugins need to
- * integrate into 'external build system' instead (http://confluence.jetbrains.com/display/IDEADEV/External+Builder+API+and+Plugins).
- * Since IDEA 13 users cannot switch to the old build system via UI and it will be completely removed in IDEA 14.
- */
-public interface BuildInstruction {
- String getOutputRelativePath();
-
- boolean accept(BuildInstructionVisitor visitor) throws Exception;
-}
diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildInstructionVisitor.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildInstructionVisitor.java
deleted file mode 100644
index 0bd62be958f7..000000000000
--- a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildInstructionVisitor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.openapi.compiler.make;
-
-/**
- * @deprecated this class is part of the obsolete build system which runs as part of the IDE process. Since IDEA 12 plugins need to
- * integrate into 'external build system' instead (http://confluence.jetbrains.com/display/IDEADEV/External+Builder+API+and+Plugins).
- * Since IDEA 13 users cannot switch to the old build system via UI and it will be completely removed in IDEA 14.
- */
-public abstract class BuildInstructionVisitor {
- public boolean visitInstruction(BuildInstruction instruction) throws Exception {
- return true;
- }
- public boolean visitFileCopyInstruction(FileCopyInstruction instruction) throws Exception {
- return visitInstruction(instruction);
- }
-} \ No newline at end of file
diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipant.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipant.java
deleted file mode 100644
index 977772418589..000000000000
--- a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipant.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.openapi.compiler.make;
-
-import com.intellij.openapi.compiler.CompileContext;
-import com.intellij.packaging.artifacts.Artifact;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * @deprecated this class is part of the obsolete build system which runs as part of the IDE process. Since IDEA 12 plugins need to
- * integrate into 'external build system' instead (http://confluence.jetbrains.com/display/IDEADEV/External+Builder+API+and+Plugins).
- * Since IDEA 13 users cannot switch to the old build system via UI and it will be completely removed in IDEA 14.
- */
-public abstract class BuildParticipant {
- public static final BuildParticipant[] EMPTY_ARRAY = new BuildParticipant[0];
-
- @Nullable
- public abstract Artifact createArtifact(CompileContext context);
-
-}
diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantProvider.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantProvider.java
deleted file mode 100644
index 374e161549ad..000000000000
--- a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantProvider.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.intellij.openapi.compiler.make;
-
-import com.intellij.openapi.extensions.ExtensionPointName;
-import com.intellij.openapi.module.Module;
-
-import java.util.Collection;
-
-/**
- * @author nik
- *
- * @deprecated this class is part of the obsolete build system which runs as part of the IDE process. Since IDEA 12 plugins need to
- * integrate into 'external build system' instead (http://confluence.jetbrains.com/display/IDEADEV/External+Builder+API+and+Plugins).
- * Since IDEA 13 users cannot switch to the old build system via UI and it will be completely removed in IDEA 14.
- */
-public abstract class BuildParticipantProvider {
- public static final ExtensionPointName<BuildParticipantProvider> EXTENSION_POINT_NAME = ExtensionPointName.create("com.intellij.compiler.buildParticipantProvider");
-
-
- public abstract Collection<? extends BuildParticipant> getParticipants(Module module);
-
-}
diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/FileCopyInstruction.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/FileCopyInstruction.java
deleted file mode 100644
index c5636394cfe0..000000000000
--- a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/FileCopyInstruction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2000-2009 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.openapi.compiler.make;
-
-import java.io.File;
-
-/**
- * @deprecated this class is part of the obsolete build system which runs as part of the IDE process. Since IDEA 12 plugins need to
- * integrate into 'external build system' instead (http://confluence.jetbrains.com/display/IDEADEV/External+Builder+API+and+Plugins).
- * Since IDEA 13 users cannot switch to the old build system via UI and it will be completely removed in IDEA 14.
- */
-public interface FileCopyInstruction extends BuildInstruction {
- File getFile();
-
- boolean isDirectory();
-
-} \ No newline at end of file
diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/QuickEvaluateActionHandler.java b/java/debugger/impl/src/com/intellij/debugger/actions/QuickEvaluateActionHandler.java
index 6eedff4136ea..2696f226e412 100644
--- a/java/debugger/impl/src/com/intellij/debugger/actions/QuickEvaluateActionHandler.java
+++ b/java/debugger/impl/src/com/intellij/debugger/actions/QuickEvaluateActionHandler.java
@@ -22,13 +22,13 @@ package com.intellij.debugger.actions;
import com.intellij.debugger.DebuggerManagerEx;
import com.intellij.debugger.impl.DebuggerSession;
-import com.intellij.debugger.settings.DebuggerSettings;
import com.intellij.debugger.ui.ValueHint;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.xdebugger.impl.evaluate.quick.common.AbstractValueHint;
import com.intellij.xdebugger.impl.evaluate.quick.common.QuickEvaluateHandler;
import com.intellij.xdebugger.impl.evaluate.quick.common.ValueHintType;
+import com.intellij.xdebugger.settings.XDebuggerSettingsManager;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
@@ -53,6 +53,6 @@ public class QuickEvaluateActionHandler extends QuickEvaluateHandler {
@Override
public int getValueLookupDelay(final Project project) {
- return DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY;
+ return XDebuggerSettingsManager.getInstance().getDataViewSettings().getValueLookupDelay();
}
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java
index ed4d8296c381..bcd8257736c2 100644
--- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java
+++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java
@@ -27,7 +27,6 @@ import com.intellij.debugger.impl.DebuggerUtilsEx;
import com.intellij.debugger.jdi.*;
import com.intellij.debugger.settings.DebuggerSettings;
import com.intellij.debugger.settings.NodeRendererSettings;
-import com.intellij.debugger.settings.ViewsGeneralSettings;
import com.intellij.debugger.ui.breakpoints.Breakpoint;
import com.intellij.debugger.ui.impl.FrameVariablesTree;
import com.intellij.debugger.ui.impl.watch.*;
@@ -47,6 +46,7 @@ import com.intellij.xdebugger.frame.XCompositeNode;
import com.intellij.xdebugger.frame.XStackFrame;
import com.intellij.xdebugger.frame.XValueChildrenList;
import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants;
+import com.intellij.xdebugger.settings.XDebuggerSettingsManager;
import com.sun.jdi.*;
import com.sun.jdi.event.Event;
import com.sun.jdi.event.ExceptionEvent;
@@ -66,7 +66,6 @@ public class JavaStackFrame extends XStackFrame {
private final DebugProcessImpl myDebugProcess;
private final XSourcePosition myXSourcePosition;
- private final SourcePosition mySourcePosition;
private final NodeManagerImpl myNodeManager;
private final StackFrameDescriptorImpl myDescriptor;
private static final JavaFramesListRenderer FRAME_RENDERER = new JavaFramesListRenderer();
@@ -74,43 +73,22 @@ public class JavaStackFrame extends XStackFrame {
public JavaStackFrame(@NotNull StackFrameProxyImpl stackFrameProxy, @NotNull DebugProcessImpl debugProcess, MethodsTracker tracker) {
myDebugProcess = debugProcess;
- Pair<SourcePosition, XSourcePosition> positions = calcSourcePosition(stackFrameProxy);
- mySourcePosition = positions.getFirst();
- myXSourcePosition = positions.getSecond();
myNodeManager = debugProcess.getXdebugProcess().getNodeManager();
myDescriptor = new StackFrameDescriptorImpl(stackFrameProxy, tracker);
myDescriptor.setContext(null);
myDescriptor.updateRepresentation(null, DescriptorLabelListener.DUMMY_LISTENER);
+ myXSourcePosition = ApplicationManager.getApplication().runReadAction(new Computable<XSourcePosition>() {
+ @Override
+ public XSourcePosition compute() {
+ return myDescriptor.getSourcePosition() != null ? DebuggerUtilsEx.toXSourcePosition(myDescriptor.getSourcePosition()) : null;
+ }
+ });
}
public StackFrameDescriptorImpl getDescriptor() {
return myDescriptor;
}
- private Pair<SourcePosition, XSourcePosition> calcSourcePosition(StackFrameProxyImpl stackFrameProxy) {
- final CompoundPositionManager positionManager = myDebugProcess.getPositionManager();
- if (positionManager == null) {
- // process already closed
- return null;
- }
- Location location = null;
- try {
- location = stackFrameProxy.location();
- }
- catch (Throwable e) {
- LOG.info(e);
- }
- final Location loc = location;
- return ApplicationManager.getApplication().runReadAction(new Computable<Pair<SourcePosition, XSourcePosition>>() {
- @Override
- public Pair<SourcePosition, XSourcePosition> compute() {
- SourcePosition position = positionManager.getSourcePosition(loc);
- XSourcePosition xSourcePosition = position != null ? DebuggerUtilsEx.toXSourcePosition(position) : null;
- return new Pair<SourcePosition, XSourcePosition>(position, xSourcePosition);
- }
- });
- }
-
@Nullable
@Override
public XDebuggerEvaluator getEvaluator() {
@@ -174,7 +152,7 @@ public class JavaStackFrame extends XStackFrame {
threadSuspendContext,
getStackFrameProxy().threadProxy(),
getStackFrameProxy());
- context.setPositionCache(mySourcePosition);
+ context.setPositionCache(myDescriptor.getSourcePosition());
context.initCaches();
}
return context;
@@ -293,7 +271,7 @@ public class JavaStackFrame extends XStackFrame {
}
try {
- if (!ViewsGeneralSettings.getInstance().ENABLE_AUTO_EXPRESSIONS && !myAutoWatchMode) {
+ if (!XDebuggerSettingsManager.getInstance().getDataViewSettings().isAutoExpressions() && !myAutoWatchMode) {
// optimization
superBuildVariables(evaluationContext, children);
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java
index 6af021c0f9cc..0a691d332207 100644
--- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java
+++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java
@@ -58,7 +58,10 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider {
private final EvaluationContextImpl myEvaluationContext;
private final NodeManagerImpl myNodeManager;
- private JavaValue(JavaValue parent, @NotNull ValueDescriptorImpl valueDescriptor, EvaluationContextImpl evaluationContext, NodeManagerImpl nodeManager) {
+ private JavaValue(JavaValue parent,
+ @NotNull ValueDescriptorImpl valueDescriptor,
+ @NotNull EvaluationContextImpl evaluationContext,
+ NodeManagerImpl nodeManager) {
super(valueDescriptor.getName());
myParent = parent;
myValueDescriptor = valueDescriptor;
diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java
index d299af172340..69cbb140be86 100644
--- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java
+++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java
@@ -83,8 +83,8 @@ public class MethodEvaluator implements Evaluator {
ReferenceType referenceType = null;
if(object instanceof ObjectReference) {
- final ReferenceType qualifierType = ((ObjectReference)object).referenceType();
- referenceType = debugProcess.findClass(context, qualifierType.name(), qualifierType.classLoader());
+ // it seems that if we have an object of the class, the class must be ready, so no need to use findClass here
+ referenceType = ((ObjectReference)object).referenceType();
}
else if(object instanceof ClassType) {
final ClassType qualifierType = (ClassType)object;
diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java
index e937aac836ef..026b7111d18f 100644
--- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java
+++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java
@@ -45,6 +45,7 @@ import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.ui.classFilter.ClassFilter;
import com.intellij.util.SmartList;
+import com.intellij.util.containers.ContainerUtil;
import com.intellij.xdebugger.XSourcePosition;
import com.intellij.xdebugger.impl.XSourcePositionImpl;
import com.sun.jdi.*;
@@ -199,7 +200,7 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils {
public static ClassFilter create(Element element) throws InvalidDataException {
ClassFilter filter = new ClassFilter();
- filter.readExternal(element);
+ DefaultJDOMExternalizer.readExternal(filter, element);
return filter;
}
@@ -245,24 +246,23 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils {
return res;
}
- public static ClassFilter[] readFilters(List children) throws InvalidDataException {
- if (children == null || children.size() == 0) {
+ public static ClassFilter[] readFilters(List<Element> children) throws InvalidDataException {
+ if (ContainerUtil.isEmpty(children)) {
return ClassFilter.EMPTY_ARRAY;
}
- List<ClassFilter> classFiltersList = new ArrayList<ClassFilter>(children.size());
- for (Object aChildren : children) {
- final ClassFilter classFilter = new ClassFilter();
- classFilter.readExternal((Element)aChildren);
- classFiltersList.add(classFilter);
+
+ ClassFilter[] filters = new ClassFilter[children.size()];
+ for (int i = 0, size = children.size(); i < size; i++) {
+ filters[i] = create(children.get(i));
}
- return classFiltersList.toArray(new ClassFilter[classFiltersList.size()]);
+ return filters;
}
public static void writeFilters(Element parentNode, @NonNls String tagName, ClassFilter[] filters) throws WriteExternalException {
for (ClassFilter filter : filters) {
Element element = new Element(tagName);
parentNode.addContent(element);
- filter.writeExternal(element);
+ DefaultJDOMExternalizer.writeExternal(filter, element);
}
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java b/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java
index 11b077340eb7..7b76b9738843 100644
--- a/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java
+++ b/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java
@@ -107,7 +107,10 @@ public class JavaEditorTextProviderImpl implements EditorTextProvider {
else if (parent instanceof PsiThisExpression) {
expression = parent;
}
- else if (parent instanceof PsiInstanceOfExpression || parent instanceof PsiBinaryExpression || parent instanceof PsiPolyadicExpression) {
+ else if (parent instanceof PsiInstanceOfExpression
+ || parent instanceof PsiBinaryExpression
+ || parent instanceof PsiPolyadicExpression
+ || parent instanceof PsiPrefixExpression) {
if (allowMethodCalls || !DebuggerUtils.hasSideEffects(parent)) {
expression = parent;
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/Bytecodes.java b/java/debugger/impl/src/com/intellij/debugger/jdi/Bytecodes.java
index 86fb655b0853..d6aa2372e720 100644
--- a/java/debugger/impl/src/com/intellij/debugger/jdi/Bytecodes.java
+++ b/java/debugger/impl/src/com/intellij/debugger/jdi/Bytecodes.java
@@ -232,15 +232,16 @@ class Bytecodes {
static {
int i;
byte[] b = new byte[220];
- String s = "AAAAAAAAAAAAAAAABCLMMDDDDDEEEEEEEEEEEEEEEEEEEEAAAAAAAADD"
- + "DDDEEEEEEEEEEEEEEEEEEEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- + "AAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAJJJJJJJJJJJJJJJJDOPAA"
- + "AAAAGGGGGGGHIFBFAAFFAARQJJKKJJJJJJJJJJJJJJJJJJ";
- for (i = 0; i < b.length; ++i) {
- b[i] = (byte) (s.charAt(i) - 'A');
- }
- TYPE = b;
+ String s =
+ "AAAAAAAAAAAAAAAABCLMMDDDDDEEEEEEEEEEEEEEEEEEEEAAAAAAAADDDDDEE" +
+ "EEEEEEEEEEEEEEEEEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
+ "AAAAAAAAAANAAAAAAAAAAAAAAAAAAAAJJJJJJJJJJJJJJJJDOPAAAAAAGGGGG" +
+ "GGHIFBFAAFFAARQJJKKJLMMGGGGGGGGGGGGHGAFFQFFGGG";
+ for (i = 0; i < b.length; ++i) {
+ b[i] = (byte) (s.charAt(i) - 'A');
}
+ TYPE = b;
+ }
static final int NOP = 0; // visitInsn
@@ -446,4 +447,139 @@ class Bytecodes {
static final int GOTO_W = 200; // -
static final int JSR_W = 201; // -
+ // JVM runtime-specific and reserved opcodes:
+ // From JVM specification:
+ // In addition to the opcodes of the instructions specified later in this chapter, which are used in class files (§4), three opcodes are reserved for internal use by a Java Virtual Machine implementation. If the instruction set of the Java Virtual Machine is extended in the future, these reserved opcodes are guaranteed not to be used.
+ // Two of the reserved opcodes, numbers 254 (0xfe) and 255 (0xff), have the mnemonics impdep1 and impdep2, respectively. These instructions are intended to provide "back doors" or traps to implementation-specific functionality implemented in software and hardware, respectively. The third reserved opcode, number 202 (0xca), has the mnemonic breakpoint and is intended to be used by debuggers to implement breakpoints.
+ // Although these opcodes have been reserved, they may be used only inside a Java Virtual Machine implementation. They cannot appear in valid class files. Tools such as debuggers or JIT code generators (§2.13) that might directly interact with Java Virtual Machine code that has been already loaded and executed may encounter these opcodes. Such tools should attempt to behave gracefully if they encounter any of these reserved instructions.
+
+ static final int BREAKPOINT = 202;
+ static final int LDC_QUICK = 203;
+ static final int LDC_W_QUICK = 204;
+ static final int LDC2_W_QUICK = 205;
+ static final int GETFIELD_QUICK = 206;
+ static final int PUTFIELD_QUICK = 207;
+ static final int GETFIELD2_QUICK = 208;
+ static final int PUTFIELD2_QUICK = 209;
+ static final int GETSTATIC_QUICK = 210;
+ static final int PUTSTATIC_QUICK = 211;
+ static final int GETSTATIC2_QUICK = 212;
+ static final int PUTSTATIC2_QUICK = 213;
+ static final int INVOKEVIRTUAL_QUICK = 214;
+ static final int INVOKENONVIRTUAL_QUICK = 215;
+ static final int INVOKESUPER_QUICK = 216;
+ static final int INVOKESTATIC_QUICK = 217;
+ static final int INVOKEINTERFACE_QUICK = 218;
+ static final int INVOKEVIRTUALOBJECT_QUICK = 219;
+ static final int NEW_QUICK = 221;
+ static final int ANEWARRAY_QUICK = 222;
+ static final int MULTIANEWARRAY_QUICK = 223;
+ static final int CHECKCAST_QUICK = 224;
+ static final int INSTANCEOF_QUICK = 225;
+ static final int INVOKEVIRTUAL_QUICK_W = 226;
+ static final int GETFIELD_QUICK_W = 227;
+ static final int PUTFIELD_QUICK_W = 228;
+ static final int IMPDEP1 = 254;
+ static final int IMPDEP2 = 255;
+
+ public static void main(String[] args) {
+ int[] b = new int[229];
+ //code to generate the above string
+
+ // SBYTE_INSN instructions
+ b[NEWARRAY] = SBYTE_INSN;
+ b[BIPUSH] = SBYTE_INSN;
+
+ // SHORT_INSN instructions
+ b[SIPUSH] = SHORT_INSN;
+
+ // (IMPL)VAR_INSN instructions
+ b[RET] = VAR_INSN;
+ for (int i = ILOAD; i <= ALOAD; ++i) {
+ b[i] = VAR_INSN;
+ }
+ for (int i = ISTORE; i <= ASTORE; ++i) {
+ b[i] = VAR_INSN;
+ }
+ for (int i = 26; i <= 45; ++i) { // ILOAD_0 to ALOAD_3
+ b[i] = IMPLVAR_INSN;
+ }
+ for (int i = 59; i <= 78; ++i) { // ISTORE_0 to ASTORE_3
+ b[i] = IMPLVAR_INSN;
+ }
+
+ // TYPE_INSN instructions
+ b[NEW] = TYPE_INSN;
+ b[ANEWARRAY] = TYPE_INSN;
+ b[CHECKCAST] = TYPE_INSN;
+ b[INSTANCEOF] = TYPE_INSN;
+
+ // (Set)FIELDORMETH_INSN instructions
+ for (int i = GETSTATIC; i <= INVOKESTATIC; ++i) {
+ b[i] = FIELDORMETH_INSN;
+ }
+ b[INVOKEINTERFACE] = ITFMETH_INSN;
+ b[INVOKEDYNAMIC] = INDYMETH_INSN;
+
+ // LABEL(W)_INSN instructions
+ for (int i = IFEQ; i <= JSR; ++i) {
+ b[i] = LABEL_INSN;
+ }
+ b[IFNULL] = LABEL_INSN;
+ b[IFNONNULL] = LABEL_INSN;
+ b[GOTO_W] = LABELW_INSN; // GOTO_W
+ b[JSR_W] = LABELW_INSN; // JSR_W
+
+ b[BREAKPOINT] = LABEL_INSN; // todo: is this correct?
+
+ // LDC(_W) instructions
+ b[LDC] = LDC_INSN;
+ b[LDC_W] = LDCW_INSN; // LDC_W
+ b[LDC2_W] = LDCW_INSN; // LDC2_W
+
+ // special instructions
+ b[IINC] = IINC_INSN;
+ b[TABLESWITCH] = TABL_INSN;
+ b[LOOKUPSWITCH] = LOOK_INSN;
+ b[MULTIANEWARRAY] = MANA_INSN;
+ b[WIDE] = WIDE_INSN; // WIDE
+
+ // runtime-specific
+
+ b[LDC_QUICK] = LDC_INSN; // = 203;
+ b[LDC_W_QUICK] = LDCW_INSN; // = 204;
+ b[LDC2_W_QUICK] = LDCW_INSN; // = 205;
+ b[GETFIELD_QUICK] = FIELDORMETH_INSN; // = 206;
+ b[PUTFIELD_QUICK] = FIELDORMETH_INSN; // = 207;
+
+ b[GETFIELD2_QUICK] = FIELDORMETH_INSN; // = 208;
+ b[PUTFIELD2_QUICK] = FIELDORMETH_INSN; // = 209;
+ b[GETSTATIC_QUICK] = FIELDORMETH_INSN; // = 210;
+ b[PUTSTATIC_QUICK] = FIELDORMETH_INSN; // = 211;
+ b[GETSTATIC2_QUICK] = FIELDORMETH_INSN; // = 212;
+ b[PUTSTATIC2_QUICK] = FIELDORMETH_INSN; // = 213;
+ b[INVOKEVIRTUAL_QUICK] = FIELDORMETH_INSN; // = 214;
+ b[INVOKENONVIRTUAL_QUICK] = FIELDORMETH_INSN; // = 215;
+ b[INVOKESUPER_QUICK] = FIELDORMETH_INSN; // = 216;
+ b[INVOKESTATIC_QUICK] = FIELDORMETH_INSN; // = 217;
+ b[INVOKEINTERFACE_QUICK] = ITFMETH_INSN; // = 218;
+ b[INVOKEVIRTUALOBJECT_QUICK] = FIELDORMETH_INSN; // = 219;
+ b[220] = Bytecodes.NOARG_INSN; // the ID is not used for any opcode
+ b[NEW_QUICK] = TYPE_INSN; // = 221;
+ b[ANEWARRAY_QUICK] = TYPE_INSN; // = 222;
+ b[MULTIANEWARRAY_QUICK] = MANA_INSN; // = 223;
+ b[CHECKCAST_QUICK] = TYPE_INSN; // = 224;
+ b[INSTANCEOF_QUICK] = TYPE_INSN; // = 225;
+ b[INVOKEVIRTUAL_QUICK_W] = FIELDORMETH_INSN; // = 226;
+ b[GETFIELD_QUICK_W] = FIELDORMETH_INSN; // = 227;
+ b[PUTFIELD_QUICK_W] = FIELDORMETH_INSN; // = 228;
+
+
+ for (int i = 0; i < b.length; ++i) {
+ System.err.print((char)('A' + b[i]));
+ }
+ System.err.println();
+
+ }
+
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/InstructionParser.java b/java/debugger/impl/src/com/intellij/debugger/jdi/InstructionParser.java
index b8053a891d42..78bf10fe7e40 100644
--- a/java/debugger/impl/src/com/intellij/debugger/jdi/InstructionParser.java
+++ b/java/debugger/impl/src/com/intellij/debugger/jdi/InstructionParser.java
@@ -38,7 +38,8 @@ public class InstructionParser {
break;
}
int opcode = myCode[v] & 0xFF;
- switch (Bytecodes.TYPE[opcode]) {
+ final byte opcodeType = opcode == Bytecodes.IMPDEP1 || opcode == Bytecodes.IMPDEP2? Bytecodes.NOARG_INSN : Bytecodes.TYPE[opcode];
+ switch (opcodeType) {
case Bytecodes.NOARG_INSN:
v += 1;
break;
diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java
index db01e13836ef..452a924aed00 100644
--- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java
+++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java
@@ -20,6 +20,7 @@ import com.intellij.debugger.impl.DebuggerUtilsEx;
import com.intellij.debugger.ui.JavaDebuggerSupport;
import com.intellij.debugger.ui.tree.render.ClassRenderer;
import com.intellij.debugger.ui.tree.render.ToStringRenderer;
+import com.intellij.openapi.options.OptionsBundle;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.registry.Registry;
@@ -45,7 +46,6 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
private JCheckBox myCbAutoscroll;
private JCheckBox myCbShowSyntheticFields;
private StateRestoringCheckBox myCbShowValFieldsAsLocalVariables;
- private JCheckBox myCbSort;
private JCheckBox myCbHideNullArrayElements;
private JCheckBox myCbShowStatic;
private JCheckBox myCbShowDeclaredType;
@@ -54,15 +54,13 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
private StateRestoringCheckBox myCbShowStaticFinalFields;
private final ArrayRendererConfigurable myArrayRendererConfigurable;
- private JCheckBox myCbEnableAutoExpressions;
private JCheckBox myCbEnableAlternateViews;
private JCheckBox myCbEnableToString;
private JRadioButton myRbAllThatOverride;
private JRadioButton myRbFromList;
private ClassFilterEditor myToStringFilterEditor;
- private JTextField myValueTooltipDelayField;
-
+
private Project myProject;
private RegistryCheckBox myAutoTooltip;
@@ -71,16 +69,19 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
myArrayRendererConfigurable = new ArrayRendererConfigurable(NodeRendererSettings.getInstance().getArrayRenderer());
}
+ @Override
public void disposeUIResources() {
myArrayRendererConfigurable.disposeUIResources();
myToStringFilterEditor = null;
myProject = null;
}
+ @Override
public String getDisplayName() {
- return DebuggerBundle.message("base.renderer.configurable.display.name");
+ return OptionsBundle.message("options.java.display.name");
}
+ @Override
public JComponent createComponent() {
if (myProject == null) {
myProject = JavaDebuggerSupport.getContextProjectForEditorFieldsInDebuggerConfigurables();
@@ -90,13 +91,12 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
myCbAutoscroll = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.autoscroll"));
myCbShowSyntheticFields = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.synthetic.fields"));
myCbShowValFieldsAsLocalVariables = new StateRestoringCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.val.fields.as.locals"));
- myCbSort = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.sort.alphabetically"));
myCbHideNullArrayElements = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.hide.null.array.elements"));
myCbShowStatic = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.static.fields"));
myCbShowStaticFinalFields = new StateRestoringCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.static.final.fields"));
myCbEnableAlternateViews = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.alternate.view"));
- myCbEnableAutoExpressions = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.auto.expressions"));
myCbShowStatic.addChangeListener(new ChangeListener(){
+ @Override
public void stateChanged(ChangeEvent e) {
if(myCbShowStatic.isSelected()) {
myCbShowStaticFinalFields.makeSelectable();
@@ -121,14 +121,15 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
myCbShowFQNames = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.fq.names"));
myCbShowObjectId = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.object.id"));
- myCbEnableToString = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.enable.tostring"));
- myRbAllThatOverride = new JRadioButton(DebuggerBundle.message("label.base.renderer.configurable.all.overridding"));
+ myCbEnableToString = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.enable.toString"));
+ myRbAllThatOverride = new JRadioButton(DebuggerBundle.message("label.base.renderer.configurable.all.overriding"));
myRbFromList = new JRadioButton(DebuggerBundle.message("label.base.renderer.configurable.classes.from.list"));
ButtonGroup group = new ButtonGroup();
group.add(myRbAllThatOverride);
group.add(myRbFromList);
myToStringFilterEditor = new ClassFilterEditor(myProject, null, "reference.viewBreakpoints.classFilters.newPattern");
myCbEnableToString.addItemListener(new ItemListener() {
+ @Override
public void itemStateChanged(ItemEvent e) {
final boolean enabled = myCbEnableToString.isSelected();
myRbAllThatOverride.setEnabled(enabled);
@@ -137,12 +138,12 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
}
});
myRbFromList.addItemListener(new ItemListener() {
+ @Override
public void itemStateChanged(ItemEvent e) {
myToStringFilterEditor.setEnabled(myCbEnableToString.isSelected() && myRbFromList.isSelected());
}
});
- panel.add(myCbSort, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
panel.add(myCbAutoscroll, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0));
@@ -151,14 +152,6 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
DebuggerBundle.message("label.base.renderer.configurable.autoTooltip.description",
Registry.stringValue("ide.forcedShowTooltip")));
panel.add(myAutoTooltip, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0));
-
- final JLabel tooltipLabel = new JLabel(DebuggerBundle.message("label.debugger.general.configurable.tooltips.delay"));
- panel.add(tooltipLabel, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0));
- myValueTooltipDelayField = new JTextField(10);
- myValueTooltipDelayField.setMinimumSize(new Dimension(50, myValueTooltipDelayField.getPreferredSize().height));
- panel.add(myValueTooltipDelayField, new GridBagConstraints(2, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0));
- tooltipLabel.setLabelFor(myValueTooltipDelayField);
-
final JPanel showPanel = new JPanel(new GridBagLayout());
showPanel.setBorder(IdeBorderFactory.createTitledBorder("Show", true));
@@ -174,12 +167,12 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
final JPanel arraysPanel = new JPanel(new BorderLayout(0, UIUtil.DEFAULT_VGAP));
final JComponent arraysComponent = myArrayRendererConfigurable.createComponent();
+ assert arraysComponent != null;
arraysPanel.add(arraysComponent, BorderLayout.CENTER);
arraysPanel.add(myCbHideNullArrayElements, BorderLayout.SOUTH);
arraysPanel.setBorder(IdeBorderFactory.createTitledBorder("Arrays", true));
panel.add(arraysPanel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
- panel.add(myCbEnableAutoExpressions, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 10), 0, 0));
panel.add(myCbEnableAlternateViews, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 10), 0, 0));
// starting 4-th row
panel.add(myCbEnableToString, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0));
@@ -191,22 +184,16 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
return panel;
}
+ @Override
public void apply() {
final ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance();
final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance();
- try {
- DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY = Integer.parseInt(myValueTooltipDelayField.getText().trim());
- }
- catch (NumberFormatException ignored) {
- }
generalSettings.AUTOSCROLL_TO_NEW_LOCALS = myCbAutoscroll.isSelected();
rendererSettings.setAlternateCollectionViewsEnabled(myCbEnableAlternateViews.isSelected());
generalSettings.HIDE_NULL_ARRAY_ELEMENTS = myCbHideNullArrayElements.isSelected();
- generalSettings.ENABLE_AUTO_EXPRESSIONS = myCbEnableAutoExpressions.isSelected();
final ClassRenderer classRenderer = rendererSettings.getClassRenderer();
- classRenderer.SORT_ASCENDING = myCbSort.isSelected();
classRenderer.SHOW_STATIC = myCbShowStatic.isSelected();
classRenderer.SHOW_STATIC_FINAL = myCbShowStaticFinalFields.isSelectedWhenSelectable();
classRenderer.SHOW_SYNTHETICS = myCbShowSyntheticFields.isSelected();
@@ -227,15 +214,14 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
rendererSettings.fireRenderersChanged();
}
+ @Override
public void reset() {
final ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance();
final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance();
- myValueTooltipDelayField.setText(Integer.toString(DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY));
myCbAutoscroll.setSelected(generalSettings.AUTOSCROLL_TO_NEW_LOCALS);
myCbHideNullArrayElements.setSelected(generalSettings.HIDE_NULL_ARRAY_ELEMENTS);
myCbEnableAlternateViews.setSelected(rendererSettings.areAlternateCollectionViewsEnabled());
- myCbEnableAutoExpressions.setSelected(generalSettings.ENABLE_AUTO_EXPRESSIONS);
ClassRenderer classRenderer = rendererSettings.getClassRenderer();
@@ -244,7 +230,6 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
if (!classRenderer.SHOW_SYNTHETICS) {
myCbShowValFieldsAsLocalVariables.makeUnselectable(false);
}
- myCbSort.setSelected(classRenderer.SORT_ASCENDING);
myCbShowStatic.setSelected(classRenderer.SHOW_STATIC);
myCbShowStaticFinalFields.setSelected(classRenderer.SHOW_STATIC_FINAL);
if(!classRenderer.SHOW_STATIC) {
@@ -268,36 +253,27 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
myArrayRendererConfigurable.reset();
}
+ @Override
public boolean isModified() {
- return areGeneralSettingsModified() || areDefaultRenderersModified() || areDebuggerSettingsModified();
- }
-
- private boolean areDebuggerSettingsModified() {
- try {
- return DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY != Integer.parseInt(myValueTooltipDelayField.getText().trim());
- }
- catch (NumberFormatException ignored) {
- }
- return false;
+ return areGeneralSettingsModified() || areDefaultRenderersModified();
}
private boolean areGeneralSettingsModified() {
ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance();
- return
- (generalSettings.AUTOSCROLL_TO_NEW_LOCALS != myCbAutoscroll.isSelected()) ||
- (generalSettings.ENABLE_AUTO_EXPRESSIONS != myCbEnableAutoExpressions.isSelected()) ||
- (generalSettings.HIDE_NULL_ARRAY_ELEMENTS != myCbHideNullArrayElements.isSelected()) || myAutoTooltip.isChanged();
+ return generalSettings.AUTOSCROLL_TO_NEW_LOCALS != myCbAutoscroll.isSelected() ||
+ generalSettings.HIDE_NULL_ARRAY_ELEMENTS != myCbHideNullArrayElements.isSelected() ||
+ myAutoTooltip.isChanged();
}
private boolean areDefaultRenderersModified() {
if (myArrayRendererConfigurable.isModified()) {
return true;
}
+
final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance();
final ClassRenderer classRenderer = rendererSettings.getClassRenderer();
final boolean isClassRendererModified=
- (classRenderer.SORT_ASCENDING != myCbSort.isSelected()) ||
(classRenderer.SHOW_STATIC != myCbShowStatic.isSelected()) ||
(classRenderer.SHOW_STATIC_FINAL != myCbShowStaticFinalFields.isSelectedWhenSelectable()) ||
(classRenderer.SHOW_SYNTHETICS != myCbShowSyntheticFields.isSelected()) ||
@@ -325,16 +301,20 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
return false;
}
+ @SuppressWarnings("SpellCheckingInspection")
+ @Override
@NotNull
public String getHelpTopic() {
return "reference.idesettings.debugger.dataviews";
}
+ @Override
@NotNull
public String getId() {
return getHelpTopic();
}
+ @Override
public Runnable enableSearch(String option) {
return null;
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerLaunchingConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerLaunchingConfigurable.java
index f731c8943dec..490f99bb5461 100644
--- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerLaunchingConfigurable.java
+++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerLaunchingConfigurable.java
@@ -17,23 +17,21 @@ package com.intellij.debugger.settings;
import com.intellij.debugger.DebuggerBundle;
import com.intellij.openapi.options.Configurable;
+import com.intellij.openapi.options.OptionsBundle;
import com.intellij.openapi.util.SystemInfo;
-import com.intellij.openapi.util.registry.Registry;
import com.intellij.ui.StateRestoringCheckBox;
import com.intellij.ui.components.panels.VerticalBox;
import javax.swing.*;
-import javax.swing.border.Border;
import java.awt.*;
-public class DebuggerLaunchingConfigurable implements Configurable{
+public class DebuggerLaunchingConfigurable implements Configurable {
private JRadioButton myRbSocket;
private JRadioButton myRbShmem;
- private JCheckBox myHideDebuggerCheckBox;
private StateRestoringCheckBox myCbForceClassicVM;
private JCheckBox myCbDisableJIT;
- private JCheckBox myFocusAppCheckBox;
+ @Override
public void reset() {
final DebuggerSettings settings = DebuggerSettings.getInstance();
if (!SystemInfo.isWindows) {
@@ -49,12 +47,11 @@ public class DebuggerLaunchingConfigurable implements Configurable{
}
myRbShmem.setEnabled(true);
}
- myHideDebuggerCheckBox.setSelected(settings.HIDE_DEBUGGER_ON_PROCESS_TERMINATION);
myCbForceClassicVM.setSelected(settings.FORCE_CLASSIC_VM);
myCbDisableJIT.setSelected(settings.DISABLE_JIT);
- myFocusAppCheckBox.setSelected(Registry.is("debugger.mayBringFrameToFrontOnBreakpoint"));
}
+ @Override
public void apply() {
getSettingsTo(DebuggerSettings.getInstance());
}
@@ -66,43 +63,34 @@ public class DebuggerLaunchingConfigurable implements Configurable{
else {
settings.DEBUGGER_TRANSPORT = DebuggerSettings.SOCKET_TRANSPORT;
}
- settings.HIDE_DEBUGGER_ON_PROCESS_TERMINATION = myHideDebuggerCheckBox.isSelected();
settings.FORCE_CLASSIC_VM = myCbForceClassicVM.isSelectedWhenSelectable();
settings.DISABLE_JIT = myCbDisableJIT.isSelected();
- Registry.get("debugger.mayBringFrameToFrontOnBreakpoint").setValue(myFocusAppCheckBox.isSelected());
}
+ @Override
public boolean isModified() {
final DebuggerSettings currentSettings = DebuggerSettings.getInstance();
final DebuggerSettings debuggerSettings = currentSettings.clone();
getSettingsTo(debuggerSettings);
- return !debuggerSettings.equals(currentSettings) || Registry.is("debugger.mayBringFrameToFrontOnBreakpoint") != myFocusAppCheckBox.isSelected();
+ return !debuggerSettings.equals(currentSettings);
}
+ @Override
public String getDisplayName() {
- return DebuggerBundle.message("debugger.launching.configurable.display.name");
+ return OptionsBundle.message("options.java.display.name");
}
+ @Override
public String getHelpTopic() {
return "reference.idesettings.debugger.launching";
}
+ @Override
public JComponent createComponent() {
myCbForceClassicVM = new StateRestoringCheckBox(DebuggerBundle.message("label.debugger.launching.configurable.force.classic.vm"));
myCbDisableJIT = new JCheckBox(DebuggerBundle.message("label.debugger.launching.configurable.disable.jit"));
- myHideDebuggerCheckBox = new JCheckBox(DebuggerBundle.message("label.debugger.launching.configurable.hide.window"));
myRbSocket = new JRadioButton(DebuggerBundle.message("label.debugger.launching.configurable.socket"));
myRbShmem = new JRadioButton(DebuggerBundle.message("label.debugger.launching.configurable.shmem"));
- myFocusAppCheckBox = new JCheckBox(DebuggerBundle.message("label.debugger.focusAppOnBreakpoint"));
-
- int cbLeftOffset = 0;
- final Border border = myCbForceClassicVM.getBorder();
- if (border != null) {
- final Insets insets = border.getBorderInsets(myCbForceClassicVM);
- if (insets != null) {
- cbLeftOffset = insets.left;
- }
- }
final ButtonGroup gr = new ButtonGroup();
gr.add(myRbSocket);
@@ -119,8 +107,6 @@ public class DebuggerLaunchingConfigurable implements Configurable{
panel.add(transportPanel);
panel.add(myCbForceClassicVM);
panel.add(myCbDisableJIT);
- panel.add(myHideDebuggerCheckBox);
- panel.add(myFocusAppCheckBox);
JPanel result = new JPanel(new BorderLayout());
result.add(panel, BorderLayout.NORTH);
@@ -129,7 +115,7 @@ public class DebuggerLaunchingConfigurable implements Configurable{
}
+ @Override
public void disposeUIResources() {
}
-
-}
+} \ No newline at end of file
diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java
index e25c895858a5..bb3fafed746f 100644
--- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java
+++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,25 +16,31 @@
package com.intellij.debugger.settings;
import com.intellij.debugger.impl.DebuggerUtilsEx;
-import com.intellij.openapi.components.NamedComponent;
-import com.intellij.openapi.components.ServiceManager;
+import com.intellij.openapi.components.*;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.util.DefaultJDOMExternalizer;
import com.intellij.openapi.util.InvalidDataException;
-import com.intellij.openapi.util.JDOMExternalizable;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.ui.classFilter.ClassFilter;
+import com.intellij.util.containers.hash.LinkedHashMap;
+import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters;
+import com.intellij.util.xmlb.XmlSerializer;
+import com.intellij.util.xmlb.annotations.Transient;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
-import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
-import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Cloneable {
- private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.settings.DebuggerSettings");
+@State(
+ name = "DebuggerSettings",
+ storages = {
+ @Storage(
+ file = StoragePathMacros.APP_CONFIG + "/other.xml"
+ )}
+)
+public class DebuggerSettings implements Cloneable, PersistentStateComponent<Element> {
+ private static final Logger LOG = Logger.getInstance(DebuggerSettings.class);
public static final int SOCKET_TRANSPORT = 0;
public static final int SHMEM_TRANSPORT = 1;
@@ -50,11 +56,9 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo
@NonNls public static final String RUN_HOTSWAP_ASK = "RunHotswapAsk";
public boolean TRACING_FILTERS_ENABLED;
- public int VALUE_LOOKUP_DELAY; // ms
public int DEBUGGER_TRANSPORT;
public boolean FORCE_CLASSIC_VM;
public boolean DISABLE_JIT;
- public boolean HIDE_DEBUGGER_ON_PROCESS_TERMINATION;
public boolean HOTSWAP_IN_BACKGROUND = true;
public boolean SKIP_SYNTHETIC_METHODS;
public boolean SKIP_CONSTRUCTORS;
@@ -72,8 +76,10 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo
private ClassFilter[] mySteppingFilters = ClassFilter.EMPTY_ARRAY;
- private Map<String, ContentState> myContentStates = new HashMap<String, ContentState>();
+ private Map<String, ContentState> myContentStates = new LinkedHashMap<String, ContentState>();
+ // transient - custom serialization
+ @Transient
public ClassFilter[] getSteppingFilters() {
final ClassFilter[] rv = new ClassFilter[mySteppingFilters.length];
for (int idx = 0; idx < rv.length; idx++) {
@@ -82,50 +88,51 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo
return rv;
}
+ public static DebuggerSettings getInstance() {
+ return ServiceManager.getService(DebuggerSettings.class);
+ }
+
public void setSteppingFilters(ClassFilter[] steppingFilters) {
mySteppingFilters = steppingFilters != null ? steppingFilters : ClassFilter.EMPTY_ARRAY;
}
- @SuppressWarnings({"HardCodedStringLiteral"})
- public void readExternal(Element parentNode) throws InvalidDataException {
- DefaultJDOMExternalizer.readExternal(this, parentNode);
- List<ClassFilter> filtersList = new ArrayList<ClassFilter>();
-
- for (final Object o : parentNode.getChildren("filter")) {
- Element filter = (Element)o;
- filtersList.add(DebuggerUtilsEx.create(filter));
- }
- setSteppingFilters(filtersList.toArray(new ClassFilter[filtersList.size()]));
-
- filtersList.clear();
-
- final List contents = parentNode.getChildren("content");
- myContentStates.clear();
- for (Object content : contents) {
- final ContentState state = new ContentState((Element)content);
- myContentStates.put(state.getType(), state);
+ @Nullable
+ @Override
+ public Element getState() {
+ Element state = XmlSerializer.serialize(this, new SkipDefaultValuesSerializationFilters());
+ try {
+ DebuggerUtilsEx.writeFilters(state, "filter", mySteppingFilters);
}
- }
-
- @SuppressWarnings({"HardCodedStringLiteral"})
- public void writeExternal(Element parentNode) throws WriteExternalException {
- DefaultJDOMExternalizer.writeExternal(this, parentNode);
- for (ClassFilter mySteppingFilter : mySteppingFilters) {
- Element element = new Element("filter");
- parentNode.addContent(element);
- mySteppingFilter.writeExternal(element);
+ catch (WriteExternalException e) {
+ LOG.error(e);
+ return null;
}
for (ContentState eachState : myContentStates.values()) {
final Element content = new Element("content");
if (eachState.write(content)) {
- parentNode.addContent(content);
+ state.addContent(content);
}
}
+ return state;
}
- public static DebuggerSettings getInstance() {
- return ServiceManager.getService(DebuggerSettings.class);
+ @Override
+ public void loadState(Element state) {
+ XmlSerializer.deserializeInto(this, state);
+
+ try {
+ setSteppingFilters(DebuggerUtilsEx.readFilters(state.getChildren("filter")));
+ }
+ catch (InvalidDataException e) {
+ LOG.error(e);
+ }
+
+ myContentStates.clear();
+ for (Element content : state.getChildren("content")) {
+ ContentState contentState = new ContentState(content);
+ myContentStates.put(contentState.getType(), contentState);
+ }
}
public boolean equals(Object obj) {
@@ -134,11 +141,9 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo
return
TRACING_FILTERS_ENABLED == secondSettings.TRACING_FILTERS_ENABLED &&
- VALUE_LOOKUP_DELAY == secondSettings.VALUE_LOOKUP_DELAY &&
DEBUGGER_TRANSPORT == secondSettings.DEBUGGER_TRANSPORT &&
FORCE_CLASSIC_VM == secondSettings.FORCE_CLASSIC_VM &&
DISABLE_JIT == secondSettings.DISABLE_JIT &&
- HIDE_DEBUGGER_ON_PROCESS_TERMINATION == secondSettings.HIDE_DEBUGGER_ON_PROCESS_TERMINATION &&
HOTSWAP_IN_BACKGROUND == secondSettings.HOTSWAP_IN_BACKGROUND &&
SKIP_SYNTHETIC_METHODS == secondSettings.SKIP_SYNTHETIC_METHODS &&
SKIP_CLASSLOADERS == secondSettings.SKIP_CLASSLOADERS &&
@@ -150,6 +155,7 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo
DebuggerUtilsEx.filterEquals(mySteppingFilters, secondSettings.mySteppingFilters);
}
+ @Override
public DebuggerSettings clone() {
try {
final DebuggerSettings cloned = (DebuggerSettings)super.clone();
@@ -169,13 +175,7 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo
return null;
}
- @NotNull
- public String getComponentName() {
- return "DebuggerSettings";
- }
-
public static class ContentState implements Cloneable {
-
private final String myType;
private boolean myMinimized;
private String mySelectedTab;
@@ -208,7 +208,7 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo
if (mySelectedTab != null) {
element.setAttribute("selected", mySelectedTab);
}
- element.setAttribute("split", new Double(mySplitProportion).toString());
+ element.setAttribute("split", Double.toString(mySplitProportion));
element.setAttribute("detached", Boolean.valueOf(myDetached).toString());
element.setAttribute("horizontal", Boolean.valueOf(myHorizontalToolbar).toString());
return true;
@@ -266,6 +266,7 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo
myHorizontalToolbar = horizontalToolbar;
}
+ @Override
public ContentState clone() throws CloneNotSupportedException {
return (ContentState)super.clone();
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java
index 75d9a81edc62..cec458ccbb70 100644
--- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java
+++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java
@@ -18,6 +18,7 @@ package com.intellij.debugger.settings;
import com.intellij.debugger.DebuggerBundle;
import com.intellij.debugger.ui.JavaDebuggerSupport;
import com.intellij.openapi.options.Configurable;
+import com.intellij.openapi.options.OptionsBundle;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.project.Project;
import com.intellij.ui.classFilter.ClassFilterEditor;
@@ -37,6 +38,7 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable, Con
private JCheckBox myCbSkipSimpleGetters;
private Project myProject;
+ @Override
public void reset() {
final DebuggerSettings settings = DebuggerSettings.getInstance();
myCbSkipSimpleGetters.setSelected(settings.SKIP_GETTERS);
@@ -52,6 +54,7 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable, Con
}
+ @Override
public void apply() {
getSettingsTo(DebuggerSettings.getInstance());
}
@@ -67,6 +70,7 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable, Con
settings.setSteppingFilters(mySteppingFilterEditor.getFilters());
}
+ @Override
public boolean isModified() {
final DebuggerSettings currentSettings = DebuggerSettings.getInstance();
final DebuggerSettings debuggerSettings = currentSettings.clone();
@@ -74,30 +78,35 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable, Con
return !debuggerSettings.equals(currentSettings);
}
+ @Override
public String getDisplayName() {
- return DebuggerBundle.message("debugger.stepping.configurable.display.name");
+ return OptionsBundle.message("options.java.display.name");
}
+ @Override
@NotNull
public String getHelpTopic() {
return "reference.idesettings.debugger.stepping";
}
+ @Override
@NotNull
public String getId() {
return getHelpTopic();
}
+ @Override
public Runnable enableSearch(String option) {
return null;
}
+ @Override
public JComponent createComponent() {
final JPanel panel = new JPanel(new GridBagLayout());
myProject = JavaDebuggerSupport.getContextProjectForEditorFieldsInDebuggerConfigurables();
myCbSkipSyntheticMethods = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.skip.synthetic.methods"));
myCbSkipConstructors = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.skip.constructors"));
- myCbSkipClassLoaders = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.skip.classloaders"));
+ myCbSkipClassLoaders = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.skip.classLoaders"));
myCbSkipSimpleGetters = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.skip.simple.getters"));
myCbStepInfoFiltersEnabled = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.step.filters.list.header"));
panel.add(myCbSkipSyntheticMethods, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0),0, 0));
@@ -110,6 +119,7 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable, Con
panel.add(mySteppingFilterEditor, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 5, 0, 0),0, 0));
myCbStepInfoFiltersEnabled.addActionListener(new ActionListener() {
+ @Override
public void actionPerformed(ActionEvent e) {
mySteppingFilterEditor.setEnabled(myCbStepInfoFiltersEnabled.isSelected());
}
@@ -117,6 +127,7 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable, Con
return panel;
}
+ @Override
public void disposeUIResources() {
mySteppingFilterEditor = null;
myProject = null;
diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/JavaDebuggerSettings.java b/java/debugger/impl/src/com/intellij/debugger/settings/JavaDebuggerSettings.java
new file mode 100644
index 000000000000..7151cb9f650e
--- /dev/null
+++ b/java/debugger/impl/src/com/intellij/debugger/settings/JavaDebuggerSettings.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.debugger.settings;
+
+import com.intellij.openapi.options.Configurable;
+import com.intellij.xdebugger.settings.XDebuggerSettings;
+import org.jdom.Element;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * We cannot now transform DebuggerSettings to XDebuggerSettings: getState/loadState is not called for EP,
+ * but we cannot use standard implementation to save our state, due to backward compatibility we must use own state spec.
+ *
+ * But we must implement createConfigurable as part of XDebuggerSettings otherwise java general settings will be before xdebugger general setting,
+ * because JavaDebuggerSettingsPanelProvider has higher priority than XDebuggerSettingsPanelProviderImpl.
+ */
+class JavaDebuggerSettings extends XDebuggerSettings<Element> {
+ protected JavaDebuggerSettings() {
+ super("java");
+ }
+
+ @Nullable
+ @Override
+ public Configurable createConfigurable(@NotNull Category category) {
+ switch (category) {
+ case ROOT:
+ return new DebuggerLaunchingConfigurable();
+ case DATA_VIEWS:
+ return new DebuggerDataViewsConfigurable(null);
+ case STEPPING:
+ return new DebuggerSteppingConfigurable();
+ }
+ return null;
+ }
+
+ @Override
+ public void generalApplied(@NotNull XDebuggerSettings.Category category) {
+ if (category == XDebuggerSettings.Category.DATA_VIEWS) {
+ NodeRendererSettings.getInstance().fireRenderersChanged();
+ }
+ }
+
+ @Nullable
+ @Override
+ public Element getState() {
+ return null;
+ }
+
+ @Override
+ public void loadState(Element state) {
+ }
+} \ No newline at end of file
diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java b/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java
index 8518e8258519..9555ce6c34dc 100644
--- a/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java
+++ b/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java
@@ -32,7 +32,6 @@ public class ViewsGeneralSettings implements PersistentStateComponent<Element> {
public boolean SHOW_OBJECTID = true;
public boolean HIDE_NULL_ARRAY_ELEMENTS = true;
public boolean AUTOSCROLL_TO_NEW_LOCALS = true;
- public boolean ENABLE_AUTO_EXPRESSIONS = true;
public ViewsGeneralSettings() {
}
@@ -41,22 +40,22 @@ public class ViewsGeneralSettings implements PersistentStateComponent<Element> {
return ServiceManager.getService(ViewsGeneralSettings.class);
}
+ @Override
public void loadState(Element element) {
try {
DefaultJDOMExternalizer.readExternal(this, element);
}
- catch (InvalidDataException e) {
- // ignore
+ catch (InvalidDataException ignored) {
}
}
+ @Override
public Element getState() {
Element element = new Element("ViewsGeneralSettings");
try {
DefaultJDOMExternalizer.writeExternal(this, element);
}
- catch (WriteExternalException e) {
- // ignore
+ catch (WriteExternalException ignored) {
}
return element;
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java
index 7b4b22ee19be..600efd834e56 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java
@@ -61,6 +61,7 @@ import com.intellij.unscramble.ThreadDumpPanel;
import com.intellij.unscramble.ThreadState;
import com.intellij.xdebugger.XDebuggerBundle;
import com.intellij.xdebugger.impl.actions.XDebuggerActions;
+import com.intellij.xdebugger.impl.settings.XDebuggerSettingsManager;
import com.intellij.xdebugger.impl.ui.DebuggerSessionTabBase;
import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants;
import org.jetbrains.annotations.NotNull;
@@ -105,7 +106,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos
case DebuggerSession.EVENT_DETACHED:
myUi.updateActionsNow();
- if (debuggerSettings.HIDE_DEBUGGER_ON_PROCESS_TERMINATION) {
+ if (XDebuggerSettingsManager.getInstanceImpl().getGeneralSettings().isHideDebuggerOnProcessTermination()) {
try {
ExecutionManager.getInstance(getProject()).getContentManager().hideRunContent(DefaultDebugExecutor.getDebugExecutorInstance(), myRunContentDescriptor);
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
index 630fa30339d2..27f63e032314 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
@@ -18,7 +18,9 @@ package com.intellij.debugger.ui;
import com.intellij.debugger.DebuggerManagerEx;
import com.intellij.debugger.actions.*;
import com.intellij.debugger.impl.DebuggerContextImpl;
-import com.intellij.debugger.settings.*;
+import com.intellij.debugger.settings.DebuggerHotswapConfigurable;
+import com.intellij.debugger.settings.NodeRendererSettings;
+import com.intellij.debugger.settings.UserRenderersConfigurable;
import com.intellij.debugger.ui.breakpoints.Breakpoint;
import com.intellij.ide.DataManager;
import com.intellij.openapi.Disposable;
@@ -333,22 +335,16 @@ public class JavaDebuggerSupport extends DebuggerSupport {
//}
}
- public static class JavaDebuggerSettingsPanelProvider extends DebuggerSettingsPanelProvider {
+ final static class JavaDebuggerSettingsPanelProvider extends DebuggerSettingsPanelProvider {
@Override
public int getPriority() {
return 1;
}
- @Override
- public Configurable getRootConfigurable() {
- return new DebuggerLaunchingConfigurable();
- }
-
+ @NotNull
@Override
public Collection<? extends Configurable> getConfigurables() {
final ArrayList<Configurable> configurables = new ArrayList<Configurable>();
- configurables.add(new DebuggerDataViewsConfigurable(null));
- configurables.add(new DebuggerSteppingConfigurable());
configurables.add(new UserRenderersConfigurable(null));
configurables.add(new DebuggerHotswapConfigurable());
return configurables;
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointWithHighlighter.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointWithHighlighter.java
index 1087338ab8d5..d6cbf1487ab9 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointWithHighlighter.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointWithHighlighter.java
@@ -177,7 +177,12 @@ public abstract class BreakpointWithHighlighter<P extends JavaBreakpointProperti
protected BreakpointWithHighlighter(@NotNull Project project, XBreakpoint xBreakpoint) {
//for persistency
super(project, xBreakpoint);
- reload();
+ ApplicationManager.getApplication().runReadAction(new Runnable() {
+ @Override
+ public void run() {
+ reload();
+ }
+ });
}
@Override
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaExceptionBreakpointType.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaExceptionBreakpointType.java
index 3bbea653a8a9..638e6a018c96 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaExceptionBreakpointType.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaExceptionBreakpointType.java
@@ -59,6 +59,18 @@ public class JavaExceptionBreakpointType extends JavaBreakpointTypeBase<JavaExce
return AllIcons.Debugger.Db_disabled_exception_breakpoint;
}
+ @NotNull
+ @Override
+ public Icon getMutedEnabledIcon() {
+ return AllIcons.Debugger.Db_muted_exception_breakpoint;
+ }
+
+ @NotNull
+ @Override
+ public Icon getMutedDisabledIcon() {
+ return AllIcons.Debugger.Db_muted_disabled_exception_breakpoint;
+ }
+
//@Override
protected String getHelpID() {
return HelpID.EXCEPTION_BREAKPOINTS;
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaFieldBreakpointType.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaFieldBreakpointType.java
index 0b1ba90ecbd6..f34898b7f615 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaFieldBreakpointType.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaFieldBreakpointType.java
@@ -63,6 +63,18 @@ public class JavaFieldBreakpointType extends JavaLineBreakpointTypeBase<JavaFiel
return AllIcons.Debugger.Db_disabled_field_breakpoint;
}
+ @NotNull
+ @Override
+ public Icon getMutedEnabledIcon() {
+ return AllIcons.Debugger.Db_muted_field_breakpoint;
+ }
+
+ @NotNull
+ @Override
+ public Icon getMutedDisabledIcon() {
+ return AllIcons.Debugger.Db_muted_disabled_field_breakpoint;
+ }
+
//@Override
protected String getHelpID() {
return HelpID.FIELD_WATCHPOINTS;
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaLineBreakpointType.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaLineBreakpointType.java
index 70d0f009e76c..a3c442fb410b 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaLineBreakpointType.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaLineBreakpointType.java
@@ -41,18 +41,6 @@ public class JavaLineBreakpointType extends JavaLineBreakpointTypeBase<JavaBreak
super("java-line", DebuggerBundle.message("line.breakpoints.tab.title"));
}
- @NotNull
- @Override
- public Icon getEnabledIcon() {
- return AllIcons.Debugger.Db_set_breakpoint;
- }
-
- @NotNull
- @Override
- public Icon getDisabledIcon() {
- return AllIcons.Debugger.Db_disabled_breakpoint;
- }
-
//@Override
protected String getHelpID() {
return HelpID.LINE_BREAKPOINTS;
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaMethodBreakpointType.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaMethodBreakpointType.java
index 2ec27499e9a3..4d7d51295fd6 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaMethodBreakpointType.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaMethodBreakpointType.java
@@ -51,6 +51,18 @@ public class JavaMethodBreakpointType extends JavaLineBreakpointTypeBase<JavaMet
return AllIcons.Debugger.Db_disabled_method_breakpoint;
}
+ @NotNull
+ @Override
+ public Icon getMutedEnabledIcon() {
+ return AllIcons.Debugger.Db_muted_method_breakpoint;
+ }
+
+ @NotNull
+ @Override
+ public Icon getMutedDisabledIcon() {
+ return AllIcons.Debugger.Db_muted_disabled_method_breakpoint;
+ }
+
//@Override
protected String getHelpID() {
return HelpID.METHOD_BREAKPOINTS;
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaWildcardMethodBreakpointType.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaWildcardMethodBreakpointType.java
index 8fea87b40db2..83da4a9f7027 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaWildcardMethodBreakpointType.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaWildcardMethodBreakpointType.java
@@ -50,6 +50,18 @@ public class JavaWildcardMethodBreakpointType extends JavaBreakpointTypeBase<Jav
return AllIcons.Debugger.Db_disabled_method_breakpoint;
}
+ @NotNull
+ @Override
+ public Icon getMutedEnabledIcon() {
+ return AllIcons.Debugger.Db_muted_method_breakpoint;
+ }
+
+ @NotNull
+ @Override
+ public Icon getMutedDisabledIcon() {
+ return AllIcons.Debugger.Db_muted_disabled_method_breakpoint;
+ }
+
//@Override
protected String getHelpID() {
return HelpID.METHOD_BREAKPOINTS;
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java
index 8cb6828d26e8..5d32e714ab89 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java
@@ -53,6 +53,7 @@ import com.intellij.util.text.CharArrayUtil;
import com.intellij.util.ui.tree.TreeModelAdapter;
import com.intellij.xdebugger.XDebuggerBundle;
import com.intellij.xdebugger.frame.XStackFrame;
+import com.intellij.xdebugger.settings.XDebuggerSettingsManager;
import com.sun.jdi.*;
import gnu.trove.TIntObjectHashMap;
import gnu.trove.TObjectProcedure;
@@ -157,7 +158,7 @@ public class FrameVariablesTree extends DebuggerTree {
}
try {
- if (!ViewsGeneralSettings.getInstance().ENABLE_AUTO_EXPRESSIONS && !myAutoWatchMode) {
+ if (!XDebuggerSettingsManager.getInstance().getDataViewSettings().isAutoExpressions() && !myAutoWatchMode) {
// optimization
super.buildVariables(stackDescriptor, evaluationContext);
}
@@ -273,7 +274,7 @@ public class FrameVariablesTree extends DebuggerTree {
}
catch (UnsupportedOperationException ignored) {
}
- catch (InternalException e) {
+ catch (Exception e) {
LOG.info(e);
}
return Collections.emptyList();
@@ -569,7 +570,7 @@ public class FrameVariablesTree extends DebuggerTree {
myVars = vars;
myPosition = position;
myEvalContext = evalContext;
- myCollectExpressions = ViewsGeneralSettings.getInstance().ENABLE_AUTO_EXPRESSIONS;
+ myCollectExpressions = XDebuggerSettingsManager.getInstance().getDataViewSettings().isAutoExpressions();
}
@Override
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java
index fce05d1f23db..df91efed9579 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/TipManager.java
@@ -15,7 +15,6 @@
*/
package com.intellij.debugger.ui.impl;
-import com.intellij.debugger.settings.DebuggerSettings;
import com.intellij.ide.FrameStateListener;
import com.intellij.ide.FrameStateManager;
import com.intellij.openapi.Disposable;
@@ -32,6 +31,7 @@ import com.intellij.util.Alarm;
import com.intellij.util.ui.UIUtil;
import com.intellij.util.ui.update.Activatable;
import com.intellij.util.ui.update.UiNotifyConnector;
+import com.intellij.xdebugger.settings.XDebuggerSettingsManager;
import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
@@ -117,14 +117,17 @@ public class TipManager implements Disposable, PopupMenuListener {
return menu;
}
+ @Override
public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
myPopupShown = true;
}
+ @Override
public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
onPopupClosed(e);
}
+ @Override
public void popupMenuCanceled(final PopupMenuEvent e) {
onPopupClosed(e);
}
@@ -174,12 +177,13 @@ public class TipManager implements Disposable, PopupMenuListener {
myShowAlarm.cancelAllRequests();
myHideAlarm.cancelAllRequests();
myShowAlarm.addRequest(new Runnable() {
+ @Override
public void run() {
if (!myIsDisposed && !myPopupShown) {
showTooltip(e, auto);
}
}
- }, auto ? DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY : 10);
+ }, auto ? XDebuggerSettingsManager.getInstance().getDataViewSettings().getValueLookupDelay() : 10);
}
private void showTooltip(InputEvent e, boolean auto) {
@@ -245,6 +249,7 @@ public class TipManager implements Disposable, PopupMenuListener {
myCurrentTooltip = null;
} else {
myHideAlarm.addRequest(new Runnable() {
+ @Override
public void run() {
if (myInsideComponent) {
hideTooltip(true);
@@ -273,10 +278,12 @@ public class TipManager implements Disposable, PopupMenuListener {
myComponent = component;
new UiNotifyConnector.Once(component, new Activatable() {
+ @Override
public void showNotify() {
installListeners();
}
+ @Override
public void hideNotify() {
}
});
@@ -284,6 +291,7 @@ public class TipManager implements Disposable, PopupMenuListener {
final HideTooltipAction hide = new HideTooltipAction();
hide.registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)), myComponent);
Disposer.register(this, new Disposable() {
+ @Override
public void dispose() {
hide.unregisterCustomShortcutSet(myComponent);
}
@@ -292,6 +300,7 @@ public class TipManager implements Disposable, PopupMenuListener {
private class HideTooltipAction extends AnAction {
+ @Override
public void actionPerformed(AnActionEvent e) {
hideTooltip(true);
}
@@ -316,6 +325,7 @@ public class TipManager implements Disposable, PopupMenuListener {
FrameStateManager.getInstance().addListener(myFrameStateListener);
}
+ @Override
public void dispose() {
Disposer.dispose(this);
@@ -333,6 +343,7 @@ public class TipManager implements Disposable, PopupMenuListener {
private class MyAwtPreprocessor implements AWTEventListener {
+ @Override
public void eventDispatched(AWTEvent event) {
if (event.getID() == MouseEvent.MOUSE_MOVED) {
preventFromHideIfInsideTooltip(event);
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java
index 52d557535917..d333eaaacd10 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java
@@ -55,6 +55,7 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.SpeedSearchComparator;
import com.intellij.ui.TreeSpeedSearch;
+import com.intellij.xdebugger.settings.XDebuggerSettingsManager;
import com.sun.jdi.*;
import com.sun.jdi.event.Event;
import com.sun.jdi.event.ExceptionEvent;
@@ -485,7 +486,7 @@ public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvi
try {
buildVariables(stackDescriptor, evaluationContext);
- if (classRenderer.SORT_ASCENDING) {
+ if (XDebuggerSettingsManager.getInstance().getDataViewSettings().isSortValues()) {
Collections.sort(myChildren, NodeManagerImpl.getNodeComparator());
}
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/BatchEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/BatchEvaluator.java
index abf937e5a793..59749a2b001a 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/BatchEvaluator.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/BatchEvaluator.java
@@ -27,6 +27,7 @@ import com.intellij.debugger.engine.jdi.ThreadReferenceProxy;
import com.intellij.debugger.engine.managerThread.SuspendContextCommand;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.registry.Registry;
import com.intellij.rt.debugger.BatchEvaluatorServer;
import com.intellij.util.containers.HashMap;
import com.sun.jdi.*;
@@ -120,7 +121,7 @@ public class BatchEvaluator {
final EvaluationContext evaluationContext = command.getEvaluationContext();
final SuspendContext suspendContext = evaluationContext.getSuspendContext();
- if(!hasBatchEvaluator(evaluationContext)) {
+ if(!Registry.is("debugger.batch.evaluation") || !hasBatchEvaluator(evaluationContext)) {
myDebugProcess.getManagerThread().invokeCommand(command);
}
else {
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java
index bd14ef55b054..7fe89bb42299 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java
@@ -38,6 +38,7 @@ import com.intellij.psi.PsiElementFactory;
import com.intellij.psi.PsiExpression;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.StringBuilderSpinAllocator;
+import com.intellij.xdebugger.settings.XDebuggerSettingsManager;
import com.sun.jdi.*;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
@@ -58,7 +59,6 @@ public class ClassRenderer extends NodeRendererImpl{
public static final @NonNls String UNIQUE_ID = "ClassRenderer";
- public boolean SORT_ASCENDING = false;
public boolean SHOW_SYNTHETICS = true;
public boolean SHOW_VAL_FIELDS_AS_LOCAL_VARIABLES = true;
public boolean SHOW_STATIC = false;
@@ -83,22 +83,27 @@ public class ClassRenderer extends NodeRendererImpl{
return typeName;
}
+ @Override
public String getUniqueId() {
return UNIQUE_ID;
}
+ @Override
public boolean isEnabled() {
return myProperties.isEnabled();
}
+ @Override
public void setEnabled(boolean enabled) {
myProperties.setEnabled(enabled);
}
+ @Override
public ClassRenderer clone() {
return (ClassRenderer) super.clone();
}
+ @Override
public String calcLabel(ValueDescriptor descriptor, EvaluationContext evaluationContext, DescriptorLabelListener labelListener) throws EvaluateException {
return calcLabel(descriptor);
}
@@ -151,6 +156,7 @@ public class ClassRenderer extends NodeRendererImpl{
}
}
+ @Override
public void buildChildren(final Value value, final ChildrenBuilder builder, final EvaluationContext evaluationContext) {
DebuggerManagerThreadImpl.assertIsManagerThread();
final ValueDescriptorImpl parentDescriptor = (ValueDescriptorImpl)builder.getParentDescriptor();
@@ -171,7 +177,7 @@ public class ClassRenderer extends NodeRendererImpl{
children.add(nodeManager.createNode(nodeDescriptorFactory.getFieldDescriptor(parentDescriptor, objRef, field), evaluationContext));
}
- if(SORT_ASCENDING) {
+ if (XDebuggerSettingsManager.getInstance().getDataViewSettings().isSortValues()) {
Collections.sort(children, NodeManagerImpl.getNodeComparator());
}
}
@@ -211,16 +217,19 @@ public class ClassRenderer extends NodeRendererImpl{
return true;
}
+ @Override
public void readExternal(Element element) throws InvalidDataException {
super.readExternal(element);
DefaultJDOMExternalizer.readExternal(this, element);
}
+ @Override
public void writeExternal(Element element) throws WriteExternalException {
super.writeExternal(element);
DefaultJDOMExternalizer.writeExternal(this, element);
}
+ @Override
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
FieldDescriptor fieldDescriptor = (FieldDescriptor)node.getDescriptor();
@@ -251,19 +260,23 @@ public class ClassRenderer extends NodeRendererImpl{
return false;
}
+ @Override
public boolean isExpandable(Value value, EvaluationContext evaluationContext, NodeDescriptor parentDescriptor) {
DebuggerManagerThreadImpl.assertIsManagerThread();
return valueExpandable(value);
}
+ @Override
public boolean isApplicable(Type type) {
return type instanceof ReferenceType && !(type instanceof ArrayType);
}
+ @Override
public @NonNls String getName() {
return "Object";
}
+ @Override
public void setName(String text) {
LOG.assertTrue(false);
}
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ToStringRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ToStringRenderer.java
index fd77aa900a7c..4016289147a7 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ToStringRenderer.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ToStringRenderer.java
@@ -36,7 +36,7 @@ import com.sun.jdi.*;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
-import java.util.Iterator;
+import java.util.List;
import static com.intellij.psi.CommonClassNames.JAVA_LANG_STRING;
@@ -126,14 +126,10 @@ public class ToStringRenderer extends NodeRendererImpl {
@SuppressWarnings({"HardCodedStringLiteral"})
private static boolean overridesToString(Type type) {
if(type instanceof ClassType) {
- final ClassType classType = (ClassType)type;
- final java.util.List methods = classType.methodsByName("toString", "()Ljava/lang/String;");
- if (methods.size() > 0) {
- for (Iterator iterator = methods.iterator(); iterator.hasNext();) {
- final Method method = (Method)iterator.next();
- if(!(method.declaringType().name()).equals(CommonClassNames.JAVA_LANG_OBJECT)){
- return true;
- }
+ final List<Method> methods = ((ClassType)type).methodsByName("toString", "()Ljava/lang/String;");
+ for (Method method : methods) {
+ if (!(method.declaringType().name()).equals(CommonClassNames.JAVA_LANG_OBJECT)) {
+ return true;
}
}
}
@@ -182,7 +178,7 @@ public class ToStringRenderer extends NodeRendererImpl {
private boolean isFiltered(Type t) {
if (t instanceof ReferenceType) {
for (ClassFilter classFilter : myClassFilters) {
- if (classFilter.isEnabled() && DebuggerUtilsEx.getSuperType(t, classFilter.getPattern()) != null) {
+ if (classFilter.isEnabled() && DebuggerUtils.getSuperType(t, classFilter.getPattern()) != null) {
return true;
}
}
diff --git a/java/debugger/impl/src/org/jetbrains/java/debugger/breakpoints/properties/JavaBreakpointProperties.java b/java/debugger/impl/src/org/jetbrains/java/debugger/breakpoints/properties/JavaBreakpointProperties.java
index 599aed3dd0dd..be8833afd55b 100644
--- a/java/debugger/impl/src/org/jetbrains/java/debugger/breakpoints/properties/JavaBreakpointProperties.java
+++ b/java/debugger/impl/src/org/jetbrains/java/debugger/breakpoints/properties/JavaBreakpointProperties.java
@@ -45,7 +45,7 @@ public class JavaBreakpointProperties<T extends JavaBreakpointProperties> extend
}
public boolean setInstanceFilters(InstanceFilter[] instanceFilters) {
- boolean changed = !Comparing.equal(myInstanceFilters, instanceFilters);
+ boolean changed = !filtersEqual(myInstanceFilters, instanceFilters);
myInstanceFilters = instanceFilters;
return changed;
}
@@ -64,11 +64,18 @@ public class JavaBreakpointProperties<T extends JavaBreakpointProperties> extend
}
public final boolean setClassFilters(ClassFilter[] classFilters) {
- boolean changed = !Comparing.equal(myClassFilters, classFilters);
+ boolean changed = !filtersEqual(myClassFilters, classFilters);
myClassFilters = classFilters;
return changed;
}
+ private static boolean filtersEqual(Object[] a, Object[] b) {
+ if ((a == null || a.length == 0) && (b == null || b.length == 0)) {
+ return true;
+ }
+ return Comparing.equal(a, b);
+ }
+
@Tag("class-exclusion-filters")
@AbstractCollection(surroundWithTag = false)
public ClassFilter[] getClassExclusionFilters() {
@@ -76,7 +83,7 @@ public class JavaBreakpointProperties<T extends JavaBreakpointProperties> extend
}
public boolean setClassExclusionFilters(ClassFilter[] classExclusionFilters) {
- boolean changed = !Comparing.equal(myClassExclusionFilters, classExclusionFilters);
+ boolean changed = !filtersEqual(myClassExclusionFilters, classExclusionFilters);
myClassExclusionFilters = classExclusionFilters;
return changed;
}
diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java
index b72a8883636f..04af179638cd 100644
--- a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java
+++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java
@@ -16,6 +16,7 @@
package com.intellij.execution.application;
import com.intellij.execution.ExecutionBundle;
+import com.intellij.execution.JavaExecutionUtil;
import com.intellij.execution.configurations.ConfigurationUtil;
import com.intellij.execution.ui.AlternativeJREPanel;
import com.intellij.execution.ui.ClassBrowser;
@@ -71,7 +72,9 @@ public class ApplicationConfigurable extends SettingsEditor<ApplicationConfigura
public void applyEditorTo(final ApplicationConfiguration configuration) throws ConfigurationException {
myCommonProgramParameters.applyTo(configuration);
myModuleSelector.applyTo(configuration);
- configuration.MAIN_CLASS_NAME = getMainClassField().getText();
+ final String className = getMainClassField().getText();
+ final PsiClass aClass = myModuleSelector.findClass(className);
+ configuration.MAIN_CLASS_NAME = aClass != null ? JavaExecutionUtil.getRuntimeQualifiedName(aClass) : className;
configuration.ALTERNATIVE_JRE_PATH = myAlternativeJREPanel.getPath();
configuration.ALTERNATIVE_JRE_PATH_ENABLED = myAlternativeJREPanel.isPathEnabled();
configuration.ENABLE_SWING_INSPECTOR = (myVersionDetector.isJre50Configured(configuration) || myVersionDetector.isModuleJre50Configured(configuration)) && myShowSwingInspectorCheckbox.isSelected();
@@ -82,7 +85,7 @@ public class ApplicationConfigurable extends SettingsEditor<ApplicationConfigura
public void resetEditorFrom(final ApplicationConfiguration configuration) {
myCommonProgramParameters.reset(configuration);
myModuleSelector.reset(configuration);
- getMainClassField().setText(configuration.MAIN_CLASS_NAME);
+ getMainClassField().setText(configuration.MAIN_CLASS_NAME.replaceAll("\\$", "\\."));
myAlternativeJREPanel.init(configuration.ALTERNATIVE_JRE_PATH, configuration.ALTERNATIVE_JRE_PATH_ENABLED);
updateShowSwingInspector(configuration);
@@ -121,7 +124,7 @@ public class ApplicationConfigurable extends SettingsEditor<ApplicationConfigura
public Visibility isDeclarationVisible(PsiElement declaration, PsiElement place) {
if (declaration instanceof PsiClass) {
final PsiClass aClass = (PsiClass)declaration;
- if (ConfigurationUtil.MAIN_CLASS.value(aClass) && PsiMethodUtil.findMainMethod(aClass) != null) {
+ if (ConfigurationUtil.MAIN_CLASS.value(aClass) && PsiMethodUtil.findMainMethod(aClass) != null || place.getParent() != null && myModuleSelector.findClass(((PsiClass)declaration).getQualifiedName()) != null) {
return Visibility.VISIBLE;
}
}
diff --git a/java/execution/impl/src/com/intellij/execution/remote/RemoteConfiguration.java b/java/execution/impl/src/com/intellij/execution/remote/RemoteConfiguration.java
index 4f503f3f7270..57c84c9fa929 100644
--- a/java/execution/impl/src/com/intellij/execution/remote/RemoteConfiguration.java
+++ b/java/execution/impl/src/com/intellij/execution/remote/RemoteConfiguration.java
@@ -77,10 +77,13 @@ public class RemoteConfiguration extends ModuleBasedConfiguration<JavaRunConfigu
@Override
public RunProfileState getState(@NotNull final Executor executor, @NotNull final ExecutionEnvironment env) throws ExecutionException {
- GenericDebuggerRunnerSettings debuggerSettings = (GenericDebuggerRunnerSettings)env.getRunnerSettings();
- debuggerSettings.LOCAL = false;
- debuggerSettings.setDebugPort(USE_SOCKET_TRANSPORT ? PORT : SHMEM_ADDRESS);
- debuggerSettings.setTransport(USE_SOCKET_TRANSPORT ? DebuggerSettings.SOCKET_TRANSPORT : DebuggerSettings.SHMEM_TRANSPORT);
+ final GenericDebuggerRunnerSettings debuggerSettings = (GenericDebuggerRunnerSettings)env.getRunnerSettings();
+ if (debuggerSettings != null) {
+ // sync self state with execution environment's state if available
+ debuggerSettings.LOCAL = false;
+ debuggerSettings.setDebugPort(USE_SOCKET_TRANSPORT ? PORT : SHMEM_ADDRESS);
+ debuggerSettings.setTransport(USE_SOCKET_TRANSPORT ? DebuggerSettings.SOCKET_TRANSPORT : DebuggerSettings.SHMEM_TRANSPORT);
+ }
return new RemoteStateState(getProject(), createRemoteConnection());
}
diff --git a/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java b/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java
index e3570c2c0fe5..ded07d482ed3 100644
--- a/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java
+++ b/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java
@@ -27,6 +27,7 @@ import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.ui.Gray;
+import com.intellij.ui.JBColor;
import com.intellij.ui.border.CustomLineBorder;
import org.jetbrains.annotations.Nullable;
@@ -55,7 +56,7 @@ public class ShowStructureSettingsAction extends AnAction implements DumbAware {
protected JComponent createSouthPanel() {
JComponent panel = super.createSouthPanel();
assert panel != null;
- CustomLineBorder line = new CustomLineBorder(Gray._153, 1, 0, 0, 0);
+ CustomLineBorder line = new CustomLineBorder(new JBColor(Gray._153, Gray._80), 1, 0, 0, 0);
panel.setBorder(new CompoundBorder(line, new EmptyBorder(10, 5, 5, 5)));
return panel;
}
diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java
new file mode 100644
index 000000000000..77ccbe6cbdff
--- /dev/null
+++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.openapi.roots.ui.configuration;
+
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.options.Configurable;
+import com.intellij.openapi.options.ConfigurationException;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
+import com.intellij.openapi.util.Disposer;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.ui.*;
+import com.intellij.ui.awt.RelativePoint;
+import com.intellij.util.Alarm;
+import com.intellij.util.ui.UIUtil;
+import org.jetbrains.annotations.Nls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.text.Element;
+import java.awt.*;
+import java.awt.event.MouseEvent;
+import java.net.URL;
+import java.util.ArrayList;
+
+/**
+ * @author Konstantin Bulenkov
+ */
+public class ErrorPaneConfigurable extends JPanel implements Configurable, Disposable, ConfigurationErrors {
+ private final Alarm myAlarm;
+ private final ArrayList<ConfigurationError> myErrors = new ArrayList<ConfigurationError>();
+ private final JTextPane myContent = new JTextPane();
+ private Runnable myOnErrorsChanged;
+
+ public ErrorPaneConfigurable(final Project project, StructureConfigurableContext context, Runnable onErrorsChanged) {
+ super(new BorderLayout());
+ myOnErrorsChanged = onErrorsChanged;
+ myContent.setEditorKit(UIUtil.getHTMLEditorKit());
+ myContent.setEditable(false);
+ myContent.setBackground(UIUtil.getListBackground());
+ final JScrollPane pane = ScrollPaneFactory.createScrollPane(myContent, true);
+ pane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+ add(pane);
+ myAlarm = new Alarm(this);
+ project.getMessageBus().connect(this).subscribe(ConfigurationErrors.TOPIC, this);
+ myContent.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void hyperlinkActivated(HyperlinkEvent e) {
+ final URL url = e.getURL();
+ final AWTEvent awtEvent = EventQueue.getCurrentEvent();
+ if (!(awtEvent instanceof MouseEvent)) {
+ return;
+ }
+ final MouseEvent me = (MouseEvent)awtEvent;
+
+ if (url != null) {
+ ConfigurationError error = null;
+ Element element = e.getSourceElement();
+ while (element != null) {
+ if ("li".equals(element.getName())) {
+ final Element ol = element.getParentElement();
+ for (int i = 0; i < ol.getElementCount(); i++) {
+ if (ol.getElement(i) == element) {
+ error = myErrors.get(i);
+ }
+ }
+ break;
+ }
+ element = element.getParentElement();
+ }
+ if (error == null) return;
+ final String host = url.getHost();
+ String path = url.getPath();
+ if (path != null && path.startsWith("/")) {
+ path = StringUtil.unescapeXml(path.substring(1));
+ }
+ if (path != null) {
+ if ("fix".equals(host)) {
+ final MouseEvent mouseEvent = new MouseEvent(me.getComponent(), me.getID(), me.getWhen(), me.getModifiers(),
+ me.getX() - 15, me.getY() + 10, me.getClickCount(), me.isPopupTrigger());
+ error.fix(myContent, new RelativePoint(mouseEvent));
+ } else {
+ error.navigate();
+ }
+ }
+ }
+ }
+ });
+
+ refresh();
+ }
+
+ public void refresh() {
+ myAlarm.cancelAllRequests();
+ myAlarm.addRequest(new Runnable() {
+ @Override
+ public void run() {
+ String html = "<html>" +
+ "<header><style type='text/css'>" +
+ "body {" +
+ " color: #" + ColorUtil.toHex(new JBColor(Gray.x33, UIUtil.getLabelForeground())) + ";" +
+ " font-family: '" + UIUtil.getLabelFont().getName() + ",serif';" +
+ " font-size: " + UIUtil.getLabelFont().getSize() + ";" +
+ "}" +
+ "li {" +
+ " margin-bottom: 5;" +
+ "}" +
+ "ol {" +
+ "}" +
+ "a {" +
+ " text-decoration: none;" +
+ "}" +
+ "</style>" +
+ "</header>" +
+ "<body>";
+ int i = 0;
+ html += "<ol>";
+ for (ConfigurationError error : myErrors) {
+ i++;
+ String description = error.getDescription();
+ if (description.startsWith("<html>") && description.endsWith("</html>")) {
+ description = description.substring(6, description.length() - 7);
+ }
+ if (description.startsWith("Module '")) {
+ final int start = 8;
+ final int end = description.indexOf("'", 9);
+ final String moduleName = description.substring(start, end);
+ description = "Module <a href='http://module/" + StringUtil.escapeXml(moduleName) + "'>" + StringUtil.escapeXml(moduleName) + "</a> " + description.substring(
+ end + 1);
+ }
+ if (error.canBeFixed()) {
+ description += " <a href='http://fix/" + i + "'>[Fix]</a>";
+ }
+ html+= "<li>" + description + "</li>";
+ }
+ html += "</ol></body></html>";
+ myContent.setText(html);
+ if (myOnErrorsChanged != null) {
+ myOnErrorsChanged.run();
+ }
+ }
+ }, 100);
+ }
+
+ @Nls
+ @Override
+ public String getDisplayName() {
+ return "Problems";
+ }
+
+ @Nullable
+ @Override
+ public String getHelpTopic() {
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public JComponent createComponent() {
+ return this;
+ }
+
+ @Override
+ public boolean isModified() {
+ return false;
+ }
+
+ @Override
+ public void apply() throws ConfigurationException {
+
+ }
+
+ @Override
+ public void reset() {
+
+ }
+
+ @Override
+ public void disposeUIResources() {
+ Disposer.dispose(this);
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public void addError(@NotNull ConfigurationError error) {
+ myErrors.add(error);
+ refresh();
+ }
+
+ @Override
+ public void removeError(@NotNull ConfigurationError error) {
+ myErrors.remove(error);
+ refresh();
+ }
+
+ public int getErrorsCount() {
+ return myErrors.size();
+ }
+}
diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java
index d007c3650642..bf083f92c66c 100644
--- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java
+++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java
@@ -43,7 +43,6 @@ import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy;
import com.intellij.packaging.artifacts.Artifact;
-import com.intellij.ui.Gray;
import com.intellij.ui.JBSplitter;
import com.intellij.ui.components.panels.Wrapper;
import com.intellij.ui.navigation.BackAction;
@@ -179,11 +178,7 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se
mySplitter.setSplitterProportionKey("ProjectStructure.TopLevelElements");
mySplitter.setHonorComponentsMinimumSize(true);
if (Registry.is("ide.new.project.settings")) {
- mySplitter.setDividerWidth(1);
- mySplitter.setShowDividerIcon(false);
- mySplitter.getDivider().setBackground(Gray._153.withAlpha(128));
- mySplitter.setShowDividerControls(false);
- mySplitter.setOrientation(mySplitter.getOrientation());
+ mySplitter.setOnePixelMode();
}
initSidePanel();
@@ -203,7 +198,7 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se
toolbar.setTargetComponent(myComponent);
myToolbarComponent = toolbar.getComponent();
if (Registry.is("ide.new.project.settings")) {
- left.setBackground(new Color(0xD2D6DD));
+ left.setBackground(UIUtil.getSidePanelColor());
} else {
left.add(myToolbarComponent, BorderLayout.NORTH);
}
@@ -214,7 +209,9 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se
myComponent.add(mySplitter, BorderLayout.CENTER);
myErrorsComponent = new ConfigurationErrorsComponent(myProject);
- myComponent.add(myErrorsComponent, BorderLayout.SOUTH);
+ if (!Registry.is("ide.new.project.settings")) {
+ myComponent.add(myErrorsComponent, BorderLayout.SOUTH);
+ }
myUiInitialized = true;
@@ -253,6 +250,11 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se
addConfigurable(configurable, true);
}
}
+
+ if (Registry.is("ide.new.project.settings")) {
+ mySidePanel.addSeparator("--");
+ addErrorPane();
+ }
}
private void addArtifactsConfig() {
@@ -299,6 +301,15 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se
addConfigurable(myProjectLibrariesConfig, ConfigurableId.PROJECT_LIBRARIES);
}
+ private void addErrorPane() {
+ addConfigurable(new ErrorPaneConfigurable(myProject, myContext, new Runnable() {
+ @Override
+ public void run() {
+ mySidePanel.getList().repaint();
+ }
+ }), true);
+ }
+
private void addGlobalLibrariesConfig() {
addConfigurable(myGlobalLibrariesConfig, ConfigurableId.GLOBAL_LIBRARIES);
}
diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java
index a2d1e4e0489d..290f35e561b5 100644
--- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java
+++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/SidePanel.java
@@ -16,17 +16,23 @@
package com.intellij.openapi.roots.ui.configuration;
import com.intellij.openapi.actionSystem.Presentation;
+import com.intellij.openapi.ui.GraphicsConfig;
import com.intellij.openapi.ui.popup.ListItemDescriptor;
import com.intellij.openapi.util.registry.Registry;
-import com.intellij.ui.ScrollPaneFactory;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.ui.*;
import com.intellij.ui.components.JBList;
+import com.intellij.ui.components.panels.NonOpaquePanel;
import com.intellij.ui.navigation.History;
import com.intellij.ui.navigation.Place;
import com.intellij.ui.popup.list.GroupedItemsListRenderer;
import com.intellij.util.ui.EmptyIcon;
+import com.intellij.util.ui.GraphicsUtil;
+import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
+import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
@@ -36,6 +42,9 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
+import static javax.swing.SwingConstants.CENTER;
+import static javax.swing.SwingConstants.LEFT;
+
public class SidePanel extends JPanel {
private final JList myList;
@@ -56,7 +65,7 @@ public class SidePanel extends JPanel {
myModel = new DefaultListModel();
myList = new JBList(myModel);
if (Registry.is("ide.new.project.settings")) {
- myList.setBackground(new Color(0xD2D6DD));
+ myList.setBackground(UIUtil.getSidePanelColor());
myList.setBorder(new EmptyBorder(5, 0, 0, 0));
}
final ListItemDescriptor descriptor = new ListItemDescriptor() {
@@ -84,18 +93,100 @@ public class SidePanel extends JPanel {
@Override
public String getCaptionAboveOf(final Object value) {
- String text = myIndex2Separator.get(myPlaces.indexOf(value));
- return text != null && Registry.is("ide.new.project.settings") ? text.toUpperCase() : text;
+ return myIndex2Separator.get(myPlaces.indexOf(value));
}
};
myList.setCellRenderer(new GroupedItemsListRenderer(descriptor) {
+ JPanel myExtraPanel;
+ CountLabel myCountLabel;
{
mySeparatorComponent.setCaptionCentered(false);
}
+
+ @Override
+ protected Color getForeground() {
+ return Registry.is("ide.new.project.settings") ? new JBColor(Gray._60, Gray._140) : super.getForeground();
+ }
+
+ @Override
+ protected SeparatorWithText createSeparator() {
+ return new SeparatorWithText() {
+ @Override
+ protected void paintComponent(Graphics g) {
+ if (Registry.is("ide.new.project.settings")) {
+ g.setColor(new JBColor(POPUP_SEPARATOR_FOREGROUND, Gray._80));
+ if ("--".equals(getCaption())) {
+ g.drawLine(0, getHeight()/ 2, getWidth(), getHeight() /2);
+ return;
+ }
+ Rectangle viewR = new Rectangle(0, getVgap(), getWidth() - 1, getHeight() - getVgap() - 1);
+ Rectangle iconR = new Rectangle();
+ Rectangle textR = new Rectangle();
+ String s = SwingUtilities
+ .layoutCompoundLabel(g.getFontMetrics(), getCaption(), null, CENTER,
+ LEFT,
+ CENTER,
+ LEFT,
+ viewR, iconR, textR, 0);
+ GraphicsUtil.setupAAPainting(g);
+ g.setColor(new JBColor(Gray._255.withAlpha(80), Gray._0.withAlpha(80)));
+ g.drawString(s, textR.x + 10, textR.y + 1 + g.getFontMetrics().getAscent());
+ g.setColor(new JBColor(new Color(0x5F6D7B), Gray._120));
+ g.drawString(s, textR.x + 10, textR.y + g.getFontMetrics().getAscent());
+ }
+ else {
+ super.paintComponent(g);
+ }
+ }
+ };
+ }
+
+ @Override
+ protected void layout() {
+ if (Registry.is("ide.new.project.settings")) {
+ myRendererComponent.add(mySeparatorComponent, BorderLayout.NORTH);
+ myExtraPanel.add(myComponent, BorderLayout.CENTER);
+ myExtraPanel.add(myCountLabel, BorderLayout.EAST);
+ myRendererComponent.add(myExtraPanel, BorderLayout.CENTER);
+ } else {
+ super.layout();
+ }
+ }
+
+ @Override
+ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+ myCountLabel.setText("");
+ final Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+ if ("Problems".equals(descriptor.getTextFor(value))) {
+ final ErrorPaneConfigurable errorPane = (ErrorPaneConfigurable)((Place)value).getPath("category");
+ if (errorPane != null && errorPane.getErrorsCount() > 0) {
+ myCountLabel.setSelected(isSelected);
+ myCountLabel.setText(String.valueOf(errorPane.getErrorsCount()));
+ }
+ }
+ return component;
+ }
+
+ @Override
+ protected JComponent createItemComponent() {
+ myExtraPanel = new NonOpaquePanel(new BorderLayout());
+ myCountLabel = new CountLabel();
+
+
+ if (Registry.is("ide.new.project.settings")) {
+ myTextLabel = new EngravedLabel();
+ myTextLabel.setFont(myTextLabel.getFont().deriveFont(Font.BOLD));
+ myTextLabel.setForeground(Gray._240);
+ myTextLabel.setOpaque(true);
+ return layoutComponent(myTextLabel);
+ }
+ return super.createItemComponent();
+ }
+
@Override
protected Color getBackground() {
- return Registry.is("ide.new.project.settings") ? new Color(0xD2D6DD) : super.getBackground();
+ return Registry.is("ide.new.project.settings") ? UIUtil.getSidePanelColor() : super.getBackground();
}
});
@@ -114,6 +205,10 @@ public class SidePanel extends JPanel {
});
}
+ public JList getList() {
+ return myList;
+ }
+
public void addPlace(Place place, @NotNull Presentation presentation) {
myModel.addElement(place);
myPlaces.add(place);
@@ -133,4 +228,51 @@ public class SidePanel extends JPanel {
public void select(final Place place) {
myList.setSelectedValue(place, true);
}
+
+ private static class CountLabel extends JLabel {
+ private boolean mySelected;
+
+ public CountLabel() {
+ super();
+ setBorder(new Border() {
+ @Override
+ public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
+ }
+
+ @Override
+ public Insets getBorderInsets(Component c) {
+ return StringUtil.isEmpty(getText()) ? new Insets(0,0,0,0) : new Insets(2, 6, 2, 6 + 6);
+ }
+
+ @Override
+ public boolean isBorderOpaque() {
+ return false;
+ }
+ });
+ setFont(UIUtil.getListFont().deriveFont(Font.BOLD));
+ }
+
+ public boolean isSelected() {
+ return mySelected;
+ }
+
+ public void setSelected(boolean selected) {
+ mySelected = selected;
+ }
+
+ @Override
+ protected void paintComponent(Graphics g) {
+ g.setColor(isSelected() ? UIUtil.getListSelectionBackground() : UIUtil.getSidePanelColor());
+ g.fillRect(0, 0, getWidth(), getHeight());
+ if (StringUtil.isEmpty(getText())) return;
+ final JBColor deepBlue = new JBColor(new Color(0x97A4B2), new Color(92, 98, 113));
+ g.setColor(isSelected() ? Gray._255.withAlpha(UIUtil.isUnderDarcula() ? 100 : 220) : deepBlue);
+ final GraphicsConfig config = GraphicsUtil.setupAAPainting(g);
+ g.fillRoundRect(0, 3, getWidth() - 6 -1, getHeight()-6 , (getHeight() - 6), (getHeight() - 6));
+ config.restore();
+ setForeground(isSelected() ? deepBlue.darker() : UIUtil.getListForeground(true));
+
+ super.paintComponent(g);
+ }
+ }
}
diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java
index 1fc3dbd66162..7af12e978190 100644
--- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java
+++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,6 +34,7 @@ import com.intellij.openapi.roots.ui.configuration.projectRoot.LibraryConfigurab
import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
import com.intellij.openapi.ui.NamedConfigurable;
import com.intellij.openapi.util.ActionCallback;
+import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.PathUtil;
import com.intellij.xml.util.XmlStringUtil;
@@ -95,7 +96,14 @@ public class LibraryProjectStructureElement extends ProjectStructureElement {
private static String createInvalidRootsDescription(List<String> invalidClasses, String rootName, String libraryName) {
StringBuilder buffer = new StringBuilder();
- buffer.append("Library '").append(StringUtil.escapeXml(libraryName)).append("' has broken " + rootName + " " + StringUtil.pluralize("path", invalidClasses.size()) + ":");
+ final String name = StringUtil.escapeXml(libraryName);
+ buffer.append("Library ");
+ if (Registry.is("ide.new.project.settings")) {
+ buffer.append("<a href='http://library/").append(name).append("'>").append(name).append("</a>");
+ } else {
+ buffer.append("'").append(name).append("'");
+ }
+ buffer.append(" has broken " + rootName + " " + StringUtil.pluralize("path", invalidClasses.size()) + ":");
for (String url : invalidClasses) {
buffer.append("<br>&nbsp;&nbsp;");
buffer.append(PathUtil.toPresentableUrl(url));
@@ -150,7 +158,10 @@ public class LibraryProjectStructureElement extends ProjectStructureElement {
@Override
public ProjectStructureProblemDescription createUnusedElementWarning() {
final List<ConfigurationErrorQuickFix> fixes = Arrays.asList(new AddLibraryToDependenciesFix(), new RemoveLibraryFix(), new RemoveAllUnusedLibrariesFix());
- return new ProjectStructureProblemDescription("Library '" + StringUtil.escapeXml(myLibrary.getName()) + "'" + " is not used", null, createPlace(),
+ final String name = StringUtil.escapeXml(myLibrary.getName());
+ String libraryName = Registry.is("ide.new.project.settings") ? "<a href='http://library/" + name + "'>" + name + "</a>"
+ : "'" + name + "'";
+ return new ProjectStructureProblemDescription("Library " + libraryName + " is not used", null, createPlace(),
ProjectStructureProblemType.unused("unused-library"), ProjectStructureProblemDescription.ProblemLevel.PROJECT,
fixes, false);
}
diff --git a/java/idea-ui/src/com/intellij/platform/templates/SaveProjectAsTemplateAction.java b/java/idea-ui/src/com/intellij/platform/templates/SaveProjectAsTemplateAction.java
index c2fafe029658..328eda553ac1 100644
--- a/java/idea-ui/src/com/intellij/platform/templates/SaveProjectAsTemplateAction.java
+++ b/java/idea-ui/src/com/intellij/platform/templates/SaveProjectAsTemplateAction.java
@@ -40,7 +40,6 @@ import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.JDOMUtil;
-import com.intellij.openapi.util.ThrowableComputable;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.StreamUtil;
import com.intellij.openapi.vfs.VfsUtil;
@@ -177,12 +176,7 @@ public class SaveProjectAsTemplateAction extends AnAction {
@Override
public InputStream getContent(final File file) throws IOException {
if (virtualFile.getFileType().isBinary() || PROJECT_TEMPLATE_XML.equals(virtualFile.getName())) return STANDARD.getContent(file);
- String result = ApplicationManager.getApplication().runReadAction(new ThrowableComputable<String, IOException>() {
- @Override
- public String compute() throws IOException {
- return getEncodedContent(virtualFile, project, parameters);
- }
- });
+ String result = getEncodedContent(virtualFile, project, parameters);
return new ByteArrayInputStream(result.getBytes(TemplateModuleBuilder.UTF_8));
}
});
@@ -253,10 +247,10 @@ public class SaveProjectAsTemplateAction extends AnAction {
public static String getEncodedContent(VirtualFile virtualFile,
Project project,
Map<String, String> parameters) throws IOException {
+ String text = VfsUtilCore.loadText(virtualFile);
final FileTemplate template = FileTemplateManager.getInstance().getDefaultTemplate(FileTemplateManager.FILE_HEADER_TEMPLATE_NAME);
final String templateText = template.getText();
final Pattern pattern = FileHeaderChecker.getTemplatePattern(template, project, new TIntObjectHashMap<String>());
- String text = VfsUtilCore.loadText(virtualFile);
String result = convertTemplates(text, pattern, templateText);
result = ProjectTemplateFileProcessor.encodeFile(result, virtualFile, project);
for (Map.Entry<String, String> entry : parameters.entrySet()) {
diff --git a/java/java-analysis-impl/java-analysis-impl.iml b/java/java-analysis-impl/java-analysis-impl.iml
index c3f33d642544..95c129baadfb 100644
--- a/java/java-analysis-impl/java-analysis-impl.iml
+++ b/java/java-analysis-impl/java-analysis-impl.iml
@@ -17,6 +17,7 @@
<orderEntry type="module" module-name="java-analysis-api" exported="" />
<orderEntry type="module" module-name="resources-en" />
<orderEntry type="module" module-name="xml-psi-impl" />
+ <orderEntry type="library" exported="" name="asm5" level="project" />
</component>
</module>
diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java
new file mode 100644
index 000000000000..813ff25caee2
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInsight;
+
+import com.intellij.codeInspection.bytecodeAnalysis.ProjectBytecodeAnalysis;
+import com.intellij.codeInspection.dataFlow.ContractInference;
+import com.intellij.codeInspection.dataFlow.MethodContract;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.PsiAnnotation;
+import com.intellij.psi.PsiMethod;
+import com.intellij.psi.PsiModifierListOwner;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.util.containers.ContainerUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+import static com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer.ORG_JETBRAINS_ANNOTATIONS_CONTRACT;
+
+public class InferredAnnotationsManagerImpl extends InferredAnnotationsManager {
+ @Nullable
+ @Override
+ public PsiAnnotation findInferredAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) {
+ PsiAnnotation fromBytecode = ProjectBytecodeAnalysis.getInstance(listOwner.getProject()).findInferredAnnotation(listOwner, annotationFQN);
+ if (fromBytecode != null) {
+ return fromBytecode;
+ }
+
+ if (ORG_JETBRAINS_ANNOTATIONS_CONTRACT.equals(annotationFQN) && canHaveContract(listOwner)) {
+ List<MethodContract> contracts = ContractInference.inferContracts((PsiMethod)listOwner);
+ if (!contracts.isEmpty()) {
+ return ProjectBytecodeAnalysis.getInstance(listOwner.getProject()).createContractAnnotation("\"" + StringUtil.join(contracts, "; ") + "\"");
+ }
+ }
+
+ return null;
+ }
+
+ private static boolean canHaveContract(PsiModifierListOwner listOwner) {
+ return listOwner instanceof PsiMethod && !PsiUtil.canBeOverriden((PsiMethod)listOwner);
+ }
+
+ @NotNull
+ @Override
+ public PsiAnnotation[] findInferredAnnotations(@NotNull PsiModifierListOwner listOwner) {
+ List<PsiAnnotation> result = ContainerUtil.newArrayList();
+ PsiAnnotation[] fromBytecode = ProjectBytecodeAnalysis.getInstance(listOwner.getProject()).findInferredAnnotations(listOwner);
+ for (PsiAnnotation annotation : fromBytecode) {
+ if (!ORG_JETBRAINS_ANNOTATIONS_CONTRACT.equals(annotation.getQualifiedName()) || canHaveContract(listOwner)) {
+ result.add(annotation);
+ }
+ }
+
+ if (canHaveContract(listOwner)) {
+ List<MethodContract> contracts = ContractInference.inferContracts((PsiMethod)listOwner);
+ if (!contracts.isEmpty()) {
+ result.add(ProjectBytecodeAnalysis.getInstance(listOwner.getProject())
+ .createContractAnnotation("\"" + StringUtil.join(contracts, "; ") + "\""));
+ }
+ }
+
+ return result.isEmpty() ? PsiAnnotation.EMPTY_ARRAY : result.toArray(new PsiAnnotation[result.size()]);
+ }
+
+ @Override
+ public boolean isInferredAnnotation(@NotNull PsiAnnotation annotation) {
+ return annotation.getUserData(ProjectBytecodeAnalysis.INFERRED_ANNOTATION) != null;
+ }
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java
index 0ccad5cadf48..9fc35a649504 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java
@@ -31,6 +31,7 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
+import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import org.jetbrains.annotations.NotNull;
@@ -91,6 +92,7 @@ public class AddTypeCastFix extends LocalQuickFixAndIntentionActionOnPsiElement
String text = "(" + type.getCanonicalText(false) + ")value";
PsiElementFactory factory = JavaPsiFacade.getInstance(original.getProject()).getElementFactory();
PsiTypeCastExpression typeCast = (PsiTypeCastExpression)factory.createExpressionFromText(text, original);
+ typeCast = (PsiTypeCastExpression)JavaCodeStyleManager.getInstance(project).shortenClassReferences(typeCast);
typeCast = (PsiTypeCastExpression)CodeStyleManager.getInstance(project).reformat(typeCast);
if (expression instanceof PsiConditionalExpression) {
diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java
index 84f704f64dcd..e5e4bb68d11e 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java
@@ -75,13 +75,16 @@ public class AddAnnotationPsiFix extends LocalQuickFixOnPsiElement {
PsiElement element = file.findElementAt(offset);
- PsiModifierListOwner listOwner = PsiTreeUtil.getParentOfType(element, PsiParameter.class, false);
- if (listOwner != null) return listOwner;
+ PsiModifierListOwner listOwner = PsiTreeUtil.getParentOfType(element, PsiModifierListOwner.class, false);
+ if (listOwner instanceof PsiParameter) return listOwner;
- final PsiIdentifier psiIdentifier = PsiTreeUtil.getParentOfType(element, PsiIdentifier.class, false);
- if (psiIdentifier != null && psiIdentifier.getParent() instanceof PsiModifierListOwner) {
- return (PsiModifierListOwner)psiIdentifier.getParent();
+ if (listOwner instanceof PsiNameIdentifierOwner) {
+ PsiElement id = ((PsiNameIdentifierOwner)listOwner).getNameIdentifier();
+ if (id != null && id.getTextRange().containsOffset(offset)) { // Groovy methods will pass this check as well
+ return listOwner;
+ }
}
+
return null;
}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java
index 96066c34eefe..c1f127d3a1df 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java
@@ -32,10 +32,7 @@ import com.intellij.psi.controlFlow.ControlFlow;
import com.intellij.psi.controlFlow.ControlFlowUtil;
import com.intellij.psi.impl.source.resolve.DefaultParameterTypeInferencePolicy;
import com.intellij.psi.infos.MethodCandidateInfo;
-import com.intellij.psi.util.InheritanceUtil;
-import com.intellij.psi.util.PsiTreeUtil;
-import com.intellij.psi.util.PsiTypesUtil;
-import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.*;
import com.intellij.util.ArrayUtilRt;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtilRt;
@@ -91,16 +88,12 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection
final PsiMethod[] methods = aClass.getMethods();
if (methods.length == 1 && aClass.getFields().length == 0) {
final PsiCodeBlock body = methods[0].getBody();
- if (body != null) {
- final ForbiddenRefsChecker checker = new ForbiddenRefsChecker(methods[0], aClass);
- body.accept(checker);
- if (!checker.hasForbiddenRefs()) {
- final PsiElement lBrace = aClass.getLBrace();
- LOG.assertTrue(lBrace != null);
- final TextRange rangeInElement = new TextRange(0, aClass.getStartOffsetInParent() + lBrace.getStartOffsetInParent());
- holder.registerProblem(aClass.getParent(), "Anonymous #ref #loc can be replaced with lambda",
- ProblemHighlightType.LIKE_UNUSED_SYMBOL, rangeInElement, new ReplaceWithLambdaFix());
- }
+ if (body != null && !hasForbiddenRefsInsideBody(methods[0], aClass)) {
+ final PsiElement lBrace = aClass.getLBrace();
+ LOG.assertTrue(lBrace != null);
+ final TextRange rangeInElement = new TextRange(0, aClass.getStartOffsetInParent() + lBrace.getStartOffsetInParent());
+ holder.registerProblem(aClass.getParent(), "Anonymous #ref #loc can be replaced with lambda",
+ ProblemHighlightType.LIKE_UNUSED_SYMBOL, rangeInElement, new ReplaceWithLambdaFix());
}
}
}
@@ -110,6 +103,14 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection
};
}
+ public static boolean hasForbiddenRefsInsideBody(PsiMethod method, PsiAnonymousClass aClass) {
+ final ForbiddenRefsChecker checker = new ForbiddenRefsChecker(method, aClass);
+ final PsiCodeBlock body = method.getBody();
+ LOG.assertTrue(body != null);
+ body.accept(checker);
+ return checker.hasForbiddenRefs();
+ }
+
private static PsiType getInferredType(PsiAnonymousClass aClass) {
final PsiExpression expression = (PsiExpression)aClass.getParent();
final PsiType psiType = PsiTypesUtil.getExpectedTypeByParent(expression);
@@ -369,14 +370,14 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection
private final PsiMethod myMethod;
private final PsiAnonymousClass myAnonymClass;
- private final boolean myRawType;
+ private final boolean myEqualInference;
public ForbiddenRefsChecker(PsiMethod method,
PsiAnonymousClass aClass) {
myMethod = method;
myAnonymClass = aClass;
final PsiType inferredType = getInferredType(aClass);
- myRawType = inferredType instanceof PsiClassType && ((PsiClassType)inferredType).isRaw();
+ myEqualInference = !aClass.getBaseClassType().equals(inferredType);
}
@Override
@@ -467,7 +468,7 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection
}
}
- if (myRawType) {
+ if (myEqualInference) {
final PsiElement resolved = expression.resolve();
if (resolved instanceof PsiParameter && ((PsiParameter)resolved).getDeclarationScope() == myMethod) {
final int parameterIndex = myMethod.getParameterList().getParameterIndex((PsiParameter)resolved);
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java
index d6a884c8917c..c3363ec7eb12 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java
@@ -69,7 +69,7 @@ public class AnonymousCanBeMethodReferenceInspection extends BaseJavaBatchLocalI
final PsiClassType baseClassType = aClass.getBaseClassType();
if (LambdaUtil.isFunctionalType(baseClassType)) {
final PsiMethod[] methods = aClass.getMethods();
- if (methods.length == 1 && aClass.getFields().length == 0) {
+ if (methods.length == 1 && aClass.getFields().length == 0 && !AnonymousCanBeLambdaInspection.hasForbiddenRefsInsideBody(methods[0], aClass)) {
final PsiCodeBlock body = methods[0].getBody();
final PsiCallExpression callExpression =
LambdaCanBeMethodReferenceInspection
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java
index 1e887030dcb4..416226e9ac8f 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java
@@ -245,11 +245,14 @@ public class LambdaCanBeMethodReferenceInspection extends BaseJavaBatchLocalInsp
PsiParameter[] candidateParams = method.getParameterList().getParameters();
if (candidateParams.length == 1) {
if (TypeConversionUtil.areTypesConvertible(candidateParams[0].getType(), parameters[0].getType())) {
- for (PsiMethod superMethod : psiMethod.findDeepestSuperMethods()) {
- PsiMethod validSuperMethod = ensureNonAmbiguousMethod(parameters, superMethod);
- if (validSuperMethod != null) return validSuperMethod;
+ final PsiMethod[] deepestSuperMethods = psiMethod.findDeepestSuperMethods();
+ if (deepestSuperMethods.length > 0) {
+ for (PsiMethod superMethod : deepestSuperMethods) {
+ PsiMethod validSuperMethod = ensureNonAmbiguousMethod(parameters, superMethod);
+ if (validSuperMethod != null) return validSuperMethod;
+ }
+ return null;
}
- return null;
}
}
}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Analysis.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Analysis.java
new file mode 100644
index 000000000000..44e493c63f0a
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Analysis.java
@@ -0,0 +1,398 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import gnu.trove.TIntObjectHashMap;
+import org.jetbrains.org.objectweb.asm.Opcodes;
+import org.jetbrains.org.objectweb.asm.Type;
+import org.jetbrains.org.objectweb.asm.tree.MethodNode;
+import org.jetbrains.org.objectweb.asm.tree.analysis.AnalyzerException;
+import org.jetbrains.org.objectweb.asm.tree.analysis.BasicValue;
+import org.jetbrains.org.objectweb.asm.tree.analysis.Frame;
+
+import java.util.*;
+
+class AbstractValues {
+ static final class ParamValue extends BasicValue {
+ ParamValue(Type tp) {
+ super(tp);
+ }
+ }
+ static final BasicValue InstanceOfCheckValue = new BasicValue(Type.INT_TYPE) {
+ @Override
+ public boolean equals(Object value) {
+ return this == value;
+ }
+ };
+
+ static final BasicValue TrueValue = new BasicValue(Type.INT_TYPE) {
+ @Override
+ public boolean equals(Object value) {
+ return this == value;
+ }
+ };
+
+ static final BasicValue FalseValue = new BasicValue(Type.INT_TYPE) {
+ @Override
+ public boolean equals(Object value) {
+ return this == value;
+ }
+ };
+
+ static final BasicValue NullValue = new BasicValue(Type.getObjectType("null")) {
+ @Override
+ public boolean equals(Object value) {
+ return this == value;
+ }
+ };
+ static final class NotNullValue extends BasicValue {
+ NotNullValue(Type tp) {
+ super(tp);
+ }
+ }
+ static final class CallResultValue extends BasicValue {
+ final Set<Key> inters;
+ CallResultValue(Type tp, Set<Key> inters) {
+ super(tp);
+ this.inters = inters;
+ }
+ }
+
+ static boolean isInstance(Conf curr, Conf prev) {
+ if (curr.insnIndex != prev.insnIndex) {
+ return false;
+ }
+ Frame<BasicValue> currFr = curr.frame;
+ Frame<BasicValue> prevFr = prev.frame;
+ for (int i = 0; i < currFr.getLocals(); i++) {
+ if (!isInstance(currFr.getLocal(i), prevFr.getLocal(i))) {
+ return false;
+ }
+ }
+ for (int i = 0; i < currFr.getStackSize(); i++) {
+ if (!isInstance(currFr.getStack(i), prevFr.getStack(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ static boolean isInstance(BasicValue curr, BasicValue prev) {
+ if (prev instanceof ParamValue) {
+ return curr instanceof ParamValue;
+ }
+ if (InstanceOfCheckValue == prev) {
+ return InstanceOfCheckValue == curr;
+ }
+ if (TrueValue == prev) {
+ return TrueValue == curr;
+ }
+ if (FalseValue == prev) {
+ return FalseValue == curr;
+ }
+ if (NullValue == prev) {
+ return NullValue == curr;
+ }
+ if (prev instanceof NotNullValue) {
+ return curr instanceof NotNullValue;
+ }
+ if (prev instanceof CallResultValue) {
+ if (curr instanceof CallResultValue) {
+ CallResultValue prevCall = (CallResultValue) prev;
+ CallResultValue currCall = (CallResultValue) curr;
+ return prevCall.inters.equals(currCall.inters);
+ }
+ else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ static boolean equiv(Conf curr, Conf prev) {
+ Frame<BasicValue> currFr = curr.frame;
+ Frame<BasicValue> prevFr = prev.frame;
+ for (int i = currFr.getStackSize() - 1; i >= 0; i--) {
+ if (!equiv(currFr.getStack(i), prevFr.getStack(i))) {
+ return false;
+ }
+ }
+ for (int i = currFr.getLocals() - 1; i >= 0; i--) {
+ if (!equiv(currFr.getLocal(i), prevFr.getLocal(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ static boolean equiv(BasicValue curr, BasicValue prev) {
+ if (curr.getClass() == prev.getClass()) {
+ if (curr instanceof CallResultValue && prev instanceof CallResultValue) {
+ Set<Key> keys1 = ((CallResultValue)prev).inters;
+ Set<Key> keys2 = ((CallResultValue)curr).inters;
+ return keys1.equals(keys2);
+ }
+ else return true;
+ }
+ else return false;
+ }
+}
+
+final class Conf {
+ final int insnIndex;
+ final Frame<BasicValue> frame;
+ final int fastHashCode;
+
+ Conf(int insnIndex, Frame<BasicValue> frame) {
+ this.insnIndex = insnIndex;
+ this.frame = frame;
+
+ int hash = 0;
+ for (int i = 0; i < frame.getLocals(); i++) {
+ hash = hash * 31 + frame.getLocal(i).getClass().hashCode();
+ }
+ for (int i = 0; i < frame.getStackSize(); i++) {
+ hash = hash * 31 + frame.getStack(i).getClass().hashCode();
+ }
+ fastHashCode = hash;
+ }
+}
+
+final class State {
+ final int index;
+ final Conf conf;
+ final List<Conf> history;
+ final boolean taken;
+ final boolean hasCompanions;
+
+ State(int index, Conf conf, List<Conf> history, boolean taken, boolean hasCompanions) {
+ this.index = index;
+ this.conf = conf;
+ this.history = history;
+ this.taken = taken;
+ this.hasCompanions = hasCompanions;
+ }
+}
+
+interface PendingAction<Res> {}
+class ProceedState<Res> implements PendingAction<Res> {
+ final State state;
+
+ ProceedState(State state) {
+ this.state = state;
+ }
+}
+class MakeResult<Res> implements PendingAction<Res> {
+ final State state;
+ final Res subResult;
+ final int[] indices;
+
+ MakeResult(State state, Res subResult, int[] indices) {
+ this.state = state;
+ this.subResult = subResult;
+ this.indices = indices;
+ }
+}
+
+abstract class Analysis<Res> {
+ private static final int STEPS_LIMIT = 30000;
+ final RichControlFlow richControlFlow;
+ final Direction direction;
+ final ControlFlowGraph controlFlow;
+ final MethodNode methodNode;
+ final Method method;
+ final DFSTree dfsTree;
+ final Res myIdentity;
+
+ final Deque<PendingAction<Res>> pending = new LinkedList<PendingAction<Res>>();
+ final TIntObjectHashMap<List<State>> computed = new TIntObjectHashMap<List<State>>();
+ final TIntObjectHashMap<Res> results = new TIntObjectHashMap<Res>();
+ final Key aKey;
+
+ Res earlyResult = null;
+
+ abstract Res identity();
+ abstract Res combineResults(Res delta, List<Res> subResults);
+ abstract boolean isEarlyResult(Res res);
+ abstract Equation<Key, Value> mkEquation(Res result);
+ abstract void processState(State state) throws AnalyzerException;
+
+ protected Analysis(RichControlFlow richControlFlow, Direction direction, boolean stable) {
+ this.richControlFlow = richControlFlow;
+ this.direction = direction;
+ controlFlow = richControlFlow.controlFlow;
+ methodNode = controlFlow.methodNode;
+ method = new Method(controlFlow.className, methodNode.name, methodNode.desc);
+ dfsTree = richControlFlow.dfsTree;
+ aKey = new Key(method, direction, stable);
+ myIdentity = identity();
+ }
+
+ final State createStartState() {
+ return new State(0, new Conf(0, createStartFrame()), new ArrayList<Conf>(), false, false);
+ }
+
+ static boolean stateEquiv(State curr, State prev) {
+ if (curr.taken != prev.taken) {
+ return false;
+ }
+ if (curr.conf.fastHashCode != prev.conf.fastHashCode) {
+ return false;
+ }
+ if (!AbstractValues.equiv(curr.conf, prev.conf)) {
+ return false;
+ }
+ if (curr.history.size() != prev.history.size()) {
+ return false;
+ }
+ for (int i = 0; i < curr.history.size(); i++) {
+ Conf curr1 = curr.history.get(i);
+ Conf prev1 = prev.history.get(i);
+ if (curr1.fastHashCode != prev1.fastHashCode || !AbstractValues.equiv(curr1, prev1)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ final Equation<Key, Value> analyze() throws AnalyzerException {
+ pending.push(new ProceedState<Res>(createStartState()));
+ int steps = 0;
+ while (!pending.isEmpty() && earlyResult == null) {
+ steps ++;
+ if (steps >= STEPS_LIMIT) {
+ throw new AnalyzerException(null, "limit is reached, steps: " + steps + " in method " + method);
+ }
+ PendingAction<Res> action = pending.pop();
+ if (action instanceof MakeResult) {
+ MakeResult<Res> makeResult = (MakeResult<Res>) action;
+ ArrayList<Res> subResults = new ArrayList<Res>();
+ for (int index : makeResult.indices) {
+ subResults.add(results.get(index));
+ }
+ Res result = combineResults(makeResult.subResult, subResults);
+ if (isEarlyResult(result)) {
+ earlyResult = result;
+ } else {
+ State state = makeResult.state;
+ int insnIndex = state.conf.insnIndex;
+ results.put(state.index, result);
+ List<State> thisComputed = computed.get(insnIndex);
+ if (thisComputed == null) {
+ thisComputed = new ArrayList<State>();
+ computed.put(insnIndex, thisComputed);
+ }
+ thisComputed.add(state);
+ }
+ }
+ else if (action instanceof ProceedState) {
+ ProceedState<Res> proceedState = (ProceedState<Res>) action;
+ State state = proceedState.state;
+ int insnIndex = state.conf.insnIndex;
+ Conf conf = state.conf;
+ List<Conf> history = state.history;
+
+ boolean fold = false;
+ if (dfsTree.loopEnters.contains(insnIndex)) {
+ for (Conf prev : history) {
+ if (AbstractValues.isInstance(conf, prev)) {
+ fold = true;
+ }
+ }
+ }
+ if (fold) {
+ results.put(state.index, myIdentity);
+ List<State> thisComputed = computed.get(insnIndex);
+ if (thisComputed == null) {
+ thisComputed = new ArrayList<State>();
+ computed.put(insnIndex, thisComputed);
+ }
+ thisComputed.add(state);
+ }
+ else {
+ State baseState = null;
+ List<State> thisComputed = computed.get(insnIndex);
+ if (thisComputed != null) {
+ for (State prevState : thisComputed) {
+ if (stateEquiv(state, prevState)) {
+ baseState = prevState;
+ break;
+ }
+ }
+ }
+ if (baseState != null) {
+ results.put(state.index, results.get(baseState.index));
+ } else {
+ // the main call
+ processState(state);
+ }
+
+ }
+ }
+ }
+ if (earlyResult != null) {
+ return mkEquation(earlyResult);
+ } else {
+ return mkEquation(results.get(0));
+ }
+ }
+
+ final Frame<BasicValue> createStartFrame() {
+ Frame<BasicValue> frame = new Frame<BasicValue>(methodNode.maxLocals, methodNode.maxStack);
+ Type returnType = Type.getReturnType(methodNode.desc);
+ BasicValue returnValue = Type.VOID_TYPE.equals(returnType) ? null : new BasicValue(returnType);
+ frame.setReturn(returnValue);
+
+ Type[] args = Type.getArgumentTypes(methodNode.desc);
+ int local = 0;
+ if ((methodNode.access & Opcodes.ACC_STATIC) == 0) {
+ frame.setLocal(local++, new AbstractValues.NotNullValue(Type.getObjectType(controlFlow.className)));
+ }
+ for (int i = 0; i < args.length; i++) {
+ BasicValue value;
+ if (direction instanceof InOut && ((InOut)direction).paramIndex == i) {
+ value = new AbstractValues.ParamValue(args[i]);
+ }
+ else if (direction instanceof In && ((In)direction).paramIndex == i) {
+ value = new AbstractValues.ParamValue(args[i]);
+ }
+ else {
+ value = new BasicValue(args[i]);
+ }
+ frame.setLocal(local++, value);
+ if (args[i].getSize() == 2) {
+ frame.setLocal(local++, BasicValue.UNINITIALIZED_VALUE);
+ }
+ }
+ while (local < methodNode.maxLocals) {
+ frame.setLocal(local++, BasicValue.UNINITIALIZED_VALUE);
+ }
+ return frame;
+ }
+
+ static BasicValue popValue(Frame<BasicValue> frame) {
+ return frame.getStack(frame.getStackSize() - 1);
+ }
+
+ static <A> List<A> append(List<A> xs, A x) {
+ ArrayList<A> result = new ArrayList<A>();
+ if (xs != null) {
+ result.addAll(xs);
+ }
+ result.add(x);
+ return result;
+ }
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java
new file mode 100644
index 000000000000..f29dd7f6cf0c
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java
@@ -0,0 +1,485 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import com.intellij.ide.util.PropertiesComponent;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.PathManager;
+import com.intellij.openapi.components.ApplicationComponent;
+import com.intellij.openapi.progress.ProgressManager;
+import com.intellij.openapi.util.ThrowableComputable;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.*;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.TypeConversionUtil;
+import com.intellij.util.io.*;
+import gnu.trove.TIntHashSet;
+import gnu.trove.TIntObjectHashMap;
+import gnu.trove.TIntObjectIterator;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.org.objectweb.asm.Type;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+
+import static com.intellij.codeInspection.bytecodeAnalysis.ProjectBytecodeAnalysis.LOG;
+
+/**
+ * @author lambdamix
+ */
+public class BytecodeAnalysisConverter implements ApplicationComponent {
+
+ private static final String VERSION = "BytecodeAnalysisConverter.Enumerators";
+
+ public static BytecodeAnalysisConverter getInstance() {
+ return ApplicationManager.getApplication().getComponent(BytecodeAnalysisConverter.class);
+ }
+
+ private PersistentStringEnumerator myNamesEnumerator;
+ private PersistentEnumeratorDelegate<int[]> myCompoundKeyEnumerator;
+ private int version;
+
+ @Override
+ public void initComponent() {
+ version = PropertiesComponent.getInstance().getOrInitInt(VERSION, 0);
+ final File keysDir = new File(PathManager.getIndexRoot(), "bytecodekeys");
+ final File namesFile = new File(keysDir, "names");
+ final File compoundKeysFile = new File(keysDir, "compound");
+
+ try {
+ IOUtil.openCleanOrResetBroken(new ThrowableComputable<Void, IOException>() {
+ @Override
+ public Void compute() throws IOException {
+ myNamesEnumerator = new PersistentStringEnumerator(namesFile, true);
+ myCompoundKeyEnumerator = new IntArrayPersistentEnumerator(compoundKeysFile, new IntArrayKeyDescriptor());
+ return null;
+ }
+ }, new Runnable() {
+ @Override
+ public void run() {
+ LOG.info("Error during initialization of enumerators in bytecode analysis. Re-initializing.");
+ IOUtil.deleteAllFilesStartingWith(keysDir);
+ version ++;
+ }
+ });
+ }
+ catch (IOException e) {
+ LOG.error("Re-initialization of enumerators in bytecode analysis failed.", e);
+ }
+ // TODO: is it enough for rebuilding indices?
+ PropertiesComponent.getInstance().setValue(VERSION, String.valueOf(version));
+ }
+
+ @Override
+ public void disposeComponent() {
+ try {
+ myNamesEnumerator.close();
+ myCompoundKeyEnumerator.close();
+ }
+ catch (IOException e) {
+ LOG.debug(e);
+ }
+ }
+
+ @NotNull
+ @Override
+ public String getComponentName() {
+ return "BytecodeAnalysisConverter";
+ }
+
+ IntIdEquation convert(Equation<Key, Value> equation) throws IOException {
+ ProgressManager.checkCanceled();
+
+ Result<Key, Value> rhs = equation.rhs;
+ IntIdResult result;
+ if (rhs instanceof Final) {
+ result = new IntIdFinal(((Final<Key, Value>)rhs).value);
+ } else {
+ Pending<Key, Value> pending = (Pending<Key, Value>)rhs;
+ Set<Product<Key, Value>> sumOrigin = pending.sum;
+ IntIdComponent[] components = new IntIdComponent[sumOrigin.size()];
+ int componentI = 0;
+ for (Product<Key, Value> prod : sumOrigin) {
+ int[] intProd = new int[prod.ids.size()];
+ int idI = 0;
+ for (Key id : prod.ids) {
+ int rawId = mkAsmKey(id);
+ if (rawId <= 0) {
+ LOG.error("raw key should be positive. rawId = " + rawId);
+ }
+ intProd[idI] = id.stable ? rawId : -rawId;
+ idI++;
+ }
+ IntIdComponent intIdComponent = new IntIdComponent(prod.value, intProd);
+ components[componentI] = intIdComponent;
+ componentI++;
+ }
+ result = new IntIdPending(components);
+ }
+
+ int rawKey = mkAsmKey(equation.id);
+ if (rawKey <= 0) {
+ LOG.error("raw key should be positive. rawKey = " + rawKey);
+ }
+
+ int key = equation.id.stable ? rawKey : -rawKey;
+ return new IntIdEquation(key, result);
+ }
+
+ public int mkAsmKey(@NotNull Key key) throws IOException {
+ return myCompoundKeyEnumerator.enumerate(new int[]{mkDirectionKey(key.direction), mkAsmSignatureKey(key.method)});
+ }
+
+ private int mkDirectionKey(Direction dir) throws IOException {
+ return myCompoundKeyEnumerator.enumerate(new int[]{dir.directionId(), dir.paramId(), dir.valueId()});
+ }
+
+ // class + short signature
+ private int mkAsmSignatureKey(@NotNull Method method) throws IOException {
+ int[] sigKey = new int[2];
+ sigKey[0] = mkAsmTypeKey(Type.getObjectType(method.internalClassName));
+ sigKey[1] = mkAsmShortSignatureKey(method);
+ return myCompoundKeyEnumerator.enumerate(sigKey);
+ }
+
+ private int mkAsmShortSignatureKey(@NotNull Method method) throws IOException {
+ Type[] argTypes = Type.getArgumentTypes(method.methodDesc);
+ int arity = argTypes.length;
+ int[] sigKey = new int[3 + arity];
+ sigKey[0] = mkAsmTypeKey(Type.getReturnType(method.methodDesc));
+ sigKey[1] = myNamesEnumerator.enumerate(method.methodName);
+ sigKey[2] = argTypes.length;
+ for (int i = 0; i < argTypes.length; i++) {
+ sigKey[3 + i] = mkAsmTypeKey(argTypes[i]);
+ }
+ return myCompoundKeyEnumerator.enumerate(sigKey);
+ }
+
+ @Nullable
+ private static Direction extractDirection(int[] directionKey) {
+ switch (directionKey[0]) {
+ case Direction.OUT_DIRECTION:
+ return new Out();
+ case Direction.IN_DIRECTION:
+ return new In(directionKey[1]);
+ case Direction.INOUT_DIRECTION:
+ return new InOut(directionKey[1], Value.values()[directionKey[2]]);
+ }
+ return null;
+ }
+
+ private int mkAsmTypeKey(Type type) throws IOException {
+ String className = type.getClassName();
+ int dotIndex = className.lastIndexOf('.');
+ String packageName;
+ String simpleName;
+ if (dotIndex > 0) {
+ packageName = className.substring(0, dotIndex);
+ simpleName = className.substring(dotIndex + 1);
+ } else {
+ packageName = "";
+ simpleName = className;
+ }
+ int[] classKey = new int[]{myNamesEnumerator.enumerate(packageName), myNamesEnumerator.enumerate(simpleName)};
+ return myCompoundKeyEnumerator.enumerate(classKey);
+ }
+
+ public int mkPsiKey(@NotNull PsiMethod psiMethod, Direction direction) throws IOException {
+ final PsiClass psiClass = PsiTreeUtil.getParentOfType(psiMethod, PsiClass.class, false);
+ if (psiClass == null) {
+ LOG.debug("PsiClass was null for " + psiMethod.getName());
+ return -1;
+ }
+ int sigKey = mkPsiSignatureKey(psiMethod);
+ if (sigKey == -1) {
+ return -1;
+ }
+ return myCompoundKeyEnumerator.enumerate(new int[]{mkDirectionKey(direction), sigKey});
+
+ }
+
+ private int mkPsiSignatureKey(@NotNull PsiMethod psiMethod) throws IOException {
+ final PsiClass psiClass = PsiTreeUtil.getParentOfType(psiMethod, PsiClass.class, false);
+ if (psiClass == null) {
+ LOG.debug("PsiClass was null for " + psiMethod.getName());
+ return -1;
+ }
+ PsiClass outerClass = psiClass.getContainingClass();
+ boolean isInnerClassConstructor = psiMethod.isConstructor() && (outerClass != null) && !psiClass.hasModifierProperty(PsiModifier.STATIC);
+ PsiParameter[] parameters = psiMethod.getParameterList().getParameters();
+ PsiType returnType = psiMethod.getReturnType();
+
+ final int shift = isInnerClassConstructor ? 1 : 0;
+ final int arity = parameters.length + shift;
+ int[] shortSigKey = new int[3 + arity];
+ if (returnType == null) {
+ shortSigKey[0] = mkPsiTypeKey(PsiType.VOID);
+ shortSigKey[1] = myNamesEnumerator.enumerate("<init>");
+ } else {
+ shortSigKey[0] = mkPsiTypeKey(returnType);
+ shortSigKey[1] = myNamesEnumerator.enumerate(psiMethod.getName());
+ }
+ shortSigKey[2] = arity;
+ if (isInnerClassConstructor) {
+ shortSigKey[3] = mkPsiClassKey(outerClass, 0);
+ }
+ for (int i = 0; i < parameters.length; i++) {
+ PsiParameter parameter = parameters[i];
+ shortSigKey[3 + i + shift] = mkPsiTypeKey(parameter.getType());
+ }
+ for (int aShortSigKey : shortSigKey) {
+ if (aShortSigKey == -1) {
+ return -1;
+ }
+ }
+
+ int[] sigKey = new int[2];
+ int classKey = mkPsiClassKey(psiClass, 0);
+ if (classKey == -1) {
+ return -1;
+ }
+ sigKey[0] = classKey;
+ sigKey[1] = myCompoundKeyEnumerator.enumerate(shortSigKey);
+
+ return myCompoundKeyEnumerator.enumerate(sigKey);
+ }
+
+
+ private int mkPsiClassKey(PsiClass psiClass, int dimensions) throws IOException {
+ PsiFile containingFile = psiClass.getContainingFile();
+ if (!(containingFile instanceof PsiClassOwner)) {
+ LOG.debug("containingFile was not resolved for " + psiClass.getQualifiedName());
+ return -1;
+ }
+ PsiClassOwner psiFile = (PsiClassOwner)containingFile;
+ String packageName = psiFile.getPackageName();
+ String qname = psiClass.getQualifiedName();
+ if (qname == null) {
+ return -1;
+ }
+ String className = qname;
+ if (packageName.length() > 0) {
+ className = qname.substring(packageName.length() + 1).replace('.', '$');
+ }
+ int[] classKey = new int[2];
+ classKey[0] = myNamesEnumerator.enumerate(packageName);
+ if (dimensions == 0) {
+ classKey[1] = myNamesEnumerator.enumerate(className);
+ } else {
+ StringBuilder sb = new StringBuilder(className);
+ for (int j = 0; j < dimensions; j++) {
+ sb.append("[]");
+ }
+ classKey[1] = myNamesEnumerator.enumerate(sb.toString());
+ }
+ return myCompoundKeyEnumerator.enumerate(classKey);
+ }
+
+ private int mkPsiTypeKey(PsiType psiType) throws IOException {
+ int dimensions = 0;
+ psiType = TypeConversionUtil.erasure(psiType);
+ if (psiType instanceof PsiArrayType) {
+ PsiArrayType arrayType = (PsiArrayType)psiType;
+ psiType = arrayType.getDeepComponentType();
+ dimensions = arrayType.getArrayDimensions();
+ }
+
+ if (psiType instanceof PsiClassType) {
+ // no resolve() -> no package/class split
+ PsiClass psiClass = ((PsiClassType)psiType).resolve();
+ if (psiClass != null) {
+ return mkPsiClassKey(psiClass, dimensions);
+ }
+ else {
+ LOG.debug("resolve was null for " + ((PsiClassType)psiType).getClassName());
+ return -1;
+ }
+ }
+ else if (psiType instanceof PsiPrimitiveType) {
+ String packageName = "";
+ String className = psiType.getPresentableText();
+ int[] classKey = new int[2];
+ classKey[0] = myNamesEnumerator.enumerate(packageName);
+ if (dimensions == 0) {
+ classKey[1] = myNamesEnumerator.enumerate(className);
+ } else {
+ StringBuilder sb = new StringBuilder(className);
+ for (int j = 0; j < dimensions; j++) {
+ sb.append("[]");
+ }
+ classKey[1] = myNamesEnumerator.enumerate(sb.toString());
+ }
+ return myCompoundKeyEnumerator.enumerate(classKey);
+ }
+ return -1;
+ }
+
+ public void addAnnotations(TIntObjectHashMap<Value> internalIdSolutions, Annotations annotations) {
+
+ TIntObjectHashMap<List<String>> contractClauses = new TIntObjectHashMap<List<String>>();
+ TIntObjectIterator<Value> solutionsIterator = internalIdSolutions.iterator();
+
+ TIntHashSet notNulls = annotations.notNulls;
+ TIntObjectHashMap<String> contracts = annotations.contracts;
+
+ for (int i = internalIdSolutions.size(); i-- > 0;) {
+ solutionsIterator.advance();
+ int key = Math.abs(solutionsIterator.key());
+ Value value = solutionsIterator.value();
+ if (value == Value.Top || value == Value.Bot) {
+ continue;
+ }
+ try {
+ int[] compoundKey = myCompoundKeyEnumerator.valueOf(key);
+ Direction direction = extractDirection(myCompoundKeyEnumerator.valueOf(compoundKey[0]));
+ if (value == Value.NotNull && (direction instanceof In || direction instanceof Out)) {
+ notNulls.add(key);
+ }
+ else if (direction instanceof InOut) {
+ compoundKey = new int[]{mkDirectionKey(new Out()), compoundKey[1]};
+ try {
+ int baseKey = myCompoundKeyEnumerator.enumerate(compoundKey);
+ List<String> clauses = contractClauses.get(baseKey);
+ if (clauses == null) {
+ clauses = new ArrayList<String>();
+ contractClauses.put(baseKey, clauses);
+ }
+ int[] sig = myCompoundKeyEnumerator.valueOf(compoundKey[1]);
+ int[] shortSig = myCompoundKeyEnumerator.valueOf(sig[1]);
+ int arity = shortSig[2];
+ clauses.add(contractElement(arity, (InOut)direction, value));
+ }
+ catch (IOException e) {
+ LOG.debug(e);
+ }
+ }
+ }
+ catch (IOException e) {
+ LOG.debug(e);
+ }
+ }
+
+ TIntObjectIterator<List<String>> buildersIterator = contractClauses.iterator();
+ for (int i = contractClauses.size(); i-- > 0;) {
+ buildersIterator.advance();
+ int key = buildersIterator.key();
+ if (!notNulls.contains(key)) {
+ List<String> clauses = buildersIterator.value();
+ Collections.sort(clauses);
+ StringBuilder sb = new StringBuilder("\"");
+ StringUtil.join(clauses, ";", sb);
+ sb.append('"');
+ contracts.put(key, sb.toString().intern());
+ }
+ }
+ }
+
+ static String contractValueString(Value v) {
+ switch (v) {
+ case False: return "false";
+ case True: return "true";
+ case NotNull: return "!null";
+ case Null: return "null";
+ default: return "_";
+ }
+ }
+
+ static String contractElement(int arity, InOut inOut, Value value) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < arity; i++) {
+ Value currentValue = Value.Top;
+ if (i == inOut.paramIndex) {
+ currentValue = inOut.inValue;
+ }
+ if (i > 0) {
+ sb.append(',');
+ }
+ sb.append(contractValueString(currentValue));
+ }
+ sb.append("->");
+ sb.append(contractValueString(value));
+ return sb.toString();
+ }
+
+ public int getVersion() {
+ return version;
+ }
+
+ private static class IntArrayKeyDescriptor implements KeyDescriptor<int[]> {
+
+ @Override
+ public void save(@NotNull DataOutput out, int[] value) throws IOException {
+ DataInputOutputUtil.writeINT(out, value.length);
+ for (int i : value) {
+ DataInputOutputUtil.writeINT(out, i);
+ }
+ }
+
+ @Override
+ public int[] read(@NotNull DataInput in) throws IOException {
+ int[] value = new int[DataInputOutputUtil.readINT(in)];
+ for (int i = 0; i < value.length; i++) {
+ value[i] = DataInputOutputUtil.readINT(in);
+ }
+ return value;
+ }
+
+ @Override
+ public int getHashCode(int[] value) {
+ return Arrays.hashCode(value);
+ }
+
+ @Override
+ public boolean isEqual(int[] val1, int[] val2) {
+ return Arrays.equals(val1, val2);
+ }
+ }
+
+ private static class IntArrayPersistentEnumerator extends PersistentEnumeratorDelegate<int[]> {
+ private final CachingEnumerator<int[]> myCache;
+
+ public IntArrayPersistentEnumerator(File compoundKeysFile, IntArrayKeyDescriptor descriptor) throws IOException {
+ super(compoundKeysFile, descriptor, 1024 * 4);
+ myCache = new CachingEnumerator<int[]>(new DataEnumerator<int[]>() {
+ @Override
+ public int enumerate(@Nullable int[] value) throws IOException {
+ return IntArrayPersistentEnumerator.super.enumerate(value);
+ }
+
+ @Nullable
+ @Override
+ public int[] valueOf(int idx) throws IOException {
+ return IntArrayPersistentEnumerator.super.valueOf(idx);
+ }
+ }, descriptor);
+ }
+
+ @Override
+ public int enumerate(@Nullable int[] value) throws IOException {
+ return myCache.enumerate(value);
+ }
+
+ @Nullable
+ @Override
+ public int[] valueOf(int idx) throws IOException {
+ return myCache.valueOf(idx);
+ }
+ }
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java
new file mode 100644
index 000000000000..6a4b32783c95
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import com.intellij.ide.highlighter.JavaClassFileType;
+import com.intellij.openapi.application.Application;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.vfs.VirtualFileWithId;
+import com.intellij.util.SystemProperties;
+import com.intellij.util.indexing.*;
+import com.intellij.util.io.DataExternalizer;
+import com.intellij.util.io.DataInputOutputUtil;
+import com.intellij.util.io.EnumeratorIntegerDescriptor;
+import com.intellij.util.io.KeyDescriptor;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author lambdamix
+ */
+public class BytecodeAnalysisIndex extends FileBasedIndexExtension<Integer, Collection<IntIdEquation>> {
+ public static final ID<Integer, Collection<IntIdEquation>> NAME = ID.create("bytecodeAnalysis");
+ private final EquationExternalizer myExternalizer = new EquationExternalizer();
+ private static final DataIndexer<Integer, Collection<IntIdEquation>, FileContent> INDEXER =
+ new ClassDataIndexer(BytecodeAnalysisConverter.getInstance());
+
+ private static final int ourInternalVersion = 2;
+ private static boolean ourEnabled = SystemProperties.getBooleanProperty("idea.enable.bytecode.contract.inference", isEnabledByDefault());
+
+ private static boolean isEnabledByDefault() {
+ Application application = ApplicationManager.getApplication();
+ return application.isInternal() || application.isUnitTestMode();
+ }
+
+ public static int indexKey(VirtualFile file, boolean parameters) {
+ return (file instanceof VirtualFileWithId ? ((VirtualFileWithId)file).getId() * 2 : -2) + (parameters ? 1 : 0);
+ }
+
+ @NotNull
+ @Override
+ public ID<Integer, Collection<IntIdEquation>> getName() {
+ return NAME;
+ }
+
+ @NotNull
+ @Override
+ public DataIndexer<Integer, Collection<IntIdEquation>, FileContent> getIndexer() {
+ return INDEXER;
+ }
+
+ @NotNull
+ @Override
+ public KeyDescriptor<Integer> getKeyDescriptor() {
+ return EnumeratorIntegerDescriptor.INSTANCE;
+ }
+
+ @NotNull
+ @Override
+ public DataExternalizer<Collection<IntIdEquation>> getValueExternalizer() {
+ return myExternalizer;
+ }
+
+ @NotNull
+ @Override
+ public FileBasedIndex.InputFilter getInputFilter() {
+ return new DefaultFileTypeSpecificInputFilter(JavaClassFileType.INSTANCE) {
+ @Override
+ public boolean acceptInput(@NotNull VirtualFile file) {
+ return ourEnabled && super.acceptInput(file);
+ }
+ };
+ }
+
+ @Override
+ public boolean dependsOnFileContent() {
+ return true;
+ }
+
+ @Override
+ public int getVersion() {
+ return ourInternalVersion + BytecodeAnalysisConverter.getInstance().getVersion() + (ourEnabled ? 0xFF : 0);
+ }
+
+ public static class EquationExternalizer implements DataExternalizer<Collection<IntIdEquation>> {
+ @Override
+ public void save(@NotNull DataOutput out, Collection<IntIdEquation> equations) throws IOException {
+ DataInputOutputUtil.writeINT(out, equations.size());
+
+ for (IntIdEquation equation : equations) {
+ out.writeInt(equation.id);
+ IntIdResult rhs = equation.rhs;
+ if (rhs instanceof IntIdFinal) {
+ IntIdFinal finalResult = (IntIdFinal)rhs;
+ out.writeBoolean(true); // final flag
+ DataInputOutputUtil.writeINT(out, finalResult.value.ordinal());
+ } else {
+ IntIdPending pendResult = (IntIdPending)rhs;
+ out.writeBoolean(false); // pending flag
+ DataInputOutputUtil.writeINT(out, pendResult.delta.length);
+
+ for (IntIdComponent component : pendResult.delta) {
+ DataInputOutputUtil.writeINT(out, component.value.ordinal());
+ int[] ids = component.ids;
+ DataInputOutputUtil.writeINT(out, ids.length);
+ for (int id : ids) {
+ out.writeInt(id);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public Collection<IntIdEquation> read(@NotNull DataInput in) throws IOException {
+
+ int size = DataInputOutputUtil.readINT(in);
+ ArrayList<IntIdEquation> result = new ArrayList<IntIdEquation>(size);
+
+ for (int x = 0; x < size; x++) {
+ int equationId = in.readInt();
+ boolean isFinal = in.readBoolean(); // flag
+ if (isFinal) {
+ int ordinal = DataInputOutputUtil.readINT(in);
+ Value value = Value.values()[ordinal];
+ result.add(new IntIdEquation(equationId, new IntIdFinal(value)));
+ } else {
+
+ int sumLength = DataInputOutputUtil.readINT(in);
+ IntIdComponent[] components = new IntIdComponent[sumLength];
+
+ for (int i = 0; i < sumLength; i++) {
+ int ordinal = DataInputOutputUtil.readINT(in);
+ Value value = Value.values()[ordinal];
+ int componentSize = DataInputOutputUtil.readINT(in);
+ int[] ids = new int[componentSize];
+ for (int j = 0; j < componentSize; j++) {
+ ids[j] = in.readInt();
+ }
+ components[i] = new IntIdComponent(value, ids);
+ }
+ result.add(new IntIdEquation(equationId, new IntIdPending(components)));
+ }
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java
new file mode 100644
index 000000000000..5e74a8b5dbb3
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import com.intellij.openapi.progress.ProcessCanceledException;
+import com.intellij.openapi.progress.ProgressManager;
+import com.intellij.openapi.util.NotNullLazyValue;
+import com.intellij.util.indexing.DataIndexer;
+import com.intellij.util.indexing.FileContent;
+import gnu.trove.TIntHashSet;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.org.objectweb.asm.*;
+import org.jetbrains.org.objectweb.asm.tree.MethodNode;
+import org.jetbrains.org.objectweb.asm.tree.analysis.AnalyzerException;
+
+import java.util.*;
+
+import static com.intellij.codeInspection.bytecodeAnalysis.ProjectBytecodeAnalysis.LOG;
+
+/**
+ * @author lambdamix
+ */
+public class ClassDataIndexer implements DataIndexer<Integer, Collection<IntIdEquation>, FileContent> {
+ final BytecodeAnalysisConverter myConverter;
+
+ public ClassDataIndexer(BytecodeAnalysisConverter converter) {
+ myConverter = converter;
+ }
+
+ @NotNull
+ @Override
+ public Map<Integer, Collection<IntIdEquation>> map(@NotNull FileContent inputData) {
+ HashMap<Integer, Collection<IntIdEquation>> map = new HashMap<Integer, Collection<IntIdEquation>>(2);
+ try {
+ ClassEquations rawEquations = processClass(new ClassReader(inputData.getContent()));
+ List<Equation<Key, Value>> rawParameterEquations = rawEquations.parameterEquations;
+ List<Equation<Key, Value>> rawContractEquations = rawEquations.contractEquations;
+
+ Collection<IntIdEquation> idParameterEquations = new ArrayList<IntIdEquation>(rawParameterEquations.size());
+ Collection<IntIdEquation> idContractEquations = new ArrayList<IntIdEquation>(rawContractEquations.size());
+
+ map.put(BytecodeAnalysisIndex.indexKey(inputData.getFile(), true), idParameterEquations);
+ map.put(BytecodeAnalysisIndex.indexKey(inputData.getFile(), false), idContractEquations);
+
+
+ for (Equation<Key, Value> rawParameterEquation: rawParameterEquations) {
+ idParameterEquations.add(myConverter.convert(rawParameterEquation));
+ }
+ for (Equation<Key, Value> rawContractEquation: rawContractEquations) {
+ idContractEquations.add(myConverter.convert(rawContractEquation));
+ }
+ }
+ catch (ProcessCanceledException e) {
+ throw e;
+ }
+ catch (Throwable e) {
+ // incorrect bytecode may result in Runtime exceptions during analysis
+ // so here we suppose that exception is due to incorrect bytecode
+ LOG.debug("Unexpected Error during indexing of bytecode", e);
+ }
+ return map;
+ }
+
+ private static class ClassEquations {
+ final List<Equation<Key, Value>> parameterEquations;
+ final List<Equation<Key, Value>> contractEquations;
+
+ private ClassEquations(List<Equation<Key, Value>> parameterEquations, List<Equation<Key, Value>> contractEquations) {
+ this.parameterEquations = parameterEquations;
+ this.contractEquations = contractEquations;
+ }
+ }
+
+ public static ClassEquations processClass(final ClassReader classReader) {
+ final List<Equation<Key, Value>> parameterEquations = new ArrayList<Equation<Key, Value>>();
+ final List<Equation<Key, Value>> contractEquations = new ArrayList<Equation<Key, Value>>();
+
+ classReader.accept(new ClassVisitor(Opcodes.ASM5) {
+ private boolean stableClass;
+
+ @Override
+ public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+ stableClass = (access & Opcodes.ACC_FINAL) != 0;
+ super.visit(version, access, name, signature, superName, interfaces);
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ final MethodNode node = new MethodNode(Opcodes.ASM5, access, name, desc, signature, exceptions);
+ return new MethodVisitor(Opcodes.ASM5, node) {
+ @Override
+ public void visitEnd() {
+ super.visitEnd();
+ processMethod(classReader.getClassName(), node, stableClass);
+ }
+ };
+ }
+
+ void processMethod(final String className, final MethodNode methodNode, boolean stableClass) {
+ ProgressManager.checkCanceled();
+ Type[] argumentTypes = Type.getArgumentTypes(methodNode.desc);
+ Type resultType = Type.getReturnType(methodNode.desc);
+ int resultSort = resultType.getSort();
+ boolean isReferenceResult = resultSort == Type.OBJECT || resultSort == Type.ARRAY;
+ boolean isBooleanResult = Type.BOOLEAN_TYPE == resultType;
+ boolean isInterestingResult = isReferenceResult || isBooleanResult;
+
+ if (argumentTypes.length == 0 && !isInterestingResult) {
+ return;
+ }
+
+ Method method = new Method(className, methodNode.name, methodNode.desc);
+ int access = methodNode.access;
+ boolean stable =
+ stableClass ||
+ (access & Opcodes.ACC_FINAL) != 0 ||
+ (access & Opcodes.ACC_PRIVATE) != 0 ||
+ (access & Opcodes.ACC_STATIC) != 0 ||
+ "<init>".equals(methodNode.name);
+ try {
+ boolean added = false;
+ ControlFlowGraph graph = cfg.buildControlFlowGraph(className, methodNode);
+
+ boolean maybeLeakingParameter = false;
+ for (Type argType : argumentTypes) {
+ int argSort = argType.getSort();
+ if (argSort == Type.OBJECT || argSort == Type.ARRAY || (isInterestingResult && Type.BOOLEAN_TYPE.equals(argType))) {
+ maybeLeakingParameter = true;
+ break;
+ }
+ }
+
+ if (graph.transitions.length > 0) {
+ DFSTree dfs = cfg.buildDFSTree(graph.transitions);
+ boolean reducible = dfs.back.isEmpty() || cfg.reducible(graph, dfs);
+ if (reducible) {
+ NotNullLazyValue<TIntHashSet> resultOrigins = new NotNullLazyValue<TIntHashSet>() {
+ @NotNull
+ @Override
+ protected TIntHashSet compute() {
+ try {
+ return cfg.resultOrigins(className, methodNode);
+ }
+ catch (AnalyzerException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ };
+ boolean[] leakingParameters = maybeLeakingParameter ? cfg.leakingParameters(className, methodNode) : null;
+ boolean shouldComputeResult = isReferenceResult;
+
+ if (!shouldComputeResult && isInterestingResult && maybeLeakingParameter) {
+ loop: for (int i = 0; i < argumentTypes.length; i++) {
+ Type argType = argumentTypes[i];
+ int argSort = argType.getSort();
+ boolean isReferenceArg = argSort == Type.OBJECT || argSort == Type.ARRAY;
+ boolean isBooleanArg = Type.BOOLEAN_TYPE.equals(argType);
+ if ((isReferenceArg || isBooleanArg) && !leakingParameters[i]) {
+ shouldComputeResult = true;
+ break loop;
+ }
+ }
+ }
+
+ Equation<Key, Value> resultEquation =
+ shouldComputeResult ? new InOutAnalysis(new RichControlFlow(graph, dfs), new Out(), resultOrigins.getValue(), stable).analyze() : null;
+
+ for (int i = 0; i < argumentTypes.length; i++) {
+ Type argType = argumentTypes[i];
+ int argSort = argType.getSort();
+ boolean isReferenceArg = argSort == Type.OBJECT || argSort == Type.ARRAY;
+ boolean isBooleanArg = Type.BOOLEAN_TYPE.equals(argType);
+ if (isReferenceArg) {
+ if (leakingParameters[i]) {
+ parameterEquations.add(new NonNullInAnalysis(new RichControlFlow(graph, dfs), new In(i), stable).analyze());
+ } else {
+ parameterEquations.add(new Equation<Key, Value>(new Key(method, new In(i), stable), new Final<Key, Value>(Value.Top)));
+ }
+ }
+ if (isReferenceArg && isInterestingResult) {
+ if (leakingParameters[i]) {
+ contractEquations.add(new InOutAnalysis(new RichControlFlow(graph, dfs), new InOut(i, Value.Null), resultOrigins.getValue(), stable).analyze());
+ contractEquations.add(new InOutAnalysis(new RichControlFlow(graph, dfs), new InOut(i, Value.NotNull), resultOrigins.getValue(), stable).analyze());
+ } else {
+ contractEquations.add(new Equation<Key, Value>(new Key(method, new InOut(i, Value.Null), stable), resultEquation.rhs));
+ contractEquations.add(new Equation<Key, Value>(new Key(method, new InOut(i, Value.NotNull), stable), resultEquation.rhs));
+ }
+ }
+ if (isBooleanArg && isInterestingResult) {
+ if (leakingParameters[i]) {
+ contractEquations.add(new InOutAnalysis(new RichControlFlow(graph, dfs), new InOut(i, Value.False), resultOrigins.getValue(), stable).analyze());
+ contractEquations.add(new InOutAnalysis(new RichControlFlow(graph, dfs), new InOut(i, Value.True), resultOrigins.getValue(), stable).analyze());
+ } else {
+ contractEquations.add(new Equation<Key, Value>(new Key(method, new InOut(i, Value.False), stable), resultEquation.rhs));
+ contractEquations.add(new Equation<Key, Value>(new Key(method, new InOut(i, Value.True), stable), resultEquation.rhs));
+ }
+ }
+ }
+ if (isReferenceResult) {
+ if (resultEquation != null) {
+ contractEquations.add(resultEquation);
+ } else {
+ contractEquations.add(new InOutAnalysis(new RichControlFlow(graph, dfs), new Out(), resultOrigins.getValue(), stable).analyze());
+ }
+ }
+ added = true;
+ }
+ else {
+ LOG.debug("CFG for " + method + " is not reducible");
+ }
+ }
+
+ if (!added) {
+ method = new Method(className, methodNode.name, methodNode.desc);
+ for (int i = 0; i < argumentTypes.length; i++) {
+ Type argType = argumentTypes[i];
+ int argSort = argType.getSort();
+ boolean isReferenceArg = argSort == Type.OBJECT || argSort == Type.ARRAY;
+ boolean isBooleanArg = Type.BOOLEAN_TYPE.equals(argType);
+
+ if (isReferenceArg) {
+ parameterEquations.add(new Equation<Key, Value>(new Key(method, new In(i), stable), new Final<Key, Value>(Value.Top)));
+ }
+ if (isReferenceArg && isInterestingResult) {
+ contractEquations.add(new Equation<Key, Value>(new Key(method, new InOut(i, Value.Null), stable), new Final<Key, Value>(Value.Top)));
+ contractEquations.add(new Equation<Key, Value>(new Key(method, new InOut(i, Value.NotNull), stable), new Final<Key, Value>(Value.Top)));
+ }
+ if (isBooleanArg && isInterestingResult) {
+ contractEquations.add(new Equation<Key, Value>(new Key(method, new InOut(i, Value.False), stable), new Final<Key, Value>(Value.Top)));
+ contractEquations.add(new Equation<Key, Value>(new Key(method, new InOut(i, Value.True), stable), new Final<Key, Value>(Value.Top)));
+ }
+ }
+ if (isReferenceResult) {
+ contractEquations.add(new Equation<Key, Value>(new Key(method, new Out(), stable), new Final<Key, Value>(Value.Top)));
+ }
+ }
+ }
+ catch (ProcessCanceledException e) {
+ throw e;
+ }
+ catch (Throwable e) {
+ // incorrect bytecode may result in Runtime exceptions during analysis
+ // so here we suppose that exception is due to incorrect bytecode
+ LOG.debug("Unexpected Error during processing of " + method, e);
+ }
+ }
+ }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
+
+ return new ClassEquations(parameterEquations, contractEquations);
+ }
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Contracts.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Contracts.java
new file mode 100644
index 000000000000..c837b127b74b
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Contracts.java
@@ -0,0 +1,439 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import gnu.trove.TIntHashSet;
+import org.jetbrains.org.objectweb.asm.Handle;
+import org.jetbrains.org.objectweb.asm.Type;
+import org.jetbrains.org.objectweb.asm.tree.*;
+import org.jetbrains.org.objectweb.asm.tree.analysis.AnalyzerException;
+import org.jetbrains.org.objectweb.asm.tree.analysis.BasicInterpreter;
+import org.jetbrains.org.objectweb.asm.tree.analysis.BasicValue;
+import org.jetbrains.org.objectweb.asm.tree.analysis.Frame;
+
+import java.util.*;
+
+import static com.intellij.codeInspection.bytecodeAnalysis.AbstractValues.*;
+import static org.jetbrains.org.objectweb.asm.Opcodes.*;
+
+class InOutAnalysis extends Analysis<Result<Key, Value>> {
+
+ final ResultUtil<Key, Value> resultUtil =
+ new ResultUtil<Key, Value>(new ELattice<Value>(Value.Bot, Value.Top));
+
+ private final InOutInterpreter interpreter;
+ private final Value inValue;
+
+ protected InOutAnalysis(RichControlFlow richControlFlow, Direction direction, TIntHashSet resultOrigins, boolean stable) {
+ super(richControlFlow, direction, stable);
+ interpreter = new InOutInterpreter(direction, richControlFlow.controlFlow.methodNode.instructions, resultOrigins);
+ inValue = direction instanceof InOut ? ((InOut)direction).inValue : null;
+ }
+
+ @Override
+ Result<Key, Value> identity() {
+ return new Final<Key, Value>(Value.Bot);
+ }
+
+ @Override
+ Result<Key, Value> combineResults(Result<Key, Value> delta, List<Result<Key, Value>> subResults) {
+ Result<Key, Value> result = null;
+ for (Result<Key, Value> subResult : subResults) {
+ if (result == null) {
+ result = subResult;
+ } else {
+ result = resultUtil.join(result, subResult);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ boolean isEarlyResult(Result<Key, Value> res) {
+ if (res instanceof Final) {
+ return ((Final<?, Value>)res).value == Value.Top;
+ }
+ return false;
+ }
+
+ @Override
+ Equation<Key, Value> mkEquation(Result<Key, Value> res) {
+ return new Equation<Key, Value>(aKey, res);
+ }
+
+ private int id = 0;
+
+ @Override
+ void processState(State state) throws AnalyzerException {
+ int stateIndex = state.index;
+ Conf preConf = state.conf;
+ int insnIndex = preConf.insnIndex;
+ boolean loopEnter = dfsTree.loopEnters.contains(insnIndex);
+ Conf conf = loopEnter ? generalize(preConf) : preConf;
+ List<Conf> history = state.history;
+ boolean taken = state.taken;
+ Frame<BasicValue> frame = conf.frame;
+ AbstractInsnNode insnNode = methodNode.instructions.get(insnIndex);
+ List<Conf> nextHistory = dfsTree.loopEnters.contains(insnIndex) ? append(history, conf) : history;
+ Frame<BasicValue> nextFrame = execute(frame, insnNode);
+
+ if (interpreter.deReferenced) {
+ results.put(stateIndex, new Final<Key, Value>(Value.Bot));
+ computed.put(insnIndex, append(computed.get(insnIndex), state));
+ return;
+ }
+
+ int opcode = insnNode.getOpcode();
+ switch (opcode) {
+ case ARETURN:
+ case IRETURN:
+ case LRETURN:
+ case FRETURN:
+ case DRETURN:
+ case RETURN:
+ BasicValue stackTop = popValue(frame);
+ if (FalseValue == stackTop) {
+ results.put(stateIndex, new Final<Key, Value>(Value.False));
+ computed.put(insnIndex, append(computed.get(insnIndex), state));
+ }
+ else if (TrueValue == stackTop) {
+ results.put(stateIndex, new Final<Key, Value>(Value.True));
+ computed.put(insnIndex, append(computed.get(insnIndex), state));
+ }
+ else if (NullValue == stackTop) {
+ results.put(stateIndex, new Final<Key, Value>(Value.Null));
+ computed.put(insnIndex, append(computed.get(insnIndex), state));
+ }
+ else if (stackTop instanceof NotNullValue) {
+ results.put(stateIndex, new Final<Key, Value>(Value.NotNull));
+ computed.put(insnIndex, append(computed.get(insnIndex), state));
+ }
+ else if (stackTop instanceof ParamValue) {
+ results.put(stateIndex, new Final<Key, Value>(inValue));
+ computed.put(insnIndex, append(computed.get(insnIndex), state));
+ }
+ else if (stackTop instanceof CallResultValue) {
+ Set<Key> keys = ((CallResultValue) stackTop).inters;
+ results.put(stateIndex, new Pending<Key, Value>(Collections.singleton(new Product<Key, Value>(Value.Top, keys))));
+ computed.put(insnIndex, append(computed.get(insnIndex), state));
+ }
+ else {
+ earlyResult = new Final<Key, Value>(Value.Top);
+ }
+ return;
+ case ATHROW:
+ results.put(stateIndex, new Final<Key, Value>(Value.Bot));
+ computed.put(insnIndex, append(computed.get(insnIndex), state));
+ return;
+ default:
+ }
+
+ if (opcode == IFNONNULL && popValue(frame) instanceof ParamValue) {
+ int nextInsnIndex = inValue == Value.Null ? insnIndex + 1 : methodNode.instructions.indexOf(((JumpInsnNode)insnNode).label);
+ State nextState = new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, false);
+ pending.push(new MakeResult<Result<Key, Value>>(state, myIdentity, new int[]{nextState.index}));
+ pending.push(new ProceedState<Result<Key, Value>>(nextState));
+ return;
+ }
+
+ if (opcode == IFNULL && popValue(frame) instanceof ParamValue) {
+ int nextInsnIndex = inValue == Value.NotNull ? insnIndex + 1 : methodNode.instructions.indexOf(((JumpInsnNode)insnNode).label);
+ State nextState = new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, false);
+ pending.push(new MakeResult<Result<Key, Value>>(state, myIdentity, new int[]{nextState.index}));
+ pending.push(new ProceedState<Result<Key, Value>>(nextState));
+ return;
+ }
+
+ if (opcode == IFEQ && popValue(frame) == InstanceOfCheckValue && inValue == Value.Null) {
+ int nextInsnIndex = methodNode.instructions.indexOf(((JumpInsnNode)insnNode).label);
+ State nextState = new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, false);
+ pending.push(new MakeResult<Result<Key, Value>>(state, myIdentity, new int[]{nextState.index}));
+ pending.push(new ProceedState<Result<Key, Value>>(nextState));
+ return;
+ }
+
+ if (opcode == IFNE && popValue(frame) == InstanceOfCheckValue && inValue == Value.Null) {
+ int nextInsnIndex = insnIndex + 1;
+ State nextState = new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, false);
+ pending.push(new MakeResult<Result<Key, Value>>(state, myIdentity, new int[]{nextState.index}));
+ pending.push(new ProceedState<Result<Key, Value>>(nextState));
+ return;
+ }
+
+ if (opcode == IFEQ && popValue(frame) instanceof ParamValue) {
+ int nextInsnIndex = inValue == Value.True ? insnIndex + 1 : methodNode.instructions.indexOf(((JumpInsnNode)insnNode).label);
+ State nextState = new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, false);
+ pending.push(new MakeResult<Result<Key, Value>>(state, myIdentity, new int[]{nextState.index}));
+ pending.push(new ProceedState<Result<Key, Value>>(nextState));
+ return;
+ }
+
+ if (opcode == IFNE && popValue(frame) instanceof ParamValue) {
+ int nextInsnIndex = inValue == Value.False ? insnIndex + 1 : methodNode.instructions.indexOf(((JumpInsnNode)insnNode).label);
+ State nextState = new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, false);
+ pending.push(new MakeResult<Result<Key, Value>>(state, myIdentity, new int[]{nextState.index}));
+ pending.push(new ProceedState<Result<Key, Value>>(nextState));
+ return;
+ }
+
+ // general case
+ int[] nextInsnIndices = controlFlow.transitions[insnIndex];
+ List<State> nextStates = new ArrayList<State>(nextInsnIndices.length);
+ int[] subIndices = new int[nextInsnIndices.length];
+
+ for (int i = 0; i < nextInsnIndices.length; i++) {
+ int nextInsnIndex = nextInsnIndices[i];
+ Frame<BasicValue> nextFrame1 = nextFrame;
+ if (controlFlow.errorTransitions.contains(new Edge(insnIndex, nextInsnIndex))) {
+ nextFrame1 = new Frame<BasicValue>(frame);
+ nextFrame1.clearStack();
+ nextFrame1.push(new BasicValue(Type.getType("java/lang/Throwable")));
+ }
+ nextStates.add(new State(++id, new Conf(nextInsnIndex, nextFrame1), nextHistory, taken, false));
+ subIndices[i] = id;
+ }
+
+ pending.push(new MakeResult<Result<Key, Value>>(state, myIdentity, subIndices));
+ for (State nextState : nextStates) {
+ pending.push(new ProceedState<Result<Key, Value>>(nextState));
+ }
+ }
+
+ private Frame<BasicValue> execute(Frame<BasicValue> frame, AbstractInsnNode insnNode) throws AnalyzerException {
+ interpreter.deReferenced = false;
+ switch (insnNode.getType()) {
+ case AbstractInsnNode.LABEL:
+ case AbstractInsnNode.LINE:
+ case AbstractInsnNode.FRAME:
+ return frame;
+ default:
+ Frame<BasicValue> nextFrame = new Frame<BasicValue>(frame);
+ nextFrame.execute(insnNode, interpreter);
+ return nextFrame;
+ }
+ }
+
+ private static Conf generalize(Conf conf) {
+ Frame<BasicValue> frame = new Frame<BasicValue>(conf.frame);
+ for (int i = 0; i < frame.getLocals(); i++) {
+ BasicValue value = frame.getLocal(i);
+ Class<?> valueClass = value.getClass();
+ if (valueClass != BasicValue.class && valueClass != ParamValue.class) {
+ frame.setLocal(i, new BasicValue(value.getType()));
+ }
+ }
+
+ BasicValue[] stack = new BasicValue[frame.getStackSize()];
+ for (int i = 0; i < frame.getStackSize(); i++) {
+ stack[i] = frame.getStack(i);
+ }
+ frame.clearStack();
+
+ for (BasicValue value : stack) {
+ Class<?> valueClass = value.getClass();
+ if (valueClass != BasicValue.class && valueClass != ParamValue.class) {
+ frame.push(new BasicValue(value.getType()));
+ } else {
+ frame.push(value);
+ }
+ }
+
+ return new Conf(conf.insnIndex, frame);
+ }
+}
+
+class InOutInterpreter extends BasicInterpreter {
+ final Direction direction;
+ final InsnList insns;
+ final TIntHashSet resultOrigins;
+ final boolean nullAnalysis;
+
+ boolean deReferenced = false;
+
+ InOutInterpreter(Direction direction, InsnList insns, TIntHashSet resultOrigins) {
+ this.direction = direction;
+ this.insns = insns;
+ this.resultOrigins = resultOrigins;
+ nullAnalysis = (direction instanceof InOut) && (((InOut)direction).inValue) == Value.Null;
+ }
+
+ @Override
+ public BasicValue newOperation(AbstractInsnNode insn) throws AnalyzerException {
+ boolean propagate = resultOrigins.contains(insns.indexOf(insn));
+ if (propagate) {
+ switch (insn.getOpcode()) {
+ case ICONST_0:
+ return FalseValue;
+ case ICONST_1:
+ return TrueValue;
+ case ACONST_NULL:
+ return NullValue;
+ case LDC:
+ Object cst = ((LdcInsnNode)insn).cst;
+ if (cst instanceof Type) {
+ Type type = (Type)cst;
+ if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {
+ return new NotNullValue(Type.getObjectType("java/lang/Class"));
+ }
+ if (type.getSort() == Type.METHOD) {
+ return new NotNullValue(Type.getObjectType("java/lang/invoke/MethodType"));
+ }
+ }
+ else if (cst instanceof String) {
+ return new NotNullValue(Type.getObjectType("java/lang/String"));
+ }
+ else if (cst instanceof Handle) {
+ return new NotNullValue(Type.getObjectType("java/lang/invoke/MethodHandle"));
+ }
+ break;
+ case NEW:
+ return new NotNullValue(Type.getObjectType(((TypeInsnNode)insn).desc));
+ default:
+ }
+ }
+ return super.newOperation(insn);
+ }
+
+ @Override
+ public BasicValue unaryOperation(AbstractInsnNode insn, BasicValue value) throws AnalyzerException {
+ boolean propagate = resultOrigins.contains(insns.indexOf(insn));
+ switch (insn.getOpcode()) {
+ case GETFIELD:
+ case ARRAYLENGTH:
+ case MONITORENTER:
+ if (nullAnalysis && value instanceof ParamValue) {
+ deReferenced = true;
+ }
+ return super.unaryOperation(insn, value);
+ case CHECKCAST:
+ if (value instanceof ParamValue) {
+ return new ParamValue(Type.getObjectType(((TypeInsnNode)insn).desc));
+ }
+ break;
+ case INSTANCEOF:
+ if (value instanceof ParamValue) {
+ return InstanceOfCheckValue;
+ }
+ break;
+ case NEWARRAY:
+ case ANEWARRAY:
+ if (propagate) {
+ return new NotNullValue(super.unaryOperation(insn, value).getType());
+ }
+ break;
+ default:
+ }
+ return super.unaryOperation(insn, value);
+ }
+
+ @Override
+ public BasicValue binaryOperation(AbstractInsnNode insn, BasicValue value1, BasicValue value2) throws AnalyzerException {
+ switch (insn.getOpcode()) {
+ case IALOAD:
+ case LALOAD:
+ case FALOAD:
+ case DALOAD:
+ case AALOAD:
+ case BALOAD:
+ case CALOAD:
+ case SALOAD:
+ case PUTFIELD:
+ if (nullAnalysis && value1 instanceof ParamValue) {
+ deReferenced = true;
+ }
+ break;
+ default:
+ }
+ return super.binaryOperation(insn, value1, value2);
+ }
+
+ @Override
+ public BasicValue ternaryOperation(AbstractInsnNode insn, BasicValue value1, BasicValue value2, BasicValue value3) throws AnalyzerException {
+ switch (insn.getOpcode()) {
+ case IASTORE:
+ case LASTORE:
+ case FASTORE:
+ case DASTORE:
+ case AASTORE:
+ case BASTORE:
+ case CASTORE:
+ case SASTORE:
+ if (nullAnalysis && value1 instanceof ParamValue) {
+ deReferenced = true;
+ }
+ default:
+ }
+ return super.ternaryOperation(insn, value1, value2, value3);
+ }
+
+ @Override
+ public BasicValue naryOperation(AbstractInsnNode insn, List<? extends BasicValue> values) throws AnalyzerException {
+ boolean propagate = resultOrigins.contains(insns.indexOf(insn));
+ int opCode = insn.getOpcode();
+ int shift = opCode == INVOKESTATIC ? 0 : 1;
+
+ switch (opCode) {
+ case INVOKESPECIAL:
+ case INVOKEINTERFACE:
+ case INVOKEVIRTUAL:
+ if (nullAnalysis && values.get(0) instanceof ParamValue) {
+ deReferenced = true;
+ return super.naryOperation(insn, values);
+ }
+ }
+
+ if (propagate) {
+ switch (opCode) {
+ case INVOKESTATIC:
+ case INVOKESPECIAL:
+ case INVOKEVIRTUAL:
+ case INVOKEINTERFACE:
+ boolean stable = opCode == INVOKESTATIC || opCode == INVOKESPECIAL;
+ MethodInsnNode mNode = (MethodInsnNode)insn;
+ Method method = new Method(mNode.owner, mNode.name, mNode.desc);
+ Type retType = Type.getReturnType(mNode.desc);
+ boolean isRefRetType = retType.getSort() == Type.OBJECT || retType.getSort() == Type.ARRAY;
+ if (!Type.VOID_TYPE.equals(retType)) {
+ if (direction instanceof InOut) {
+ InOut inOut = (InOut)direction;
+ HashSet<Key> keys = new HashSet<Key>();
+ for (int i = shift; i < values.size(); i++) {
+ if (values.get(i) instanceof ParamValue) {
+ keys.add(new Key(method, new InOut(i - shift, inOut.inValue), stable));
+ }
+ }
+ if (isRefRetType) {
+ keys.add(new Key(method, new Out(), stable));
+ }
+ if (!keys.isEmpty()) {
+ return new CallResultValue(retType, keys);
+ }
+ }
+ else if (isRefRetType) {
+ HashSet<Key> keys = new HashSet<Key>();
+ keys.add(new Key(method, new Out(), stable));
+ return new CallResultValue(retType, keys);
+ }
+ }
+ break;
+ case MULTIANEWARRAY:
+ return new NotNullValue(super.naryOperation(insn, values).getType());
+ default:
+ }
+ }
+ return super.naryOperation(insn, values);
+ }
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ControlFlow.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ControlFlow.java
new file mode 100644
index 000000000000..910d75b9a57f
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ControlFlow.java
@@ -0,0 +1,1030 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import gnu.trove.TIntArrayList;
+import gnu.trove.TIntHashSet;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.org.objectweb.asm.Opcodes;
+import org.jetbrains.org.objectweb.asm.Type;
+import org.jetbrains.org.objectweb.asm.tree.*;
+import org.jetbrains.org.objectweb.asm.tree.analysis.*;
+import org.jetbrains.org.objectweb.asm.tree.analysis.Value;
+
+import java.util.*;
+
+import static org.jetbrains.org.objectweb.asm.Opcodes.*;
+
+final class cfg {
+ static ControlFlowGraph buildControlFlowGraph(String className, MethodNode methodNode) throws AnalyzerException {
+ return new ControlFlowBuilder(className, methodNode).buildCFG();
+ }
+
+ static TIntHashSet resultOrigins(String className, MethodNode methodNode) throws AnalyzerException {
+ Frame<SourceValue>[] frames = new Analyzer<SourceValue>(MININAL_ORIGIN_INTERPRETER).analyze(className, methodNode);
+ InsnList insns = methodNode.instructions;
+ TIntHashSet result = new TIntHashSet();
+ for (int i = 0; i < frames.length; i++) {
+ AbstractInsnNode insnNode = insns.get(i);
+ Frame<SourceValue> frame = frames[i];
+ if (frame != null) {
+ switch (insnNode.getOpcode()) {
+ case ARETURN:
+ case IRETURN:
+ case LRETURN:
+ case FRETURN:
+ case DRETURN:
+ for (AbstractInsnNode sourceInsn : frame.pop().insns) {
+ result.add(insns.indexOf(sourceInsn));
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ static boolean[] leakingParameters(String className, MethodNode methodNode) throws AnalyzerException {
+ Frame<ParamsValue>[] frames = new Analyzer<ParamsValue>(new ParametersUsage(methodNode)).analyze(className, methodNode);
+ InsnList insns = methodNode.instructions;
+ LeakingParametersCollector collector = new LeakingParametersCollector(methodNode);
+ for (int i = 0; i < frames.length; i++) {
+ AbstractInsnNode insnNode = insns.get(i);
+ Frame<ParamsValue> frame = frames[i];
+ if (frame != null) {
+ switch (insnNode.getType()) {
+ case AbstractInsnNode.LABEL:
+ case AbstractInsnNode.LINE:
+ case AbstractInsnNode.FRAME:
+ break;
+ default:
+ frame.execute(insnNode, collector);
+ }
+ }
+ }
+ return collector.leaking;
+ }
+
+ static final Interpreter<SourceValue> MININAL_ORIGIN_INTERPRETER = new SourceInterpreter() {
+ final SourceValue[] sourceVals = {new SourceValue(1), new SourceValue(2)};
+
+ @Override
+ public SourceValue newOperation(AbstractInsnNode insn) {
+ SourceValue result = super.newOperation(insn);
+ switch (insn.getOpcode()) {
+ case ICONST_0:
+ case ICONST_1:
+ case ACONST_NULL:
+ case LDC:
+ case NEW:
+ return result;
+ default:
+ return sourceVals[result.getSize() - 1];
+ }
+ }
+
+ @Override
+ public SourceValue unaryOperation(AbstractInsnNode insn, SourceValue value) {
+ SourceValue result = super.unaryOperation(insn, value);
+ switch (insn.getOpcode()) {
+ case CHECKCAST:
+ case NEWARRAY:
+ case ANEWARRAY:
+ return result;
+ default:
+ return sourceVals[result.getSize() - 1];
+ }
+ }
+
+ @Override
+ public SourceValue binaryOperation(AbstractInsnNode insn, SourceValue value1, SourceValue value2) {
+ switch (insn.getOpcode()) {
+ case LALOAD:
+ case DALOAD:
+ case LADD:
+ case DADD:
+ case LSUB:
+ case DSUB:
+ case LMUL:
+ case DMUL:
+ case LDIV:
+ case DDIV:
+ case LREM:
+ case LSHL:
+ case LSHR:
+ case LUSHR:
+ case LAND:
+ case LOR:
+ case LXOR:
+ return sourceVals[1];
+ default:
+ return sourceVals[0];
+ }
+ }
+
+ @Override
+ public SourceValue ternaryOperation(AbstractInsnNode insn, SourceValue value1, SourceValue value2, SourceValue value3) {
+ return sourceVals[0];
+ }
+
+ @Override
+ public SourceValue copyOperation(AbstractInsnNode insn, SourceValue value) {
+ return value;
+ }
+
+ };
+
+ private interface Action {}
+ private static class MarkScanned implements Action {
+ final int node;
+ private MarkScanned(int node) {
+ this.node = node;
+ }
+ }
+ private static class ExamineEdge implements Action {
+ final int from;
+ final int to;
+
+ private ExamineEdge(int from, int to) {
+ this.from = from;
+ this.to = to;
+ }
+ }
+
+ // Graphs: Theory and Algorithms. by K. Thulasiraman , M. N. S. Swamy (1992)
+ // 11.7.2 DFS of a directed graph
+ static DFSTree buildDFSTree(int[][] transitions) {
+ Set<Edge> tree = new HashSet<Edge>();
+ Set<Edge> forward = new HashSet<Edge>();
+ Set<Edge> back = new HashSet<Edge>();
+ Set<Edge> cross = new HashSet<Edge>();
+
+ boolean[] marked = new boolean[transitions.length];
+ boolean[] scanned = new boolean[transitions.length];
+ int[] preOrder = new int[transitions.length];
+ int[] postOrder = new int[transitions.length];
+
+ int entered = 0;
+ int completed = 0;
+
+ Deque<Action> stack = new LinkedList<Action>();
+ Set<Integer> loopEnters = new HashSet<Integer>();
+
+ // enter 0
+ entered ++;
+ preOrder[0] = entered;
+ marked[0] = true;
+ stack.push(new MarkScanned(0));
+ for (int to : transitions[0]) {
+ stack.push(new ExamineEdge(0, to));
+ }
+
+ while (!stack.isEmpty()) {
+ Action action = stack.pop();
+ if (action instanceof MarkScanned) {
+ MarkScanned markScannedAction = (MarkScanned) action;
+ completed ++;
+ postOrder[markScannedAction.node] = completed;
+ scanned[markScannedAction.node] = true;
+ }
+ else {
+ ExamineEdge examineEdgeAction = (ExamineEdge) action;
+ int from = examineEdgeAction.from;
+ int to = examineEdgeAction.to;
+ if (!marked[to]) {
+ tree.add(new Edge(from, to));
+ // enter to
+ entered ++;
+ preOrder[to] = entered;
+ marked[to] = true;
+ stack.push(new MarkScanned(to));
+ for (int to1 : transitions[to]) {
+ stack.push(new ExamineEdge(to, to1));
+ }
+ }
+ else if (preOrder[to] > preOrder[from]) {
+ forward.add(new Edge(from, to));
+ }
+ else if (preOrder[to] < preOrder[from] && !scanned[to]) {
+ back.add(new Edge(from, to));
+ loopEnters.add(to);
+ } else {
+ cross.add(new Edge(from, to));
+ }
+ }
+ }
+
+ return new DFSTree(preOrder, postOrder, tree, forward, back, cross, loopEnters);
+ }
+
+ // Tarjan. Testing flow graph reducibility.
+ // Journal of Computer and System Sciences 9.3 (1974): 355-365.
+ static boolean reducible(ControlFlowGraph cfg, DFSTree dfs) {
+ int size = cfg.transitions.length;
+ HashSet<Integer>[] cycles = new HashSet[size];
+ HashSet<Integer>[] nonCycles = new HashSet[size];
+ int[] collapsedTo = new int[size];
+ for (int i = 0; i < size; i++) {
+ cycles[i] = new HashSet<Integer>();
+ nonCycles[i] = new HashSet<Integer>();
+ collapsedTo[i] = i;
+ }
+
+ for (Edge edge : dfs.back) {
+ cycles[edge.to].add(edge.from);
+ }
+ for (Edge edge : dfs.tree) {
+ nonCycles[edge.to].add(edge.from);
+ }
+ for (Edge edge : dfs.forward) {
+ nonCycles[edge.to].add(edge.from);
+ }
+ for (Edge edge : dfs.cross) {
+ nonCycles[edge.to].add(edge.from);
+ }
+
+ for (int w = size - 1; w >= 0 ; w--) {
+ HashSet<Integer> p = new HashSet<Integer>(cycles[w]);
+ Queue<Integer> queue = new LinkedList<Integer>(cycles[w]);
+
+ while (!queue.isEmpty()) {
+ int x = queue.remove();
+ for (int y : nonCycles[x]) {
+ int y1 = collapsedTo[y];
+ if (!dfs.isDescendant(y1, w)) {
+ return false;
+ }
+ if (y1 != w && p.add(y1)) {
+ queue.add(y1);
+ }
+ }
+ }
+
+ for (int x : p) {
+ collapsedTo[x] = w;
+ }
+ }
+
+ return true;
+ }
+
+}
+
+final class Edge {
+ final int from, to;
+
+ Edge(int from, int to) {
+ this.from = from;
+ this.to = to;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof Edge)) {
+ return false;
+ }
+ Edge edge = (Edge) o;
+ return from == edge.from && to == edge.to;
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * from + to;
+ }
+
+ @Override
+ public String toString() {
+ return "(" + from + "," + to + ")";
+ }
+}
+
+final class ControlFlowGraph {
+ final String className;
+ final MethodNode methodNode;
+ final int[][] transitions;
+ final Set<Edge> errorTransitions;
+
+ ControlFlowGraph(String className, MethodNode methodNode, int[][] transitions, Set<Edge> errorTransitions) {
+ this.className = className;
+ this.methodNode = methodNode;
+ this.transitions = transitions;
+ this.errorTransitions = errorTransitions;
+ }
+
+ @Override
+ public String toString() {
+ return "CFG(" +
+ Arrays.toString(transitions) + "," +
+ errorTransitions +
+ ')';
+ }
+}
+
+final class RichControlFlow {
+ final ControlFlowGraph controlFlow;
+ final DFSTree dfsTree;
+
+ RichControlFlow(ControlFlowGraph controlFlow, DFSTree dfsTree) {
+ this.controlFlow = controlFlow;
+ this.dfsTree = dfsTree;
+ }
+}
+
+final class ControlFlowBuilder extends CfgAnalyzer {
+ final String className;
+ final MethodNode methodNode;
+ final TIntArrayList[] transitions;
+ final Set<Edge> errorTransitions;
+
+ ControlFlowBuilder(String className, MethodNode methodNode) {
+ this.className = className;
+ this.methodNode = methodNode;
+ transitions = new TIntArrayList[methodNode.instructions.size()];
+ for (int i = 0; i < transitions.length; i++) {
+ transitions[i] = new TIntArrayList();
+ }
+ errorTransitions = new HashSet<Edge>();
+ }
+
+ final ControlFlowGraph buildCFG() throws AnalyzerException {
+ if ((methodNode.access & (ACC_ABSTRACT | ACC_NATIVE)) == 0) {
+ analyze(methodNode);
+ }
+ int[][] resultTransitions = new int[transitions.length][];
+ for (int i = 0; i < resultTransitions.length; i++) {
+ resultTransitions[i] = transitions[i].toNativeArray();
+ }
+ return new ControlFlowGraph(className, methodNode, resultTransitions, errorTransitions);
+ }
+
+ @Override
+ protected final void newControlFlowEdge(int insn, int successor) {
+ if (!transitions[insn].contains(successor)) {
+ transitions[insn].add(successor);
+ }
+ }
+
+ @Override
+ protected final boolean newControlFlowExceptionEdge(int insn, int successor) {
+ if (!transitions[insn].contains(successor)) {
+ transitions[insn].add(successor);
+ errorTransitions.add(new Edge(insn, successor));
+ }
+ return true;
+ }
+}
+
+final class DFSTree {
+ final int[] preOrder, postOrder;
+ final Set<Edge> tree, forward, back, cross;
+ final Set<Integer> loopEnters;
+
+ DFSTree(int[] preOrder,
+ int[] postOrder,
+ Set<Edge> tree,
+ Set<Edge> forward,
+ Set<Edge> back,
+ Set<Edge> cross,
+ Set<Integer> loopEnters) {
+ this.preOrder = preOrder;
+ this.postOrder = postOrder;
+ this.tree = tree;
+ this.forward = forward;
+ this.back = back;
+ this.cross = cross;
+ this.loopEnters = loopEnters;
+ }
+
+ final boolean isDescendant(int child, int parent) {
+ return preOrder[parent] <= preOrder[child] && postOrder[child] <= postOrder[parent];
+ }
+}
+
+final class ParamsValue implements Value {
+ @NotNull final boolean[] params;
+ final int size;
+
+ ParamsValue(@NotNull boolean[] params, int size) {
+ this.params = params;
+ this.size = size;
+ }
+
+ @Override
+ public int getSize() {
+ return size;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null) return false;
+ ParamsValue that = (ParamsValue)o;
+ return (this.size == that.size && Arrays.equals(this.params, that.params));
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * Arrays.hashCode(params) + size;
+ }
+}
+
+class ParametersUsage extends Interpreter<ParamsValue> {
+ final ParamsValue val1;
+ final ParamsValue val2;
+ int called = -1;
+ final int rangeStart;
+ final int rangeEnd;
+ final int arity;
+ final int shift;
+
+ ParametersUsage(MethodNode methodNode) {
+ super(ASM5);
+ arity = Type.getArgumentTypes(methodNode.desc).length;
+ boolean[] emptyParams = new boolean[arity];
+ val1 = new ParamsValue(emptyParams, 1);
+ val2 = new ParamsValue(emptyParams, 2);
+
+ shift = (methodNode.access & ACC_STATIC) == 0 ? 2 : 1;
+ rangeStart = shift;
+ rangeEnd = arity + shift;
+ }
+
+ @Override
+ public ParamsValue newValue(Type type) {
+ if (type == null) return val1;
+ called++;
+ if (type == Type.VOID_TYPE) return null;
+ if (called < rangeEnd && rangeStart <= called) {
+ boolean[] params = new boolean[arity];
+ params[called - shift] = true;
+ return type.getSize() == 1 ? new ParamsValue(params, 1) : new ParamsValue(params, 2);
+ }
+ else {
+ return type.getSize() == 1 ? val1 : val2;
+ }
+ }
+
+ @Override
+ public ParamsValue newOperation(final AbstractInsnNode insn) {
+ int size;
+ switch (insn.getOpcode()) {
+ case LCONST_0:
+ case LCONST_1:
+ case DCONST_0:
+ case DCONST_1:
+ size = 2;
+ break;
+ case LDC:
+ Object cst = ((LdcInsnNode) insn).cst;
+ size = cst instanceof Long || cst instanceof Double ? 2 : 1;
+ break;
+ case GETSTATIC:
+ size = Type.getType(((FieldInsnNode) insn).desc).getSize();
+ break;
+ default:
+ size = 1;
+ }
+ return size == 1 ? val1 : val2;
+ }
+
+ @Override
+ public ParamsValue copyOperation(AbstractInsnNode insn, ParamsValue value) {
+ return value;
+ }
+
+ @Override
+ public ParamsValue unaryOperation(AbstractInsnNode insn, ParamsValue value) {
+ int size;
+ switch (insn.getOpcode()) {
+ case CHECKCAST:
+ return new ParamsValue(value.params, Type.getObjectType(((TypeInsnNode)insn).desc).getSize());
+ case LNEG:
+ case DNEG:
+ case I2L:
+ case I2D:
+ case L2D:
+ case F2L:
+ case F2D:
+ case D2L:
+ size = 2;
+ break;
+ case GETFIELD:
+ size = Type.getType(((FieldInsnNode) insn).desc).getSize();
+ break;
+ default:
+ size = 1;
+ }
+ return size == 1 ? val1 : val2;
+ }
+
+ @Override
+ public ParamsValue binaryOperation(AbstractInsnNode insn, ParamsValue value1, ParamsValue value2) {
+ int size;
+ switch (insn.getOpcode()) {
+ case LALOAD:
+ case DALOAD:
+ case LADD:
+ case DADD:
+ case LSUB:
+ case DSUB:
+ case LMUL:
+ case DMUL:
+ case LDIV:
+ case DDIV:
+ case LREM:
+ case DREM:
+ case LSHL:
+ case LSHR:
+ case LUSHR:
+ case LAND:
+ case LOR:
+ case LXOR:
+ size = 2;
+ break;
+ default:
+ size = 1;
+ }
+ return size == 1 ? val1 : val2;
+ }
+
+ @Override
+ public ParamsValue ternaryOperation(AbstractInsnNode insn, ParamsValue value1, ParamsValue value2, ParamsValue value3) {
+ return val1;
+ }
+
+ @Override
+ public ParamsValue naryOperation(AbstractInsnNode insn, List<? extends ParamsValue> values) {
+ int size;
+ int opcode = insn.getOpcode();
+ if (opcode == MULTIANEWARRAY) {
+ size = 1;
+ } else {
+ String desc = (opcode == INVOKEDYNAMIC) ? ((InvokeDynamicInsnNode) insn).desc : ((MethodInsnNode) insn).desc;
+ size = Type.getReturnType(desc).getSize();
+ }
+ return size == 1 ? val1 : val2;
+ }
+
+ @Override
+ public void returnOperation(AbstractInsnNode insn, ParamsValue value, ParamsValue expected) {}
+
+ @Override
+ public ParamsValue merge(ParamsValue v1, ParamsValue v2) {
+ if (v1.equals(v2)) return v1;
+ boolean[] params = new boolean[arity];
+ boolean[] params1 = v1.params;
+ boolean[] params2 = v2.params;
+ for (int i = 0; i < arity; i++) {
+ params[i] = params1[i] || params2[i];
+ }
+ return new ParamsValue(params, Math.min(v1.size, v2.size));
+ }
+}
+
+class LeakingParametersCollector extends ParametersUsage {
+ final boolean[] leaking;
+ LeakingParametersCollector(MethodNode methodNode) {
+ super(methodNode);
+ leaking = new boolean[arity];
+ }
+
+ @Override
+ public ParamsValue unaryOperation(AbstractInsnNode insn, ParamsValue value) {
+ switch (insn.getOpcode()) {
+ case GETFIELD:
+ case ARRAYLENGTH:
+ case MONITORENTER:
+ case INSTANCEOF:
+ case IRETURN:
+ case ARETURN:
+ case IFNONNULL:
+ case IFNULL:
+ case IFEQ:
+ case IFNE:
+ boolean[] params = value.params;
+ for (int i = 0; i < arity; i++) {
+ leaking[i] |= params[i];
+ }
+ break;
+ default:
+ }
+ return super.unaryOperation(insn, value);
+ }
+
+ @Override
+ public ParamsValue binaryOperation(AbstractInsnNode insn, ParamsValue value1, ParamsValue value2) {
+ switch (insn.getOpcode()) {
+ case IALOAD:
+ case LALOAD:
+ case FALOAD:
+ case DALOAD:
+ case AALOAD:
+ case BALOAD:
+ case CALOAD:
+ case SALOAD:
+ case PUTFIELD:
+ boolean[] params = value1.params;
+ for (int i = 0; i < arity; i++) {
+ leaking[i] |= params[i];
+ }
+ break;
+ default:
+ }
+ return super.binaryOperation(insn, value1, value2);
+ }
+
+ @Override
+ public ParamsValue ternaryOperation(AbstractInsnNode insn, ParamsValue value1, ParamsValue value2, ParamsValue value3) {
+ switch (insn.getOpcode()) {
+ case IASTORE:
+ case LASTORE:
+ case FASTORE:
+ case DASTORE:
+ case AASTORE:
+ case BASTORE:
+ case CASTORE:
+ case SASTORE:
+ boolean[] params = value1.params;
+ for (int i = 0; i < arity; i++) {
+ leaking[i] |= params[i];
+ }
+ break;
+ default:
+ }
+ return super.ternaryOperation(insn, value1, value2, value3);
+ }
+
+ @Override
+ public ParamsValue naryOperation(AbstractInsnNode insn, List<? extends ParamsValue> values) {
+ switch (insn.getOpcode()) {
+ case INVOKESTATIC:
+ case INVOKESPECIAL:
+ case INVOKEVIRTUAL:
+ case INVOKEINTERFACE:
+ for (ParamsValue value : values) {
+ boolean[] params = value.params;
+ for (int i = 0; i < arity; i++) {
+ leaking[i] |= params[i];
+ }
+ }
+ break;
+ default:
+ }
+ return super.naryOperation(insn, values);
+ }
+}
+
+/**
+ * Specialized lite version of {@link org.jetbrains.org.objectweb.asm.tree.analysis.Analyzer}.
+ * Calculation of fix-point of frames is removed, since frames are not needed to build control flow graph.
+ * So, the main point here is handling of subroutines (jsr) and try-catch-finally blocks.
+ */
+class CfgAnalyzer implements Opcodes {
+ static class Subroutine {
+
+ LabelNode start;
+
+ boolean[] access;
+
+ List<JumpInsnNode> callers;
+
+ private Subroutine() {
+ }
+
+ Subroutine(final LabelNode start, final int maxLocals,
+ final JumpInsnNode caller) {
+ this.start = start;
+ this.access = new boolean[maxLocals];
+ this.callers = new ArrayList<JumpInsnNode>();
+ callers.add(caller);
+ }
+
+ public Subroutine copy() {
+ Subroutine result = new Subroutine();
+ result.start = start;
+ result.access = new boolean[access.length];
+ System.arraycopy(access, 0, result.access, 0, access.length);
+ result.callers = new ArrayList<JumpInsnNode>(callers);
+ return result;
+ }
+
+ public boolean merge(final Subroutine subroutine) throws AnalyzerException {
+ boolean changes = false;
+ for (int i = 0; i < access.length; ++i) {
+ if (subroutine.access[i] && !access[i]) {
+ access[i] = true;
+ changes = true;
+ }
+ }
+ if (subroutine.start == start) {
+ for (int i = 0; i < subroutine.callers.size(); ++i) {
+ JumpInsnNode caller = subroutine.callers.get(i);
+ if (!callers.contains(caller)) {
+ callers.add(caller);
+ changes = true;
+ }
+ }
+ }
+ return changes;
+ }
+ }
+ private int n;
+ private InsnList insns;
+ private List<TryCatchBlockNode>[] handlers;
+ private Subroutine[] subroutines;
+ private boolean[] wasQueued;
+ private boolean[] queued;
+ private int[] queue;
+ private int top;
+
+ public void analyze(final MethodNode m) throws AnalyzerException {
+ n = m.instructions.size();
+ insns = m.instructions;
+ handlers = (List<TryCatchBlockNode>[]) new List<?>[n];
+ subroutines = new Subroutine[n];
+ queued = new boolean[n];
+ wasQueued = new boolean[n];
+ queue = new int[n];
+ top = 0;
+
+ // computes exception handlers for each instruction
+ for (int i = 0; i < m.tryCatchBlocks.size(); ++i) {
+ TryCatchBlockNode tcb = m.tryCatchBlocks.get(i);
+ int begin = insns.indexOf(tcb.start);
+ int end = insns.indexOf(tcb.end);
+ for (int j = begin; j < end; ++j) {
+ List<TryCatchBlockNode> insnHandlers = handlers[j];
+ if (insnHandlers == null) {
+ insnHandlers = new ArrayList<TryCatchBlockNode>();
+ handlers[j] = insnHandlers;
+ }
+ insnHandlers.add(tcb);
+ }
+ }
+
+ // computes the subroutine for each instruction:
+ Subroutine main = new Subroutine(null, m.maxLocals, null);
+ List<AbstractInsnNode> subroutineCalls = new ArrayList<AbstractInsnNode>();
+ Map<LabelNode, Subroutine> subroutineHeads = new HashMap<LabelNode, Subroutine>();
+
+ findSubroutine(0, main, subroutineCalls);
+ while (!subroutineCalls.isEmpty()) {
+ JumpInsnNode jsr = (JumpInsnNode) subroutineCalls.remove(0);
+ Subroutine sub = subroutineHeads.get(jsr.label);
+ if (sub == null) {
+ sub = new Subroutine(jsr.label, m.maxLocals, jsr);
+ subroutineHeads.put(jsr.label, sub);
+ findSubroutine(insns.indexOf(jsr.label), sub, subroutineCalls);
+ } else {
+ sub.callers.add(jsr);
+ }
+ }
+ for (int i = 0; i < n; ++i) {
+ if (subroutines[i] != null && subroutines[i].start == null) {
+ subroutines[i] = null;
+ }
+ }
+
+ merge(0, null);
+ // control flow analysis
+ while (top > 0) {
+ int insn = queue[--top];
+ Subroutine subroutine = subroutines[insn];
+ queued[insn] = false;
+
+ AbstractInsnNode insnNode = null;
+ try {
+ insnNode = m.instructions.get(insn);
+ int insnOpcode = insnNode.getOpcode();
+ int insnType = insnNode.getType();
+
+ if (insnType == AbstractInsnNode.LABEL || insnType == AbstractInsnNode.LINE || insnType == AbstractInsnNode.FRAME) {
+ merge(insn + 1, subroutine);
+ newControlFlowEdge(insn, insn + 1);
+ } else {
+ subroutine = subroutine == null ? null : subroutine.copy();
+
+ if (insnNode instanceof JumpInsnNode) {
+ JumpInsnNode j = (JumpInsnNode) insnNode;
+ if (insnOpcode != GOTO && insnOpcode != JSR) {
+ merge(insn + 1, subroutine);
+ newControlFlowEdge(insn, insn + 1);
+ }
+ int jump = insns.indexOf(j.label);
+ if (insnOpcode == JSR) {
+ merge(jump, new Subroutine(j.label, m.maxLocals, j));
+ } else {
+ merge(jump, subroutine);
+ }
+ newControlFlowEdge(insn, jump);
+ } else if (insnNode instanceof LookupSwitchInsnNode) {
+ LookupSwitchInsnNode lsi = (LookupSwitchInsnNode) insnNode;
+ int jump = insns.indexOf(lsi.dflt);
+ merge(jump, subroutine);
+ newControlFlowEdge(insn, jump);
+ for (int j = 0; j < lsi.labels.size(); ++j) {
+ LabelNode label = lsi.labels.get(j);
+ jump = insns.indexOf(label);
+ merge(jump, subroutine);
+ newControlFlowEdge(insn, jump);
+ }
+ } else if (insnNode instanceof TableSwitchInsnNode) {
+ TableSwitchInsnNode tsi = (TableSwitchInsnNode) insnNode;
+ int jump = insns.indexOf(tsi.dflt);
+ merge(jump, subroutine);
+ newControlFlowEdge(insn, jump);
+ for (int j = 0; j < tsi.labels.size(); ++j) {
+ LabelNode label = tsi.labels.get(j);
+ jump = insns.indexOf(label);
+ merge(jump, subroutine);
+ newControlFlowEdge(insn, jump);
+ }
+ } else if (insnOpcode == RET) {
+ if (subroutine == null) {
+ throw new AnalyzerException(insnNode, "RET instruction outside of a sub routine");
+ }
+ for (int i = 0; i < subroutine.callers.size(); ++i) {
+ JumpInsnNode caller = subroutine.callers.get(i);
+ int call = insns.indexOf(caller);
+ if (wasQueued[call]) {
+ merge(call + 1, subroutines[call], subroutine.access);
+ newControlFlowEdge(insn, call + 1);
+ }
+ }
+ } else if (insnOpcode != ATHROW && (insnOpcode < IRETURN || insnOpcode > RETURN)) {
+ if (subroutine != null) {
+ if (insnNode instanceof VarInsnNode) {
+ int var = ((VarInsnNode) insnNode).var;
+ subroutine.access[var] = true;
+ if (insnOpcode == LLOAD || insnOpcode == DLOAD
+ || insnOpcode == LSTORE
+ || insnOpcode == DSTORE) {
+ subroutine.access[var + 1] = true;
+ }
+ } else if (insnNode instanceof IincInsnNode) {
+ int var = ((IincInsnNode) insnNode).var;
+ subroutine.access[var] = true;
+ }
+ }
+ merge(insn + 1, subroutine);
+ newControlFlowEdge(insn, insn + 1);
+ }
+ }
+
+ List<TryCatchBlockNode> insnHandlers = handlers[insn];
+ if (insnHandlers != null) {
+ for (TryCatchBlockNode tcb : insnHandlers) {
+ newControlFlowExceptionEdge(insn, tcb);
+ merge(insns.indexOf(tcb.handler), subroutine);
+ }
+ }
+ } catch (AnalyzerException e) {
+ throw new AnalyzerException(e.node, "Error at instruction "
+ + insn + ": " + e.getMessage(), e);
+ } catch (Exception e) {
+ throw new AnalyzerException(insnNode, "Error at instruction "
+ + insn + ": " + e.getMessage(), e);
+ }
+ }
+ }
+
+ private void findSubroutine(int insn, final Subroutine sub,
+ final List<AbstractInsnNode> calls) throws AnalyzerException {
+ while (true) {
+ if (insn < 0 || insn >= n) {
+ throw new AnalyzerException(null, "Execution can fall off end of the code");
+ }
+ if (subroutines[insn] != null) {
+ return;
+ }
+ subroutines[insn] = sub.copy();
+ AbstractInsnNode node = insns.get(insn);
+
+ // calls findSubroutine recursively on normal successors
+ if (node instanceof JumpInsnNode) {
+ if (node.getOpcode() == JSR) {
+ // do not follow a JSR, it leads to another subroutine!
+ calls.add(node);
+ } else {
+ JumpInsnNode jnode = (JumpInsnNode) node;
+ findSubroutine(insns.indexOf(jnode.label), sub, calls);
+ }
+ } else if (node instanceof TableSwitchInsnNode) {
+ TableSwitchInsnNode tsnode = (TableSwitchInsnNode) node;
+ findSubroutine(insns.indexOf(tsnode.dflt), sub, calls);
+ for (int i = tsnode.labels.size() - 1; i >= 0; --i) {
+ LabelNode l = tsnode.labels.get(i);
+ findSubroutine(insns.indexOf(l), sub, calls);
+ }
+ } else if (node instanceof LookupSwitchInsnNode) {
+ LookupSwitchInsnNode lsnode = (LookupSwitchInsnNode) node;
+ findSubroutine(insns.indexOf(lsnode.dflt), sub, calls);
+ for (int i = lsnode.labels.size() - 1; i >= 0; --i) {
+ LabelNode l = lsnode.labels.get(i);
+ findSubroutine(insns.indexOf(l), sub, calls);
+ }
+ }
+
+ // calls findSubroutine recursively on exception handler successors
+ List<TryCatchBlockNode> insnHandlers = handlers[insn];
+ if (insnHandlers != null) {
+ for (int i = 0; i < insnHandlers.size(); ++i) {
+ TryCatchBlockNode tcb = insnHandlers.get(i);
+ findSubroutine(insns.indexOf(tcb.handler), sub, calls);
+ }
+ }
+
+ // if insn does not falls through to the next instruction, return.
+ switch (node.getOpcode()) {
+ case GOTO:
+ case RET:
+ case TABLESWITCH:
+ case LOOKUPSWITCH:
+ case IRETURN:
+ case LRETURN:
+ case FRETURN:
+ case DRETURN:
+ case ARETURN:
+ case RETURN:
+ case ATHROW:
+ return;
+ }
+ insn++;
+ }
+ }
+
+ protected void newControlFlowEdge(final int insn, final int successor) {}
+
+ protected boolean newControlFlowExceptionEdge(final int insn,
+ final int successor) {
+ return true;
+ }
+
+ protected boolean newControlFlowExceptionEdge(final int insn,
+ final TryCatchBlockNode tcb) {
+ return newControlFlowExceptionEdge(insn, insns.indexOf(tcb.handler));
+ }
+
+ // -------------------------------------------------------------------------
+
+ private void merge(final int insn, final Subroutine subroutine) throws AnalyzerException {
+ Subroutine oldSubroutine = subroutines[insn];
+ boolean changes = false;
+
+ if (!wasQueued[insn]) {
+ wasQueued[insn] = true;
+ changes = true;
+ }
+
+ if (oldSubroutine == null) {
+ if (subroutine != null) {
+ subroutines[insn] = subroutine.copy();
+ changes = true;
+ }
+ } else {
+ if (subroutine != null) {
+ changes |= oldSubroutine.merge(subroutine);
+ }
+ }
+ if (changes && !queued[insn]) {
+ queued[insn] = true;
+ queue[top++] = insn;
+ }
+ }
+
+ private void merge(final int insn, final Subroutine subroutineBeforeJSR, final boolean[] access) throws AnalyzerException {
+ Subroutine oldSubroutine = subroutines[insn];
+ boolean changes = false;
+
+ if (!wasQueued[insn]) {
+ wasQueued[insn] = true;
+ changes = true;
+ }
+
+ if (oldSubroutine != null && subroutineBeforeJSR != null) {
+ changes |= oldSubroutine.merge(subroutineBeforeJSR);
+ }
+ if (changes && !queued[insn]) {
+ queued[insn] = true;
+ queue[top++] = insn;
+ }
+ }
+}
+
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Data.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Data.java
new file mode 100644
index 000000000000..132c5643b2d6
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Data.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+final class Method {
+ final String internalClassName;
+ final String methodName;
+ final String methodDesc;
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Method method = (Method) o;
+ return internalClassName.equals(method.internalClassName) && methodDesc.equals(method.methodDesc) && methodName.equals(method.methodName);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = internalClassName.hashCode();
+ result = 31 * result + methodName.hashCode();
+ result = 31 * result + methodDesc.hashCode();
+ return result;
+ }
+
+ Method(String internalClassName, String methodName, String methodDesc) {
+ this.internalClassName = internalClassName;
+ this.methodName = methodName;
+ this.methodDesc = methodDesc;
+ }
+
+ @Override
+ public String toString() {
+ return internalClassName + ' ' + methodName + ' ' + methodDesc;
+ }
+}
+
+enum Value {
+ Bot, NotNull, Null, True, False, Top
+}
+
+interface Direction {
+ static final int OUT_DIRECTION = 0;
+ static final int IN_DIRECTION = 1;
+ static final int INOUT_DIRECTION = 2;
+ int directionId();
+ int paramId();
+ int valueId();
+}
+
+final class In implements Direction {
+ final int paramIndex;
+
+ In(int paramIndex) {
+ this.paramIndex = paramIndex;
+ }
+
+ @Override
+ public String toString() {
+ return "In " + paramIndex;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ In in = (In) o;
+ if (paramIndex != in.paramIndex) return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return paramIndex;
+ }
+
+ @Override
+ public int directionId() {
+ return IN_DIRECTION;
+ }
+
+ @Override
+ public int paramId() {
+ return paramIndex;
+ }
+
+ @Override
+ public int valueId() {
+ return 0;
+ }
+}
+
+final class InOut implements Direction {
+ final int paramIndex;
+ final Value inValue;
+
+ InOut(int paramIndex, Value inValue) {
+ this.paramIndex = paramIndex;
+ this.inValue = inValue;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ InOut inOut = (InOut) o;
+
+ if (paramIndex != inOut.paramIndex) return false;
+ if (inValue != inOut.inValue) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = paramIndex;
+ result = 31 * result + inValue.ordinal();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "InOut " + paramIndex + " " + inValue.toString();
+ }
+
+ @Override
+ public int directionId() {
+ return INOUT_DIRECTION;
+ }
+
+ @Override
+ public int paramId() {
+ return paramIndex;
+ }
+
+ @Override
+ public int valueId() {
+ return inValue.ordinal();
+ }
+}
+
+final class Out implements Direction {
+ @Override
+ public String toString() {
+ return "Out";
+ }
+
+ @Override
+ public int hashCode() {
+ return 1;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof Out;
+ }
+
+ @Override
+ public int directionId() {
+ return OUT_DIRECTION;
+ }
+
+ @Override
+ public int paramId() {
+ return 0;
+ }
+
+ @Override
+ public int valueId() {
+ return 0;
+ }
+}
+
+final class Key {
+ final Method method;
+ final Direction direction;
+ final boolean stable;
+
+ Key(Method method, Direction direction, boolean stable) {
+ this.method = method;
+ this.direction = direction;
+ this.stable = stable;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Key key = (Key) o;
+
+ if (!direction.equals(key.direction)) return false;
+ if (!method.equals(key.method)) return false;
+ if (stable != key.stable) return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = method.hashCode();
+ result = 31 * result + direction.hashCode();
+ result = 31 * result + (stable ? 1 : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "" + method + ' ' + direction + ' ' + stable;
+ }
+}
+
+
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java
new file mode 100644
index 000000000000..08c52c4d49b0
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java
@@ -0,0 +1,390 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import org.jetbrains.org.objectweb.asm.Type;
+import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode;
+import org.jetbrains.org.objectweb.asm.tree.JumpInsnNode;
+import org.jetbrains.org.objectweb.asm.tree.MethodInsnNode;
+import org.jetbrains.org.objectweb.asm.tree.TypeInsnNode;
+import org.jetbrains.org.objectweb.asm.tree.analysis.AnalyzerException;
+import org.jetbrains.org.objectweb.asm.tree.analysis.BasicInterpreter;
+import org.jetbrains.org.objectweb.asm.tree.analysis.BasicValue;
+import org.jetbrains.org.objectweb.asm.tree.analysis.Frame;
+
+import java.util.*;
+
+import static com.intellij.codeInspection.bytecodeAnalysis.AbstractValues.InstanceOfCheckValue;
+import static com.intellij.codeInspection.bytecodeAnalysis.AbstractValues.ParamValue;
+import static com.intellij.codeInspection.bytecodeAnalysis.PResults.*;
+import static org.jetbrains.org.objectweb.asm.Opcodes.*;
+
+abstract class PResults {
+ // SoP = sum of products
+ static Set<Set<Key>> join(Set<Set<Key>> sop1, Set<Set<Key>> sop2) {
+ Set<Set<Key>> sop = new HashSet<Set<Key>>();
+ sop.addAll(sop1);
+ sop.addAll(sop2);
+ return sop;
+ }
+
+ static Set<Set<Key>> meet(Set<Set<Key>> sop1, Set<Set<Key>> sop2) {
+ Set<Set<Key>> sop = new HashSet<Set<Key>>();
+ for (Set<Key> prod1 : sop1) {
+ for (Set<Key> prod2 : sop2) {
+ Set<Key> prod = new HashSet<Key>();
+ prod.addAll(prod1);
+ prod.addAll(prod2);
+ sop.add(prod);
+ }
+ }
+ return sop;
+ }
+
+ // Results
+ interface PResult {}
+ static final PResult Identity = new PResult() {
+ @Override
+ public String toString() {
+ return "Identity";
+ }
+ };
+ // similar to top, maximal element
+ static final PResult Return = new PResult() {
+ @Override
+ public String toString() {
+ return "Return";
+ }
+ };
+ // minimal element
+ static final PResult NPE = new PResult() {
+ @Override
+ public String toString() {
+ return "NPE";
+ }
+ };
+ static final class ConditionalNPE implements PResult {
+ final Set<Set<Key>> sop;
+ public ConditionalNPE(Set<Set<Key>> sop) {
+ this.sop = sop;
+ }
+
+ public ConditionalNPE(Key key) {
+ sop = new HashSet<Set<Key>>();
+ Set<Key> prod = new HashSet<Key>();
+ prod.add(key);
+ sop.add(prod);
+ }
+ }
+
+ static PResult join(PResult r1, PResult r2) {
+ if (Identity == r1) return r2;
+ if (Identity == r2) return r1;
+ if (Return == r1) return Return;
+ if (Return == r2) return Return;
+ if (NPE == r1) return r2;
+ if (NPE == r2) return r1;
+ ConditionalNPE cnpe1 = (ConditionalNPE) r1;
+ ConditionalNPE cnpe2 = (ConditionalNPE) r2;
+ return new ConditionalNPE(join(cnpe1.sop, cnpe2.sop));
+ }
+
+ static PResult meet(PResult r1, PResult r2) {
+ if (Identity == r1) return r2;
+ if (Return == r1) return r2;
+ if (Return == r2) return r1;
+ if (NPE == r1) return NPE;
+ if (NPE == r2) return NPE;
+ if (Identity == r2) return Identity;
+ ConditionalNPE cnpe1 = (ConditionalNPE) r1;
+ ConditionalNPE cnpe2 = (ConditionalNPE) r2;
+ return new ConditionalNPE(meet(cnpe1.sop, cnpe2.sop));
+ }
+
+}
+
+class NonNullInAnalysis extends Analysis<PResult> {
+
+ private final NonNullInInterpreter interpreter = new NonNullInInterpreter();
+
+ protected NonNullInAnalysis(RichControlFlow richControlFlow, Direction direction, boolean stable) {
+ super(richControlFlow, direction, stable);
+ }
+
+ @Override
+ PResult identity() {
+ return Identity;
+ }
+
+ @Override
+ PResult combineResults(PResult delta, List<PResult> subResults) {
+ PResult subResult = Identity;
+ for (PResult sr : subResults) {
+ subResult = join(subResult, sr);
+ }
+ return meet(delta, subResult);
+ }
+
+ @Override
+ boolean isEarlyResult(PResult result) {
+ return false;
+ }
+
+ @Override
+ Equation<Key, Value> mkEquation(PResult result) {
+ if (Identity == result || Return == result) {
+ return new Equation<Key, Value>(aKey, new Final<Key, Value>(Value.Top));
+ }
+ else if (NPE == result) {
+ return new Equation<Key, Value>(aKey, new Final<Key, Value>(Value.NotNull));
+ }
+ else {
+ ConditionalNPE condNpe = (ConditionalNPE) result;
+ Set<Product<Key, Value>> components = new HashSet<Product<Key, Value>>();
+ for (Set<Key> prod : condNpe.sop) {
+ components.add(new Product<Key, Value>(Value.Top, prod));
+ }
+ return new Equation<Key, Value>(aKey, new Pending<Key, Value>(components));
+ }
+ }
+
+ private int id = 0;
+ private Frame<BasicValue> nextFrame = null;
+ private PResult subResult = null;
+
+ @Override
+ void processState(State state) throws AnalyzerException {
+ int stateIndex = state.index;
+ Conf conf = state.conf;
+ int insnIndex = conf.insnIndex;
+ List<Conf> history = state.history;
+ boolean taken = state.taken;
+ Frame<BasicValue> frame = conf.frame;
+ AbstractInsnNode insnNode = methodNode.instructions.get(insnIndex);
+ List<Conf> nextHistory = dfsTree.loopEnters.contains(insnIndex) ? append(history, conf) : history;
+ boolean hasCompanions = state.hasCompanions;
+ execute(frame, insnNode);
+
+ boolean notEmptySubResult = subResult != Identity;
+
+ if (subResult == NPE) {
+ results.put(stateIndex, NPE);
+ computed.put(insnIndex, append(computed.get(insnIndex), state));
+ return;
+ }
+
+ int opcode = insnNode.getOpcode();
+ switch (opcode) {
+ case ARETURN:
+ case IRETURN:
+ case LRETURN:
+ case FRETURN:
+ case DRETURN:
+ case RETURN:
+ if (!hasCompanions) {
+ earlyResult = Return;
+ } else {
+ results.put(stateIndex, Return);
+ computed.put(insnIndex, append(computed.get(insnIndex), state));
+ }
+ return;
+ default:
+ }
+
+ if (opcode == ATHROW) {
+ if (taken) {
+ results.put(stateIndex, NPE);
+ } else {
+ results.put(stateIndex, Identity);
+ }
+ computed.put(insnIndex, append(computed.get(insnIndex), state));
+ return;
+ }
+
+ if (opcode == IFNONNULL && popValue(frame) instanceof ParamValue) {
+ int nextInsnIndex = insnIndex + 1;
+ State nextState = new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, hasCompanions || notEmptySubResult);
+ pending.push(new MakeResult<PResult>(state, subResult, new int[]{nextState.index}));
+ pending.push(new ProceedState<PResult>(nextState));
+ return;
+ }
+
+ if (opcode == IFNULL && popValue(frame) instanceof ParamValue) {
+ int nextInsnIndex = methodNode.instructions.indexOf(((JumpInsnNode)insnNode).label);
+ State nextState = new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, hasCompanions || notEmptySubResult);
+ pending.push(new MakeResult<PResult>(state, subResult, new int[]{nextState.index}));
+ pending.push(new ProceedState<PResult>(nextState));
+ return;
+ }
+
+ if (opcode == IFEQ && popValue(frame) == InstanceOfCheckValue) {
+ int nextInsnIndex = methodNode.instructions.indexOf(((JumpInsnNode)insnNode).label);
+ State nextState = new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, hasCompanions || notEmptySubResult);
+ pending.push(new MakeResult<PResult>(state, subResult, new int[]{nextState.index}));
+ pending.push(new ProceedState<PResult>(nextState));
+ return;
+ }
+
+ if (opcode == IFNE && popValue(frame) == InstanceOfCheckValue) {
+ int nextInsnIndex = insnIndex + 1;
+ State nextState = new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, hasCompanions || notEmptySubResult);
+ pending.push(new MakeResult<PResult>(state, subResult, new int[]{nextState.index}));
+ pending.push(new ProceedState<PResult>(nextState));
+ return;
+ }
+
+ // general case
+ int[] nextInsnIndices = controlFlow.transitions[insnIndex];
+ List<State> nextStates = new ArrayList<State>(nextInsnIndices.length);
+ int[] subIndices = new int[nextInsnIndices.length];
+
+ for (int i = 0; i < nextInsnIndices.length; i++) {
+ int nextInsnIndex = nextInsnIndices[i];
+ Frame<BasicValue> nextFrame1 = nextFrame;
+ if (controlFlow.errorTransitions.contains(new Edge(insnIndex, nextInsnIndex))) {
+ nextFrame1 = new Frame<BasicValue>(frame);
+ nextFrame1.clearStack();
+ nextFrame1.push(new BasicValue(Type.getType("java/lang/Throwable")));
+ }
+ nextStates.add(new State(++id, new Conf(nextInsnIndex, nextFrame1), nextHistory, taken, hasCompanions || notEmptySubResult));
+ subIndices[i] = (id);
+ }
+
+ pending.push(new MakeResult<PResult>(state, subResult, subIndices));
+ for (State nextState : nextStates) {
+ pending.push(new ProceedState<PResult>(nextState));
+ }
+
+ }
+
+ private void execute(Frame<BasicValue> frame, AbstractInsnNode insnNode) throws AnalyzerException {
+ switch (insnNode.getType()) {
+ case AbstractInsnNode.LABEL:
+ case AbstractInsnNode.LINE:
+ case AbstractInsnNode.FRAME:
+ nextFrame = frame;
+ subResult = Identity;
+ break;
+ default:
+ nextFrame = new Frame<BasicValue>(frame);
+ interpreter.reset();
+ nextFrame.execute(insnNode, interpreter);
+ subResult = interpreter.getSubResult();
+ }
+ }
+}
+
+class NonNullInInterpreter extends BasicInterpreter {
+ private PResult subResult = Identity;
+ public PResult getSubResult() {
+ return subResult;
+ }
+ void reset() {
+ subResult = Identity;
+ }
+
+ @Override
+ public BasicValue unaryOperation(AbstractInsnNode insn, BasicValue value) throws AnalyzerException {
+ switch (insn.getOpcode()) {
+ case GETFIELD:
+ case ARRAYLENGTH:
+ case MONITORENTER:
+ if (value instanceof ParamValue) {
+ subResult = NPE;
+ }
+ break;
+ case CHECKCAST:
+ if (value instanceof ParamValue) {
+ return new ParamValue(Type.getObjectType(((TypeInsnNode)insn).desc));
+ }
+ break;
+ case INSTANCEOF:
+ if (value instanceof ParamValue) {
+ return InstanceOfCheckValue;
+ }
+ break;
+ default:
+
+ }
+ return super.unaryOperation(insn, value);
+ }
+
+ @Override
+ public BasicValue binaryOperation(AbstractInsnNode insn, BasicValue value1, BasicValue value2) throws AnalyzerException {
+ switch (insn.getOpcode()) {
+ case IALOAD:
+ case LALOAD:
+ case FALOAD:
+ case DALOAD:
+ case AALOAD:
+ case BALOAD:
+ case CALOAD:
+ case SALOAD:
+ case PUTFIELD:
+ if (value1 instanceof ParamValue) {
+ subResult = NPE;
+ }
+ break;
+ default:
+ }
+ return super.binaryOperation(insn, value1, value2);
+ }
+
+ @Override
+ public BasicValue ternaryOperation(AbstractInsnNode insn, BasicValue value1, BasicValue value2, BasicValue value3) throws AnalyzerException {
+ switch (insn.getOpcode()) {
+ case IASTORE:
+ case LASTORE:
+ case FASTORE:
+ case DASTORE:
+ case AASTORE:
+ case BASTORE:
+ case CASTORE:
+ case SASTORE:
+ if (value1 instanceof ParamValue) {
+ subResult = NPE;
+ }
+ default:
+ }
+ return super.ternaryOperation(insn, value1, value2, value3);
+ }
+
+ @Override
+ public BasicValue naryOperation(AbstractInsnNode insn, List<? extends BasicValue> values) throws AnalyzerException {
+ int opcode = insn.getOpcode();
+ boolean isStaticInvoke = opcode == INVOKESTATIC;
+ int shift = isStaticInvoke ? 0 : 1;
+ if ((opcode == INVOKESPECIAL || opcode ==INVOKEINTERFACE || opcode == INVOKEVIRTUAL) && values.get(0) instanceof ParamValue) {
+ subResult = NPE;
+ }
+ switch (opcode) {
+ case INVOKESTATIC:
+ case INVOKESPECIAL:
+ case INVOKEVIRTUAL:
+ case INVOKEINTERFACE:
+ boolean stable = opcode == INVOKESTATIC || opcode == INVOKESPECIAL;
+ MethodInsnNode methodNode = (MethodInsnNode) insn;
+ for (int i = shift; i < values.size(); i++) {
+ if (values.get(i) instanceof ParamValue) {
+ Method method = new Method(methodNode.owner, methodNode.name, methodNode.desc);
+ subResult = meet(subResult, new ConditionalNPE(new Key(method, new In(i - shift), stable)));
+ }
+ }
+ default:
+ }
+ return super.naryOperation(insn, values);
+ }
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java
new file mode 100644
index 000000000000..86b9dd101fd9
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java
@@ -0,0 +1,291 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import com.intellij.ProjectTopics;
+import com.intellij.codeInsight.AnnotationUtil;
+import com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer;
+import com.intellij.openapi.components.ServiceManager;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.progress.ProgressManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ContentIterator;
+import com.intellij.openapi.roots.ModuleRootAdapter;
+import com.intellij.openapi.roots.ModuleRootEvent;
+import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.ModificationTracker;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.*;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.search.ProjectScope;
+import com.intellij.psi.util.CachedValueProvider;
+import com.intellij.psi.util.CachedValuesManager;
+import com.intellij.util.IncorrectOperationException;
+import com.intellij.util.indexing.FileBasedIndex;
+import com.intellij.util.messages.MessageBusConnection;
+import gnu.trove.TIntHashSet;
+import gnu.trove.TIntObjectHashMap;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.IOException;
+import java.util.Collection;
+
+/**
+ * @author lambdamix
+ */
+public class ProjectBytecodeAnalysis {
+ public static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.bytecodeAnalysis");
+ public static final Key<Boolean> INFERRED_ANNOTATION = Key.create("INFERRED_ANNOTATION");
+ private final Project myProject;
+
+ private volatile Annotations myAnnotations = null;
+
+ public static ProjectBytecodeAnalysis getInstance(@NotNull Project project) {
+ return ServiceManager.getService(project, ProjectBytecodeAnalysis.class);
+ }
+
+ public ProjectBytecodeAnalysis(Project project) {
+ myProject = project;
+ final MessageBusConnection connection = myProject.getMessageBus().connect();
+ connection.subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootAdapter() {
+ @Override
+ public void rootsChanged(ModuleRootEvent event) {
+ unloadAnnotations();
+ }
+ });
+ }
+
+ private void loadAnnotations() {
+ Annotations annotations = new Annotations();
+ loadParameterAnnotations(annotations);
+ loadContractAnnotations(annotations);
+ myAnnotations = annotations;
+ LOG.debug("NotNull annotations: " + myAnnotations.notNulls.size());
+ LOG.debug("Contract annotations: " + myAnnotations.contracts.size());
+ }
+
+ private void unloadAnnotations() {
+ myAnnotations = null;
+ LOG.debug("unloaded");
+ }
+
+ private void loadParameterAnnotations(Annotations annotations) {
+ LOG.debug("initializing parameter annotations");
+ final IntIdSolver solver = new IntIdSolver(new ELattice<Value>(Value.NotNull, Value.Top));
+
+ processValues(true, new FileBasedIndex.ValueProcessor<Collection<IntIdEquation>>() {
+ @Override
+ public boolean process(VirtualFile file, Collection<IntIdEquation> value) {
+ for (IntIdEquation intIdEquation : value) {
+ solver.addEquation(intIdEquation);
+ }
+ return true;
+ }
+ });
+
+ LOG.debug("parameter equations are constructed");
+ LOG.debug("equations: " + solver.getSize());
+ TIntObjectHashMap<Value> solutions = solver.solve();
+ LOG.debug("parameter equations are solved");
+ BytecodeAnalysisConverter.getInstance().addAnnotations(solutions, annotations);
+ }
+
+ private void processValues(final boolean parameters, final FileBasedIndex.ValueProcessor<Collection<IntIdEquation>> processor) {
+ final GlobalSearchScope libScope = ProjectScope.getLibrariesScope(myProject);
+ final FileBasedIndex index = FileBasedIndex.getInstance();
+ index.iterateIndexableFiles(new ContentIterator() {
+ @Override
+ public boolean processFile(VirtualFile fileOrDir) {
+ ProgressManager.checkCanceled();
+ if (!fileOrDir.isDirectory() && libScope.contains(fileOrDir)) {
+ index.processValues(BytecodeAnalysisIndex.NAME, BytecodeAnalysisIndex.indexKey(fileOrDir, parameters),
+ fileOrDir, processor, GlobalSearchScope.fileScope(myProject, fileOrDir));
+ }
+ return false;
+ }
+ }, myProject, null);
+ }
+
+ private void loadContractAnnotations(Annotations annotations) {
+ LOG.debug("initializing contract annotations");
+ final IntIdSolver solver = new IntIdSolver(new ELattice<Value>(Value.Bot, Value.Top));
+ processValues(false, new FileBasedIndex.ValueProcessor<Collection<IntIdEquation>>() {
+ @Override
+ public boolean process(VirtualFile file, Collection<IntIdEquation> value) {
+ for (IntIdEquation intIdEquation : value) {
+ solver.addEquation(intIdEquation);
+ }
+ return true;
+ }
+ });
+ LOG.debug("contract equations are constructed");
+ LOG.debug("equations: " + solver.getSize());
+ TIntObjectHashMap<Value> solutions = solver.solve();
+ LOG.debug("contract equations are solved");
+ BytecodeAnalysisConverter.getInstance().addAnnotations(solutions, annotations);
+ }
+
+ @Nullable
+ public PsiAnnotation findInferredAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) {
+ if (!(listOwner instanceof PsiCompiledElement)) {
+ return null;
+ }
+ if (annotationFQN.equals("org.jetbrains.annotations.NotNull")) {
+ return findNotNullAnnotation(listOwner);
+ }
+ else if (annotationFQN.equals("org.jetbrains.annotations.Contract")) {
+ return findContractAnnotation(listOwner);
+ }
+ else {
+ return null;
+ }
+ }
+
+ @NotNull
+ public PsiAnnotation[] findInferredAnnotations(@NotNull PsiModifierListOwner listOwner) {
+ if (!(listOwner instanceof PsiCompiledElement)) {
+ return PsiAnnotation.EMPTY_ARRAY;
+ }
+ return collectInferredAnnotations(listOwner);
+ }
+
+ // TODO the best way to synchronize?
+ @NotNull
+ private synchronized PsiAnnotation[] collectInferredAnnotations(PsiModifierListOwner listOwner) {
+ if (myAnnotations == null) {
+ loadAnnotations();
+ }
+ try {
+ int key = getKey(listOwner);
+ if (key == -1) {
+ return PsiAnnotation.EMPTY_ARRAY;
+ }
+ boolean notNull = myAnnotations.notNulls.contains(key);
+ String contractValue = myAnnotations.contracts.get(key);
+
+ if (notNull && contractValue != null) {
+ return new PsiAnnotation[]{
+ getNotNullAnnotation(),
+ createAnnotationFromText("@" + ControlFlowAnalyzer.ORG_JETBRAINS_ANNOTATIONS_CONTRACT + "(" + contractValue + ")")
+ };
+ }
+ else if (notNull) {
+ return new PsiAnnotation[]{
+ getNotNullAnnotation()
+ };
+ }
+ else if (contractValue != null) {
+ return new PsiAnnotation[]{
+ createAnnotationFromText("@" + ControlFlowAnalyzer.ORG_JETBRAINS_ANNOTATIONS_CONTRACT + "(" + contractValue + ")")
+ };
+ }
+ else {
+ return PsiAnnotation.EMPTY_ARRAY;
+ }
+ }
+ catch (IOException e) {
+ LOG.debug(e);
+ return PsiAnnotation.EMPTY_ARRAY;
+ }
+ }
+
+ private PsiAnnotation getNotNullAnnotation() {
+ return CachedValuesManager.getManager(myProject).getCachedValue(myProject, new CachedValueProvider<PsiAnnotation>() {
+ @Nullable
+ @Override
+ public Result<PsiAnnotation> compute() {
+ return Result.create(createAnnotationFromText("@" + AnnotationUtil.NOT_NULL), ModificationTracker.NEVER_CHANGED);
+ }
+ });
+ }
+
+ @Nullable
+ private synchronized PsiAnnotation findNotNullAnnotation(PsiModifierListOwner listOwner) {
+ if (myAnnotations == null) {
+ loadAnnotations();
+ }
+ try {
+ int key = getKey(listOwner);
+ if (key == -1) {
+ return null;
+ }
+ return myAnnotations.notNulls.contains(key) ? getNotNullAnnotation() : null;
+ }
+ catch (IOException e) {
+ LOG.debug(e);
+ return null;
+ }
+ }
+
+ @Nullable
+ private synchronized PsiAnnotation findContractAnnotation(PsiModifierListOwner listOwner) {
+ if (myAnnotations == null) {
+ loadAnnotations();
+ }
+ try {
+ int key = getKey(listOwner);
+ if (key == -1) {
+ return null;
+ }
+ String contractValue = myAnnotations.contracts.get(key);
+ return contractValue != null ? createContractAnnotation(contractValue) : null;
+ }
+ catch (IOException e) {
+ LOG.debug(e);
+ return null;
+ }
+ }
+
+ public PsiAnnotation createContractAnnotation(String contractValue) {
+ return createAnnotationFromText("@org.jetbrains.annotations.Contract(" + contractValue + ")");
+ }
+
+ public static int getKey(@NotNull PsiModifierListOwner owner) throws IOException {
+ LOG.assertTrue(owner instanceof PsiCompiledElement, owner);
+
+ if (owner instanceof PsiMethod) {
+ return BytecodeAnalysisConverter.getInstance().mkPsiKey((PsiMethod)owner, new Out());
+ }
+
+ if (owner instanceof PsiParameter) {
+ PsiElement parent = owner.getParent();
+ if (parent instanceof PsiParameterList) {
+ PsiElement gParent = parent.getParent();
+ if (gParent instanceof PsiMethod) {
+ final int index = ((PsiParameterList)parent).getParameterIndex((PsiParameter)owner);
+ return BytecodeAnalysisConverter.getInstance().mkPsiKey((PsiMethod)gParent, new In(index));
+ }
+ }
+ }
+
+ return -1;
+ }
+
+ @NotNull
+ private PsiAnnotation createAnnotationFromText(@NotNull final String text) throws IncorrectOperationException {
+ PsiAnnotation annotation = JavaPsiFacade.getElementFactory(myProject).createAnnotationFromText(text, null);
+ annotation.putUserData(INFERRED_ANNOTATION, Boolean.TRUE);
+ return annotation;
+ }
+}
+
+class Annotations {
+ // @NotNull keys
+ final TIntHashSet notNulls = new TIntHashSet();
+ // @Contracts
+ final TIntObjectHashMap<String> contracts = new TIntObjectHashMap<String>();
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Solver.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Solver.java
new file mode 100644
index 000000000000..47c97790d102
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Solver.java
@@ -0,0 +1,440 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import com.intellij.util.containers.IntStack;
+import com.intellij.util.containers.IntToIntSetMap;
+import gnu.trove.TIntObjectHashMap;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.*;
+
+final class ELattice<T extends Enum<T>> {
+ final T bot;
+ final T top;
+
+ ELattice(T bot, T top) {
+ this.bot = bot;
+ this.top = top;
+ }
+
+ final T join(T x, T y) {
+ if (x == bot) return y;
+ if (y == bot) return x;
+ if (x == y) return x;
+ return top;
+ }
+
+ final T meet(T x, T y) {
+ if (x == top) return y;
+ if (y == top) return x;
+ if (x == y) return x;
+ return bot;
+ }
+}
+
+// component specialized for ints
+final class IntIdComponent {
+ Value value;
+ final int[] ids;
+
+ IntIdComponent(Value value, int[] ids) {
+ this.value = value;
+ this.ids = ids;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ IntIdComponent that = (IntIdComponent)o;
+
+ if (!Arrays.equals(ids, that.ids)) return false;
+ if (value != that.value) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return value.ordinal() + Arrays.hashCode(ids);
+ }
+
+ public boolean remove(int id) {
+ return IdUtils.remove(ids, id);
+ }
+
+ public boolean isEmpty() {
+ return IdUtils.isEmpty(ids);
+ }
+
+ IntIdComponent copy() {
+ return new IntIdComponent(value, ids.clone());
+ }
+}
+
+class IdUtils {
+ // removed value
+ static final int nullId = 0;
+
+ static boolean contains(int[] ids, int id) {
+ for (int id1 : ids) {
+ if (id1 == id) return true;
+ }
+
+ return false;
+ }
+
+ static boolean isEmpty(int[] ids) {
+ for (int id : ids) {
+ if (id != nullId) return false;
+ }
+ return true;
+ }
+
+ static IntIdComponent[] toArray(Collection<IntIdComponent> set) {
+ IntIdComponent[] result = new IntIdComponent[set.size()];
+ int i = 0;
+ for (IntIdComponent intIdComponent : set) {
+ result[i] = intIdComponent;
+ i++;
+ }
+
+ return result;
+ }
+
+ static boolean remove(int[] ids, int id) {
+ boolean removed = false;
+ for (int i = 0; i < ids.length; i++) {
+ if (ids[i] == id) {
+ ids[i] = nullId;
+ removed = true;
+ }
+ }
+ return removed;
+ }
+}
+
+class ResultUtil<Id, T extends Enum<T>> {
+ private final ELattice<T> lattice;
+ final T top;
+ ResultUtil(ELattice<T> lattice) {
+ this.lattice = lattice;
+ top = lattice.top;
+ }
+
+ Result<Id, T> join(Result<Id, T> r1, Result<Id, T> r2) {
+ if (r1 instanceof Final && ((Final) r1).value == top) {
+ return r1;
+ }
+ if (r2 instanceof Final && ((Final) r2).value == top) {
+ return r2;
+ }
+ if (r1 instanceof Final && r2 instanceof Final) {
+ return new Final<Id, T>(lattice.join(((Final<?, T>) r1).value, ((Final<?, T>) r2).value));
+ }
+ if (r1 instanceof Final && r2 instanceof Pending) {
+ Final<?, T> f1 = (Final<?, T>)r1;
+ Pending<Id, T> pending = (Pending<Id, T>) r2;
+ Set<Product<Id, T>> sum1 = new HashSet<Product<Id, T>>(pending.sum);
+ sum1.add(new Product<Id, T>(f1.value, Collections.<Id>emptySet()));
+ return new Pending<Id, T>(sum1);
+ }
+ if (r1 instanceof Pending && r2 instanceof Final) {
+ Final<?, T> f2 = (Final<?, T>)r2;
+ Pending<Id, T> pending = (Pending<Id, T>) r1;
+ Set<Product<Id, T>> sum1 = new HashSet<Product<Id, T>>(pending.sum);
+ sum1.add(new Product<Id, T>(f2.value, Collections.<Id>emptySet()));
+ return new Pending<Id, T>(sum1);
+ }
+ Pending<Id, T> pending1 = (Pending<Id, T>) r1;
+ Pending<Id, T> pending2 = (Pending<Id, T>) r2;
+ Set<Product<Id, T>> sum = new HashSet<Product<Id, T>>();
+ sum.addAll(pending1.sum);
+ sum.addAll(pending2.sum);
+ return new Pending<Id, T>(sum);
+ }
+}
+
+final class Product<K, V> {
+ @NotNull final V value;
+ @NotNull final Set<K> ids;
+
+ Product(@NotNull V value, @NotNull Set<K> ids) {
+ this.value = value;
+ this.ids = ids;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Product product = (Product)o;
+
+ if (!ids.equals(product.ids)) return false;
+ if (!value.equals(product.value)) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = value.hashCode();
+ result = 31 * result + ids.hashCode();
+ return result;
+ }
+}
+
+interface Result<Id, T> {}
+final class Final<Id, T> implements Result<Id, T> {
+ final T value;
+ Final(T value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return "Final{" + "value=" + value + '}';
+ }
+}
+
+final class Pending<Id, T> implements Result<Id, T> {
+ final Set<Product<Id, T>> sum;
+
+ Pending(Set<Product<Id, T>> sum) {
+ this.sum = sum;
+ }
+
+}
+
+interface IntIdResult {}
+// this just wrapper, no need for this really
+final class IntIdFinal implements IntIdResult {
+ final Value value;
+ public IntIdFinal(Value value) {
+ this.value = value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ IntIdFinal that = (IntIdFinal)o;
+
+ if (value != that.value) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return value.ordinal();
+ }
+
+ @Override
+ public String toString() {
+ return super.toString();
+ }
+}
+
+final class IntIdPending implements IntIdResult {
+ final IntIdComponent[] delta;
+
+ IntIdPending(IntIdComponent[] delta) {
+ this.delta = delta;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof IntIdPending)) return false;
+ IntIdPending pending = (IntIdPending)o;
+ return !Arrays.equals(delta, pending.delta);
+ }
+
+ @Override
+ public int hashCode() {
+ return Arrays.hashCode(delta);
+ }
+
+ IntIdPending copy() {
+ IntIdComponent[] delta1 = new IntIdComponent[delta.length];
+ for (int i = 0; i < delta.length; i++) {
+ delta1[i] = delta[i].copy();
+ }
+ return new IntIdPending(delta1);
+ }
+}
+
+final class IntIdEquation {
+ final int id;
+ final IntIdResult rhs;
+
+ IntIdEquation(int id, IntIdResult rhs) {
+ this.id = id;
+ this.rhs = rhs;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof IntIdEquation)) return false;
+
+ IntIdEquation equation = (IntIdEquation)o;
+
+ if (id != equation.id) return false;
+ if (!rhs.equals(equation.rhs)) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id;
+ result = 31 * result + rhs.hashCode();
+ return result;
+ }
+}
+
+final class Solution<Id, Val> {
+ final Id id;
+ final Val value;
+
+ Solution(Id id, Val value) {
+ this.id = id;
+ this.value = value;
+ }
+}
+
+final class Equation<Id, T> {
+ final Id id;
+ final Result<Id, T> rhs;
+
+ Equation(Id id, Result<Id, T> rhs) {
+ this.id = id;
+ this.rhs = rhs;
+ }
+
+ @Override
+ public String toString() {
+ return "Equation{" + "id=" + id + ", rhs=" + rhs + '}';
+ }
+}
+
+final class IntIdSolver {
+
+ private int size = 0;
+ private final ELattice<Value> lattice;
+ private final IntToIntSetMap dependencies = new IntToIntSetMap(10000, 0.5f);
+ private final TIntObjectHashMap<IntIdPending> pending = new TIntObjectHashMap<IntIdPending>();
+ private final TIntObjectHashMap<Value> solved = new TIntObjectHashMap<Value>();
+ private final IntStack moving = new IntStack();
+
+ int getSize() {
+ return size;
+ }
+
+ IntIdSolver(ELattice<Value> lattice) {
+ this.lattice = lattice;
+ }
+
+ void addEquation(IntIdEquation equation) {
+ size ++;
+ IntIdResult rhs = equation.rhs;
+ if (rhs instanceof IntIdFinal) {
+ solved.put(equation.id, ((IntIdFinal) rhs).value);
+ moving.push(equation.id);
+ } else if (rhs instanceof IntIdPending) {
+ IntIdPending pendResult = ((IntIdPending)rhs).copy();
+ IntIdResult norm = normalize(pendResult.delta);
+ if (norm instanceof IntIdFinal) {
+ solved.put(equation.id, ((IntIdFinal) norm).value);
+ moving.push(equation.id);
+ }
+ else {
+ IntIdPending pendResult1 = ((IntIdPending)rhs).copy();
+ for (IntIdComponent component : pendResult1.delta) {
+ for (int trigger : component.ids) {
+ dependencies.addOccurence(trigger, equation.id);
+ }
+ pending.put(equation.id, pendResult1);
+ }
+ }
+ }
+ }
+
+ TIntObjectHashMap<Value> solve() {
+ while (!moving.empty()) {
+ int id = moving.pop();
+ Value value = solved.get(id);
+
+ boolean stable = id > 0;
+ int[] pIds = stable ? new int[]{id, -id} : new int[]{-id, id};
+ Value[] pVals = stable ? new Value[]{value, value} : new Value[]{value, lattice.top};
+
+ for (int i = 0; i < pIds.length; i++) {
+ int pId = pIds[i];
+ Value pVal = pVals[i];
+ // todo - remove
+ int[] dIds = dependencies.get(pId);
+ for (int dId : dIds) {
+ IntIdPending pend = pending.remove(dId);
+ if (pend != null) {
+ IntIdResult pend1 = substitute(pend, pId, pVal);
+ if (pend1 instanceof IntIdFinal) {
+ IntIdFinal fi = (IntIdFinal)pend1;
+ solved.put(dId, fi.value);
+ moving.push(dId);
+ }
+ else {
+ pending.put(dId, (IntIdPending)pend1);
+ }
+ }
+ }
+ }
+ }
+ pending.clear();
+ return solved;
+ }
+
+ // substitute id -> value into pending
+ IntIdResult substitute(IntIdPending pending, int id, Value value) {
+ IntIdComponent[] sum = pending.delta;
+ for (IntIdComponent intIdComponent : sum) {
+ if (intIdComponent.remove(id)) {
+ intIdComponent.value = lattice.meet(intIdComponent.value, value);
+ }
+ }
+ return normalize(sum);
+ }
+
+ IntIdResult normalize(IntIdComponent[] sum) {
+ Value acc = lattice.bot;
+ boolean computableNow = true;
+ for (IntIdComponent prod : sum) {
+ if (prod.isEmpty() || prod.value == lattice.bot) {
+ acc = lattice.join(acc, prod.value);
+ } else {
+ computableNow = false;
+ }
+ }
+ return (acc == lattice.top || computableNow) ? new IntIdFinal(acc) : new IntIdPending(sum);
+ }
+
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractInference.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractInference.java
index 534d65b07531..a1c908837ad0 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractInference.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractInference.java
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInspection.dataFlow;
+import com.intellij.codeInsight.NullableNotNullManager;
import com.intellij.codeInspection.dataFlow.MethodContract.ValueConstraint;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Condition;
@@ -41,6 +42,10 @@ public class ContractInference {
@NotNull
public static List<MethodContract> inferContracts(@NotNull final PsiMethod method) {
+ if (method instanceof PsiCompiledElement) {
+ return Collections.emptyList();
+ }
+
return CachedValuesManager.getCachedValue(method, new CachedValueProvider<List<MethodContract>>() {
@Nullable
@Override
@@ -70,7 +75,12 @@ class ContractInferenceInterpreter {
}
else if (statements[0] instanceof PsiExpressionStatement && ((PsiExpressionStatement)statements[0]).getExpression() instanceof PsiMethodCallExpression) {
List<MethodContract> result = handleDelegation(((PsiExpressionStatement)statements[0]).getExpression(), false);
- if (result != null) return result;
+ if (result != null) return ContainerUtil.findAll(result, new Condition<MethodContract>() {
+ @Override
+ public boolean value(MethodContract contract) {
+ return contract.returnValue == THROW_EXCEPTION || !textMatches(myMethod.getReturnTypeElement(), PsiKeyword.VOID);
+ }
+ });
}
}
@@ -103,7 +113,7 @@ class ContractInferenceInterpreter {
return RecursionManager.doPreventingRecursion(myMethod, true, new Computable<List<MethodContract>>() {
@Override
public List<MethodContract> compute() {
- List<MethodContract> delegateContracts = ContractInference.inferContracts(targetMethod); //todo use explicit contracts, too
+ List<MethodContract> delegateContracts = ControlFlowAnalyzer.getMethodContracts(targetMethod);
return ContainerUtil.mapNotNull(delegateContracts, new NullableFunction<MethodContract, MethodContract>() {
@Nullable
@Override
@@ -125,7 +135,7 @@ class ContractInferenceInterpreter {
}
}
}
- return new MethodContract(answer, negated ? negateConstraint(delegateContract.returnValue) : delegateContract.returnValue);
+ return answer == null ? null : new MethodContract(answer, negated ? negateConstraint(delegateContract.returnValue) : delegateContract.returnValue);
}
});
}
@@ -173,10 +183,12 @@ class ContractInferenceInterpreter {
if (expr instanceof PsiInstanceOfExpression) {
final int parameter = resolveParameter(((PsiInstanceOfExpression)expr).getOperand());
if (parameter >= 0) {
- return ContainerUtil.map(states, new Function<ValueConstraint[], MethodContract>() {
+ return ContainerUtil.mapNotNull(states, new Function<ValueConstraint[], MethodContract>() {
@Override
public MethodContract fun(ValueConstraint[] state) {
- return new MethodContract(withConstraint(state, parameter, NULL_VALUE), FALSE_VALUE);
+ ValueConstraint paramConstraint = NULL_VALUE;
+ ValueConstraint returnValue = FALSE_VALUE;
+ return contractWithConstraint(state, parameter, paramConstraint, returnValue);
}
});
}
@@ -187,17 +199,17 @@ class ContractInferenceInterpreter {
return toContracts(states, constraint);
}
- int parameter = resolveParameter(expr);
- if (parameter >= 0) {
+ int paramIndex = resolveParameter(expr);
+ if (paramIndex >= 0) {
List<MethodContract> result = ContainerUtil.newArrayList();
for (ValueConstraint[] state : states) {
- if (state[parameter] != ANY_VALUE) {
+ if (state[paramIndex] != ANY_VALUE) {
// the second 'o' reference in cases like: if (o != null) return o;
- result.add(new MethodContract(state, state[parameter]));
- } else {
+ result.add(new MethodContract(state, state[paramIndex]));
+ } else if (textMatches(myMethod.getParameterList().getParameters()[paramIndex].getTypeElement(), PsiKeyword.BOOLEAN)) {
// if (boolValue) ...
- result.add(new MethodContract(withConstraint(state, parameter, TRUE_VALUE), TRUE_VALUE));
- result.add(new MethodContract(withConstraint(state, parameter, FALSE_VALUE), FALSE_VALUE));
+ ContainerUtil.addIfNotNull(result, contractWithConstraint(state, paramIndex, TRUE_VALUE, TRUE_VALUE));
+ ContainerUtil.addIfNotNull(result, contractWithConstraint(state, paramIndex, FALSE_VALUE, FALSE_VALUE));
}
}
return result;
@@ -206,6 +218,18 @@ class ContractInferenceInterpreter {
return Collections.emptyList();
}
+ @Nullable
+ private MethodContract contractWithConstraint(ValueConstraint[] state,
+ int parameter, ValueConstraint paramConstraint,
+ ValueConstraint returnValue) {
+ ValueConstraint[] newState = withConstraint(state, parameter, paramConstraint);
+ return newState == null ? null : new MethodContract(newState, returnValue);
+ }
+
+ private static boolean textMatches(@Nullable PsiTypeElement typeElement, @NotNull String text) {
+ return typeElement != null && typeElement.textMatches(text);
+ }
+
private List<MethodContract> visitEqualityComparison(List<ValueConstraint[]> states,
PsiExpression op1,
PsiExpression op2,
@@ -219,8 +243,9 @@ class ContractInferenceInterpreter {
if (parameter >= 0 && constraint != null) {
List<MethodContract> result = ContainerUtil.newArrayList();
for (ValueConstraint[] state : states) {
- result.add(new MethodContract(withConstraint(state, parameter, constraint), equality ? TRUE_VALUE : FALSE_VALUE));
- result.add(new MethodContract(withConstraint(state, parameter, negateConstraint(constraint)), equality ? FALSE_VALUE : TRUE_VALUE));
+ ContainerUtil.addIfNotNull(result, contractWithConstraint(state, parameter, constraint, equality ? TRUE_VALUE : FALSE_VALUE));
+ ContainerUtil.addIfNotNull(result, contractWithConstraint(state, parameter, negateConstraint(constraint),
+ equality ? FALSE_VALUE : TRUE_VALUE));
}
return result;
}
@@ -295,7 +320,15 @@ class ContractInferenceInterpreter {
result.addAll(toContracts(states, THROW_EXCEPTION));
}
else if (statement instanceof PsiReturnStatement) {
- result.addAll(visitExpression(states, ((PsiReturnStatement)statement).getReturnValue()));
+ List<MethodContract> contracts = visitExpression(states, ((PsiReturnStatement)statement).getReturnValue());
+ for (MethodContract contract : contracts) {
+ if ((contract.returnValue == TRUE_VALUE || contract.returnValue == FALSE_VALUE) &&
+ !textMatches(myMethod.getReturnTypeElement(), PsiKeyword.BOOLEAN)) {
+ continue;
+ }
+
+ result.add(contract);
+ }
}
else if (statement instanceof PsiAssertStatement) {
List<MethodContract> conditionResults = visitExpression(states, ((PsiAssertStatement)statement).getAssertCondition());
@@ -357,7 +390,19 @@ class ContractInferenceInterpreter {
return -1;
}
- private static ValueConstraint[] withConstraint(ValueConstraint[] constraints, int index, ValueConstraint constraint) {
+ @Nullable
+ private ValueConstraint[] withConstraint(ValueConstraint[] constraints, int index, ValueConstraint constraint) {
+ if (constraints[index] == constraint) return constraints;
+
+ ValueConstraint negated = negateConstraint(constraint);
+ if (negated != constraint && constraints[index] == negated) {
+ return null;
+ }
+
+ if (constraint == NULL_VALUE && NullableNotNullManager.isNotNull(myMethod.getParameterList().getParameters()[index])) {
+ return null;
+ }
+
ValueConstraint[] copy = constraints.clone();
copy[index] = constraint;
return copy;
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java
index 65e7fd7c859a..7ef19f2b73d0 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java
@@ -20,7 +20,6 @@ import com.intellij.codeInspection.dataFlow.instructions.*;
import com.intellij.codeInspection.dataFlow.value.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Condition;
-import com.intellij.openapi.util.registry.Registry;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.tree.IElementType;
@@ -30,37 +29,15 @@ import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.Stack;
import com.siyeh.ig.numeric.UnnecessaryExplicitNumericCastInspection;
import org.jetbrains.annotations.Contract;
-import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
-import java.util.regex.Pattern;
-import static com.intellij.codeInspection.dataFlow.MethodContract.ValueConstraint;
import static com.intellij.psi.CommonClassNames.*;
public class ControlFlowAnalyzer extends JavaElementVisitor {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer");
- private static final Condition<String> FALSE_GETTERS = parseFalseGetters();
-
- private static Condition<String> parseFalseGetters() {
- try {
- final Pattern pattern = Pattern.compile(Registry.stringValue("ide.dfa.getters.with.side.effects"));
- return new Condition<String>() {
- @Override
- public boolean value(String s) {
- return pattern.matcher(s).matches();
- }
- };
- }
- catch (Exception e) {
- LOG.error(e);
- //noinspection unchecked
- return Condition.FALSE;
- }
- }
-
public static final String ORG_JETBRAINS_ANNOTATIONS_CONTRACT = Contract.class.getName();
private boolean myIgnoreAssertions;
@@ -209,9 +186,23 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
}
addInstruction(new AssignInstruction(rExpr));
+
+ flushArrayElementsOnUnknownIndexAssignment(lExpr);
+
finishElement(expression);
}
+ private void flushArrayElementsOnUnknownIndexAssignment(PsiExpression lExpr) {
+ if (lExpr instanceof PsiArrayAccessExpression &&
+ myFactory.createValue(lExpr) == null // check for unknown index, otherwise AssignInstruction will flush only that element
+ ) {
+ DfaValue arrayVar = myFactory.createValue(((PsiArrayAccessExpression)lExpr).getArrayExpression());
+ if (arrayVar instanceof DfaVariableValue) {
+ addInstruction(new FlushVariableInstruction((DfaVariableValue)arrayVar));
+ }
+ }
+ }
+
private void generateDefaultAssignmentBinOp(PsiExpression lExpr, PsiExpression rExpr, final PsiType exprType) {
lExpr.accept(this);
addInstruction(new DupInstruction());
@@ -635,7 +626,7 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
((PsiReferenceExpression)caseExpression).getQualifierExpression() == null &&
JavaPsiFacade.getInstance(body.getProject()).getConstantEvaluationHelper().computeConstantExpression(caseValue) != null) {
- addInstruction(new PushInstruction(getExpressionDfaValue((PsiReferenceExpression)caseExpression), caseExpression));
+ addInstruction(new PushInstruction(myFactory.createValue(caseExpression), caseExpression));
caseValue.accept(this);
addInstruction(new BinopInstruction(JavaTokenType.EQEQ, null, caseExpression.getProject()));
}
@@ -1030,7 +1021,8 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
addInstruction(new PopInstruction());
}
- pushTypeOrUnknown(arrayExpression);
+ DfaValue toPush = myFactory.createValue(expression);
+ addInstruction(new PushInstruction(toPush != null ? toPush : myFactory.createTypeValue(expression.getType(), Nullness.UNKNOWN), null));
finishElement(expression);
}
@@ -1396,8 +1388,8 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
}
addConditionalRuntimeThrow();
- List<MethodContract> contracts = method instanceof PsiMethod ? getMethodContracts((PsiMethod)method) : Collections.<MethodContract>emptyList();
- addInstruction(new MethodCallInstruction(expression, createChainedVariableValue(expression), contracts));
+ List<MethodContract> contracts = method instanceof PsiMethod ? getMethodCallContracts((PsiMethod)method, expression) : Collections.<MethodContract>emptyList();
+ addInstruction(new MethodCallInstruction(expression, myFactory.createValue(expression), contracts));
if (!contracts.isEmpty()) {
// if a contract resulted in 'fail', handle it
addInstruction(new DupInstruction());
@@ -1431,6 +1423,11 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
finishElement(expression);
}
+ private static List<MethodContract> getMethodCallContracts(@NotNull final PsiMethod method, @NotNull PsiMethodCallExpression call) {
+ List<MethodContract> contracts = HardcodedContracts.getHardcodedContracts(method, call);
+ return !contracts.isEmpty() ? contracts : getMethodContracts(method);
+ }
+
static List<MethodContract> getMethodContracts(@NotNull final PsiMethod method) {
final PsiAnnotation contractAnno = findContractAnnotation(method);
final int paramCount = method.getParameterList().getParametersCount();
@@ -1458,45 +1455,6 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
});
}
- @NonNls String methodName = method.getName();
-
- PsiClass owner = method.getContainingClass();
- if (owner != null) {
- final String className = owner.getQualifiedName();
- if ("java.lang.System".equals(className)) {
- if ("exit".equals(methodName)) {
- return Collections.singletonList(new MethodContract(MethodContract.createConstraintArray(paramCount), ValueConstraint.THROW_EXCEPTION));
- }
- }
- else if ("junit.framework.Assert".equals(className) || "org.junit.Assert".equals(className) ||
- "junit.framework.TestCase".equals(className) || "org.testng.Assert".equals(className) || "org.testng.AssertJUnit".equals(className)) {
- boolean testng = className.startsWith("org.testng.");
- if ("fail".equals(methodName)) {
- return Collections.singletonList(new MethodContract(MethodContract.createConstraintArray(paramCount), ValueConstraint.THROW_EXCEPTION));
- }
-
- int checkedParam = testng ? 0 : paramCount - 1;
- ValueConstraint[] constraints = MethodContract.createConstraintArray(paramCount);
- if ("assertTrue".equals(methodName)) {
- constraints[checkedParam] = ValueConstraint.FALSE_VALUE;
- return Collections.singletonList(new MethodContract(constraints, ValueConstraint.THROW_EXCEPTION));
- }
- if ("assertFalse".equals(methodName)) {
- constraints[checkedParam] = ValueConstraint.TRUE_VALUE;
- return Collections.singletonList(new MethodContract(constraints, ValueConstraint.THROW_EXCEPTION));
- }
- if ("assertNull".equals(methodName)) {
- constraints[checkedParam] = ValueConstraint.NOT_NULL_VALUE;
- return Collections.singletonList(new MethodContract(constraints, ValueConstraint.THROW_EXCEPTION));
- }
- if ("assertNotNull".equals(methodName)) {
- constraints[checkedParam] = ValueConstraint.NULL_VALUE;
- return Collections.singletonList(new MethodContract(constraints, ValueConstraint.THROW_EXCEPTION));
- }
- return Collections.emptyList();
- }
- }
-
return Collections.emptyList();
}
@@ -1505,20 +1463,6 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
return AnnotationUtil.findAnnotation(method, ORG_JETBRAINS_ANNOTATIONS_CONTRACT);
}
- private void pushTypeOrUnknown(PsiExpression expr) {
- PsiType type = expr.getType();
-
- final DfaValue dfaValue;
- if (type instanceof PsiClassType) {
- dfaValue = myFactory.createTypeValue(type, Nullness.UNKNOWN);
- }
- else {
- dfaValue = null;
- }
-
- addInstruction(new PushInstruction(dfaValue, null));
- }
-
@Override public void visitNewExpression(PsiNewExpression expression) {
startElement(expression);
@@ -1657,88 +1601,11 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
}
boolean referenceRead = PsiUtil.isAccessedForReading(expression) && !PsiUtil.isAccessedForWriting(expression);
- addInstruction(new PushInstruction(getExpressionDfaValue(expression), expression, referenceRead));
+ addInstruction(new PushInstruction(myFactory.createValue(expression), expression, referenceRead));
finishElement(expression);
}
- @Nullable
- private DfaValue getExpressionDfaValue(PsiReferenceExpression expression) {
- DfaValue dfaValue = myFactory.createReferenceValue(expression);
- if (dfaValue == null) {
- PsiElement resolved = expression.resolve();
- if (resolved instanceof PsiField) {
- dfaValue = createDfaValueForAnotherInstanceMemberAccess(expression, (PsiField)resolved);
- }
- }
- return dfaValue;
- }
-
- @NotNull
- private DfaValue createDfaValueForAnotherInstanceMemberAccess(PsiReferenceExpression expression, PsiField field) {
- DfaValue dfaValue = null;
- if (expression.getQualifierExpression() != null) {
- dfaValue = createChainedVariableValue(expression);
- }
- if (dfaValue == null) {
- PsiType type = expression.getType();
- return myFactory.createTypeValue(type, DfaPsiUtil.getElementNullability(type, field));
- }
- return dfaValue;
- }
-
- @Nullable
- private DfaVariableValue createChainedVariableValue(@Nullable PsiExpression expression) {
- if (expression instanceof PsiParenthesizedExpression) {
- return createChainedVariableValue(((PsiParenthesizedExpression)expression).getExpression());
- }
-
- PsiReferenceExpression refExpr;
- if (expression instanceof PsiMethodCallExpression) {
- refExpr = ((PsiMethodCallExpression)expression).getMethodExpression();
- }
- else if (expression instanceof PsiReferenceExpression) {
- refExpr = (PsiReferenceExpression)expression;
- }
- else {
- return null;
- }
-
- PsiElement target = refExpr.resolve();
- PsiModifierListOwner var = getAccessedVariable(target);
- if (var == null) {
- return null;
- }
-
- if (DfaValueFactory.isEffectivelyUnqualified(refExpr)) {
- return myFactory.getVarFactory().createVariableValue(var, refExpr.getType(), false, null);
- }
-
- if (!(var instanceof PsiField) || !var.hasModifierProperty(PsiModifier.TRANSIENT) && !var.hasModifierProperty(PsiModifier.VOLATILE)) {
- DfaVariableValue qualifierValue = createChainedVariableValue(refExpr.getQualifierExpression());
- if (qualifierValue != null) {
- return myFactory.getVarFactory().createVariableValue(var, refExpr.getType(), false, qualifierValue);
- }
- }
- return null;
- }
-
- @Nullable
- private static PsiModifierListOwner getAccessedVariable(final PsiElement target) {
- if (target instanceof PsiVariable) {
- return (PsiVariable)target;
- }
- if (target instanceof PsiMethod) {
- if (PropertyUtil.isSimplePropertyGetter((PsiMethod)target)) {
- String qName = PsiUtil.getMemberQualifiedName((PsiMethod)target);
- if (qName == null || !FALSE_GETTERS.value(qName)) {
- return (PsiMethod)target;
- }
- }
- }
- return null;
- }
-
@Override public void visitSuperExpression(PsiSuperExpression expression) {
startElement(expression);
addInstruction(new PushInstruction(myFactory.createTypeValue(expression.getType(), Nullness.NOT_NULL), null));
@@ -1769,7 +1636,7 @@ public class ControlFlowAnalyzer extends JavaElementVisitor {
generateBoxingUnboxingInstructionFor(operand, castExpression.getType());
}
else {
- pushTypeOrUnknown(castExpression);
+ addInstruction(new PushInstruction(myFactory.createTypeValue(castExpression.getType(), Nullness.UNKNOWN), null));
}
final PsiTypeElement typeElement = castExpression.getCastType();
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java
index 3e017e091084..d66d63bf85c3 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java
@@ -32,7 +32,8 @@ import com.intellij.codeInsight.daemon.impl.quickfix.SimplifyBooleanExpressionFi
import com.intellij.codeInsight.intention.impl.AddNullableAnnotationFix;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.dataFlow.instructions.*;
-import com.intellij.codeInspection.dataFlow.value.*;
+import com.intellij.codeInspection.dataFlow.value.DfaConstValue;
+import com.intellij.codeInspection.dataFlow.value.DfaValue;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
@@ -41,9 +42,9 @@ import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
-import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
+import com.intellij.refactoring.extractMethod.ExtractMethodUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ArrayUtilRt;
import com.intellij.util.IncorrectOperationException;
@@ -106,7 +107,6 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool {
public void visitIfStatement(PsiIfStatement statement) {
PsiExpression condition = statement.getCondition();
if (BranchingInstruction.isBoolConst(condition)) {
- assert condition != null;
LocalQuickFix fix = createSimplifyBooleanExpressionFix(condition, condition.textMatches(PsiKeyword.TRUE));
holder.registerProblem(condition, "Condition is always " + condition.getText(), fix);
}
@@ -253,7 +253,7 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool {
final Object value = pair.second.getValue();
PsiVariable constant = pair.second.getConstant();
final String presentableName = constant != null ? constant.getName() : String.valueOf(value);
- final String exprText = getConstantValueText(value, constant);
+ final String exprText = String.valueOf(value);
if (presentableName == null || exprText == null) {
continue;
}
@@ -280,31 +280,23 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool {
PsiElement problemElement = descriptor.getPsiElement();
if (problemElement == null) return;
+ PsiMethodCallExpression call = problemElement.getParent() instanceof PsiExpressionList &&
+ problemElement.getParent().getParent() instanceof PsiMethodCallExpression ?
+ (PsiMethodCallExpression)problemElement.getParent().getParent() :
+ null;
+ PsiMethod targetMethod = call == null ? null : call.resolveMethod();
+
JavaPsiFacade facade = JavaPsiFacade.getInstance(project);
- PsiElement newElement = problemElement.replace(facade.getElementFactory().createExpressionFromText(exprText, null));
- newElement = JavaCodeStyleManager.getInstance(project).shortenClassReferences(newElement);
- if (newElement instanceof PsiJavaCodeReferenceElement) {
- PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement)newElement;
- PsiElement target = ref.resolve();
- String shortName = ref.getReferenceName();
- if (target != null && shortName != null && ref.isQualified() &&
- facade.getResolveHelper().resolveReferencedVariable(shortName, newElement) == target) {
- newElement.replace(facade.getElementFactory().createExpressionFromText(shortName, null));
- }
+ problemElement.replace(facade.getElementFactory().createExpressionFromText(exprText, null));
+
+ if (targetMethod != null) {
+ ExtractMethodUtil.addCastsToEnsureResolveTarget(targetMethod, call);
}
}
});
}
}
- private static String getConstantValueText(Object value, @Nullable PsiVariable constant) {
- if (constant != null) {
- return constant instanceof PsiMember ? PsiUtil.getMemberQualifiedName((PsiMember)constant) : constant.getName();
- }
-
- return value instanceof String ? "\"" + StringUtil.escapeStringCharacters((String)value) + "\"" : String.valueOf(value);
- }
-
private void reportNullableArgumentsPassedToNonAnnotated(DataFlowInstructionVisitor visitor, ProblemsHolder holder, Set<PsiElement> reportedAnchors) {
for (PsiElement expr : visitor.getProblems(NullabilityProblem.passingNullableArgumentToNonAnnotatedParameter)) {
if (reportedAnchors.contains(expr)) continue;
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaPsiUtil.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaPsiUtil.java
index e6c278e1414b..4dd2ac23c9ae 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaPsiUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaPsiUtil.java
@@ -17,16 +17,15 @@ package com.intellij.codeInspection.dataFlow;
import com.intellij.codeInsight.NullableNotNullManager;
import com.intellij.codeInspection.dataFlow.instructions.Instruction;
+import com.intellij.codeInspection.dataFlow.instructions.MethodCallInstruction;
import com.intellij.codeInspection.dataFlow.instructions.ReturnInstruction;
+import com.intellij.codeInspection.dataFlow.value.DfaValueFactory;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.*;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.tree.IElementType;
-import com.intellij.psi.util.CachedValueProvider;
-import com.intellij.psi.util.CachedValuesManager;
-import com.intellij.psi.util.PsiModificationTracker;
-import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.*;
import com.intellij.util.NullableFunction;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
@@ -126,11 +125,36 @@ public class DfaPsiUtil {
shouldCheck = psiBlock == body;
}
+ private boolean isCallExposingNonInitializedFields(Instruction instruction) {
+ if (!(instruction instanceof MethodCallInstruction) ||
+ ((MethodCallInstruction)instruction).getMethodType() != MethodCallInstruction.MethodType.REGULAR_METHOD_CALL) {
+ return false;
+ }
+
+ PsiCallExpression call = ((MethodCallInstruction)instruction).getCallExpression();
+ if (call == null) return false;
+
+ if (call instanceof PsiMethodCallExpression &&
+ DfaValueFactory.isEffectivelyUnqualified(((PsiMethodCallExpression)call).getMethodExpression())) {
+ return true;
+ }
+
+ PsiExpressionList argumentList = call.getArgumentList();
+ if (argumentList != null) {
+ for (PsiExpression expression : argumentList.getExpressions()) {
+ if (expression instanceof PsiThisExpression) return true;
+ }
+ }
+
+ return false;
+ }
+
@Override
protected DfaInstructionState[] acceptInstruction(InstructionVisitor visitor, DfaInstructionState instructionState) {
if (shouldCheck) {
Instruction instruction = instructionState.getInstruction();
- if (instruction instanceof ReturnInstruction && !((ReturnInstruction)instruction).isViaException()) {
+ if (isCallExposingNonInitializedFields(instruction) ||
+ instruction instanceof ReturnInstruction && !((ReturnInstruction)instruction).isViaException()) {
for (PsiField field : containingClass.getFields()) {
if (!instructionState.getMemoryState().isNotNull(getFactory().getVarFactory().createVariableValue(field, false))) {
map.put(field, false);
@@ -138,6 +162,7 @@ public class DfaPsiUtil {
map.put(field, true);
}
}
+ return DfaInstructionState.EMPTY_ARRAY;
}
}
return super.acceptInstruction(visitor, instructionState);
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java
new file mode 100644
index 000000000000..7e77dc281c1d
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.dataFlow;
+
+import com.intellij.psi.*;
+import com.siyeh.ig.psiutils.ExpressionUtils;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+import java.util.List;
+
+import static com.intellij.codeInspection.dataFlow.MethodContract.ValueConstraint.*;
+import static com.intellij.codeInspection.dataFlow.MethodContract.createConstraintArray;
+
+/**
+ * @author peter
+ */
+class HardcodedContracts {
+ static List<MethodContract> getHardcodedContracts(@NotNull PsiMethod method, @NotNull PsiMethodCallExpression call) {
+ PsiClass owner = method.getContainingClass();
+ if (owner == null) return Collections.emptyList();
+
+ final int paramCount = method.getParameterList().getParametersCount();
+ String className = owner.getQualifiedName();
+ String methodName = method.getName();
+
+ if ("java.lang.System".equals(className)) {
+ if ("exit".equals(methodName)) {
+ return Collections.singletonList(new MethodContract(createConstraintArray(paramCount), THROW_EXCEPTION));
+ }
+ }
+ else if ("com.google.common.base.Preconditions".equals(className)) {
+ if ("checkNotNull".equals(methodName) && paramCount > 0) {
+ MethodContract.ValueConstraint[] constraints = createConstraintArray(paramCount);
+ constraints[0] = NULL_VALUE;
+ return Collections.singletonList(new MethodContract(constraints, THROW_EXCEPTION));
+ }
+ }
+ else if ("junit.framework.Assert".equals(className) ||
+ "org.junit.Assert".equals(className) ||
+ "junit.framework.TestCase".equals(className) ||
+ "org.testng.Assert".equals(className) ||
+ "org.testng.AssertJUnit".equals(className)) {
+ return handleTestFrameworks(paramCount, className, methodName, call);
+ }
+
+ return Collections.emptyList();
+ }
+
+ private static boolean isNotNullMatcher(PsiExpression expr) {
+ if (expr instanceof PsiMethodCallExpression) {
+ String calledName = ((PsiMethodCallExpression)expr).getMethodExpression().getReferenceName();
+ if ("notNullValue".equals(calledName)) {
+ return true;
+ }
+ if ("not".equals(calledName)) {
+ PsiExpression[] notArgs = ((PsiMethodCallExpression)expr).getArgumentList().getExpressions();
+ if (notArgs.length == 1 &&
+ notArgs[0] instanceof PsiMethodCallExpression &&
+ "equalTo".equals(((PsiMethodCallExpression)notArgs[0]).getMethodExpression().getReferenceName())) {
+ PsiExpression[] equalArgs = ((PsiMethodCallExpression)notArgs[0]).getArgumentList().getExpressions();
+ if (equalArgs.length == 1 && ExpressionUtils.isNullLiteral(equalArgs[0])) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ private static List<MethodContract> handleTestFrameworks(int paramCount, String className, String methodName,
+ @NotNull PsiMethodCallExpression call) {
+ if ("assertThat".equals(methodName)) {
+ PsiExpression[] args = call.getArgumentList().getExpressions();
+ if (args.length == paramCount) {
+ for (int i = 1; i < args.length; i++) {
+ if (isNotNullMatcher(args[i])) {
+ MethodContract.ValueConstraint[] constraints = createConstraintArray(args.length);
+ constraints[i - 1] = NULL_VALUE;
+ return Collections.singletonList(new MethodContract(constraints, THROW_EXCEPTION));
+ }
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ if (!"junit.framework.Assert".equals(className) &&
+ !"junit.framework.TestCase".equals(className) &&
+ !"org.junit.Assert".equals(className) &&
+ !"org.testng.Assert".equals(className) &&
+ !"org.testng.AssertJUnit".equals(className)) {
+ return Collections.emptyList();
+ }
+
+ boolean testng = className.startsWith("org.testng.");
+ if ("fail".equals(methodName)) {
+ return Collections.singletonList(new MethodContract(createConstraintArray(paramCount), THROW_EXCEPTION));
+ }
+
+ int checkedParam = testng ? 0 : paramCount - 1;
+ MethodContract.ValueConstraint[] constraints = createConstraintArray(paramCount);
+ if ("assertTrue".equals(methodName)) {
+ constraints[checkedParam] = FALSE_VALUE;
+ return Collections.singletonList(new MethodContract(constraints, THROW_EXCEPTION));
+ }
+ if ("assertFalse".equals(methodName)) {
+ constraints[checkedParam] = TRUE_VALUE;
+ return Collections.singletonList(new MethodContract(constraints, THROW_EXCEPTION));
+ }
+ if ("assertNull".equals(methodName)) {
+ constraints[checkedParam] = NOT_NULL_VALUE;
+ return Collections.singletonList(new MethodContract(constraints, THROW_EXCEPTION));
+ }
+ if ("assertNotNull".equals(methodName)) {
+ constraints[checkedParam] = NULL_VALUE;
+ return Collections.singletonList(new MethodContract(constraints, THROW_EXCEPTION));
+ }
+ return Collections.emptyList();
+ }
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java
index 160f69ba349e..691c2f00d985 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java
@@ -20,6 +20,7 @@ import com.intellij.codeInspection.dataFlow.value.DfaValueFactory;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
@@ -31,7 +32,7 @@ public class MethodContract {
public final ValueConstraint[] arguments;
public final ValueConstraint returnValue;
- public MethodContract(ValueConstraint[] arguments, ValueConstraint returnValue) {
+ public MethodContract(@NotNull ValueConstraint[] arguments, @NotNull ValueConstraint returnValue) {
this.arguments = arguments;
this.returnValue = returnValue;
}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java
index 522bd34a9cf7..013e24cbe07a 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java
@@ -455,10 +455,10 @@ public class StandardInstructionVisitor extends InstructionVisitor {
DfaValue dfaRight,
DfaValue dfaLeft, IElementType opSign) {
if (dfaRight instanceof DfaConstValue && dfaLeft instanceof DfaVariableValue) {
- PsiType varType = ((DfaVariableValue)dfaLeft).getVariableType();
Object value = ((DfaConstValue)dfaRight).getValue();
- if (varType instanceof PsiPrimitiveType && value instanceof Number) {
- DfaInstructionState[] result = checkTypeRanges(instruction, runner, memState, opSign, varType, ((Number)value).longValue());
+ if (value instanceof Number) {
+ DfaInstructionState[] result = checkComparingWithConstant(instruction, runner, memState, (DfaVariableValue)dfaLeft, opSign,
+ ((Number)value).doubleValue());
if (result != null) {
return result;
}
@@ -485,33 +485,60 @@ public class StandardInstructionVisitor extends InstructionVisitor {
return null;
}
- private static DfaInstructionState[] checkTypeRanges(BinopInstruction instruction,
- DataFlowRunner runner,
- DfaMemoryState memState,
- IElementType opSign, PsiType varType, long constantValue) {
- long minValue = varType == PsiType.BYTE ? Byte.MIN_VALUE :
- varType == PsiType.SHORT ? Short.MIN_VALUE :
- varType == PsiType.INT ? Integer.MIN_VALUE :
- varType == PsiType.CHAR ? Character.MIN_VALUE :
- Long.MIN_VALUE;
- long maxValue = varType == PsiType.BYTE ? Byte.MAX_VALUE :
- varType == PsiType.SHORT ? Short.MAX_VALUE :
- varType == PsiType.INT ? Integer.MAX_VALUE :
- varType == PsiType.CHAR ? Character.MAX_VALUE :
- Long.MAX_VALUE;
-
- if (constantValue < minValue || constantValue > maxValue) {
+ @Nullable
+ private static DfaInstructionState[] checkComparingWithConstant(BinopInstruction instruction,
+ DataFlowRunner runner,
+ DfaMemoryState memState,
+ DfaVariableValue var,
+ IElementType opSign, double comparedWith) {
+ DfaConstValue knownConstantValue = memState.getConstantValue(var);
+ Object knownValue = knownConstantValue == null ? null : knownConstantValue.getValue();
+ if (knownValue instanceof Number) {
+ double knownDouble = ((Number)knownValue).doubleValue();
+ return checkComparisonWithKnownRange(instruction, runner, memState, opSign, comparedWith, knownDouble, knownDouble);
+ }
+
+ PsiType varType = var.getVariableType();
+ if (!(varType instanceof PsiPrimitiveType)) return null;
+
+ double minValue = varType == PsiType.BYTE ? Byte.MIN_VALUE :
+ varType == PsiType.SHORT ? Short.MIN_VALUE :
+ varType == PsiType.INT ? Integer.MIN_VALUE :
+ varType == PsiType.CHAR ? Character.MIN_VALUE :
+ varType == PsiType.LONG ? Long.MIN_VALUE :
+ varType == PsiType.FLOAT ? Float.MIN_VALUE :
+ Double.MIN_VALUE;
+ double maxValue = varType == PsiType.BYTE ? Byte.MAX_VALUE :
+ varType == PsiType.SHORT ? Short.MAX_VALUE :
+ varType == PsiType.INT ? Integer.MAX_VALUE :
+ varType == PsiType.CHAR ? Character.MAX_VALUE :
+ varType == PsiType.LONG ? Long.MAX_VALUE :
+ varType == PsiType.FLOAT ? Float.MAX_VALUE :
+ Double.MAX_VALUE;
+
+ return checkComparisonWithKnownRange(instruction, runner, memState, opSign, comparedWith, minValue, maxValue);
+ }
+
+ @Nullable
+ private static DfaInstructionState[] checkComparisonWithKnownRange(BinopInstruction instruction,
+ DataFlowRunner runner,
+ DfaMemoryState memState,
+ IElementType opSign,
+ double comparedWith,
+ double rangeMin,
+ double rangeMax) {
+ if (comparedWith < rangeMin || comparedWith > rangeMax) {
if (opSign == EQEQ) return alwaysFalse(instruction, runner, memState);
if (opSign == NE) return alwaysTrue(instruction, runner, memState);
}
- if (opSign == LT && constantValue <= minValue) return alwaysFalse(instruction, runner, memState);
- if (opSign == LT && constantValue > maxValue) return alwaysTrue(instruction, runner, memState);
- if (opSign == LE && constantValue >= maxValue) return alwaysTrue(instruction, runner, memState);
+ if (opSign == LT && comparedWith <= rangeMin) return alwaysFalse(instruction, runner, memState);
+ if (opSign == LT && comparedWith > rangeMax) return alwaysTrue(instruction, runner, memState);
+ if (opSign == LE && comparedWith >= rangeMax) return alwaysTrue(instruction, runner, memState);
- if (opSign == GT && constantValue >= maxValue) return alwaysFalse(instruction, runner, memState);
- if (opSign == GT && constantValue < minValue) return alwaysTrue(instruction, runner, memState);
- if (opSign == GE && constantValue <= minValue) return alwaysTrue(instruction, runner, memState);
+ if (opSign == GT && comparedWith >= rangeMax) return alwaysFalse(instruction, runner, memState);
+ if (opSign == GT && comparedWith < rangeMin) return alwaysTrue(instruction, runner, memState);
+ if (opSign == GE && comparedWith <= rangeMin) return alwaysTrue(instruction, runner, memState);
return null;
}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java
new file mode 100644
index 000000000000..ec9e02fce92d
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.dataFlow.value;
+
+import com.intellij.codeInspection.dataFlow.DfaPsiUtil;
+import com.intellij.codeInspection.dataFlow.Nullness;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.util.Condition;
+import com.intellij.openapi.util.registry.Registry;
+import com.intellij.psi.*;
+import com.intellij.psi.impl.JavaConstantExpressionEvaluator;
+import com.intellij.psi.util.PropertyUtil;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.util.containers.ContainerUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * @author peter
+ */
+public class DfaExpressionFactory {
+ private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.dataFlow.value.DfaExpressionFactory");
+ private static final Condition<String> FALSE_GETTERS = parseFalseGetters();
+
+ private static Condition<String> parseFalseGetters() {
+ try {
+ final Pattern pattern = Pattern.compile(Registry.stringValue("ide.dfa.getters.with.side.effects"));
+ return new Condition<String>() {
+ @Override
+ public boolean value(String s) {
+ return pattern.matcher(s).matches();
+ }
+ };
+ }
+ catch (Exception e) {
+ LOG.error(e);
+ //noinspection unchecked
+ return Condition.FALSE;
+ }
+ }
+
+ private final DfaValueFactory myFactory;
+ private Map<Integer, PsiVariable> myMockIndices = ContainerUtil.newHashMap();
+
+ public DfaExpressionFactory(DfaValueFactory factory) {
+ myFactory = factory;
+ }
+
+ @Nullable
+ public DfaValue getExpressionDfaValue(@Nullable PsiExpression expression) {
+ if (expression == null) return null;
+
+ if (expression instanceof PsiParenthesizedExpression) {
+ return getExpressionDfaValue(((PsiParenthesizedExpression)expression).getExpression());
+ }
+
+ if (expression instanceof PsiArrayAccessExpression) {
+ PsiExpression arrayExpression = ((PsiArrayAccessExpression)expression).getArrayExpression();
+ DfaValue qualifier = getExpressionDfaValue(arrayExpression);
+ if (qualifier instanceof DfaVariableValue) {
+ PsiVariable indexVar = getArrayIndexVariable(((PsiArrayAccessExpression)expression).getIndexExpression());
+ if (indexVar != null) {
+ return myFactory.getVarFactory().createVariableValue(indexVar, expression.getType(), false, (DfaVariableValue)qualifier);
+ }
+ }
+ return null;
+ }
+
+ if (expression instanceof PsiMethodCallExpression) {
+ return createReferenceValue(((PsiMethodCallExpression)expression).getMethodExpression());
+ }
+
+ if (expression instanceof PsiReferenceExpression) {
+ return createReferenceValue((PsiReferenceExpression)expression);
+ }
+
+ if (expression instanceof PsiLiteralExpression) {
+ return myFactory.createLiteralValue((PsiLiteralExpression)expression);
+ }
+
+ if (expression instanceof PsiNewExpression) {
+ return myFactory.createTypeValue(expression.getType(), Nullness.NOT_NULL);
+ }
+
+ final Object value = JavaConstantExpressionEvaluator.computeConstantExpression(expression, false);
+ PsiType type = expression.getType();
+ if (value != null && type != null) {
+ if (value instanceof String) {
+ return myFactory.createTypeValue(type, Nullness.NOT_NULL); // Non-null string literal.
+ }
+ return myFactory.getConstFactory().createFromValue(value, type, null);
+ }
+
+ return null;
+ }
+
+ private DfaValue createReferenceValue(@NotNull PsiReferenceExpression refExpr) {
+ PsiModifierListOwner var = getAccessedVariableOrGetter(refExpr.resolve());
+ if (var == null) {
+ return null;
+ }
+
+ if (!var.hasModifierProperty(PsiModifier.VOLATILE) && !var.hasModifierProperty(PsiModifier.TRANSIENT)) {
+ if (var instanceof PsiVariable && var.hasModifierProperty(PsiModifier.FINAL)) {
+ DfaValue constValue = myFactory.getConstFactory().create((PsiVariable)var);
+ if (constValue != null) return constValue;
+ }
+
+ if (DfaValueFactory.isEffectivelyUnqualified(refExpr)) {
+ return myFactory.getVarFactory().createVariableValue(var, refExpr.getType(), false, null);
+ }
+
+ DfaValue qualifierValue = getExpressionDfaValue(refExpr.getQualifierExpression());
+ if (qualifierValue instanceof DfaVariableValue) {
+ return myFactory.getVarFactory().createVariableValue(var, refExpr.getType(), false, (DfaVariableValue)qualifierValue);
+ }
+ }
+
+ PsiType type = refExpr.getType();
+ return myFactory.createTypeValue(type, DfaPsiUtil.getElementNullability(type, var));
+ }
+
+ @Nullable
+ private static PsiModifierListOwner getAccessedVariableOrGetter(final PsiElement target) {
+ if (target instanceof PsiVariable) {
+ return (PsiVariable)target;
+ }
+ if (target instanceof PsiMethod) {
+ if (PropertyUtil.isSimplePropertyGetter((PsiMethod)target)) {
+ String qName = PsiUtil.getMemberQualifiedName((PsiMethod)target);
+ if (qName == null || !FALSE_GETTERS.value(qName)) {
+ return (PsiMethod)target;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ private PsiVariable getArrayIndexVariable(@Nullable PsiExpression indexExpression) {
+ Object constant = JavaConstantExpressionEvaluator.computeConstantExpression(indexExpression, false);
+ if (constant instanceof Integer) {
+ PsiVariable mockVar = myMockIndices.get(constant);
+ if (mockVar == null) {
+ mockVar = JavaPsiFacade.getElementFactory(indexExpression.getProject()).createField("$array$index$" + constant, PsiType.INT);
+ myMockIndices.put((Integer)constant, mockVar);
+ }
+ return mockVar;
+ }
+ return null;
+ }
+
+
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java
index ba7772ba2ca2..da1d2d952634 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java
@@ -27,7 +27,6 @@ package com.intellij.codeInspection.dataFlow.value;
import com.intellij.codeInspection.dataFlow.Nullness;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.*;
-import com.intellij.psi.impl.JavaConstantExpressionEvaluator;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.containers.ContainerUtil;
@@ -52,6 +51,7 @@ public class DfaValueFactory {
myBoxedFactory = new DfaBoxedValue.Factory(this);
myTypeFactory = new DfaTypeValue.Factory(this);
myRelationFactory = new DfaRelationValue.Factory(this);
+ myExpressionFactory = new DfaExpressionFactory(this);
}
public boolean isHonorFieldInitializers() {
@@ -83,28 +83,7 @@ public class DfaValueFactory {
@Nullable
public DfaValue createValue(PsiExpression psiExpression) {
- if (psiExpression instanceof PsiReferenceExpression) {
- return createReferenceValue((PsiReferenceExpression)psiExpression);
- }
-
- if (psiExpression instanceof PsiLiteralExpression) {
- return createLiteralValue((PsiLiteralExpression)psiExpression);
- }
-
- if (psiExpression instanceof PsiNewExpression) {
- return createTypeValue(psiExpression.getType(), Nullness.NOT_NULL);
- }
-
- final Object value = JavaConstantExpressionEvaluator.computeConstantExpression(psiExpression, false);
- PsiType type = psiExpression.getType();
- if (value != null && type != null) {
- if (value instanceof String) {
- return createTypeValue(type, Nullness.NOT_NULL); // Non-null string literal.
- }
- return getConstFactory().createFromValue(value, type, null);
- }
-
- return null;
+ return myExpressionFactory.getExpressionDfaValue(psiExpression);
}
@Nullable
@@ -116,26 +95,6 @@ public class DfaValueFactory {
}
@Nullable
- public DfaValue createReferenceValue(PsiReferenceExpression referenceExpression) {
- PsiElement psiSource = referenceExpression.resolve();
- if (!(psiSource instanceof PsiVariable)) {
- return null;
- }
-
- final PsiVariable variable = (PsiVariable)psiSource;
- if (variable.hasModifierProperty(PsiModifier.FINAL) && !variable.hasModifierProperty(PsiModifier.TRANSIENT)) {
- DfaValue constValue = getConstFactory().create(variable);
- if (constValue != null) return constValue;
- }
-
- if (!variable.hasModifierProperty(PsiModifier.VOLATILE) && isEffectivelyUnqualified(referenceExpression)) {
- return getVarFactory().createVariableValue(variable, referenceExpression.getType(), false, null);
- }
-
- return null;
- }
-
- @Nullable
public static PsiVariable resolveUnqualifiedVariable(PsiReferenceExpression refExpression) {
if (isEffectivelyUnqualified(refExpression)) {
PsiElement resolved = refExpression.resolve();
@@ -168,6 +127,7 @@ public class DfaValueFactory {
private final DfaBoxedValue.Factory myBoxedFactory;
private final DfaTypeValue.Factory myTypeFactory;
private final DfaRelationValue.Factory myRelationFactory;
+ private final DfaExpressionFactory myExpressionFactory;
@NotNull
public DfaVariableValue.Factory getVarFactory() {
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java
index 31492bb38b9b..3030bef32934 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java
@@ -105,7 +105,7 @@ public class DfaVariableValue extends DfaValue {
return myTypeValue;
}
- @Nullable
+ @NotNull
public PsiModifierListOwner getPsiVariable() {
return myVariable;
}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticalDataSearch.java b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticalDataSearch.java
index 8691d6b65f3e..4266b66cb6ed 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticalDataSearch.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticalDataSearch.java
@@ -1,6 +1,21 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package com.intellij.codeInspection.inheritance.search;
-import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.util.Couple;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
import com.intellij.psi.search.GlobalSearchScope;
@@ -32,7 +47,7 @@ public class InheritorsStatisticalDataSearch {
disabledNames.add(aClassName);
disabledNames.add(superClassName);
final Set<InheritorsCountData> collector = new TreeSet<InheritorsCountData>();
- final Pair<Integer, Integer> collectingResult = collectInheritorsInfo(superClass, collector, disabledNames);
+ final Couple<Integer> collectingResult = collectInheritorsInfo(superClass, collector, disabledNames);
final int allAnonymousInheritors = collectingResult.getSecond();
final int allInheritors = collectingResult.getFirst() + allAnonymousInheritors - 1;
@@ -64,19 +79,19 @@ public class InheritorsStatisticalDataSearch {
return result;
}
- private static Pair<Integer, Integer> collectInheritorsInfo(final PsiClass superClass,
+ private static Couple<Integer> collectInheritorsInfo(final PsiClass superClass,
final Set<InheritorsCountData> collector,
final Set<String> disabledNames) {
return collectInheritorsInfo(superClass, collector, disabledNames, new HashSet<String>(), new HashSet<String>());
}
- private static Pair<Integer, Integer> collectInheritorsInfo(final PsiClass aClass,
+ private static Couple<Integer> collectInheritorsInfo(final PsiClass aClass,
final Set<InheritorsCountData> collector,
final Set<String> disabledNames,
final Set<String> processedElements,
final Set<String> allNotAnonymousInheritors) {
final String className = aClass.getName();
- if (!processedElements.add(className)) return Pair.create(0, 0);
+ if (!processedElements.add(className)) return Couple.of(0, 0);
final MyInheritorsInfoProcessor processor = new MyInheritorsInfoProcessor(collector, disabledNames, processedElements);
DirectClassInheritorsSearch.search(aClass).forEach(processor);
@@ -87,7 +102,7 @@ public class InheritorsStatisticalDataSearch {
if (!aClass.isInterface() && allInheritorsCount != 0 && !disabledNames.contains(className)) {
collector.add(new InheritorsCountData(aClass, allInheritorsCount));
}
- return Pair.create(allNotAnonymousInheritors.size(), processor.getAnonymousInheritorsCount());
+ return Couple.of(allNotAnonymousInheritors.size(), processor.getAnonymousInheritorsCount());
}
private static class MyInheritorsInfoProcessor implements Processor<PsiClass> {
@@ -120,8 +135,11 @@ public class InheritorsStatisticalDataSearch {
myAnonymousInheritorsCount++;
}
else {
- final Pair<Integer, Integer> res =
- collectInheritorsInfo(psiClass, myCollector, myDisabledNames, myProcessedElements, myAllNotAnonymousInheritors);
+ final Couple<Integer> res = collectInheritorsInfo(psiClass,
+ myCollector,
+ myDisabledNames,
+ myProcessedElements,
+ myAllNotAnonymousInheritors);
myAnonymousInheritorsCount += res.getSecond();
if (!psiClass.isInterface()) {
myAllNotAnonymousInheritors.add(inheritorName);
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java
index 38f8d46fe10c..47d32a03bf8f 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java
@@ -114,8 +114,8 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
ProblemHighlightType.GENERIC_ERROR_OR_WARNING, getterAnnoFix);
}
}
- if (annotated.isDeclaredNotNull && manager.isNullable(getter, false) ||
- annotated.isDeclaredNullable && manager.isNotNull(getter, false)) {
+ if (annotated.isDeclaredNotNull && isNullableNotInferred(getter, false) ||
+ annotated.isDeclaredNullable && isNotNullNotInferred(getter, false)) {
holder.registerProblem(nameIdentifier, InspectionsBundle.message(
"inspection.nullable.problems.annotated.field.getter.conflict", getPresentableAnnoName(field), getPresentableAnnoName(getter)),
ProblemHighlightType.GENERIC_ERROR_OR_WARNING, getterAnnoFix);
@@ -141,8 +141,8 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
addAnnoFix);
}
if (PropertyUtil.isSimpleSetter(setter)) {
- if (annotated.isDeclaredNotNull && manager.isNullable(parameter, false) ||
- annotated.isDeclaredNullable && manager.isNotNull(parameter, false)) {
+ if (annotated.isDeclaredNotNull && isNullableNotInferred(parameter, false) ||
+ annotated.isDeclaredNullable && isNotNullNotInferred(parameter, false)) {
final PsiIdentifier nameIdentifier1 = parameter.getNameIdentifier();
assertValidElement(setter, parameter, nameIdentifier1);
holder.registerProblem(nameIdentifier1, InspectionsBundle.message(
@@ -154,7 +154,17 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
}
}
- for (PsiExpression rhs : DfaPsiUtil.findAllConstructorInitializers(field)) {
+ List<PsiExpression> initializers = DfaPsiUtil.findAllConstructorInitializers(field);
+ if (annotated.isDeclaredNotNull && initializers.isEmpty()) {
+ final PsiAnnotation annotation = AnnotationUtil.findAnnotation(field, manager.getNotNulls());
+ if (annotation != null) {
+ holder.registerProblem(annotation.isPhysical() ? annotation : field.getNameIdentifier(),
+ "Not-null fields must be initialized",
+ ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
+ }
+ }
+
+ for (PsiExpression rhs : initializers) {
if (rhs instanceof PsiReferenceExpression) {
PsiElement target = ((PsiReferenceExpression)rhs).resolve();
if (target instanceof PsiParameter) {
@@ -169,7 +179,7 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
ProblemHighlightType.GENERIC_ERROR_OR_WARNING, fix);
continue;
}
- if (annotated.isDeclaredNullable && manager.isNotNull(parameter, false)) {
+ if (annotated.isDeclaredNullable && isNotNullNotInferred(parameter, false)) {
boolean usedAsQualifier = !ReferencesSearch.search(parameter).forEach(new Processor<PsiReference>() {
@Override
public boolean process(PsiReference reference) {
@@ -203,6 +213,33 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
if (!PsiUtil.isLanguageLevel5OrHigher(parameter)) return;
check(parameter, holder, parameter.getType());
}
+
+ @Override
+ public void visitAnnotation(PsiAnnotation annotation) {
+ if (!AnnotationUtil.NOT_NULL.equals(annotation.getQualifiedName())) return;
+
+ PsiAnnotationMemberValue value = annotation.findDeclaredAttributeValue("exception");
+ if (value instanceof PsiClassObjectAccessExpression) {
+ PsiClass psiClass = PsiUtil.resolveClassInClassTypeOnly(((PsiClassObjectAccessExpression)value).getOperand().getType());
+ if (psiClass != null && !hasStringConstructor(psiClass)) {
+ holder.registerProblem(value,
+ "Custom exception class should have a constructor with a single message parameter of String type",
+ ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
+
+ }
+ }
+ }
+
+ private boolean hasStringConstructor(PsiClass aClass) {
+ for (PsiMethod method : aClass.getConstructors()) {
+ PsiParameterList list = method.getParameterList();
+ if (list.getParametersCount() == 1 &&
+ list.getParameters()[0].getType().equalsToText(CommonClassNames.JAVA_LANG_STRING)) {
+ return true;
+ }
+ }
+ return false;
+ }
};
}
@@ -231,7 +268,7 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
PsiAnnotation isDeclaredNotNull = AnnotationUtil.findAnnotation(parameter, manager.getNotNulls());
PsiAnnotation isDeclaredNullable = AnnotationUtil.findAnnotation(parameter, manager.getNullables());
if (isDeclaredNullable != null && isDeclaredNotNull != null) {
- reportNullableNotNullConflict(holder, parameter, isDeclaredNullable, isDeclaredNotNull);
+ reportNullableNotNullConflict(holder, parameter, isDeclaredNullable, isDeclaredNotNull);
}
if ((isDeclaredNotNull != null || isDeclaredNullable != null) && type != null && TypeConversionUtil.isPrimitive(type.getCanonicalText())) {
PsiAnnotation annotation = isDeclaredNotNull == null ? isDeclaredNullable : isDeclaredNotNull;
@@ -282,7 +319,7 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
if (!reported_nullable_method_overrides_notnull
&& REPORT_NOTNULL_PARAMETER_OVERRIDES_NULLABLE
&& annotated.isDeclaredNullable
- && NullableNotNullManager.isNotNull(superMethod)) {
+ && isNotNullNotInferred(superMethod, true)) {
reported_nullable_method_overrides_notnull = true;
final PsiAnnotation annotation = AnnotationUtil.findAnnotation(method, nullableManager.getNullables(), true);
holder.registerProblem(annotation != null ? annotation : method.getNameIdentifier(),
@@ -293,7 +330,7 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
&& REPORT_NOT_ANNOTATED_METHOD_OVERRIDES_NOTNULL
&& !annotated.isDeclaredNullable
&& !annotated.isDeclaredNotNull
- && NullableNotNullManager.isNotNull(superMethod)) {
+ && isNotNullNotInferred(superMethod, true)) {
reported_not_annotated_method_overrides_notnull = true;
final String defaultNotNull = nullableManager.getDefaultNotNull();
final String[] annotationsToRemove = ArrayUtil.toStringArray(nullableManager.getNullables());
@@ -314,8 +351,8 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
PsiParameter parameter = parameters[i];
PsiParameter superParameter = superParameters[i];
if (!reported_notnull_parameter_overrides_nullable[i] && REPORT_NOTNULL_PARAMETER_OVERRIDES_NULLABLE &&
- nullableManager.isNotNull(parameter, false) &&
- nullableManager.isNullable(superParameter, false)) {
+ isNotNullNotInferred(parameter, false) &&
+ isNullableNotInferred(superParameter, false)) {
reported_notnull_parameter_overrides_nullable[i] = true;
final PsiAnnotation annotation = AnnotationUtil.findAnnotation(parameter, nullableManager.getNotNulls(), true);
holder.registerProblem(annotation != null ? annotation : parameter.getNameIdentifier(),
@@ -325,7 +362,7 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
}
if (!reported_not_annotated_parameter_overrides_notnull[i] && REPORT_NOT_ANNOTATED_METHOD_OVERRIDES_NOTNULL) {
- if (!nullableManager.hasNullability(parameter) && nullableManager.isNotNull(superParameter, false)) {
+ if (!nullableManager.hasNullability(parameter) && isNotNullNotInferred(superParameter, false)) {
reported_not_annotated_parameter_overrides_notnull[i] = true;
final LocalQuickFix fix = AnnotationUtil.isAnnotatingApplicable(parameter, nullableManager.getDefaultNotNull())
? new AddNotNullAnnotationFix(parameter)
@@ -346,7 +383,7 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
boolean hasAnnotatedParameter = false;
for (int i = 0; i < parameters.length; i++) {
PsiParameter parameter = parameters[i];
- parameterAnnotated[i] = nullableManager.isNotNull(parameter, false);
+ parameterAnnotated[i] = isNotNullNotInferred(parameter, false);
hasAnnotatedParameter |= parameterAnnotated[i];
}
if (hasAnnotatedParameter || annotated.isDeclaredNotNull) {
@@ -362,8 +399,8 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
final boolean applicable = AnnotationUtil.isAnnotatingApplicable(overriding, defaultNotNull);
if (!methodQuickFixSuggested
&& annotated.isDeclaredNotNull
- && !nullableManager.isNotNull(overriding, false)
- && (nullableManager.isNullable(overriding, false) || !nullableManager.isNullable(overriding, true))) {
+ && !isNotNullNotInferred(overriding, false)
+ && (isNullableNotInferred(overriding, false) || !isNullableNotInferred(overriding, true))) {
method.getNameIdentifier(); //load tree
PsiAnnotation annotation = AnnotationUtil.findAnnotation(method, nullableManager.getNotNulls());
final String[] annotationsToRemove = ArrayUtil.toStringArray(nullableManager.getNullables());
@@ -391,7 +428,7 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
for (int i = 0; i < psiParameters.length; i++) {
if (parameterQuickFixSuggested[i]) continue;
PsiParameter parameter = psiParameters[i];
- if (parameterAnnotated[i] && !nullableManager.isNotNull(parameter, false) && !nullableManager.isNullable(parameter, false)) {
+ if (parameterAnnotated[i] && !isNotNullNotInferred(parameter, false) && !isNullableNotInferred(parameter, false)) {
parameters[i].getNameIdentifier(); //be sure that corresponding tree element available
PsiAnnotation annotation = AnnotationUtil.findAnnotation(parameters[i], nullableManager.getNotNulls());
PsiElement psiElement = annotation;
@@ -415,6 +452,24 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
}
}
+ private static boolean isNotNullNotInferred(@NotNull PsiModifierListOwner owner, boolean checkBases) {
+ Project project = owner.getProject();
+ NullableNotNullManager manager = NullableNotNullManager.getInstance(project);
+ if (!manager.isNotNull(owner, checkBases)) return false;
+
+ PsiAnnotation anno = manager.getNotNullAnnotation(owner, checkBases);
+ return !(anno != null && AnnotationUtil.isInferredAnnotation(anno));
+ }
+
+ private static boolean isNullableNotInferred(@NotNull PsiModifierListOwner owner, boolean checkBases) {
+ Project project = owner.getProject();
+ NullableNotNullManager manager = NullableNotNullManager.getInstance(project);
+ if (!manager.isNullable(owner, checkBases)) return false;
+
+ PsiAnnotation anno = manager.getNullableAnnotation(owner, checkBases);
+ return !(anno != null && AnnotationUtil.isInferredAnnotation(anno));
+ }
+
@NotNull
private static LocalQuickFix[] wrapFix(LocalQuickFix fix) {
if (fix == null) return LocalQuickFix.EMPTY_ARRAY;
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/unusedLibraries/UnusedLibrariesInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/unusedLibraries/UnusedLibrariesInspection.java
index 5a419dfa9647..4db11dc0b0d0 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/unusedLibraries/UnusedLibrariesInspection.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/unusedLibraries/UnusedLibrariesInspection.java
@@ -23,14 +23,15 @@ package com.intellij.codeInspection.unusedLibraries;
import com.intellij.analysis.AnalysisScope;
import com.intellij.codeInsight.daemon.GroupNames;
import com.intellij.codeInspection.*;
-import com.intellij.codeInspection.reference.*;
+import com.intellij.codeInspection.reference.RefEntity;
+import com.intellij.codeInspection.reference.RefGraphAnnotator;
+import com.intellij.codeInspection.reference.RefManager;
+import com.intellij.codeInspection.reference.RefModule;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.*;
-import com.intellij.openapi.roots.impl.DirectoryIndex;
-import com.intellij.openapi.roots.impl.DirectoryInfo;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Key;
@@ -185,12 +186,12 @@ public class UnusedLibrariesInspection extends GlobalInspectionTool {
private static class UnusedLibraryGraphAnnotator extends RefGraphAnnotator {
public static final Key<Set<VirtualFile>> USED_LIBRARY_ROOTS = Key.create("inspection.dependencies");
- private final DirectoryIndex myDirectoryIndex;
+ private final ProjectFileIndex myFileIndex;
private RefManager myManager;
public UnusedLibraryGraphAnnotator(RefManager manager) {
myManager = manager;
- myDirectoryIndex = DirectoryIndex.getInstance(manager.getProject());
+ myFileIndex = ProjectRootManager.getInstance(manager.getProject()).getFileIndex();
}
@Override
@@ -199,8 +200,7 @@ public class UnusedLibrariesInspection extends GlobalInspectionTool {
final VirtualFile virtualFile = PsiUtilCore.getVirtualFile(what);
final VirtualFile containingDir = virtualFile != null ? virtualFile.getParent() : null;
if (containingDir != null) {
- final DirectoryInfo infoForDirectory = myDirectoryIndex.getInfoForDirectory(containingDir);
- final VirtualFile libraryClassRoot = infoForDirectory != null ? infoForDirectory.getLibraryClassRoot() : null;
+ final VirtualFile libraryClassRoot = myFileIndex.getClassRootForFile(containingDir);
if (libraryClassRoot != null) {
final Module fromModule = ModuleUtilCore.findModuleForPsiElement(from);
if (fromModule != null){
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspectionBase.java
index f84abbb0e3d6..e13f3e66a198 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspectionBase.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspectionBase.java
@@ -132,6 +132,7 @@ public class FieldCanBeLocalInspectionBase extends BaseJavaBatchLocalInspectionT
final Set<PsiField> candidates,
final Set<PsiField> usedFields,
final boolean ignoreFieldsUsedInMultipleMethods) {
+ final Set<PsiField> ignored = new HashSet<PsiField>();
aClass.accept(new JavaRecursiveElementWalkingVisitor() {
@Override
public void visitElement(PsiElement element) {
@@ -144,7 +145,7 @@ public class FieldCanBeLocalInspectionBase extends BaseJavaBatchLocalInspectionT
final PsiCodeBlock body = method.getBody();
if (body != null) {
- checkCodeBlock(body, candidates, usedFields, ignoreFieldsUsedInMultipleMethods);
+ checkCodeBlock(body, candidates, usedFields, ignoreFieldsUsedInMultipleMethods, ignored);
}
}
@@ -153,14 +154,14 @@ public class FieldCanBeLocalInspectionBase extends BaseJavaBatchLocalInspectionT
super.visitLambdaExpression(expression);
final PsiElement body = expression.getBody();
if (body != null) {
- checkCodeBlock(body, candidates, usedFields, ignoreFieldsUsedInMultipleMethods);
+ checkCodeBlock(body, candidates, usedFields, ignoreFieldsUsedInMultipleMethods, ignored);
}
}
@Override
public void visitClassInitializer(PsiClassInitializer initializer) {
super.visitClassInitializer(initializer);
- checkCodeBlock(initializer.getBody(), candidates, usedFields, ignoreFieldsUsedInMultipleMethods);
+ checkCodeBlock(initializer.getBody(), candidates, usedFields, ignoreFieldsUsedInMultipleMethods, ignored);
}
});
}
@@ -168,20 +169,28 @@ public class FieldCanBeLocalInspectionBase extends BaseJavaBatchLocalInspectionT
private static void checkCodeBlock(final PsiElement body,
final Set<PsiField> candidates,
Set<PsiField> usedFields,
- boolean ignoreFieldsUsedInMultipleMethods) {
+ boolean ignoreFieldsUsedInMultipleMethods,
+ Set<PsiField> ignored) {
try {
+ final Ref<Collection<PsiVariable>> writtenVariables = new Ref<Collection<PsiVariable>>();
final ControlFlow
controlFlow = ControlFlowFactory.getInstance(body.getProject()).getControlFlow(body, AllVariablesControlFlowPolicy.getInstance());
final List<PsiVariable> usedVars = ControlFlowUtil.getUsedVariables(controlFlow, 0, controlFlow.getSize());
for (PsiVariable usedVariable : usedVars) {
if (usedVariable instanceof PsiField) {
final PsiField usedField = (PsiField)usedVariable;
- if (!usedFields.add(usedField) && ignoreFieldsUsedInMultipleMethods) {
+ if (!getWrittenVariables(controlFlow, writtenVariables).contains(usedField)) {
+ ignored.add(usedField);
+ }
+
+ if (!usedFields.add(usedField) && (ignoreFieldsUsedInMultipleMethods || ignored.contains(usedField))) {
candidates.remove(usedField); //used in more than one code block
}
}
}
- final Ref<Collection<PsiVariable>> writtenVariables = new Ref<Collection<PsiVariable>>();
+
+ if (candidates.isEmpty()) return;
+
final List<PsiReferenceExpression> readBeforeWrites = ControlFlowUtil.getReadBeforeWrite(controlFlow);
for (final PsiReferenceExpression readBeforeWrite : readBeforeWrites) {
final PsiElement resolved = readBeforeWrite.resolve();
diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodUtil.java b/java/java-analysis-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodUtil.java
index f20ff1ca9ded..82ed68a44228 100644
--- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodUtil.java
@@ -26,6 +26,7 @@ import com.intellij.psi.util.RedundantCastUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Processor;
import com.intellij.util.containers.HashMap;
+import org.jetbrains.annotations.NotNull;
import java.util.Map;
@@ -89,7 +90,7 @@ public class ExtractMethodUtil {
if (target != null) {
expression.putCopyableUserData(RESOLVE_TARGET_KEY, null);
try {
- assertSameResolveTarget(target, expression, extracted);
+ addCastsToEnsureResolveTarget(target, expression);
}
catch (IncorrectOperationException e) {
LOG.error(e);
@@ -102,7 +103,7 @@ public class ExtractMethodUtil {
for (final Map.Entry<PsiMethodCallExpression, PsiMethod> entry : oldResolves.entrySet()) {
try {
- assertSameResolveTarget(entry.getValue(), entry.getKey(), extracted);
+ addCastsToEnsureResolveTarget(entry.getValue(), entry.getKey());
}
catch (IncorrectOperationException e) {
LOG.error(e);
@@ -110,10 +111,10 @@ public class ExtractMethodUtil {
}
}
- private static void assertSameResolveTarget(final PsiMethod oldTarget, final PsiMethodCallExpression call, final PsiMethod extracted)
+ public static void addCastsToEnsureResolveTarget(@NotNull final PsiMethod oldTarget, @NotNull final PsiMethodCallExpression call)
throws IncorrectOperationException {
final PsiMethod newTarget = call.resolveMethod();
- final PsiManager manager = extracted.getManager();
+ final PsiManager manager = oldTarget.getManager();
final PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();
if (!manager.areElementsEquivalent(oldTarget, newTarget)) {
final PsiParameter[] oldParameters = oldTarget.getParameterList().getParameters();
diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java
index d5d927cf44fc..182f79c94bce 100644
--- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java
+++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java
@@ -48,43 +48,55 @@ public class ExternalAnnotationsLineMarkerProvider implements LineMarkerProvider
@Nullable
@Override
public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element) {
- if (element instanceof PsiParameter) return null;
+ if (!(element instanceof PsiModifierListOwner)) return null;
+ if (element instanceof PsiParameter || element instanceof PsiLocalVariable) return null;
- PsiModifierListOwner owner = null;
- if (element instanceof PsiModifierListOwner) {
- final PsiModifierListOwner modifierListOwner = (PsiModifierListOwner)element;
- final ExternalAnnotationsManager annotationsManager = ExternalAnnotationsManager.getInstance(modifierListOwner.getProject());
- PsiAnnotation[] externalAnnotations = annotationsManager.findExternalAnnotations(modifierListOwner);
- if (externalAnnotations != null && externalAnnotations.length > 0) {
- owner = (PsiModifierListOwner)element;
- } else if (element instanceof PsiMethod) {
- final PsiParameter[] parameters = ((PsiMethod)element).getParameterList().getParameters();
- for (PsiParameter parameter : parameters) {
- externalAnnotations = annotationsManager.findExternalAnnotations(parameter);
- if (externalAnnotations != null && externalAnnotations.length > 0) {
- owner = (PsiMethod)element;
- break;
- }
- }
- }
- }
-
- if (owner == null) {
+ if (!shouldShowSignature(preferCompiledElement((PsiModifierListOwner)element))) {
return null;
}
final Function<PsiModifierListOwner, String> annotationsCollector = new Function<PsiModifierListOwner, String>() {
@Override
public String fun(PsiModifierListOwner owner) {
- return XmlStringUtil.wrapInHtml(JavaDocInfoGenerator.generateSignature(owner));
+ return XmlStringUtil.wrapInHtml(JavaDocInfoGenerator.generateSignature(preferCompiledElement(owner)));
}
};
- return new LineMarkerInfo<PsiModifierListOwner>(owner, owner.getTextOffset(), AllIcons.Gutter.ExtAnnotation,
+ return new LineMarkerInfo<PsiModifierListOwner>((PsiModifierListOwner)element, element.getTextOffset(), AllIcons.Gutter.ExtAnnotation,
Pass.UPDATE_ALL,
annotationsCollector, new MyIconGutterHandler(),
GutterIconRenderer.Alignment.LEFT);
}
+ private static PsiModifierListOwner preferCompiledElement(PsiModifierListOwner element) {
+ PsiElement original = element.getOriginalElement();
+ return original instanceof PsiModifierListOwner ? (PsiModifierListOwner)original : element;
+ }
+
+ private static boolean shouldShowSignature(PsiModifierListOwner owner) {
+ if (hasNonCodeAnnotations(owner)) {
+ return true;
+ }
+
+ if (owner instanceof PsiMethod) {
+ for (PsiParameter parameter : ((PsiMethod)owner).getParameterList().getParameters()) {
+ if (hasNonCodeAnnotations(parameter)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private static boolean hasNonCodeAnnotations(@NotNull PsiModifierListOwner element) {
+ Project project = element.getProject();
+ PsiAnnotation[] externalAnnotations = ExternalAnnotationsManager.getInstance(project).findExternalAnnotations(element);
+ if (externalAnnotations != null && externalAnnotations.length > 0) {
+ return true;
+ }
+ return InferredAnnotationsManager.getInstance(project).findInferredAnnotations(element).length > 0;
+ }
+
@Override
public void collectSlowLineMarkers(@NotNull List<PsiElement> elements, @NotNull Collection<LineMarkerInfo> result) {}
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java
index 4ff8ca2ec5f8..cbc9653b6adf 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java
@@ -21,6 +21,7 @@ import com.intellij.diagnostic.AttachmentFactory;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.util.ClassConditionKey;
+import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
@@ -38,6 +39,7 @@ import java.util.Set;
* @author peter
*/
public class JavaChainLookupElement extends LookupElementDecorator<LookupElement> implements TypedLookupItem {
+ public static final Key<Boolean> CHAIN_QUALIFIER = Key.create("CHAIN_QUALIFIER");
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.completion.JavaChainLookupElement");
public static final ClassConditionKey<JavaChainLookupElement> CLASS_CONDITION_KEY = ClassConditionKey.create(JavaChainLookupElement.class);
private final LookupElement myQualifier;
@@ -109,9 +111,12 @@ public class JavaChainLookupElement extends LookupElementDecorator<LookupElement
public void handleInsert(InsertionContext context) {
final Document document = context.getEditor().getDocument();
document.replaceString(context.getStartOffset(), context.getTailOffset(), ";");
+ myQualifier.putUserData(CHAIN_QUALIFIER, true);
final InsertionContext qualifierContext = CompletionUtil.emulateInsertion(context, context.getStartOffset(), myQualifier);
OffsetKey oldStart = context.trackOffset(context.getStartOffset(), false);
+ PsiDocumentManager.getInstance(context.getProject()).doPostponedOperationsAndUnblockDocument(document);
+
int start = CharArrayUtil.shiftForward(context.getDocument().getCharsSequence(), context.getStartOffset(), " \t\n");
if (shouldParenthesizeQualifier(context.getFile(), start, qualifierContext.getTailOffset())) {
final String space = CodeStyleSettingsManager.getSettings(qualifierContext.getProject()).SPACE_WITHIN_PARENTHESES ? " " : "";
@@ -165,6 +170,7 @@ public class JavaChainLookupElement extends LookupElementDecorator<LookupElement
if (expr instanceof PsiJavaCodeReferenceElement ||
expr instanceof PsiMethodCallExpression ||
+ expr instanceof PsiNewExpression ||
expr instanceof PsiArrayAccessExpression) {
return false;
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java
index be6d8146ce3d..f5a8253ab5ab 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java
@@ -98,7 +98,8 @@ class JavaClassNameInsertHandler implements InsertHandler<JavaPsiClassReferenceE
context.setTailOffset(context.getOffset(refEnd));
context.commitDocument();
- if (shouldInsertParentheses(file.findElementAt(context.getTailOffset() - 1))) {
+ if (item.getUserData(JavaChainLookupElement.CHAIN_QUALIFIER) == null &&
+ shouldInsertParentheses(file.findElementAt(context.getTailOffset() - 1))) {
if (ConstructorInsertHandler.insertParentheses(context, item, psiClass, false)) {
fillTypeArgs |= psiClass.hasTypeParameters() && PsiUtil.getLanguageLevel(file).isAtLeast(LanguageLevel.JDK_1_5);
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java
index 7310227a80f0..fba10a633432 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java
@@ -426,7 +426,7 @@ public class JavaCompletionContributor extends CompletionContributor {
if (JavaCompletionData.isAfterPrimitiveOrArrayType(position)) {
return false;
}
-
+
return true;
}
@@ -466,11 +466,11 @@ public class JavaCompletionContributor extends CompletionContributor {
methods: for (PsiMethod method : annoClass.getMethods()) {
if (!(method instanceof PsiAnnotationMethod)) continue;
-
+
final String attrName = method.getName();
for (PsiNameValuePair existingAttr : existingPairs) {
if (PsiTreeUtil.isAncestor(existingAttr, insertedElement, false)) break;
- if (Comparing.equal(existingAttr.getName(), attrName) ||
+ if (Comparing.equal(existingAttr.getName(), attrName) ||
PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME.equals(attrName) && existingAttr.getName() == null) continue methods;
}
LookupElementBuilder element = LookupElementBuilder.createWithIcon(method).withInsertHandler(new InsertHandler<LookupElement>() {
@@ -479,7 +479,7 @@ public class JavaCompletionContributor extends CompletionContributor {
final Editor editor = context.getEditor();
TailType.EQ.processTail(editor, editor.getCaretModel().getOffset());
context.setAddCompletionChar(false);
-
+
context.commitDocument();
PsiAnnotationParameterList paramList =
PsiTreeUtil.findElementOfClassAtOffset(context.getFile(), context.getStartOffset(), PsiAnnotationParameterList.class, false);
@@ -644,7 +644,20 @@ public class JavaCompletionContributor extends CompletionContributor {
if (file instanceof PsiJavaFile) {
if (context.getInvocationCount() > 0) {
autoImport(file, context.getStartOffset() - 1, context.getEditor());
- PsiDocumentManager.getInstance(context.getProject()).commitDocument(context.getEditor().getDocument());
+
+ PsiElement leaf = file.findElementAt(context.getStartOffset() - 1);
+ if (leaf != null) leaf = PsiTreeUtil.prevVisibleLeaf(leaf);
+
+ PsiVariable variable = PsiTreeUtil.getParentOfType(leaf, PsiVariable.class);
+ if (variable != null) {
+ PsiTypeElement typeElement = variable.getTypeElement();
+ if (typeElement != null) {
+ PsiType type = typeElement.getType();
+ if (type instanceof PsiClassType && ((PsiClassType)type).resolve() == null) {
+ autoImportReference(file, context.getEditor(), typeElement.getInnermostComponentReferenceElement());
+ }
+ }
+ }
}
JavaCompletionUtil.initOffsets(file, context.getOffsetMap());
@@ -702,7 +715,13 @@ public class JavaCompletionContributor extends CompletionContributor {
iterator.advance();
}
- if (!iterator.atEnd() && (iterator.getTokenType() == JavaTokenType.LPARENTH || iterator.getTokenType() == JavaTokenType.COLON)) {
+ if (!iterator.atEnd() && (iterator.getTokenType() == JavaTokenType.LPARENTH)) {
+ return true;
+ }
+
+ if (!iterator.atEnd()
+ && (iterator.getTokenType() == JavaTokenType.COLON)
+ && null == PsiTreeUtil.findElementOfClassAtOffset(file, startOffset, PsiConditionalExpression.class, false)) {
return true;
}
@@ -721,7 +740,7 @@ public class JavaCompletionContributor extends CompletionContributor {
return iterator.getTokenType() == JavaTokenType.EQ || iterator.getTokenType() == JavaTokenType.LPARENTH;
}
- private static void autoImport(final PsiFile file, int offset, final Editor editor) {
+ private static void autoImport(@NotNull final PsiFile file, int offset, @NotNull final Editor editor) {
final CharSequence text = editor.getDocument().getCharsSequence();
while (offset > 0 && Character.isJavaIdentifierPart(text.charAt(offset))) offset--;
if (offset <= 0) return;
@@ -734,7 +753,10 @@ public class JavaCompletionContributor extends CompletionContributor {
while (offset > 0 && Character.isWhitespace(text.charAt(offset))) offset--;
if (offset <= 0) return;
- PsiJavaCodeReferenceElement element = extractReference(PsiTreeUtil.findElementOfClassAtOffset(file, offset, PsiExpression.class, false));
+ autoImportReference(file, editor, extractReference(PsiTreeUtil.findElementOfClassAtOffset(file, offset, PsiExpression.class, false)));
+ }
+
+ private static void autoImportReference(@NotNull PsiFile file, @NotNull Editor editor, @Nullable PsiJavaCodeReferenceElement element) {
if (element == null) return;
while (true) {
@@ -745,6 +767,7 @@ public class JavaCompletionContributor extends CompletionContributor {
}
if (!(element.getParent() instanceof PsiMethodCallExpression) && element.multiResolve(true).length == 0) {
new ImportClassFix(element).doFix(editor, false, false);
+ PsiDocumentManager.getInstance(file.getProject()).commitDocument(editor.getDocument());
}
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java
index b409014c1fe8..661d0abfcaac 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java
@@ -18,11 +18,14 @@ package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupItem;
import com.intellij.psi.PsiMethod;
-import com.intellij.psi.ResolveResult;
+import com.intellij.psi.PsiType;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
+import static com.intellij.util.ObjectUtils.assertNotNull;
+
/**
* @author peter
*/
@@ -38,13 +41,9 @@ public class JavaMethodMergingContributor extends CompletionContributor {
final LookupElement[] items = context.getItems();
if (items.length > 1) {
String commonName = null;
- LookupElement best = null;
final ArrayList<PsiMethod> allMethods = new ArrayList<PsiMethod>();
for (LookupElement item : items) {
- Object o = item.getObject();
- if (o instanceof ResolveResult) {
- o = ((ResolveResult)o).getElement();
- }
+ Object o = item.getPsiElement();
if (item.getUserData(LookupItem.FORCE_SHOW_SIGNATURE_ATTR) != null || !(o instanceof PsiMethod)) {
return AutoCompletionDecision.SHOW_LOOKUP;
}
@@ -56,19 +55,37 @@ public class JavaMethodMergingContributor extends CompletionContributor {
return AutoCompletionDecision.SHOW_LOOKUP;
}
- if (best == null && method.getParameterList().getParametersCount() > 0) {
- best = item;
- }
commonName = name;
allMethods.add(method);
item.putUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE, allMethods);
}
- if (best == null) {
- best = items[0];
- }
- return AutoCompletionDecision.insertItem(best);
+
+ return AutoCompletionDecision.insertItem(findBestOverload(items));
}
return super.handleAutoCompletionPossibility(context);
}
+
+ public static LookupElement findBestOverload(LookupElement[] items) {
+ LookupElement best = items[0];
+ for (int i = 1; i < items.length; i++) {
+ LookupElement item = items[i];
+ if (getPriority(best) < getPriority(item)) {
+ best = item;
+ }
+ }
+ return best;
+ }
+
+ private static int getPriority(LookupElement element) {
+ PsiMethod method = assertNotNull(getItemMethod(element));
+ return (method.getReturnType() == PsiType.VOID ? 0 : 1) +
+ (method.getParameterList().getParametersCount() > 0 ? 2 : 0);
+ }
+
+ @Nullable
+ private static PsiMethod getItemMethod(LookupElement item) {
+ Object o = item.getPsiElement();
+ return o instanceof PsiMethod ? (PsiMethod)o : null;
+ }
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java
index f36f567199a0..ceebdecdf8c3 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java
@@ -20,6 +20,7 @@ import com.intellij.codeInsight.completion.impl.BetterPrefixMatcher;
import com.intellij.codeInsight.completion.impl.CamelHumpMatcher;
import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.LookupElement;
+import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
@@ -41,7 +42,6 @@ import static com.intellij.patterns.PsiJavaPatterns.psiElement;
* @author peter
*/
public class JavaNoVariantsDelegator extends CompletionContributor {
-
@Override
public void fillCompletionVariants(@NotNull final CompletionParameters parameters, @NotNull CompletionResultSet result) {
LinkedHashSet<CompletionResult> plainResults = result.runRemainingContributors(parameters, true);
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java
index abcff2238c68..5edd1973cfd8 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java
@@ -51,7 +51,7 @@ public class CreateAbstractMethodFromUsageFix extends CreateMethodFromUsageFix {
}
@Override
- protected boolean shouldBeAbstract(PsiClass targetClass) {
+ protected boolean shouldBeAbstract(PsiReferenceExpression expression, PsiClass targetClass) {
return true;
}
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFieldFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFieldFromUsageFix.java
index 939b8b6f8a13..1e9d1a88cb99 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFieldFromUsageFix.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFieldFromUsageFix.java
@@ -28,6 +28,9 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* @author Mike
*/
@@ -45,6 +48,19 @@ public class CreateFieldFromUsageFix extends CreateVarFromUsageFix {
return false;
}
+ @NotNull
+ @Override
+ protected List<PsiClass> getTargetClasses(PsiElement element) {
+ final List<PsiClass> targetClasses = new ArrayList<PsiClass>();
+ for (PsiClass psiClass : super.getTargetClasses(element)) {
+ if (psiClass.getManager().isInProject(psiClass) &&
+ (!psiClass.isInterface() && !psiClass.isAnnotationType() || shouldCreateStaticMember(myReferenceExpression, psiClass))) {
+ targetClasses.add(psiClass);
+ }
+ }
+ return targetClasses;
+ }
+
@Override
protected boolean canBeTargetClass(PsiClass psiClass) {
return psiClass.getManager().isInProject(psiClass) && !psiClass.isInterface() && !psiClass.isAnnotationType();
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java
index c12fbe8d7711..09b83e2a489f 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java
@@ -168,6 +168,9 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction {
list.deleteChildRange(list.getFirstChild(), list.getLastChild());
return;
}
+ if (targetClass.isInterface()) {
+ return;
+ }
final String visibility = getVisibility(parentClass, targetClass);
if (VisibilityUtil.ESCALATE_VISIBILITY.equals(visibility)) {
list.setModifierProperty(PsiModifier.PRIVATE, true);
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java
index b7cd8af73084..8e93a6a0c817 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java
@@ -120,7 +120,7 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix {
PsiMethodCallExpression call = getMethodCall();
if (call == null) return Collections.emptyList();
for (PsiClass target : targets) {
- if (target.isInterface() && shouldCreateStaticMember(call.getMethodExpression(), target)) continue;
+ if (target.isInterface() && shouldCreateStaticMember(call.getMethodExpression(), target) && !PsiUtil.isLanguageLevel8OrHigher(target)) continue;
if (!isMethodSignatureExists(call, target)) {
result.add(target);
}
@@ -155,7 +155,8 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix {
PsiCodeBlock body = method.getBody();
assert body != null;
- if (shouldBeAbstract(targetClass)) {
+ final boolean shouldBeAbstract = shouldBeAbstract(expression.getMethodExpression(), targetClass);
+ if (shouldBeAbstract) {
body.delete();
if (!targetClass.isInterface()) {
method.getModifierList().setModifierProperty(PsiModifier.ABSTRACT, true);
@@ -167,14 +168,14 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix {
expression = getMethodCall();
LOG.assertTrue(expression.isValid());
- if (!targetClass.isInterface() && shouldCreateStaticMember(expression.getMethodExpression(), targetClass) && !shouldBeAbstract(targetClass)) {
+ if ((!targetClass.isInterface() || PsiUtil.isLanguageLevel8OrHigher(targetClass)) && shouldCreateStaticMember(expression.getMethodExpression(), targetClass) && !shouldBeAbstract) {
PsiUtil.setModifierProperty(method, PsiModifier.STATIC, true);
}
final PsiElement context = PsiTreeUtil.getParentOfType(expression, PsiClass.class, PsiMethod.class);
PsiExpression[] arguments = expression.getArgumentList().getExpressions();
- doCreate(targetClass, method, shouldBeAbstract(targetClass),
+ doCreate(targetClass, method, shouldBeAbstract,
ContainerUtil.map2List(arguments, Pair.<PsiExpression, PsiType>createFunction(null)),
getTargetSubstitutor(expression),
CreateFromUsageUtils.guessExpectedTypes(expression, true),
@@ -213,7 +214,7 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix {
public static void doCreate(PsiClass targetClass, PsiMethod method, List<Pair<PsiExpression, PsiType>> arguments, PsiSubstitutor substitutor,
ExpectedTypeInfo[] expectedTypes, @Nullable PsiElement context) {
- doCreate(targetClass, method, shouldBeAbstractImpl(targetClass), arguments, substitutor, expectedTypes, context);
+ doCreate(targetClass, method, shouldBeAbstractImpl(null, targetClass), arguments, substitutor, expectedTypes, context);
}
public static void doCreate(PsiClass targetClass,
@@ -340,12 +341,12 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix {
return false;
}
- protected boolean shouldBeAbstract(PsiClass targetClass) {
- return shouldBeAbstractImpl(targetClass);
+ protected boolean shouldBeAbstract(PsiReferenceExpression expression, PsiClass targetClass) {
+ return shouldBeAbstractImpl(expression, targetClass);
}
- private static boolean shouldBeAbstractImpl(PsiClass targetClass) {
- return targetClass.isInterface();
+ private static boolean shouldBeAbstractImpl(PsiReferenceExpression expression, PsiClass targetClass) {
+ return targetClass.isInterface() && (expression == null || !shouldCreateStaticMember(expression, targetClass));
}
@Override
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFix.java
index b5de7b73e318..fec3efd161ba 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFix.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFix.java
@@ -30,6 +30,7 @@ import com.intellij.psi.*;
import com.intellij.psi.util.ClassUtil;
import org.jetbrains.annotations.NotNull;
+import java.util.Collections;
import java.util.List;
public class ImportClassFix extends ImportClassFixBase<PsiJavaCodeReferenceElement, PsiJavaCodeReferenceElement> {
@@ -107,9 +108,22 @@ public class ImportClassFix extends ImportClassFixBase<PsiJavaCodeReferenceEleme
return super.getRequiredMemberName(reference);
}
+ @Override
+ protected boolean canReferenceClass(PsiJavaCodeReferenceElement ref) {
+ if (ref instanceof PsiReferenceExpression) {
+ PsiElement parent = ref.getParent();
+ return parent instanceof PsiReferenceExpression || parent instanceof PsiExpressionStatement;
+ }
+ return true;
+ }
+
@NotNull
@Override
protected List<PsiClass> filterByContext(@NotNull List<PsiClass> candidates, @NotNull PsiJavaCodeReferenceElement ref) {
+ if (ref instanceof PsiReferenceExpression) {
+ return Collections.emptyList();
+ }
+
PsiElement typeElement = ref.getParent();
if (typeElement instanceof PsiTypeElement) {
PsiElement var = typeElement.getParent();
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java
index 8047486d93ba..2fbe85bc7b25 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java
@@ -102,14 +102,19 @@ public abstract class ImportClassFixBase<T extends PsiElement, R extends PsiRefe
// can happen when e.g. class name happened to be in a method position
if (element instanceof PsiClass && result.isValidResult()) return Collections.emptyList();
}
- PsiShortNamesCache cache = PsiShortNamesCache.getInstance(myElement.getProject());
+
String name = getReferenceName(myRef);
GlobalSearchScope scope = myElement.getResolveScope();
if (name == null) {
return Collections.emptyList();
}
+
+ if (!canReferenceClass(myRef)) {
+ return Collections.emptyList();
+ }
+
boolean referenceHasTypeParameters = hasTypeParameters(myRef);
- PsiClass[] classes = cache.getClassesByName(name, scope);
+ PsiClass[] classes = PsiShortNamesCache.getInstance(myElement.getProject()).getClassesByName(name, scope);
if (classes.length == 0) return Collections.emptyList();
List<PsiClass> classList = new ArrayList<PsiClass>(classes.length);
boolean isAnnotationReference = myElement.getParent() instanceof PsiAnnotation;
@@ -140,6 +145,10 @@ public abstract class ImportClassFixBase<T extends PsiElement, R extends PsiRefe
return classList;
}
+ protected boolean canReferenceClass(R ref) {
+ return true;
+ }
+
private List<PsiClass> filterByRequiredMemberName(List<PsiClass> classList) {
final String memberName = getRequiredMemberName(myElement);
if (memberName != null) {
diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/JavaSmartEnterProcessor.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/JavaSmartEnterProcessor.java
index cea07113fe24..90c26bc6073b 100644
--- a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/JavaSmartEnterProcessor.java
+++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/JavaSmartEnterProcessor.java
@@ -47,7 +47,21 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.editorActions.smartEnter.JavaSmartEnterProcessor");
private static final Fixer[] ourFixers;
- private static final EnterProcessor[] ourEnterProcessors;
+ private static final EnterProcessor[] ourEnterProcessors = {
+ new CommentBreakerEnterProcessor(),
+ new AfterSemicolonEnterProcessor(),
+ new LeaveCodeBlockEnterProcessor(),
+ new PlainEnterProcessor()
+ };
+ private static final EnterProcessor[] ourAfterCompletionEnterProcessors = {
+ new AfterSemicolonEnterProcessor(),
+ new EnterProcessor() {
+ @Override
+ public boolean doEnter(Editor editor, PsiElement psiElement, boolean isModified) {
+ return PlainEnterProcessor.expandCodeBlock(editor, psiElement);
+ }
+ }
+ };
static {
final List<Fixer> fixers = new ArrayList<Fixer>();
@@ -78,15 +92,7 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor {
fixers.add(new MissingArrayInitializerBraceFixer());
fixers.add(new MissingArrayConstructorBracketFixer());
fixers.add(new EnumFieldFixer());
- //ourFixers.add(new CompletionFixer());
ourFixers = fixers.toArray(new Fixer[fixers.size()]);
-
- List<EnterProcessor> processors = new ArrayList<EnterProcessor>();
- processors.add(new CommentBreakerEnterProcessor());
- processors.add(new AfterSemicolonEnterProcessor());
- processors.add(new LeaveCodeBlockEnterProcessor());
- processors.add(new PlainEnterProcessor());
- ourEnterProcessors = processors.toArray(new EnterProcessor[processors.size()]);
}
private int myFirstErrorOffset = Integer.MAX_VALUE;
@@ -102,13 +108,22 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor {
public boolean process(@NotNull final Project project, @NotNull final Editor editor, @NotNull final PsiFile psiFile) {
FeatureUsageTracker.getInstance().triggerFeatureUsed("codeassists.complete.statement");
+ return invokeProcessor(editor, psiFile, false);
+ }
+
+ @Override
+ public boolean processAfterCompletion(@NotNull Editor editor, @NotNull PsiFile psiFile) {
+ return invokeProcessor(editor, psiFile, true);
+ }
+
+ private boolean invokeProcessor(Editor editor, PsiFile psiFile, boolean afterCompletion) {
final Document document = editor.getDocument();
- final String textForRollback = document.getText();
+ final CharSequence textForRollback = document.getImmutableCharSequence();
try {
editor.putUserData(SMART_ENTER_TIMESTAMP, editor.getDocument().getModificationStamp());
myFirstErrorOffset = Integer.MAX_VALUE;
mySkipEnter = false;
- process(project, editor, psiFile, 0);
+ process(editor, psiFile, 0, afterCompletion);
}
catch (TooManyAttemptsException e) {
document.replaceString(0, document.getTextLength(), textForRollback);
@@ -118,8 +133,7 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor {
return true;
}
-
- private void process(@NotNull final Project project, @NotNull final Editor editor, @NotNull final PsiFile file, final int attempt) throws TooManyAttemptsException {
+ private void process(@NotNull final Editor editor, @NotNull final PsiFile file, final int attempt, boolean afterCompletion) throws TooManyAttemptsException {
if (attempt > MAX_ATTEMPTS) throw new TooManyAttemptsException();
try {
@@ -148,18 +162,18 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor {
for (PsiElement psiElement : queue) {
for (Fixer fixer : ourFixers) {
fixer.apply(editor, this, psiElement);
- if (LookupManager.getInstance(project).getActiveLookup() != null) {
+ if (LookupManager.getInstance(file.getProject()).getActiveLookup() != null) {
return;
}
- if (isUncommited(project) || !psiElement.isValid()) {
+ if (isUncommited(file.getProject()) || !psiElement.isValid()) {
moveCaretInsideBracesIfAny(editor, file);
- process(project, editor, file, attempt + 1);
+ process(editor, file, attempt + 1, afterCompletion);
return;
}
}
}
- doEnter(atCaret, editor);
+ doEnter(atCaret, editor, afterCompletion);
}
catch (IncorrectOperationException e) {
LOG.error(e);
@@ -187,7 +201,7 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor {
}
- private void doEnter(PsiElement atCaret, Editor editor) throws IncorrectOperationException {
+ private void doEnter(PsiElement atCaret, Editor editor, boolean afterCompletion) throws IncorrectOperationException {
final PsiFile psiFile = atCaret.getContainingFile();
final RangeMarker rangeMarker = createRangeMarker(atCaret);
@@ -205,7 +219,7 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor {
}
atCaret = CodeInsightUtil.findElementInRange(psiFile, rangeMarker.getStartOffset(), rangeMarker.getEndOffset(), atCaret.getClass());
- for (EnterProcessor processor : ourEnterProcessors) {
+ for (EnterProcessor processor : afterCompletion ? ourAfterCompletionEnterProcessors : ourEnterProcessors) {
if(atCaret == null){
// Can't restore element at caret after enter processor execution!
break;
@@ -214,7 +228,7 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor {
if (processor.doEnter(editor, atCaret, isModified(editor))) return;
}
- if (!isModified(editor)) {
+ if (!isModified(editor) && !afterCompletion) {
plainEnter(editor);
} else {
if (myFirstErrorOffset == Integer.MAX_VALUE) {
diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/PlainEnterProcessor.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/PlainEnterProcessor.java
index 0fe58925d884..6bafcc00d983 100644
--- a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/PlainEnterProcessor.java
+++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/PlainEnterProcessor.java
@@ -42,29 +42,37 @@ import org.jetbrains.annotations.Nullable;
public class PlainEnterProcessor implements EnterProcessor {
@Override
public boolean doEnter(Editor editor, PsiElement psiElement, boolean isModified) {
+ if (expandCodeBlock(editor, psiElement)) return true;
+
+ getEnterHandler(IdeActions.ACTION_EDITOR_START_NEW_LINE).execute(editor, ((EditorEx)editor).getDataContext());
+ return true;
+ }
+
+ static boolean expandCodeBlock(Editor editor, PsiElement psiElement) {
PsiCodeBlock block = getControlStatementBlock(editor.getCaretModel().getOffset(), psiElement);
if (processExistingBlankLine(editor, block, psiElement)) {
return true;
}
- EditorActionHandler enterHandler = getEnterHandler(IdeActions.ACTION_EDITOR_START_NEW_LINE);
- if (block != null) {
- PsiElement firstElement = block.getFirstBodyElement();
- if (firstElement == null) {
- firstElement = block.getRBrace();
- // Plain enter processor inserts enter after the end of line, hence, we don't want to use it here because the line ends with
- // the empty braces block. So, we get the following in case of default handler usage:
- // Before:
- // if (condition[caret]) {}
- // After:
- // if (condition) {}
- // [caret]
- enterHandler = getEnterHandler(IdeActions.ACTION_EDITOR_ENTER);
- }
- editor.getCaretModel().moveToOffset(firstElement != null ?
- firstElement.getTextRange().getStartOffset() :
- block.getTextRange().getEndOffset());
+ if (block == null) {
+ return false;
}
+ EditorActionHandler enterHandler = getEnterHandler(IdeActions.ACTION_EDITOR_START_NEW_LINE);
+ PsiElement firstElement = block.getFirstBodyElement();
+ if (firstElement == null) {
+ firstElement = block.getRBrace();
+ // Plain enter processor inserts enter after the end of line, hence, we don't want to use it here because the line ends with
+ // the empty braces block. So, we get the following in case of default handler usage:
+ // Before:
+ // if (condition[caret]) {}
+ // After:
+ // if (condition) {}
+ // [caret]
+ enterHandler = getEnterHandler(IdeActions.ACTION_EDITOR_ENTER);
+ }
+ editor.getCaretModel().moveToOffset(firstElement != null ?
+ firstElement.getTextRange().getStartOffset() :
+ block.getTextRange().getEndOffset());
enterHandler.execute(editor, ((EditorEx)editor).getDataContext());
return true;
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilder.java b/java/java-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilder.java
index 8646805b3a2f..5d948f326930 100644
--- a/java/java-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilder.java
+++ b/java/java-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilder.java
@@ -17,6 +17,7 @@ package com.intellij.codeInsight.folding.impl;
import com.intellij.codeInsight.ExpectedTypeInfo;
import com.intellij.codeInsight.ExpectedTypesProvider;
+import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleSettings;
@@ -27,7 +28,7 @@ public class JavaFoldingBuilder extends JavaFoldingBuilderBase {
@Override
protected boolean isBelowRightMargin(Project project, int lineLength) {
final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(project);
- return lineLength <= settings.RIGHT_MARGIN;
+ return lineLength <= settings.getRightMargin(JavaLanguage.INSTANCE);
}
@Override
diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateDelegateHandler.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateDelegateHandler.java
index 4236da3187fc..fe4208deada7 100644
--- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateDelegateHandler.java
+++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateDelegateHandler.java
@@ -251,11 +251,22 @@ public class GenerateDelegateHandler implements LanguageCodeInsightActionHandler
final Set<MethodSignature> existingSignatures = new HashSet<MethodSignature>(aClass.getVisibleSignatures());
final Set<PsiMethodMember> selection = new HashSet<PsiMethodMember>();
Map<PsiClass, PsiSubstitutor> superSubstitutors = new HashMap<PsiClass, PsiSubstitutor>();
+
+ final PsiClass containingClass = targetMember.getContainingClass();
JavaPsiFacade facade = JavaPsiFacade.getInstance(target.getProject());
for (PsiMethod method : allMethods) {
final PsiClass superClass = method.getContainingClass();
if (CommonClassNames.JAVA_LANG_OBJECT.equals(superClass.getQualifiedName())) continue;
if (method.isConstructor()) continue;
+
+ //do not suggest to override final method
+ if (method.hasModifierProperty(PsiModifier.FINAL)) {
+ PsiMethod overridden = containingClass.findMethodBySignature(method, true);
+ if (overridden != null && overridden.getContainingClass() != containingClass) {
+ continue;
+ }
+ }
+
PsiSubstitutor superSubstitutor = superSubstitutors.get(superClass);
if (superSubstitutor == null) {
superSubstitutor = TypeConversionUtil.getSuperClassSubstitutor(superClass, targetClass, substitutor);
diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java
index d8df67367790..49e2e43f2ce4 100644
--- a/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java
+++ b/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java
@@ -15,10 +15,7 @@
*/
package com.intellij.codeInsight.generation;
-import com.intellij.codeInsight.AnnotationUtil;
-import com.intellij.codeInsight.CodeInsightActionHandler;
-import com.intellij.codeInsight.CodeInsightBundle;
-import com.intellij.codeInsight.MethodImplementor;
+import com.intellij.codeInsight.*;
import com.intellij.codeInsight.intention.AddAnnotationFix;
import com.intellij.codeInsight.intention.AddAnnotationPsiFix;
import com.intellij.featureStatistics.FeatureUsageTracker;
@@ -259,6 +256,11 @@ public class OverrideImplementUtil extends OverrideImplementExploreUtil {
for (String annotation : each.getAnnotations(project)) {
if (moduleScope != null && facade.findClass(annotation, moduleScope) == null) continue;
if (AnnotationUtil.isAnnotated(overridden, annotation, false, false) && !AnnotationUtil.isAnnotated(method, annotation, false, false)) {
+ PsiAnnotation psiAnnotation = AnnotationUtil.findAnnotation(overridden, annotation);
+ if (psiAnnotation != null && AnnotationUtil.isInferredAnnotation(psiAnnotation)) {
+ continue;
+ }
+
AddAnnotationPsiFix.removePhysicalAnnotations(method, each.annotationsToRemove(project, annotation));
AddAnnotationPsiFix.addPhysicalAnnotation(annotation, PsiNameValuePair.EMPTY_ARRAY, method.getModifierList());
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java b/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java
index b33287321535..fd85d1124171 100644
--- a/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java
+++ b/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java
@@ -23,6 +23,7 @@ import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.lang.parameterInfo.*;
import com.intellij.openapi.project.DumbAware;
+import com.intellij.openapi.project.DumbService;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.CompletionParameterTypeInferencePolicy;
import com.intellij.psi.infos.CandidateInfo;
@@ -31,6 +32,7 @@ import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.psi.util.PsiUtilBase;
import com.intellij.util.ArrayUtil;
+import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -443,13 +445,18 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc
private static void appendModifierList(@NotNull StringBuilder buffer, @NotNull PsiModifierListOwner owner) {
int lastSize = buffer.length();
- for (PsiAnnotation annotation : AnnotationUtil.getAllAnnotations(owner, false, null)) {
+ Set<String> shownAnnotations = ContainerUtil.newHashSet();
+ for (PsiAnnotation annotation : AnnotationUtil.getAllAnnotations(owner, false, null, !DumbService.isDumb(owner.getProject()))) {
final PsiJavaCodeReferenceElement element = annotation.getNameReferenceElement();
if (element != null) {
final PsiElement resolved = element.resolve();
if (resolved instanceof PsiClass && !AnnotationUtil.isAnnotated((PsiClass)resolved, "java.lang.annotation.Documented", false)) continue;
+
+ String referenceName = element.getReferenceName();
+ if (!shownAnnotations.add(referenceName)) continue;
+
if (lastSize != buffer.length()) buffer.append(" ");
- buffer.append("@").append(element.getReferenceName());
+ buffer.append("@").append(referenceName);
}
}
if (lastSize != buffer.length()) buffer.append(" ");
diff --git a/java/java-impl/src/com/intellij/codeInsight/template/impl/ShortenToStaticImportProcessor.java b/java/java-impl/src/com/intellij/codeInsight/template/impl/ShortenToStaticImportProcessor.java
index 41424cf2b526..fbb6786c4972 100644
--- a/java/java-impl/src/com/intellij/codeInsight/template/impl/ShortenToStaticImportProcessor.java
+++ b/java/java-impl/src/com/intellij/codeInsight/template/impl/ShortenToStaticImportProcessor.java
@@ -27,11 +27,11 @@ import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
+import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtilBase;
import com.intellij.psi.util.PsiUtilCore;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
@@ -63,7 +63,7 @@ public class ShortenToStaticImportProcessor implements TemplateOptionalProcessor
for (
PsiElement element = PsiUtilCore.getElementAtOffset(file, templateRange.getStartOffset());
element != null && element.getTextRange().getStartOffset() < templateRange.getEndOffset();
- element = getNext(element))
+ element = PsiTreeUtil.nextLeaf(element))
{
for (StaticImporter importer : IMPORTERS) {
if (importer.canPerform(element)) {
@@ -81,15 +81,6 @@ public class ShortenToStaticImportProcessor implements TemplateOptionalProcessor
}
}
- @Nullable
- private static PsiElement getNext(@NotNull PsiElement element) {
- PsiElement result = element.getNextSibling();
- for (PsiElement current = element; current != null && result == null; current = current.getParent()) {
- result = current.getNextSibling();
- }
- return result;
- }
-
@Nls
@Override
public String getOptionName() {
diff --git a/java/java-impl/src/com/intellij/codeInsight/unwrap/JavaMethodParameterUnwrapper.java b/java/java-impl/src/com/intellij/codeInsight/unwrap/JavaMethodParameterUnwrapper.java
index ec771e43c073..1c1957bcf472 100644
--- a/java/java-impl/src/com/intellij/codeInsight/unwrap/JavaMethodParameterUnwrapper.java
+++ b/java/java-impl/src/com/intellij/codeInsight/unwrap/JavaMethodParameterUnwrapper.java
@@ -29,15 +29,23 @@ public class JavaMethodParameterUnwrapper extends JavaUnwrapper {
super("");
}
+ private static PsiElement adjustElementToTheLeft(PsiElement element) {
+ if (element instanceof PsiJavaToken && ((PsiJavaToken)element).getTokenType() == JavaTokenType.RPARENTH) {
+ return element.getPrevSibling();
+ }
+ return element;
+ }
+
@Override
public String getDescription(PsiElement e) {
- String text = e.getText();
+ String text = adjustElementToTheLeft(e).getText();
if (text.length() > 20) text = text.substring(0, 17) + "...";
return CodeInsightBundle.message("unwrap.with.placeholder", text);
}
@Override
public boolean isApplicableTo(PsiElement e) {
+ e = adjustElementToTheLeft(e);
final PsiElement parent = e.getParent();
if (e instanceof PsiExpression){
if (parent instanceof PsiExpressionList) {
@@ -62,6 +70,7 @@ public class JavaMethodParameterUnwrapper extends JavaUnwrapper {
@Override
public PsiElement collectAffectedElements(PsiElement e, List<PsiElement> toExtract) {
+ e = adjustElementToTheLeft(e);
super.collectAffectedElements(e, toExtract);
return isTopLevelCall(e) ? e.getParent() : e.getParent().getParent();
}
@@ -73,6 +82,7 @@ public class JavaMethodParameterUnwrapper extends JavaUnwrapper {
@Override
protected void doUnwrap(PsiElement element, Context context) throws IncorrectOperationException {
+ element = adjustElementToTheLeft(element);
PsiElement methodCall = isTopLevelCall(element) ? element.getParent() : element.getParent().getParent();
final PsiElement extractedElement = isTopLevelCall(element) ? getArg(element) : element;
context.extractElement(extractedElement, methodCall);
diff --git a/java/java-impl/src/com/intellij/ide/projectView/impl/nodes/PackageUtil.java b/java/java-impl/src/com/intellij/ide/projectView/impl/nodes/PackageUtil.java
index e9e999b7b149..bcb4b3d20319 100644
--- a/java/java-impl/src/com/intellij/ide/projectView/impl/nodes/PackageUtil.java
+++ b/java/java-impl/src/com/intellij/ide/projectView/impl/nodes/PackageUtil.java
@@ -21,8 +21,6 @@ import com.intellij.ide.util.treeView.TreeViewUtil;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.*;
-import com.intellij.openapi.roots.impl.DirectoryIndex;
-import com.intellij.openapi.roots.impl.DirectoryInfo;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.JavaDirectoryService;
@@ -230,20 +228,16 @@ public class PackageUtil {
}
private static class ProjectLibrariesSearchScope extends GlobalSearchScope {
- private final DirectoryIndex myDirectoryIndex;
+ private final ProjectFileIndex myFileIndex;
public ProjectLibrariesSearchScope(@NotNull Project project) {
super(project);
- myDirectoryIndex = DirectoryIndex.getInstance(project);
+ myFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
}
@Override
public boolean contains(@NotNull VirtualFile file) {
- VirtualFile dir = file.isDirectory() ? file : file.getParent();
- if (dir == null) return false;
-
- DirectoryInfo info = myDirectoryIndex.getInfoForDirectory(dir);
- return info != null && info.hasLibraryClassRoot();
+ return myFileIndex.isInLibraryClasses(file);
}
@Override
diff --git a/java/java-impl/src/com/intellij/ide/util/PackageUtil.java b/java/java-impl/src/com/intellij/ide/util/PackageUtil.java
index be9405ee4754..0530f34e653a 100644
--- a/java/java-impl/src/com/intellij/ide/util/PackageUtil.java
+++ b/java/java-impl/src/com/intellij/ide/util/PackageUtil.java
@@ -24,14 +24,12 @@ import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.projectRoots.impl.ProjectRootUtil;
-import com.intellij.openapi.roots.ModulePackageIndex;
-import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.roots.ProjectFileIndex;
-import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.ui.configuration.CommonContentEntriesEditor;
import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Computable;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
@@ -52,13 +50,29 @@ public class PackageUtil {
@Nullable
public static PsiDirectory findPossiblePackageDirectoryInModule(Module module, String packageName) {
+ return findPossiblePackageDirectoryInModule(module, packageName, true);
+ }
+ @Nullable
+ public static PsiDirectory findPossiblePackageDirectoryInModule(Module module, String packageName, boolean preferNonGeneratedRoots) {
+ final Project project = module.getProject();
PsiDirectory psiDirectory = null;
- if (!"".equals(packageName)) {
- PsiPackage rootPackage = findLongestExistingPackage(module.getProject(), packageName);
+ if (!StringUtil.isEmptyOrSpaces(packageName)) {
+ PsiPackage rootPackage = findLongestExistingPackage(project, packageName);
if (rootPackage != null) {
final PsiDirectory[] psiDirectories = getPackageDirectoriesInModule(rootPackage, module);
if (psiDirectories.length > 0) {
psiDirectory = psiDirectories[0];
+
+ // If we prefer to find a non-generated PsiDirectory for the given package name, search through all
+ // the directories for the first dir not marked as generated and use that one instead
+ if (preferNonGeneratedRoots && psiDirectories.length > 1) {
+ for (PsiDirectory dir : psiDirectories) {
+ if (!GeneratedSourcesFilter.isGeneratedSourceByAnyFilter(dir.getVirtualFile(), project)) {
+ psiDirectory = dir;
+ break;
+ }
+ }
+ }
}
}
}
@@ -66,7 +80,7 @@ public class PackageUtil {
if (checkSourceRootsConfigured(module)) {
final List<VirtualFile> sourceRoots = ModuleRootManager.getInstance(module).getSourceRoots(JavaModuleSourceRootTypes.SOURCES);
for (VirtualFile sourceRoot : sourceRoots) {
- final PsiDirectory directory = PsiManager.getInstance(module.getProject()).findDirectory(sourceRoot);
+ final PsiDirectory directory = PsiManager.getInstance(project).findDirectory(sourceRoot);
if (directory != null) {
psiDirectory = directory;
break;
diff --git a/java/java-impl/src/com/intellij/openapi/roots/impl/JavaLanguageLevelPusher.java b/java/java-impl/src/com/intellij/openapi/roots/impl/JavaLanguageLevelPusher.java
index d933576fc697..a4e7b64241f3 100644
--- a/java/java-impl/src/com/intellij/openapi/roots/impl/JavaLanguageLevelPusher.java
+++ b/java/java-impl/src/com/intellij/openapi/roots/impl/JavaLanguageLevelPusher.java
@@ -86,7 +86,7 @@ public class JavaLanguageLevelPusher implements FilePropertyPusher<LanguageLevel
private static final FileAttribute PERSISTENCE = new FileAttribute("language_level_persistence", 3, true);
@Override
- public void persistAttribute(@NotNull VirtualFile fileOrDir, @NotNull LanguageLevel level) throws IOException {
+ public void persistAttribute(@NotNull Project project, @NotNull VirtualFile fileOrDir, @NotNull LanguageLevel level) throws IOException {
final DataInputStream iStream = PERSISTENCE.readAttribute(fileOrDir);
if (iStream != null) {
try {
@@ -104,7 +104,7 @@ public class JavaLanguageLevelPusher implements FilePropertyPusher<LanguageLevel
for (VirtualFile child : fileOrDir.getChildren()) {
if (!child.isDirectory() && StdFileTypes.JAVA.equals(child.getFileType())) {
- PushedFilePropertiesUpdater.filePropertiesChanged(child);
+ PushedFilePropertiesUpdater.getInstance(project).filePropertiesChanged(child);
}
}
}
diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java b/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java
index b76aeaa4b3fd..28748028c246 100644
--- a/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java
+++ b/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java
@@ -44,6 +44,7 @@ import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.java.IJavaElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.containers.ConcurrentHashMap;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
@@ -229,7 +230,7 @@ public class JavaSpacePropertyProcessor extends JavaElementVisitor {
new TextRange(dependanceStart, myChild1.getTextRange().getEndOffset()),
keepOneLine, true);
}
- else if (myRole1 == ChildRole.LBRACE) {
+ else if (myRole1 == ChildRole.LBRACE || isEndOfLineCommentAfterLBrace(myChild1)) {
if (aClass.isEnum()) {
createParenthSpace(true, false);
}
@@ -275,6 +276,19 @@ public class JavaSpacePropertyProcessor extends JavaElementVisitor {
}
}
+ private boolean isEndOfLineCommentAfterLBrace(@NotNull ASTNode node) {
+ if (node.getPsi() instanceof PsiComment) {
+ PsiElement ws = node.getPsi().getPrevSibling();
+ if (ws instanceof PsiWhiteSpace && !ws.textContains('\n')) {
+ PsiElement beforeWs = ws.getPrevSibling();
+ if (beforeWs instanceof PsiJavaToken && ((PsiJavaToken)beforeWs).getTokenType() == JavaTokenType.LBRACE) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
private static boolean isTheOnlyClassMember(final ASTNode node) {
ASTNode next = node.getTreeNext();
if (next == null || !(next.getElementType() == JavaTokenType.RBRACE)) return false;
diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaCodeBlockModificationListener.java b/java/java-impl/src/com/intellij/psi/impl/JavaCodeBlockModificationListener.java
index 18be9cd12246..314f55c2f7fe 100644
--- a/java/java-impl/src/com/intellij/psi/impl/JavaCodeBlockModificationListener.java
+++ b/java/java-impl/src/com/intellij/psi/impl/JavaCodeBlockModificationListener.java
@@ -16,6 +16,7 @@
package com.intellij.psi.impl;
import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.jsp.jspXml.JspDirective;
import com.intellij.psi.util.PsiModificationTracker;
@@ -90,7 +91,8 @@ public class JavaCodeBlockModificationListener implements PsiTreeChangePreproces
}
private static boolean isSourceDir(PsiElement element) {
- return element instanceof PsiDirectory && JavaDirectoryService.getInstance().getPackage((PsiDirectory)element) != null;
+ return element instanceof PsiDirectory &&
+ ProjectFileIndex.SERVICE.getInstance(element.getProject()).isInSource(((PsiDirectory)element).getVirtualFile());
}
private static boolean isClassOwner(final PsiElement element) {
diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaDirectoryIconProvider.java b/java/java-impl/src/com/intellij/psi/impl/JavaDirectoryIconProvider.java
index 795e66e01ed4..e87e95f79086 100644
--- a/java/java-impl/src/com/intellij/psi/impl/JavaDirectoryIconProvider.java
+++ b/java/java-impl/src/com/intellij/psi/impl/JavaDirectoryIconProvider.java
@@ -15,6 +15,7 @@
*/
package com.intellij.psi.impl;
+import com.intellij.icons.AllIcons;
import com.intellij.ide.IconProvider;
import com.intellij.ide.projectView.impl.ProjectRootsUtil;
import com.intellij.openapi.module.Module;
@@ -24,6 +25,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.roots.SourceFolder;
import com.intellij.openapi.roots.ui.configuration.SourceRootPresentation;
+import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.JavaDirectoryService;
@@ -68,6 +70,9 @@ public class JavaDirectoryIconProvider extends IconProvider implements DumbAware
else if (JavaDirectoryService.getInstance().getPackage(psiDirectory) != null) {
symbolIcon = PlatformIcons.PACKAGE_ICON;
}
+ else if (!Registry.is("ide.hide.excluded.files") && ProjectRootManager.getInstance(project).getFileIndex().isExcluded(vFile)) {
+ symbolIcon = AllIcons.Modules.ExcludeRoot;
+ }
else {
symbolIcon = PlatformIcons.DIRECTORY_CLOSED_ICON;
}
diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java
index 8ea592fd99aa..dce55fd952b5 100644
--- a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java
@@ -178,7 +178,7 @@ public class JavaPsiImplementationHelperImpl extends JavaPsiImplementationHelper
}
List<OrderEntry> orderEntries = index.getOrderEntriesForFile(virtualFile);
if (orderEntries.isEmpty()) {
- LOG.error("Inconsistent: " + DirectoryIndex.getInstance(myProject).getInfoForDirectory(folder).toString());
+ LOG.error("Inconsistent: " + DirectoryIndex.getInstance(myProject).getInfoForFile(folder).toString());
}
final VirtualFile[] files = orderEntries.get(0).getFiles(OrderRootType.CLASSES);
for (VirtualFile rootFile : files) {
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/javadoc/JDParser.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/javadoc/JDParser.java
index b424af918851..f6dc9b9697f2 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/javadoc/JDParser.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/javadoc/JDParser.java
@@ -15,6 +15,7 @@
*/
package com.intellij.psi.impl.source.codeStyle.javadoc;
+import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.pom.java.LanguageLevel;
@@ -469,20 +470,21 @@ public class JDParser {
boolean firstLineShorter,
int firstLinePrefixLength)
{
+ int rightMargin = mySettings.getRightMargin(JavaLanguage.INSTANCE);
StringBuilder sb = new StringBuilder();
List<String> list;
//If wrap comments selected, comments should be wrapped by the right margin
if (mySettings.WRAP_COMMENTS) {
- list = toArrayWrapping(str, mySettings.RIGHT_MARGIN - prefix.length());
+ list = toArrayWrapping(str, rightMargin - prefix.length());
if (firstLineShorter
&& list != null && !list.isEmpty()
- && list.get(0).length() > mySettings.RIGHT_MARGIN - firstLinePrefixLength)
+ && list.get(0).length() > rightMargin - firstLinePrefixLength)
{
list = new ArrayList<String>();
//want the first line to be shorter, according to it's prefix
- String firstLine = toArrayWrapping(str, mySettings.RIGHT_MARGIN - firstLinePrefixLength).get(0);
+ String firstLine = toArrayWrapping(str, rightMargin - firstLinePrefixLength).get(0);
//so now first line is exactly same width we need
list.add(firstLine);
str = str.substring(firstLine.length());
@@ -493,7 +495,7 @@ public class JDParser {
}
//getting all another lines according to their prefix
- List<String> subList = toArrayWrapping(str, mySettings.RIGHT_MARGIN - prefix.length());
+ List<String> subList = toArrayWrapping(str, rightMargin - prefix.length());
//removing pre tag
if (unclosedPreTag && subList != null && !subList.isEmpty()) {
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaCharsetReferenceContributor.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaCharsetReferenceContributor.java
deleted file mode 100644
index db1a385d5137..000000000000
--- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaCharsetReferenceContributor.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2000-2014 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.intellij.psi.impl.source.resolve.reference.impl;
-
-import com.intellij.codeInsight.daemon.impl.analysis.encoding.EncodingReference;
-import com.intellij.psi.*;
-import com.intellij.psi.impl.source.resolve.reference.impl.manipulators.StringLiteralManipulator;
-import com.intellij.util.ProcessingContext;
-import org.jetbrains.annotations.NotNull;
-
-import java.nio.charset.Charset;
-
-import static com.intellij.patterns.PsiJavaPatterns.literalExpression;
-import static com.intellij.patterns.PsiJavaPatterns.psiMethod;
-import static com.intellij.patterns.StandardPatterns.string;
-
-/**
- * @author peter
- */
-public class JavaCharsetReferenceContributor extends PsiReferenceContributor {
- @Override
- public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) {
- registrar.registerReferenceProvider(
- literalExpression().methodCallParameter(
- 0, psiMethod().withName(string().oneOf("forName", "isSupported")).inClass(Charset.class.getName())),
- new PsiReferenceProvider() {
- @NotNull
- @Override
- public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
- PsiLiteralExpression literal = (PsiLiteralExpression)element;
- Object value = literal.getValue();
- if (value instanceof String) {
- return new PsiReference[]{new EncodingReference(element, (String)value, StringLiteralManipulator.getValueRange(literal))};
- }
- return PsiReference.EMPTY_ARRAY;
- }
- });
- }
-}
diff --git a/java/java-impl/src/com/intellij/psi/util/proximity/KnownElementWeigher.java b/java/java-impl/src/com/intellij/psi/util/proximity/KnownElementWeigher.java
index ffb122b1ca61..511d41f58986 100644
--- a/java/java-impl/src/com/intellij/psi/util/proximity/KnownElementWeigher.java
+++ b/java/java-impl/src/com/intellij/psi/util/proximity/KnownElementWeigher.java
@@ -20,14 +20,26 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.ProximityLocation;
+import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Set;
+
+import static com.intellij.psi.CommonClassNames.*;
+
/**
* @author peter
*/
public class KnownElementWeigher extends ProximityWeigher {
+ private static final Set<String> POPULAR_JDK_CLASSES = ContainerUtil.newHashSet(
+ JAVA_LANG_STRING,
+ JAVA_LANG_CLASS,
+ System.class.getName(), JAVA_LANG_RUNNABLE,
+ JAVA_LANG_EXCEPTION, JAVA_LANG_THROWABLE, JAVA_LANG_RUNTIME_EXCEPTION,
+ JAVA_UTIL_ARRAY_LIST, JAVA_UTIL_HASH_MAP, JAVA_UTIL_HASH_SET
+ );
@Override
public Comparable weigh(@NotNull final PsiElement element, @NotNull final ProximityLocation location) {
@@ -50,7 +62,7 @@ public class KnownElementWeigher extends ProximityWeigher {
if (containingClass != null) {
String methodName = method.getName();
if ("finalize".equals(methodName) || "registerNatives".equals(methodName) || methodName.startsWith("wait") || methodName.startsWith("notify")) {
- if (CommonClassNames.JAVA_LANG_OBJECT.equals(containingClass.getQualifiedName())) {
+ if (JAVA_LANG_OBJECT.equals(containingClass.getQualifiedName())) {
return -1;
}
}
@@ -58,11 +70,11 @@ public class KnownElementWeigher extends ProximityWeigher {
return -1;
}
if ("subSequence".equals(methodName)) {
- if (CommonClassNames.JAVA_LANG_STRING.equals(containingClass.getQualifiedName())) {
+ if (JAVA_LANG_STRING.equals(containingClass.getQualifiedName())) {
return -1;
}
}
- if (CommonClassNames.JAVA_LANG_OBJECT.equals(containingClass.getQualifiedName())) {
+ if (JAVA_LANG_OBJECT.equals(containingClass.getQualifiedName())) {
return 0;
}
return getJdkClassProximity(method.getContainingClass());
@@ -86,8 +98,8 @@ public class KnownElementWeigher extends ProximityWeigher {
@NonNls final String qname = element.getQualifiedName();
if (qname != null) {
String pkg = StringUtil.getPackageName(qname);
- if (qname.equals(CommonClassNames.JAVA_LANG_OBJECT)) return 5;
- if (isPopularJdkClass(qname)) return 8;
+ if (qname.equals(JAVA_LANG_OBJECT)) return 5;
+ if (POPULAR_JDK_CLASSES.contains(qname)) return 8;
if (pkg.equals("java.lang")) return 6;
if (pkg.equals("java.util")) return 7;
@@ -103,13 +115,4 @@ public class KnownElementWeigher extends ProximityWeigher {
return 0;
}
- private static boolean isPopularJdkClass(String qname) {
- return qname.equals(CommonClassNames.JAVA_LANG_STRING) ||
- qname.equals(System.class.getName()) ||
- qname.equals(CommonClassNames.JAVA_LANG_EXCEPTION) ||
- qname.equals(CommonClassNames.JAVA_LANG_THROWABLE) ||
- qname.equals(CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION) ||
- qname.equals(CommonClassNames.JAVA_LANG_RUNNABLE) ||
- qname.equals(CommonClassNames.JAVA_LANG_CLASS);
- }
} \ No newline at end of file
diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java
index 8a9eca38a529..6a44f2529284 100644
--- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java
@@ -15,7 +15,9 @@
*/
package com.intellij.refactoring.changeSignature;
+import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.codeInsight.ExceptionUtil;
+import com.intellij.codeInsight.InferredAnnotationsManager;
import com.intellij.codeInsight.daemon.impl.analysis.JavaHighlightUtil;
import com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer;
import com.intellij.lang.StdLanguages;
@@ -943,7 +945,8 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr
}
private static void checkContract(MultiMap<PsiElement, String> conflictDescriptions, PsiMethod method) {
- if (ControlFlowAnalyzer.findContractAnnotation(method) != null) {
+ PsiAnnotation contract = ControlFlowAnalyzer.findContractAnnotation(method);
+ if (contract != null && !AnnotationUtil.isInferredAnnotation(contract)) {
conflictDescriptions.putValue(method, "@Contract annotation will have to be changed manually");
}
}
diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java
index 7b68e338aa63..b29d02fad178 100644
--- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java
@@ -791,7 +791,7 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
String[] names = myJavaCodeStyle.suggestVariableName(VariableKind.LOCAL_VARIABLE, null, null, thisType)
.names;
String thisVarName = names[0];
- thisVarName = myJavaCodeStyle.suggestUniqueVariableName(thisVarName, block.getFirstChild(), true);
+ thisVarName = myJavaCodeStyle.suggestUniqueVariableName(thisVarName, myMethod.getFirstChild(), true);
PsiExpression initializer = myFactory.createExpressionFromText("null", null);
PsiDeclarationStatement declaration = myFactory.createVariableDeclarationStatement(thisVarName, thisType, initializer);
declaration = (PsiDeclarationStatement)block.addAfter(declaration, null);
diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java
index 731daff180c9..a751acea42df 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java
@@ -405,7 +405,8 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase
PsiElementFactory factory = JavaPsiFacade.getInstance(psiManager.getProject()).getElementFactory();
try {
PsiField field = factory.createFieldFromText(pattern.toString(), null);
- field.getTypeElement().replace(factory.createTypeElement(type));
+ final PsiTypeElement typeElement = factory.createTypeElement(type);
+ field.getTypeElement().replace(typeElement);
field = (PsiField)CodeStyleManager.getInstance(psiManager.getProject()).reformat(field);
if (includeInitializer) {
field.getInitializer().replace(initializerExpr);
diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java
index 4238c2181f0b..ceae8aed2e44 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java
@@ -224,6 +224,11 @@ public class InplaceIntroduceConstantPopup extends AbstractInplaceIntroduceField
}
@Override
+ protected String getRefactoringId() {
+ return "refactoring.extractConstant";
+ }
+
+ @Override
protected boolean startsOnTheSameElement(RefactoringActionHandler handler, PsiElement element) {
return super.startsOnTheSameElement(handler, element) && handler instanceof IntroduceConstantHandler;
}
diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java
index 4c1de5e39551..3998a93d1b54 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java
@@ -148,6 +148,11 @@ public class InplaceIntroduceFieldPopup extends AbstractInplaceIntroduceFieldPop
}
}
+ @Override
+ protected String getRefactoringId() {
+ return "refactoring.extractField";
+ }
+
public void setVisibility(String visibility) {
myIntroduceFieldPanel.setVisibility(visibility);
}
@@ -203,6 +208,8 @@ public class InplaceIntroduceFieldPopup extends AbstractInplaceIntroduceFieldPop
protected void performIntroduce() {
ourLastInitializerPlace = myIntroduceFieldPanel.getInitializerPlace();
+ final PsiType forcedType = getType();
+ LOG.assertTrue(forcedType == null || forcedType.isValid(), forcedType);
final BaseExpressionToFieldHandler.Settings settings =
new BaseExpressionToFieldHandler.Settings(getInputName(),
getExpr(),
@@ -211,7 +218,7 @@ public class InplaceIntroduceFieldPopup extends AbstractInplaceIntroduceFieldPop
myIntroduceFieldPanel.isDeclareFinal(),
myIntroduceFieldPanel.getInitializerPlace(),
myIntroduceFieldPanel.getFieldVisibility(), (PsiLocalVariable)getLocalVariable(),
- getType(),
+ forcedType,
myIntroduceFieldPanel.isDeleteVariable(),
myParentClass, false, false);
new WriteCommandAction(myProject, getCommandName(), getCommandName()){
diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java
index dc1f1668d744..152172597d6e 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java
@@ -348,6 +348,15 @@ public class IntroduceParameterProcessor extends BaseRefactoringProcessor implem
return data;
}
+ @Nullable
+ @Override
+ protected RefactoringEventData getAfterData(UsageInfo[] usages) {
+ final PsiParameter parameter = JavaIntroduceParameterMethodUsagesProcessor.getAnchorParameter(myMethodToReplaceIn);
+ final RefactoringEventData afterData = new RefactoringEventData();
+ afterData.addElement(parameter);
+ return afterData;
+ }
+
protected void performRefactoring(UsageInfo[] usages) {
try {
PsiElementFactory factory = JavaPsiFacade.getInstance(myManager.getProject()).getElementFactory();
diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java
index 0e513d4d39d0..16fc097bc612 100644
--- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java
+++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java
@@ -61,6 +61,8 @@ import com.intellij.refactoring.*;
import com.intellij.refactoring.introduce.inplace.AbstractInplaceIntroducer;
import com.intellij.refactoring.introduce.inplace.OccurrencesChooser;
import com.intellij.refactoring.introduceField.ElementToWorkOn;
+import com.intellij.refactoring.listeners.RefactoringEventData;
+import com.intellij.refactoring.listeners.RefactoringEventListener;
import com.intellij.refactoring.ui.TypeSelectorManagerImpl;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.refactoring.util.FieldConflictsResolver;
@@ -85,7 +87,8 @@ import java.util.*;
public abstract class IntroduceVariableBase extends IntroduceHandlerBase {
private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.introduceVariable.IntroduceVariableBase");
@NonNls private static final String PREFER_STATEMENTS_OPTION = "introduce.variable.prefer.statements";
-
+ @NonNls private static final String REFACTORING_ID = "refactoring.extractVariable";
+
protected static final String REFACTORING_NAME = RefactoringBundle.message("introduce.variable.title");
public static final Key<Boolean> NEED_PARENTHESIS = Key.create("NEED_PARENTHESIS");
@@ -677,13 +680,27 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase {
occurrenceMarkers.add(topLevelEditor.getDocument().createRangeMarker(occurrence.getTextRange()));
}
}
+ final RefactoringEventData beforeData = new RefactoringEventData();
+ beforeData.addElement(expr);
+ project.getMessageBus()
+ .syncPublisher(RefactoringEventListener.REFACTORING_EVENT_TOPIC).refactoringStarted(REFACTORING_ID, beforeData);
final String expressionText = expr.getText();
final Runnable runnable = introduce(project, expr, topLevelEditor, chosenAnchor, occurrences, settings, variable);
CommandProcessor.getInstance().executeCommand(
project,
new Runnable() {
public void run() {
- ApplicationManager.getApplication().runWriteAction(runnable);
+ try {
+ ApplicationManager.getApplication().runWriteAction(runnable);
+ }
+ finally {
+ final RefactoringEventData afterData = new RefactoringEventData();
+ final SmartPsiElementPointer<PsiVariable> pointer = variable.get();
+ afterData.addElement(pointer != null ? pointer.getElement() : null);
+ project.getMessageBus()
+ .syncPublisher(RefactoringEventListener.REFACTORING_EVENT_TOPIC).refactoringDone(REFACTORING_ID, afterData);
+ }
+
if (isInplaceAvailableOnDataContext) {
final PsiVariable elementToRename = variable.get().getElement();
if (elementToRename != null) {
diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHelper.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHelper.java
index 39913cdf2a60..ab86ee853b3b 100644
--- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHelper.java
+++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHelper.java
@@ -219,7 +219,10 @@ public class JavaPullUpHelper implements PullUpHelper<MemberInfo> {
}
}
PsiMethod methodCopy = (PsiMethod)method.copy();
- if (method.findSuperMethods(myTargetSuperClass).length == 0) {
+ Language language = myTargetSuperClass.getLanguage();
+ final PsiMethod superClassMethod = myTargetSuperClass.findMethodBySignature(methodCopy, false);
+ if (superClassMethod != null && superClassMethod.findDeepestSuperMethods().length == 0 ||
+ method.findSuperMethods(myTargetSuperClass).length == 0) {
deleteOverrideAnnotationIfFound(methodCopy);
}
boolean isOriginalMethodAbstract = method.hasModifierProperty(PsiModifier.ABSTRACT) || method.hasModifierProperty(PsiModifier.DEFAULT);
@@ -238,7 +241,14 @@ public class JavaPullUpHelper implements PullUpHelper<MemberInfo> {
myJavaDocPolicy.processCopiedJavaDoc(methodCopy.getDocComment(), method.getDocComment(), isOriginalMethodAbstract);
- final PsiMember movedElement = anchor != null ? (PsiMember)myTargetSuperClass.addBefore(methodCopy, anchor) : (PsiMember)myTargetSuperClass.add(methodCopy);
+ final PsiMember movedElement;
+ if (superClassMethod != null && superClassMethod.hasModifierProperty(PsiModifier.ABSTRACT)) {
+ movedElement = (PsiMember)superClassMethod.replace(convertMethodToLanguage(methodCopy, language));
+ }
+ else {
+ movedElement =
+ anchor != null ? (PsiMember)myTargetSuperClass.addBefore(methodCopy, anchor) : (PsiMember)myTargetSuperClass.add(methodCopy);
+ }
CodeStyleSettings styleSettings = CodeStyleSettingsManager.getSettings(method.getProject());
if (styleSettings.INSERT_OVERRIDE_ANNOTATION) {
if (PsiUtil.isLanguageLevel5OrHigher(mySourceClass) && !myIsTargetInterface || PsiUtil.isLanguageLevel6OrHigher(mySourceClass)) {
@@ -265,8 +275,6 @@ public class JavaPullUpHelper implements PullUpHelper<MemberInfo> {
RefactoringUtil.replaceMovedMemberTypeParameters(methodCopy, PsiUtil.typeParametersIterable(mySourceClass), substitutor, elementFactory);
fixReferencesToStatic(methodCopy);
- Language language = myTargetSuperClass.getLanguage();
- final PsiMethod superClassMethod = myTargetSuperClass.findMethodBySignature(methodCopy, false);
if (superClassMethod != null && superClassMethod.hasModifierProperty(PsiModifier.ABSTRACT)) {
superClassMethod.replace(convertMethodToLanguage(methodCopy, language));
}
diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpDialog.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpDialog.java
index b92c5f52bfa9..3fd4e334a01f 100644
--- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpDialog.java
+++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpDialog.java
@@ -196,7 +196,7 @@ public class PullUpDialog extends PullUpDialogBase<MemberInfoStorage, MemberInfo
final PsiSubstitutor superSubstitutor = TypeConversionUtil.getSuperClassSubstitutor(currentSuperClass, myClass, PsiSubstitutor.EMPTY);
final MethodSignature signature = ((PsiMethod) element).getSignature(superSubstitutor);
final PsiMethod superClassMethod = MethodSignatureUtil.findMethodBySignature(currentSuperClass, signature, false);
- if (superClassMethod != null) return false;
+ if (superClassMethod != null && !PsiUtil.isLanguageLevel8OrHigher(currentSuperClass)) return false;
return !((PsiModifierListOwner) element).hasModifierProperty(PsiModifier.STATIC) || PsiUtil.isLanguageLevel8OrHigher(currentSuperClass);
}
return true;
diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java
index c1bc3bf60038..ce19d6bacaa5 100644
--- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java
+++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/AutocreatingSingleSourceRootMoveDestination.java
@@ -102,6 +102,6 @@ public class AutocreatingSingleSourceRootMoveDestination extends AutocreatingMov
if (myTargetDirectory == null) {
myTargetDirectory = RefactoringUtil.createPackageDirectoryInSourceRoot(myPackage, mySourceRoot);
}
- return RefactoringUtil.createPackageDirectoryInSourceRoot(myPackage, mySourceRoot);
+ return myTargetDirectory;
}
}
diff --git a/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java b/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java
index 895334d12abe..5e5b620bcd31 100644
--- a/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java
+++ b/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java
@@ -131,7 +131,7 @@ public class DuplicatesImpl {
}
HighlightManager.getInstance(project).removeSegmentHighlighter(editor, highlighters.get(0));
- new WriteCommandAction(project, MethodDuplicatesHandler.REFACTORING_NAME) {
+ new WriteCommandAction(project, MethodDuplicatesHandler.REFACTORING_NAME, MethodDuplicatesHandler.REFACTORING_NAME) {
@Override
protected void run(Result result) throws Throwable {
try {
diff --git a/java/java-impl/src/com/intellij/spellchecker/LiteralExpressionTokenizer.java b/java/java-impl/src/com/intellij/spellchecker/LiteralExpressionTokenizer.java
index 2eade6903cd2..5d10f0714eda 100644
--- a/java/java-impl/src/com/intellij/spellchecker/LiteralExpressionTokenizer.java
+++ b/java/java-impl/src/com/intellij/spellchecker/LiteralExpressionTokenizer.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,7 +17,6 @@ package com.intellij.spellchecker;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.psi.JavaTokenType;
-import com.intellij.psi.PsiLanguageInjectionHost;
import com.intellij.psi.PsiLiteralExpression;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
@@ -37,12 +36,10 @@ import java.util.Collections;
public class LiteralExpressionTokenizer extends Tokenizer<PsiLiteralExpression> {
@Override
public void tokenize(@NotNull PsiLiteralExpression element, TokenConsumer consumer) {
- PsiLiteralExpressionImpl literalExpression = (PsiLiteralExpressionImpl) element;
- if (literalExpression.getLiteralElementType() != JavaTokenType.STRING_LITERAL) {
- return; // not a string literal
- }
+ PsiLiteralExpressionImpl literalExpression = (PsiLiteralExpressionImpl)element;
+ if (literalExpression.getLiteralElementType() != JavaTokenType.STRING_LITERAL) return; // not a string literal
- if (InjectedLanguageUtil.hasInjections((PsiLanguageInjectionHost)element)) return;
+ if (InjectedLanguageUtil.hasInjections(literalExpression)) return;
final PsiModifierListOwner listOwner = PsiTreeUtil.getParentOfType(element, PsiModifierListOwner.class);
if (listOwner != null && AnnotationUtil.isAnnotated(listOwner, Collections.singleton(AnnotationUtil.NON_NLS), false, false)) {
diff --git a/java/java-impl/src/com/intellij/testIntegration/BaseGenerateTestSupportMethodAction.java b/java/java-impl/src/com/intellij/testIntegration/BaseGenerateTestSupportMethodAction.java
index 40a97cf93981..6d82acdbdf8e 100644
--- a/java/java-impl/src/com/intellij/testIntegration/BaseGenerateTestSupportMethodAction.java
+++ b/java/java-impl/src/com/intellij/testIntegration/BaseGenerateTestSupportMethodAction.java
@@ -24,9 +24,10 @@ import com.intellij.codeInsight.generation.actions.BaseGenerateAction;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.ide.fileTemplates.FileTemplateDescriptor;
import com.intellij.ide.fileTemplates.impl.AllFileTemplatesConfigurable;
-import com.intellij.ide.util.EditSourceUtil;
-import com.intellij.openapi.actionSystem.*;
-import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.CommonDataKeys;
+import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
@@ -40,7 +41,6 @@ import com.intellij.ui.components.JBList;
import com.intellij.util.Consumer;
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException;
-import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -100,7 +100,7 @@ public class BaseGenerateTestSupportMethodAction extends BaseGenerateAction {
private static PsiClass findTargetClass(@NotNull Editor editor, @NotNull PsiFile file) {
int offset = editor.getCaretModel().getOffset();
PsiElement element = file.findElementAt(offset);
- return element == null ? null : TestIntegrationUtils.findOuterClass(element);
+ return PsiTreeUtil.getParentOfType(element, PsiClass.class, false) == null ? null : TestIntegrationUtils.findOuterClass(element);
}
@Override
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java
index 90edae7b3648..67f8bde38c2e 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java
@@ -44,7 +44,7 @@ public class JavaAnnotationIndex extends StringStubIndexExtension<PsiAnnotation>
}
@Override
- public Collection<PsiAnnotation> get(final String s, final Project project, @NotNull final GlobalSearchScope scope) {
+ public Collection<PsiAnnotation> get(@NotNull final String s, @NotNull final Project project, @NotNull final GlobalSearchScope scope) {
return StubIndex.getElements(getKey(), s, project, new JavaSourceFilterScope(scope), PsiAnnotation.class);
}
} \ No newline at end of file
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnonymousClassBaseRefOccurenceIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnonymousClassBaseRefOccurenceIndex.java
index 3c92cd48188d..0439ea5a726f 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnonymousClassBaseRefOccurenceIndex.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnonymousClassBaseRefOccurenceIndex.java
@@ -45,7 +45,7 @@ public class JavaAnonymousClassBaseRefOccurenceIndex extends StringStubIndexExte
}
@Override
- public Collection<PsiAnonymousClass> get(final String s, final Project project, @NotNull final GlobalSearchScope scope) {
+ public Collection<PsiAnonymousClass> get(@NotNull final String s, @NotNull final Project project, @NotNull final GlobalSearchScope scope) {
return StubIndex.getElements(getKey(), s, project, new JavaSourceFilterScope(scope), PsiAnonymousClass.class);
}
} \ No newline at end of file
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFieldNameIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFieldNameIndex.java
index 873ea3ec4ab4..d2d4cc812123 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFieldNameIndex.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFieldNameIndex.java
@@ -44,7 +44,7 @@ public class JavaFieldNameIndex extends StringStubIndexExtension<PsiField> {
}
@Override
- public Collection<PsiField> get(final String s, final Project project, @NotNull final GlobalSearchScope scope) {
+ public Collection<PsiField> get(@NotNull final String s, @NotNull final Project project, @NotNull final GlobalSearchScope scope) {
return StubIndex.getElements(getKey(), s, project, new JavaSourceFilterScope(scope), PsiField.class);
}
} \ No newline at end of file
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java
index 045fdc08b07e..ecabef22aa08 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java
@@ -44,7 +44,7 @@ public class JavaFullClassNameIndex extends IntStubIndexExtension<PsiClass> {
}
@Override
- public Collection<PsiClass> get(final Integer integer, final Project project, @NotNull final GlobalSearchScope scope) {
+ public Collection<PsiClass> get(@NotNull final Integer integer, @NotNull final Project project, @NotNull final GlobalSearchScope scope) {
return StubIndex.getElements(getKey(), integer, project, new JavaSourceFilterScope(scope), PsiClass.class);
}
} \ No newline at end of file
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodNameIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodNameIndex.java
index daf3f52a552c..42e95d38479f 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodNameIndex.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodNameIndex.java
@@ -44,7 +44,7 @@ public class JavaMethodNameIndex extends StringStubIndexExtension<PsiMethod> {
}
@Override
- public Collection<PsiMethod> get(final String s, final Project project, @NotNull final GlobalSearchScope scope) {
+ public Collection<PsiMethod> get(@NotNull final String s, @NotNull final Project project, @NotNull final GlobalSearchScope scope) {
return StubIndex.getElements(getKey(), s, project, new JavaSourceFilterScope(scope), PsiMethod.class);
}
} \ No newline at end of file
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodParameterTypesIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodParameterTypesIndex.java
index 689961ec024b..23f4ffac729e 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodParameterTypesIndex.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodParameterTypesIndex.java
@@ -44,7 +44,7 @@ public class JavaMethodParameterTypesIndex extends StringStubIndexExtension<PsiM
}
@Override
- public Collection<PsiMethod> get(final String s, final Project project, @NotNull final GlobalSearchScope scope) {
+ public Collection<PsiMethod> get(@NotNull final String s, @NotNull final Project project, @NotNull final GlobalSearchScope scope) {
return StubIndex.getElements(getKey(), s, project, new JavaSourceFilterScope(scope), PsiMethod.class);
}
} \ No newline at end of file
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java
index 35e1d1ec8d34..5f0d9298b1cc 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java
@@ -51,7 +51,7 @@ public class JavaShortClassNameIndex extends StringStubIndexExtension<PsiClass>
}
@Override
- public Collection<PsiClass> get(final String s, final Project project, @NotNull final GlobalSearchScope scope) {
+ public Collection<PsiClass> get(@NotNull final String s, @NotNull final Project project, @NotNull final GlobalSearchScope scope) {
return StubIndex.getElements(getKey(), s, project, new JavaSourceFilterScope(scope), PsiClass.class);
}
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaSuperClassNameOccurenceIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaSuperClassNameOccurenceIndex.java
index dcd7ae9b40ab..542ed3896f08 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaSuperClassNameOccurenceIndex.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaSuperClassNameOccurenceIndex.java
@@ -45,7 +45,7 @@ public class JavaSuperClassNameOccurenceIndex extends StringStubIndexExtension<P
}
@Override
- public Collection<PsiReferenceList> get(final String s, final Project project, @NotNull final GlobalSearchScope scope) {
+ public Collection<PsiReferenceList> get(@NotNull final String s, @NotNull final Project project, @NotNull final GlobalSearchScope scope) {
return StubIndex.getElements(getKey(), s, project, new JavaSourceFilterScope(scope), PsiReferenceList.class);
}
diff --git a/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java b/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java
index c0cd96c20d47..c2c79a9d9d8a 100644
--- a/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java
+++ b/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java
@@ -113,13 +113,21 @@ public class AnnotationUtil {
}
}
if (!skipExternal) {
- final ExternalAnnotationsManager annotationsManager = ExternalAnnotationsManager.getInstance(listOwner.getProject());
+ final Project project = listOwner.getProject();
+ final ExternalAnnotationsManager annotationsManager = ExternalAnnotationsManager.getInstance(project);
for (String annotationName : annotationNames) {
final PsiAnnotation annotation = annotationsManager.findExternalAnnotation(listOwner, annotationName);
if (annotation != null) {
return annotation;
}
}
+ final InferredAnnotationsManager inferredAnnotationsManager = InferredAnnotationsManager.getInstance(project);
+ for (String annotationName : annotationNames) {
+ final PsiAnnotation annotation = inferredAnnotationsManager.findInferredAnnotation(listOwner, annotationName);
+ if (annotation != null) {
+ return annotation;
+ }
+ }
}
return null;
}
@@ -269,8 +277,12 @@ public class AnnotationUtil {
if (modifierList == null) return false;
PsiAnnotation annotation = modifierList.findAnnotation(annotationFQN);
if (annotation != null) return true;
- if (!skipExternal && ExternalAnnotationsManager.getInstance(listOwner.getProject()).findExternalAnnotation(listOwner, annotationFQN) != null) {
- return true;
+ if (!skipExternal) {
+ final Project project = listOwner.getProject();
+ if (ExternalAnnotationsManager.getInstance(project).findExternalAnnotation(listOwner, annotationFQN) != null ||
+ InferredAnnotationsManager.getInstance(project).findInferredAnnotation(listOwner, annotationFQN) != null) {
+ return true;
+ }
}
if (checkHierarchy) {
if (listOwner instanceof PsiMethod) {
@@ -365,17 +377,31 @@ public class AnnotationUtil {
}
@NotNull
- public static PsiAnnotation[] getAllAnnotations(@NotNull PsiModifierListOwner owner, boolean inHierarchy, Set<PsiModifierListOwner> visited) {
+ public static PsiAnnotation[] getAllAnnotations(@NotNull PsiModifierListOwner owner,
+ boolean inHierarchy,
+ Set<PsiModifierListOwner> visited) {
+ return getAllAnnotations(owner, inHierarchy, visited, true);
+ }
+
+ @NotNull
+ public static PsiAnnotation[] getAllAnnotations(@NotNull PsiModifierListOwner owner,
+ boolean inHierarchy,
+ Set<PsiModifierListOwner> visited, boolean withInferred) {
final PsiModifierList list = owner.getModifierList();
PsiAnnotation[] annotations = PsiAnnotation.EMPTY_ARRAY;
if (list != null) {
annotations = list.getAnnotations();
}
- final PsiAnnotation[] externalAnnotations = ExternalAnnotationsManager.getInstance(owner.getProject()).findExternalAnnotations(owner);
+ final Project project = owner.getProject();
+ final PsiAnnotation[] externalAnnotations = ExternalAnnotationsManager.getInstance(project).findExternalAnnotations(owner);
if (externalAnnotations != null) {
annotations = ArrayUtil.mergeArrays(annotations, externalAnnotations, PsiAnnotation.ARRAY_FACTORY);
}
+ if (withInferred) {
+ final PsiAnnotation[] inferredAnnotations = InferredAnnotationsManager.getInstance(project).findInferredAnnotations(owner);
+ annotations = ArrayUtil.mergeArrays(annotations, inferredAnnotations, PsiAnnotation.ARRAY_FACTORY);
+ }
if (inHierarchy) {
if (owner instanceof PsiClass) {
@@ -435,6 +461,10 @@ public class AnnotationUtil {
return PsiTreeUtil.getParentOfType(element, PsiNameValuePair.class, PsiArrayInitializerMemberValue.class) != null;
}
+ public static boolean isInferredAnnotation(@NotNull PsiAnnotation annotation) {
+ return InferredAnnotationsManager.getInstance(annotation.getProject()).isInferredAnnotation(annotation);
+ }
+
@Nullable
public static String getStringAttributeValue(@NotNull PsiAnnotation anno, @Nullable final String attributeName) {
PsiAnnotationMemberValue attrValue = anno.findAttributeValue(attributeName);
diff --git a/java/java-psi-api/src/com/intellij/codeInsight/InferredAnnotationsManager.java b/java/java-psi-api/src/com/intellij/codeInsight/InferredAnnotationsManager.java
new file mode 100644
index 000000000000..b3fbfe7547cf
--- /dev/null
+++ b/java/java-psi-api/src/com/intellij/codeInsight/InferredAnnotationsManager.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInsight;
+
+import com.intellij.openapi.components.ServiceManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.NotNullLazyKey;
+import com.intellij.psi.PsiAnnotation;
+import com.intellij.psi.PsiModifierListOwner;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public abstract class InferredAnnotationsManager {
+ private static final NotNullLazyKey<InferredAnnotationsManager, Project> INSTANCE_KEY = ServiceManager.createLazyKey(InferredAnnotationsManager.class);
+
+ public static InferredAnnotationsManager getInstance(@NotNull Project project) {
+ return INSTANCE_KEY.getValue(project);
+ }
+
+ @Nullable
+ public abstract PsiAnnotation findInferredAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN);
+
+ @NotNull
+ public abstract PsiAnnotation[] findInferredAnnotations(@NotNull PsiModifierListOwner listOwner);
+
+ public abstract boolean isInferredAnnotation(@NotNull PsiAnnotation annotation);
+}
diff --git a/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java b/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java
index 192d19c31958..21e014e4aca3 100644
--- a/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java
+++ b/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java
@@ -94,10 +94,15 @@ public class NullableNotNullManager implements PersistentStateComponent<Element>
@Nullable
public String getNullable(PsiModifierListOwner owner) {
- PsiAnnotation annotation = findNullabilityAnnotation(owner, false, true);
+ PsiAnnotation annotation = getNullableAnnotation(owner, false);
return annotation == null ? null : annotation.getQualifiedName();
}
+ @Nullable
+ public PsiAnnotation getNullableAnnotation(PsiModifierListOwner owner, boolean checkBases) {
+ return findNullabilityAnnotation(owner, checkBases, true);
+ }
+
public void setDefaultNullable(@NotNull String defaultNullable) {
LOG.assertTrue(getNullables().contains(defaultNullable));
myDefaultNullable = defaultNullable;
@@ -108,8 +113,13 @@ public class NullableNotNullManager implements PersistentStateComponent<Element>
}
@Nullable
+ public PsiAnnotation getNotNullAnnotation(PsiModifierListOwner owner, boolean checkBases) {
+ return findNullabilityAnnotation(owner, checkBases, false);
+ }
+
+ @Nullable
public String getNotNull(PsiModifierListOwner owner) {
- PsiAnnotation annotation = findNullabilityAnnotation(owner, false, false);
+ PsiAnnotation annotation = getNotNullAnnotation(owner, false);
return annotation == null ? null : annotation.getQualifiedName();
}
diff --git a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java
index fe45c66cf024..87afd3d4f8e4 100644
--- a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java
@@ -44,7 +44,15 @@ public class PsiMethodReferenceUtil {
public static String checkReturnType(PsiMethodReferenceExpression expression, JavaResolveResult result, PsiType functionalInterfaceType) {
final PsiElement resolve = result.getElement();
if (resolve instanceof PsiMethod) {
+ final PsiClass containingClass = ((PsiMethod)resolve).getContainingClass();
+ LOG.assertTrue(containingClass != null);
PsiSubstitutor subst = result.getSubstitutor();
+ PsiClass qContainingClass = getQualifierResolveResult(expression).getContainingClass();
+ if (qContainingClass != null && InheritanceUtil.isInheritorOrSelf(qContainingClass, containingClass, true)) {
+ subst = TypeConversionUtil.getClassSubstitutor(containingClass, qContainingClass, subst);
+ LOG.assertTrue(subst != null);
+ }
+
final PsiType interfaceReturnType = LambdaUtil.getFunctionalInterfaceReturnType(functionalInterfaceType);
@@ -57,7 +65,7 @@ public class PsiMethodReferenceUtil {
PsiType methodReturnType = subst.substitute(returnType);
if (interfaceReturnType != null && interfaceReturnType != PsiType.VOID) {
if (methodReturnType == null) {
- methodReturnType = JavaPsiFacade.getElementFactory(expression.getProject()).createType(((PsiMethod)resolve).getContainingClass(), subst);
+ methodReturnType = JavaPsiFacade.getElementFactory(expression.getProject()).createType(containingClass, subst);
}
if (!TypeConversionUtil.isAssignable(interfaceReturnType, methodReturnType, false)) {
return "Bad return type in method reference: cannot convert " + methodReturnType.getCanonicalText() + " to " + interfaceReturnType.getCanonicalText();
diff --git a/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java b/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java
index 388da3b05ab9..622714c6dd61 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiFormatUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiFormatUtil.java
index 472e7cd65403..885f1bd9a444 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/PsiFormatUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/PsiFormatUtil.java
@@ -450,6 +450,40 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
return builder.toString();
}
+ @Nullable
+ public static String getRawExternalName(PsiModifierListOwner owner) {
+ final StringBuilder builder = new StringBuilder();
+ final PsiClass psiClass = PsiTreeUtil.getParentOfType(owner, PsiClass.class, false);
+ if (psiClass == null) return null;
+ ClassUtil.formatClassName(psiClass, builder);
+ if (owner instanceof PsiMethod) {
+ builder.append(" ");
+ formatMethod((PsiMethod)owner, PsiSubstitutor.EMPTY,
+ SHOW_NAME | SHOW_FQ_NAME | SHOW_TYPE | SHOW_RAW_TYPE | SHOW_PARAMETERS | SHOW_FQ_CLASS_NAMES,
+ SHOW_TYPE | SHOW_RAW_TYPE | SHOW_FQ_CLASS_NAMES,
+ Integer.MAX_VALUE, builder);
+ }
+ else if (owner instanceof PsiParameter) {
+ final PsiElement declarationScope = ((PsiParameter)owner).getDeclarationScope();
+ if (!(declarationScope instanceof PsiMethod)) {
+ return null;
+ }
+ final PsiMethod psiMethod = (PsiMethod)declarationScope;
+
+ builder.append(" ");
+ formatMethod(psiMethod, PsiSubstitutor.EMPTY,
+ SHOW_NAME | SHOW_FQ_NAME | SHOW_TYPE | SHOW_RAW_TYPE | SHOW_PARAMETERS | SHOW_FQ_CLASS_NAMES,
+ SHOW_TYPE | SHOW_RAW_TYPE | SHOW_FQ_CLASS_NAMES,
+ Integer.MAX_VALUE, builder);
+ builder.append(" ");
+ builder.append(psiMethod.getParameterList().getParameterIndex((PsiParameter)owner));
+ }
+ else {
+ return null;
+ }
+ return builder.toString();
+ }
+
public static String getPackageDisplayName(@NotNull final PsiClass psiClass) {
if (psiClass instanceof PsiTypeParameter) {
PsiTypeParameterListOwner owner = ((PsiTypeParameter)psiClass).getOwner();
diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java
index 1a7e71c5fc69..b721d801b6c4 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java
@@ -181,6 +181,7 @@ public class PsiTypesUtil {
@Nullable
public static PsiType createJavaLangClassType(@NotNull PsiElement context, @Nullable PsiType qualifierType, boolean captureTopLevelWildcards) {
if (qualifierType != null) {
+ PsiUtil.ensureValidType(qualifierType);
JavaPsiFacade facade = JavaPsiFacade.getInstance(context.getProject());
PsiClass javaLangClass = facade.findClass(CommonClassNames.JAVA_LANG_CLASS, context.getResolveScope());
if (javaLangClass != null && javaLangClass.getTypeParameters().length == 1) {
diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
index b71214f907f0..e5493711b7c2 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
@@ -775,7 +775,7 @@ public final class PsiUtil extends PsiUtilCore {
@NotNull
public static Iterable<PsiTypeParameter> typeParametersIterable(@NotNull final PsiTypeParameterListOwner owner) {
- ArrayList<PsiTypeParameter> result = null;
+ List<PsiTypeParameter> result = null;
PsiTypeParameterListOwner currentOwner = owner;
while (currentOwner != null) {
diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java b/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java
index 9f5ecb109fd5..5e008afb4797 100644
--- a/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java
+++ b/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/JavaFoldingBuilderBase.java
@@ -45,7 +45,6 @@ import com.intellij.psi.util.*;
import com.intellij.util.Function;
import com.intellij.util.ObjectUtils;
import com.intellij.util.text.CharArrayUtil;
-import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -701,7 +700,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
else if (element instanceof PsiComment) {
return settings.isCollapseEndOfLineComments();
}
- else if (isLiteralExpression(element)
+ else if (ParameterNameFoldingManager.isLiteralExpression(element)
&& element.getParent() instanceof PsiExpressionList
&& (element.getParent().getParent() instanceof PsiCallExpression
|| element.getParent().getParent() instanceof PsiAnonymousClass)) {
@@ -760,55 +759,8 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
if (quick || !JavaCodeFoldingSettings.getInstance().isInlineParameterNamesForLiteralCallArguments()) {
return;
}
- PsiExpressionList callArgumentsList = expression.getArgumentList();
- if (callArgumentsList == null) {
- return;
- }
-
- PsiExpression[] callArguments = callArgumentsList.getExpressions();
- if (callArguments.length > 1) {
- PsiParameter[] parameters = null;
- boolean isResolved = false;
-
- for (int i = 0; i < callArguments.length; i++) {
- PsiExpression callArgument = callArguments[i];
-
- if (callArgument.getType() != null && isLiteralExpression(callArgument)) {
- if (!isResolved) {
- PsiMethod method = expression.resolveMethod();
- isResolved = true;
- if (method == null) {
- return;
- }
- parameters = method.getParameterList().getParameters();
- if (parameters.length != callArguments.length) {
- return;
- }
- }
-
- PsiParameter methodParam = parameters[i];
- if (TypeConversionUtil.isAssignable(methodParam.getType(), callArgument.getType())) {
- TextRange range = callArgument.getTextRange();
- String placeholderText = methodParam.getName() + ": " + callArgument.getText();
- foldElements.add(new NamedFoldingDescriptor(callArgument, range.getStartOffset(), range.getEndOffset(), null, placeholderText));
- }
- }
- }
- }
- }
-
- @Contract("null -> false")
- private static boolean isLiteralExpression(@Nullable PsiElement callArgument) {
- if (callArgument instanceof PsiLiteralExpression)
- return true;
-
- if (callArgument instanceof PsiPrefixExpression) {
- PsiPrefixExpression expr = (PsiPrefixExpression)callArgument;
- IElementType tokenType = expr.getOperationTokenType();
- return JavaTokenType.MINUS.equals(tokenType) && expr.getOperand() instanceof PsiLiteralExpression;
- }
-
- return false;
+ ParameterNameFoldingManager manager = new ParameterNameFoldingManager(expression);
+ foldElements.addAll(manager.buildDescriptors());
}
private boolean addClosureFolding(final PsiClass aClass, final Document document, final List<FoldingDescriptor> foldElements,
diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/ParameterNameFoldingManager.java b/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/ParameterNameFoldingManager.java
new file mode 100644
index 000000000000..aca4357f7e49
--- /dev/null
+++ b/java/java-psi-impl/src/com/intellij/codeInsight/folding/impl/ParameterNameFoldingManager.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInsight.folding.impl;
+
+import com.intellij.lang.folding.FoldingDescriptor;
+import com.intellij.lang.folding.NamedFoldingDescriptor;
+import com.intellij.openapi.util.Couple;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.*;
+import com.intellij.psi.tree.IElementType;
+import com.intellij.psi.util.TypeConversionUtil;
+import com.intellij.util.containers.ContainerUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+public class ParameterNameFoldingManager {
+ private static final int MIN_NAME_LENGTH_THRESHOLD = 3;
+ private static final int MIN_ARGS_TO_FOLD = 2;
+
+ private static final List<Couple<String>> COMMONLY_USED_PARAMETER_PAIR = ContainerUtil.newArrayList(
+ Couple.of("begin", "end"),
+ Couple.of("start", "end"),
+ Couple.of("first", "last"),
+ Couple.of("first", "second"),
+ Couple.of("from", "to"),
+ Couple.of("key", "value")
+ );
+
+ private final PsiCallExpression myCallExpression;
+
+ private PsiExpression[] myCallArguments;
+ private PsiParameter[] myParameters;
+
+ public ParameterNameFoldingManager(@NotNull PsiCallExpression callExpression) {
+ myCallExpression = callExpression;
+ }
+
+ public static boolean isLiteralExpression(@Nullable PsiElement callArgument) {
+ if (callArgument instanceof PsiLiteralExpression)
+ return true;
+
+ if (callArgument instanceof PsiPrefixExpression) {
+ PsiPrefixExpression expr = (PsiPrefixExpression)callArgument;
+ IElementType tokenType = expr.getOperationTokenType();
+ return JavaTokenType.MINUS.equals(tokenType) && expr.getOperand() instanceof PsiLiteralExpression;
+ }
+
+ return false;
+ }
+
+ @Nullable
+ public PsiExpression[] getArguments(@NotNull PsiCallExpression call) {
+ PsiExpressionList callArgumentsList = call.getArgumentList();
+ return callArgumentsList != null ? callArgumentsList.getExpressions() : null;
+ }
+
+ @NotNull
+ public List<FoldingDescriptor> buildDescriptors() {
+ myCallArguments = getArguments(myCallExpression);
+
+ if (myCallArguments != null && myCallArguments.length >= MIN_ARGS_TO_FOLD && hasLiteralExpression(myCallArguments)) {
+ PsiMethod method = myCallExpression.resolveMethod();
+
+ if (method != null) {
+ myParameters = method.getParameterList().getParameters();
+ if (myParameters.length == myCallArguments.length) {
+ return buildDescriptorsForLiteralArguments();
+ }
+ }
+ }
+
+ return ContainerUtil.emptyList();
+ }
+
+ @NotNull
+ private List<FoldingDescriptor> buildDescriptorsForLiteralArguments() {
+ List<FoldingDescriptor> descriptors = ContainerUtil.newArrayList();
+
+ int i = 0;
+ while (i < myCallArguments.length) {
+ if (i + 1 < myCallArguments.length && isCommonlyNamedParameterPair(i, i + 1)) {
+ i += 2;
+ continue;
+ }
+
+ if (shouldInlineParameterName(i)) {
+ descriptors.add(createFoldingDescriptor(myCallArguments[i], myParameters[i]));
+ }
+ i++;
+ }
+
+ return descriptors;
+ }
+
+ @NotNull
+ private static NamedFoldingDescriptor createFoldingDescriptor(@NotNull PsiExpression callArgument, @NotNull PsiParameter methodParam) {
+ TextRange range = callArgument.getTextRange();
+ String placeholderText = methodParam.getName() + ": " + callArgument.getText();
+ return new NamedFoldingDescriptor(callArgument, range.getStartOffset(), range.getEndOffset(), null, placeholderText);
+ }
+
+ private boolean isCommonlyNamedParameterPair(int first, int second) {
+ assert first < myParameters.length && second < myParameters.length;
+
+ String firstParamName = myParameters[first].getName();
+ String secondParamName = myParameters[second].getName();
+ if (firstParamName == null || secondParamName == null) return false;
+
+ for (Couple<String> knownPair : COMMONLY_USED_PARAMETER_PAIR) {
+ if (StringUtil.containsIgnoreCase(firstParamName, knownPair.first)
+ && StringUtil.containsIgnoreCase(secondParamName, knownPair.second)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private boolean shouldInlineParameterName(int paramIndex) {
+ PsiExpression argument = myCallArguments[paramIndex];
+ if (isLiteralExpression(argument) && argument.getType() != null) {
+ PsiParameter parameter = myParameters[paramIndex];
+ String paramName = parameter.getName();
+ if (paramName != null && paramName.length() >= MIN_NAME_LENGTH_THRESHOLD) {
+ return TypeConversionUtil.isAssignable(parameter.getType(), argument.getType());
+ }
+ }
+ return false;
+ }
+
+ private static boolean hasLiteralExpression(@NotNull PsiExpression[] arguments) {
+ for (PsiExpression argument : arguments) {
+ if (isLiteralExpression(argument)) return true;
+ }
+ return false;
+ }
+}
diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java
index 0052dd5bb8b9..f2b9583c49b0 100644
--- a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java
+++ b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java
@@ -18,6 +18,7 @@ package com.intellij.codeInsight.javadoc;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.ExternalAnnotationsManager;
+import com.intellij.codeInsight.InferredAnnotationsManager;
import com.intellij.codeInsight.documentation.DocumentationManagerUtil;
import com.intellij.lang.ASTNode;
import com.intellij.lang.LangBundle;
@@ -217,6 +218,7 @@ public class JavaDocInfoGenerator {
LOG.debug(text);
}
+ text = StringUtil.replaceIgnoreCase(text, "<p/>", "<p></p>");
return StringUtil.replace(text, "/>", ">");
}
@@ -321,7 +323,7 @@ public class JavaDocInfoGenerator {
}
private static boolean generateClassSignature(StringBuilder buffer, PsiClass aClass, boolean generateLink) {
- generateAnnotations(buffer, aClass, generateLink);
+ generateAnnotations(buffer, aClass, generateLink, true);
String modifiers = PsiFormatUtil.formatModifiers(aClass, PsiFormatUtilBase.JAVADOC_MODIFIERS_ONLY);
if (!modifiers.isEmpty()) {
buffer.append(modifiers);
@@ -487,7 +489,7 @@ public class JavaDocInfoGenerator {
}
private static void generateFieldSignature(StringBuilder buffer, PsiField field, boolean generateLink) {
- generateAnnotations(buffer, field, generateLink);
+ generateAnnotations(buffer, field, generateLink, true);
String modifiers = PsiFormatUtil.formatModifiers(field, PsiFormatUtilBase.JAVADOC_MODIFIERS_ONLY);
if (!modifiers.isEmpty()) {
buffer.append(modifiers);
@@ -695,30 +697,38 @@ public class JavaDocInfoGenerator {
}
}
- private static void generateAnnotations(@NonNls @NotNull StringBuilder buffer, @NotNull PsiModifierListOwner owner, boolean generateLink) {
+ private static void generateAnnotations(@NonNls @NotNull StringBuilder buffer,
+ @NotNull PsiModifierListOwner owner,
+ boolean generateLink,
+ boolean splitAnnotations) {
final PsiModifierList ownerModifierList = owner.getModifierList();
if (ownerModifierList == null) return;
- generateAnnotations(buffer, owner, ownerModifierList.getAnnotations(), false, generateLink);
- final PsiAnnotation[] externalAnnotations = ExternalAnnotationsManager.getInstance(owner.getProject()).findExternalAnnotations(owner);
- if (externalAnnotations != null) {
- generateAnnotations(buffer, owner, externalAnnotations, true, generateLink);
+ generateAnnotations(buffer, owner, ownerModifierList.getAnnotations(), false, generateLink, splitAnnotations);
+ PsiAnnotation[] externalAnnotations = ExternalAnnotationsManager.getInstance(owner.getProject()).findExternalAnnotations(owner);
+ if (externalAnnotations == null) {
+ externalAnnotations = new PsiAnnotation[]{};
}
+ PsiAnnotation[] inferredAnnotations = InferredAnnotationsManager.getInstance(owner.getProject()).findInferredAnnotations(owner);
+ externalAnnotations = ArrayUtil.mergeArrays(externalAnnotations, inferredAnnotations, PsiAnnotation.ARRAY_FACTORY);
+ generateAnnotations(buffer, owner, externalAnnotations, true, generateLink, splitAnnotations);
}
private static void generateAnnotations(StringBuilder buffer,
PsiModifierListOwner owner,
PsiAnnotation[] annotations,
boolean external,
- boolean generateLink) {
+ boolean generateLink, boolean splitAnnotations) {
PsiManager manager = owner.getManager();
for (PsiAnnotation annotation : annotations) {
final PsiJavaCodeReferenceElement nameReferenceElement = annotation.getNameReferenceElement();
if (nameReferenceElement == null) continue;
final PsiElement resolved = nameReferenceElement.resolve();
+ boolean inferred = AnnotationUtil.isInferredAnnotation(annotation);
if (resolved instanceof PsiClass) {
final PsiClass annotationType = (PsiClass)resolved;
if (AnnotationUtil.isAnnotated(annotationType, "java.lang.annotation.Documented", false)) {
+ if (inferred) buffer.append("<i>");
final PsiClassType type = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory().createType(annotationType, PsiSubstitutor.EMPTY);
buffer.append("@");
generateType(buffer, type, owner, generateLink);
@@ -736,24 +746,27 @@ public class JavaDocInfoGenerator {
}
final PsiAnnotationMemberValue value = pair.getValue();
if (value != null) {
- buffer.append(value.getText());
+ buffer.append(XmlStringUtil.escapeString(value.getText()));
}
}
buffer.append(")");
}
+ if (inferred) buffer.append("</i>");
buffer.append("&nbsp;");
}
} else if (external) {
- buffer.append(annotation.getText());
+ if (inferred) buffer.append("<i>");
+ buffer.append(XmlStringUtil.escapeString(annotation.getText()));
buffer.append("&nbsp;");
+ if (inferred) buffer.append("</i>");
}
else {
buffer.append("<font color=red>");
- buffer.append(annotation.getText());
+ buffer.append(XmlStringUtil.escapeString(annotation.getText()));
buffer.append("</font>");
buffer.append("&nbsp;");
}
- buffer.append("\n");
+ if (splitAnnotations) buffer.append("\n");
}
}
@@ -767,7 +780,7 @@ public class JavaDocInfoGenerator {
buffer.append(modifiers);
buffer.append(" ");
}
- generateAnnotations(buffer, parameter, true);
+ generateAnnotations(buffer, parameter, true, true);
generateType(buffer, parameter.getType(), parameter);
buffer.append(" ");
buffer.append("<b>");
@@ -843,7 +856,7 @@ public class JavaDocInfoGenerator {
}
private static void generateMethodSignature(StringBuilder buffer, PsiMethod method, boolean generateLink) {
- generateAnnotations(buffer, method, generateLink);
+ generateAnnotations(buffer, method, generateLink, true);
String modifiers = PsiFormatUtil.formatModifiers(method, PsiFormatUtilBase.JAVADOC_MODIFIERS_ONLY);
int indent = 0;
if (!modifiers.isEmpty()) {
@@ -876,7 +889,7 @@ public class JavaDocInfoGenerator {
PsiParameter[] parms = method.getParameterList().getParameters();
for (int i = 0; i < parms.length; i++) {
PsiParameter parm = parms[i];
- generateAnnotations(buffer, parm, generateLink);
+ generateAnnotations(buffer, parm, generateLink, false);
generateType(buffer, parm.getType(), method, generateLink);
buffer.append("&nbsp;");
if (parm.getName() != null) {
diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java
index 0377048d0acb..36d024726bbf 100644
--- a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java
+++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java
@@ -46,6 +46,8 @@ public class DeclarationParser {
JavaTokenType.IDENTIFIER, JavaTokenType.COMMA, JavaTokenType.THROWS_KEYWORD);
private static final TokenSet PARAM_LIST_STOPPERS = TokenSet.create(
JavaTokenType.RPARENTH, JavaTokenType.LBRACE, JavaTokenType.ARROW);
+ private static final TokenSet TYPE_START = TokenSet.orSet(
+ ElementType.PRIMITIVE_TYPE_BIT_SET, TokenSet.create(JavaTokenType.IDENTIFIER, JavaTokenType.AT));
private static final String WHITESPACES = "\n\r \t";
private static final String LINE_ENDS = "\n\r";
@@ -278,56 +280,64 @@ public class DeclarationParser {
return modList;
}
- PsiBuilder.Marker type;
- if (ElementType.PRIMITIVE_TYPE_BIT_SET.contains(builder.getTokenType())) {
- type = parseTypeNotNull(builder);
- }
- else if (builder.getTokenType() == JavaTokenType.IDENTIFIER) {
- final PsiBuilder.Marker idPos = builder.mark();
- type = parseTypeNotNull(builder);
- if (builder.getTokenType() == JavaTokenType.LPARENTH) { // constructor
- if (context == Context.CODE_BLOCK) {
- declaration.rollbackTo();
- return null;
- }
- idPos.rollbackTo();
- if (typeParams == null) {
- emptyElement(builder, JavaElementType.TYPE_PARAMETER_LIST);
- }
- builder.advanceLexer();
- if (builder.getTokenType() != JavaTokenType.LPARENTH) {
- declaration.rollbackTo();
- return null;
- }
- return parseMethodFromLeftParenth(builder, declaration, false, true);
- }
- idPos.drop();
- }
- else if (builder.getTokenType() == JavaTokenType.LBRACE) {
+ if (builder.getTokenType() == JavaTokenType.LBRACE) {
if (context == Context.CODE_BLOCK) {
error(builder, JavaErrorMessages.message("expected.identifier.or.type"), typeParams);
declaration.drop();
return modList;
}
- final PsiBuilder.Marker codeBlock = myParser.getStatementParser().parseCodeBlock(builder);
+ PsiBuilder.Marker codeBlock = myParser.getStatementParser().parseCodeBlock(builder);
assert codeBlock != null : builder.getOriginalText();
if (typeParams != null) {
- final PsiBuilder.Marker error = typeParams.precede();
+ PsiBuilder.Marker error = typeParams.precede();
error.errorBefore(JavaErrorMessages.message("unexpected.token"), codeBlock);
}
+
done(declaration, JavaElementType.CLASS_INITIALIZER);
return declaration;
}
- else {
- final PsiBuilder.Marker error;
- if (typeParams != null) {
- error = typeParams.precede();
+
+ PsiBuilder.Marker type = null;
+
+ if (TYPE_START.contains(builder.getTokenType())) {
+ PsiBuilder.Marker pos = builder.mark();
+
+ type = myParser.getReferenceParser().parseType(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.WILDCARD);
+
+ if (type == null) {
+ pos.rollbackTo();
+ }
+ else if (builder.getTokenType() == JavaTokenType.LPARENTH) { // constructor
+ if (context == Context.CODE_BLOCK) {
+ declaration.rollbackTo();
+ return null;
+ }
+
+ pos.rollbackTo();
+
+ if (typeParams == null) {
+ emptyElement(builder, JavaElementType.TYPE_PARAMETER_LIST);
+ }
+ parseAnnotations(builder);
+ builder.advanceLexer();
+
+ if (builder.getTokenType() == JavaTokenType.LPARENTH) {
+ return parseMethodFromLeftParenth(builder, declaration, false, true);
+ }
+ else {
+ declaration.rollbackTo();
+ return null;
+ }
}
else {
- error = builder.mark();
+ pos.drop();
}
+ }
+
+ if (type == null) {
+ PsiBuilder.Marker error = typeParams != null ? typeParams.precede() : builder.mark();
error.error(JavaErrorMessages.message("expected.identifier.or.type"));
declaration.drop();
return modList;
@@ -364,13 +374,6 @@ public class DeclarationParser {
}
@NotNull
- private PsiBuilder.Marker parseTypeNotNull(final PsiBuilder builder) {
- final PsiBuilder.Marker type = myParser.getReferenceParser().parseType(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.WILDCARD);
- assert type != null : builder.getOriginalText();
- return type;
- }
-
- @NotNull
public Pair<PsiBuilder.Marker, Boolean> parseModifierList(final PsiBuilder builder) {
return parseModifierList(builder, ElementType.MODIFIER_BIT_SET);
}
diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java
index 42a41d51c6fb..e18b1b5b5dab 100644
--- a/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java
+++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java
@@ -277,8 +277,8 @@ public class ReferenceParser {
error(builder, JavaErrorMessages.message("expected.identifier"));
}
else {
- final IElementType tokenType = builder.getTokenType();
- if (WILDCARD_KEYWORD_SET.contains(tokenType) && tokenType != null) {
+ IElementType tokenType = builder.getTokenType();
+ if (WILDCARD_KEYWORD_SET.contains(tokenType)) {
parseReferenceList(builder, tokenType, null, JavaTokenType.AND);
}
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/InheritanceImplUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/InheritanceImplUtil.java
index 543c8a653651..f958555a3c45 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/InheritanceImplUtil.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/InheritanceImplUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@ import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiModificationTracker;
-import com.intellij.util.containers.ConcurrentHashMap;
+import com.intellij.util.containers.ConcurrentWeakHashMap;
import com.intellij.util.containers.HashSet;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NonNls;
@@ -41,14 +41,14 @@ public class InheritanceImplUtil {
if (baseClass instanceof PsiAnonymousClass) return false;
if (!checkDeep) return isInheritor(candidateClass, baseClass, false, null);
- if (CommonClassNames.JAVA_LANG_OBJECT.equals(candidateClass.getQualifiedName())) return false;
- if (CommonClassNames.JAVA_LANG_OBJECT.equals(baseClass.getQualifiedName())) return true;
+ if (CommonClassNames.JAVA_LANG_OBJECT_SHORT.equals(candidateClass.getName()) && CommonClassNames.JAVA_LANG_OBJECT.equals(candidateClass.getQualifiedName())) return false;
+ if (CommonClassNames.JAVA_LANG_OBJECT_SHORT.equals(baseClass.getName()) && CommonClassNames.JAVA_LANG_OBJECT.equals(baseClass.getQualifiedName())) return true;
Map<PsiClass, Boolean> map = CachedValuesManager.
getCachedValue(candidateClass, new CachedValueProvider<Map<PsiClass, Boolean>>() {
@Nullable
@Override
public Result<Map<PsiClass, Boolean>> compute() {
- final Map<PsiClass, Boolean> map = new ConcurrentHashMap<PsiClass, Boolean>();
+ final Map<PsiClass, Boolean> map = new ConcurrentWeakHashMap<PsiClass, Boolean>();
return Result.create(map, candidateClass, PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT);
}
});
@@ -82,7 +82,7 @@ public class InheritanceImplUtil {
}
@NonNls final String baseName = baseClass.getName();
- if ("Object".equals(baseName)) {
+ if (CommonClassNames.JAVA_LANG_OBJECT_SHORT.equals(baseName)) {
PsiClass objectClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(CommonClassNames.JAVA_LANG_OBJECT, candidateClass.getResolveScope());
if (manager.areElementsEquivalent(baseClass, objectClass)) {
if (manager.areElementsEquivalent(candidateClass, objectClass)) return false;
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java b/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java
index 674ccbe1f03f..19da149c99b8 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java
@@ -105,11 +105,11 @@ public class JavaConstantExpressionEvaluator extends JavaRecursiveElementWalking
return myMapFactory.create();
}
- public static Object computeConstantExpression(PsiExpression expression, @Nullable Set<PsiVariable> visitedVars, boolean throwExceptionOnOverflow) {
+ public static Object computeConstantExpression(@Nullable PsiExpression expression, @Nullable Set<PsiVariable> visitedVars, boolean throwExceptionOnOverflow) {
return computeConstantExpression(expression, visitedVars, throwExceptionOnOverflow, null);
}
- public static Object computeConstantExpression(PsiExpression expression, @Nullable Set<PsiVariable> visitedVars, boolean throwExceptionOnOverflow,
+ public static Object computeConstantExpression(@Nullable PsiExpression expression, @Nullable Set<PsiVariable> visitedVars, boolean throwExceptionOnOverflow,
final PsiConstantEvaluationHelper.AuxEvaluator auxEvaluator) {
if (expression == null) return null;
@@ -131,7 +131,7 @@ public class JavaConstantExpressionEvaluator extends JavaRecursiveElementWalking
return cached == NO_VALUE ? null : cached;
}
- public static Object computeConstantExpression(PsiExpression expression, boolean throwExceptionOnOverflow) {
+ public static Object computeConstantExpression(@Nullable PsiExpression expression, boolean throwExceptionOnOverflow) {
return computeConstantExpression(expression, null, throwExceptionOnOverflow);
}
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java
index 46cceffcb6ad..bd5f75ece27f 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java
@@ -32,6 +32,7 @@ import com.intellij.util.cls.ClsFormatException;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.io.StringRef;
import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.text.CharacterIterator;
@@ -259,7 +260,8 @@ public class SignatureParsing {
return variance;
}
- public static String parseTypeString(CharacterIterator signature) throws ClsFormatException {
+ @NotNull
+ public static String parseTypeString(@NotNull CharacterIterator signature) throws ClsFormatException {
int arrayDimensions = 0;
while (signature.current() == '[') {
arrayDimensions++;
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaImportStatementElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaImportStatementElementType.java
index 7c9af30f1d9b..93e359e6778a 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaImportStatementElementType.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaImportStatementElementType.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@ import com.intellij.psi.impl.java.stubs.impl.PsiImportStatementStubImpl;
import com.intellij.psi.impl.source.PsiImportStatementImpl;
import com.intellij.psi.impl.source.PsiImportStaticStatementImpl;
import com.intellij.psi.impl.source.tree.JavaElementType;
-import com.intellij.psi.impl.source.tree.SourceUtil;
+import com.intellij.psi.impl.source.tree.JavaSourceUtil;
import com.intellij.psi.impl.source.tree.java.ImportStaticStatementElement;
import com.intellij.psi.stubs.IndexSink;
import com.intellij.psi.stubs.StubElement;
@@ -68,7 +68,7 @@ public abstract class JavaImportStatementElementType extends JavaStubElementType
for (LighterASTNode child : tree.getChildren(node)) {
IElementType type = child.getTokenType();
if (type == JavaElementType.JAVA_CODE_REFERENCE || type == JavaElementType.IMPORT_STATIC_REFERENCE) {
- refText = SourceUtil.getReferenceText(tree, child);
+ refText = JavaSourceUtil.getReferenceText(tree, child);
}
else if (type == JavaTokenType.ASTERISK) {
isOnDemand = true;
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightStubBuilder.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightStubBuilder.java
index ff8c80db3729..3413fda3a3fe 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightStubBuilder.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightStubBuilder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -44,7 +44,7 @@ public class JavaLightStubBuilder extends LightStubBuilder {
if (pkg != null) {
LighterASTNode ref = LightTreeUtil.firstChildOfType(tree, pkg, JavaElementType.JAVA_CODE_REFERENCE);
if (ref != null) {
- refText = SourceUtil.getReferenceText(tree, ref);
+ refText = JavaSourceUtil.getReferenceText(tree, ref);
}
}
return new PsiJavaFileStubImpl((PsiJavaFile)file, StringRef.fromString(refText), false);
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java
index 55b760031646..807b42d60383 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java
@@ -587,7 +587,15 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme
if (parameterList != null) {
text += parameterList.getText();
}
- PsiJavaCodeReferenceElement ref = facade.getParserFacade().createReferenceFromText(text, getParent());
+
+ PsiJavaCodeReferenceElement ref;
+ try {
+ ref = facade.getParserFacade().createReferenceFromText(text, getParent());
+ }
+ catch (IncorrectOperationException e) {
+ throw new IncorrectOperationException(e.getMessage() + " [qname=" + qName + " class=" + aClass + ";" + aClass.getClass().getName() + "]");
+ }
+
((PsiJavaCodeReferenceElementImpl)ref).setAnnotations(annotations);
getTreeParent().replaceChildInternal(this, (TreeElement)ref.getNode());
@@ -743,7 +751,7 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme
private String getNormalizedText() {
String whiteSpaceAndComments = myCachedNormalizedText;
if (whiteSpaceAndComments == null) {
- myCachedNormalizedText = whiteSpaceAndComments = SourceUtil.getReferenceText(this);
+ myCachedNormalizedText = whiteSpaceAndComments = JavaSourceUtil.getReferenceText(this);
}
return whiteSpaceAndComments;
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java
index a2e5593478eb..3e081a738caf 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java
@@ -38,6 +38,7 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi
@NotNull
private final PsiFile myContainingFile;
private final PsiElement myPlace;
+ private final PsiResolveHelper myResolveHelper;
private PsiClass myAccessClass = null;
private List<ClassCandidateInfo> myCandidates = null;
private boolean myHasAccessibleCandidate;
@@ -67,6 +68,7 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi
}
}
}
+ myResolveHelper = JavaPsiFacade.getInstance(containingFile.getProject()).getResolveHelper();
}
@NotNull
@@ -252,8 +254,7 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi
}
private boolean checkAccessibility(final PsiClass aClass) {
- JavaPsiFacade facade = JavaPsiFacade.getInstance(aClass.getProject());
- return facade.getResolveHelper().isAccessible(aClass, myPlace, myAccessClass);
+ return myResolveHelper.isAccessible(aClass, myPlace, myAccessClass);
}
@Override
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java
index f16231ac8d26..6098199c591c 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java
@@ -379,7 +379,7 @@ public class InferenceSession {
PsiType returnType = method.getReturnType();
if (!PsiType.VOID.equals(returnType) && returnType != null) {
PsiType targetType = getTargetType(context);
- if (targetType != null) {
+ if (targetType != null && !PsiType.VOID.equals(targetType)) {
registerReturnTypeConstraints(PsiUtil.isRawSubstitutor(method, mySiteSubstitutor) ? returnType : mySiteSubstitutor.substitute(returnType), targetType);
}
}
@@ -970,7 +970,8 @@ public class InferenceSession {
addConstraint(new TypeCompatibilityConstraint(getParameterType(parameters, i, PsiSubstitutor.EMPTY, varargs), pType));
}
}
- else if (parameters.length + 1 == functionalMethodParameters.length && !varargs || !isStatic && varargs && functionalMethodParameters.length > 0) { //instance methods
+ else if (parameters.length + 1 == functionalMethodParameters.length && !varargs ||
+ !isStatic && varargs && functionalMethodParameters.length > 0 && PsiMethodReferenceUtil.hasReceiver(reference, method)) { //instance methods
initBounds(containingClass.getTypeParameters());
final PsiType pType = signature.getParameterTypes()[0];
@@ -1020,13 +1021,13 @@ public class InferenceSession {
*/
public static boolean isMoreSpecific(PsiMethod m1,
PsiMethod m2,
- PsiSubstitutor siteSubstitutor2,
PsiExpression[] args,
PsiElement context,
boolean varargs) {
- final PsiTypeParameter[] typeParameters = m2.getTypeParameters();
-
- final InferenceSession session = new InferenceSession(typeParameters, siteSubstitutor2, m2.getManager(), context);
+ final InferenceSession session = new InferenceSession(PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY, m2.getManager(), context);
+ for (PsiTypeParameter param : PsiUtil.typeParametersIterable(m2)) {
+ session.initBounds(param);
+ }
final PsiParameter[] parameters1 = m1.getParameterList().getParameters();
final PsiParameter[] parameters2 = m2.getParameterList().getParameters();
@@ -1036,8 +1037,8 @@ public class InferenceSession {
final int paramsLength = !varargs ? parameters1.length : parameters1.length - 1;
for (int i = 0; i < paramsLength; i++) {
- PsiType sType = getParameterType(parameters1, i, siteSubstitutor2, false);
- PsiType tType = getParameterType(parameters2, i, siteSubstitutor2, varargs);
+ PsiType sType = getParameterType(parameters1, i, PsiSubstitutor.EMPTY, false);
+ PsiType tType = getParameterType(parameters2, i, PsiSubstitutor.EMPTY, varargs);
if (session.isProperType(sType) && session.isProperType(tType)) {
if (!TypeConversionUtil.isAssignable(tType, sType)) {
return false;
@@ -1054,8 +1055,8 @@ public class InferenceSession {
}
if (varargs) {
- PsiType sType = getParameterType(parameters1, paramsLength, siteSubstitutor2, true);
- PsiType tType = getParameterType(parameters2, paramsLength, siteSubstitutor2, true);
+ PsiType sType = getParameterType(parameters1, paramsLength, PsiSubstitutor.EMPTY, true);
+ PsiType tType = getParameterType(parameters2, paramsLength, PsiSubstitutor.EMPTY, true);
session.addConstraint(new StrictSubtypingConstraint(tType, sType));
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java
index 175f083ce319..18d0c49e79d4 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java
@@ -21,6 +21,7 @@ import com.intellij.psi.impl.source.resolve.graphInference.FunctionalInterfacePa
import com.intellij.psi.impl.source.resolve.graphInference.InferenceSession;
import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil;
import com.intellij.psi.infos.MethodCandidateInfo;
+import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
@@ -60,6 +61,10 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm
final PsiType interfaceMethodReturnType = interfaceMethod.getReturnType();
final PsiType returnType = substitutor.substitute(interfaceMethodReturnType);
final PsiType[] typeParameters = myExpression.getTypeParameters();
+
+ final PsiMethodReferenceUtil.QualifierResolveResult qualifierResolveResult = PsiMethodReferenceUtil.getQualifierResolveResult(myExpression);
+ PsiSubstitutor psiSubstitutor = qualifierResolveResult.getSubstitutor();
+
if (!myExpression.isExact()) {
for (PsiParameter parameter : targetParameters) {
if (!session.isProperType(substitutor.substitute(parameter.getType()))) {
@@ -70,11 +75,9 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm
final PsiMember applicableMember = myExpression.getPotentiallyApplicableMember();
LOG.assertTrue(applicableMember != null);
- final PsiMethodReferenceUtil.QualifierResolveResult qualifierResolveResult = PsiMethodReferenceUtil.getQualifierResolveResult(myExpression);
final PsiClass applicableMemberContainingClass = applicableMember.getContainingClass();
final PsiClass containingClass = qualifierResolveResult.getContainingClass();
- PsiSubstitutor psiSubstitutor = qualifierResolveResult.getSubstitutor();
psiSubstitutor = applicableMemberContainingClass == null || containingClass == null || myExpression.isConstructor()
? psiSubstitutor
: TypeConversionUtil.getSuperClassSubstitutor(applicableMemberContainingClass, containingClass, psiSubstitutor);
@@ -143,6 +146,13 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm
final PsiType referencedMethodReturnType;
final PsiClass containingClass = method.getContainingClass();
LOG.assertTrue(containingClass != null, method);
+
+ PsiClass qContainingClass = qualifierResolveResult.getContainingClass();
+ if (qContainingClass != null && InheritanceUtil.isInheritorOrSelf(qContainingClass, containingClass, true)) {
+ psiSubstitutor = TypeConversionUtil.getClassSubstitutor(containingClass, qContainingClass, PsiSubstitutor.EMPTY);
+ LOG.assertTrue(psiSubstitutor != null);
+ }
+
if (method.isConstructor()) {
referencedMethodReturnType = JavaPsiFacade.getElementFactory(method.getProject()).createType(containingClass, PsiSubstitutor.EMPTY);
}
@@ -179,7 +189,6 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm
}
int idx = 0;
- PsiSubstitutor psiSubstitutor = PsiSubstitutor.EMPTY;
for (PsiTypeParameter param : method.getTypeParameters()) {
if (idx < typeParameters.length) {
psiSubstitutor = psiSubstitutor.put(param, typeParameters[idx++]);
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java
index 4fbbad26964d..8d42dbeb4f90 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java
@@ -84,8 +84,8 @@ public interface JavaElementType {
IElementType PARAMETER_LIST = JavaStubElementTypes.PARAMETER_LIST;
IElementType EXTENDS_BOUND_LIST = JavaStubElementTypes.EXTENDS_BOUND_LIST;
IElementType THROWS_LIST = JavaStubElementTypes.THROWS_LIST;
- IElementType LITERAL_EXPRESSION = new JavaCompositeElementType("LITERAL_EXPRESSION", PsiLiteralExpressionImpl.class);
+ IElementType LITERAL_EXPRESSION = new JavaCompositeElementType("LITERAL_EXPRESSION", PsiLiteralExpressionImpl.class);
IElementType IMPORT_STATIC_REFERENCE = new JavaCompositeElementType("IMPORT_STATIC_REFERENCE", PsiImportStaticReferenceElementImpl.class);
IElementType TYPE = new JavaCompositeElementType("TYPE", PsiTypeElementImpl.class);
IElementType DIAMOND_TYPE = new JavaCompositeElementType("DIAMOND_TYPE", PsiDiamondTypeElementImpl.class);
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaSourceUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaSourceUtil.java
index 8cf5b5bfbdd2..e2af7b08df0d 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaSourceUtil.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaSourceUtil.java
@@ -15,13 +15,28 @@
*/
package com.intellij.psi.impl.source.tree;
+import com.intellij.lang.ASTFactory;
import com.intellij.lang.ASTNode;
+import com.intellij.lang.LighterAST;
+import com.intellij.lang.LighterASTNode;
+import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
+import com.intellij.psi.codeStyle.CodeStyleManager;
+import com.intellij.psi.impl.source.DummyHolder;
import com.intellij.psi.impl.source.SourceJavaCodeReference;
+import com.intellij.psi.impl.source.SourceTreeToPsiMap;
+import com.intellij.psi.tree.IElementType;
+import com.intellij.psi.tree.TokenSet;
import com.intellij.util.CharTable;
+import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
public class JavaSourceUtil {
+ private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.JavaSourceUtil");
+
+ private static final TokenSet REF_FILTER = TokenSet.orSet(
+ ElementType.JAVA_COMMENT_OR_WHITESPACE_BIT_SET, TokenSet.create(JavaElementType.ANNOTATION));
+
private JavaSourceUtil() { }
public static void fullyQualifyReference(@NotNull CompositeElement reference, @NotNull PsiClass targetClass) {
@@ -61,4 +76,70 @@ public class JavaSourceUtil {
}
}
}
+
+ @NotNull
+ public static String getReferenceText(@NotNull PsiJavaCodeReferenceElement ref) {
+ final StringBuilder buffer = new StringBuilder();
+
+ ((TreeElement)ref.getNode()).acceptTree(new RecursiveTreeElementWalkingVisitor() {
+ @Override
+ public void visitLeaf(LeafElement leaf) {
+ if (!REF_FILTER.contains(leaf.getElementType())) {
+ String leafText = leaf.getText();
+ if (buffer.length() > 0 && !leafText.isEmpty() && Character.isJavaIdentifierPart(leafText.charAt(0))) {
+ char lastInBuffer = buffer.charAt(buffer.length() - 1);
+ if (lastInBuffer == '?' || Character.isJavaIdentifierPart(lastInBuffer)) {
+ buffer.append(" ");
+ }
+ }
+
+ buffer.append(leafText);
+ }
+ }
+
+ @Override
+ public void visitComposite(CompositeElement composite) {
+ if (!REF_FILTER.contains(composite.getElementType())) {
+ super.visitComposite(composite);
+ }
+ }
+ });
+
+ return buffer.toString();
+ }
+
+ @NotNull
+ public static String getReferenceText(@NotNull LighterAST tree, @NotNull LighterASTNode node) {
+ return LightTreeUtil.toFilteredString(tree, node, REF_FILTER);
+ }
+
+ public static TreeElement addParenthToReplacedChild(@NotNull IElementType parenthType,
+ @NotNull TreeElement newChild,
+ @NotNull PsiManager manager) {
+ CompositeElement parenthExpr = ASTFactory.composite(parenthType);
+
+ TreeElement dummyExpr = (TreeElement)newChild.clone();
+ final CharTable charTableByTree = SharedImplUtil.findCharTableByTree(newChild);
+ new DummyHolder(manager, parenthExpr, null, charTableByTree);
+ parenthExpr.putUserData(CharTable.CHAR_TABLE_KEY, charTableByTree);
+ parenthExpr.rawAddChildren(ASTFactory.leaf(JavaTokenType.LPARENTH, "("));
+ parenthExpr.rawAddChildren(dummyExpr);
+ parenthExpr.rawAddChildren(ASTFactory.leaf(JavaTokenType.RPARENTH, ")"));
+
+ try {
+ CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(manager.getProject());
+ PsiElement formatted = codeStyleManager.reformat(SourceTreeToPsiMap.treeToPsiNotNull(parenthExpr));
+ parenthExpr = (CompositeElement)SourceTreeToPsiMap.psiToTreeNotNull(formatted);
+ }
+ catch (IncorrectOperationException e) {
+ LOG.error(e); // should not happen
+ }
+
+ newChild.putUserData(CharTable.CHAR_TABLE_KEY, SharedImplUtil.findCharTableByTree(newChild));
+ dummyExpr.getTreeParent().replaceChild(dummyExpr, newChild);
+
+ // TODO remove explicit caches drop since this should be ok if we will use ChangeUtil for the modification
+ TreeUtil.clearCaches(TreeUtil.getFileElement(parenthExpr));
+ return parenthExpr;
+ }
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/SourceUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/SourceUtil.java
index 93e9f60c890e..554580828c0b 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/SourceUtil.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/SourceUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,94 +15,29 @@
*/
package com.intellij.psi.impl.source.tree;
-import com.intellij.lang.ASTFactory;
import com.intellij.lang.LighterAST;
import com.intellij.lang.LighterASTNode;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.psi.JavaTokenType;
-import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiJavaCodeReferenceElement;
import com.intellij.psi.PsiManager;
-import com.intellij.psi.codeStyle.CodeStyleManager;
-import com.intellij.psi.impl.source.DummyHolder;
-import com.intellij.psi.impl.source.SourceTreeToPsiMap;
import com.intellij.psi.tree.IElementType;
-import com.intellij.psi.tree.TokenSet;
-import com.intellij.util.CharTable;
-import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
+/** @deprecated use {@link JavaSourceUtil} (to be removed in IDEA 15) */
+@SuppressWarnings("UnusedDeclaration")
public class SourceUtil {
- private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.SourceUtil");
-
- private static final TokenSet REF_FILTER = TokenSet.orSet(
- ElementType.JAVA_COMMENT_OR_WHITESPACE_BIT_SET, TokenSet.create(JavaElementType.ANNOTATION));
-
private SourceUtil() { }
@NotNull
public static String getReferenceText(@NotNull PsiJavaCodeReferenceElement ref) {
- final StringBuilder buffer = new StringBuilder();
-
- ((TreeElement)ref.getNode()).acceptTree(new RecursiveTreeElementWalkingVisitor() {
- @Override
- public void visitLeaf(LeafElement leaf) {
- if (!REF_FILTER.contains(leaf.getElementType())) {
- String leafText = leaf.getText();
- if (buffer.length() > 0 && !leafText.isEmpty() && Character.isJavaIdentifierPart(leafText.charAt(0))) {
- char lastInBuffer = buffer.charAt(buffer.length() - 1);
- if (lastInBuffer == '?' || Character.isJavaIdentifierPart(lastInBuffer)) {
- buffer.append(" ");
- }
- }
-
- buffer.append(leafText);
- }
- }
-
- @Override
- public void visitComposite(CompositeElement composite) {
- if (!REF_FILTER.contains(composite.getElementType())) {
- super.visitComposite(composite);
- }
- }
- });
-
- return buffer.toString();
+ return JavaSourceUtil.getReferenceText(ref);
}
@NotNull
public static String getReferenceText(@NotNull LighterAST tree, @NotNull LighterASTNode node) {
- return LightTreeUtil.toFilteredString(tree, node, REF_FILTER);
+ return JavaSourceUtil.getReferenceText(tree, node);
}
- public static TreeElement addParenthToReplacedChild(@NotNull IElementType parenthType,
- @NotNull TreeElement newChild,
- @NotNull PsiManager manager) {
- CompositeElement parenthExpr = ASTFactory.composite(parenthType);
-
- TreeElement dummyExpr = (TreeElement)newChild.clone();
- final CharTable charTableByTree = SharedImplUtil.findCharTableByTree(newChild);
- new DummyHolder(manager, parenthExpr, null, charTableByTree);
- parenthExpr.putUserData(CharTable.CHAR_TABLE_KEY, charTableByTree);
- parenthExpr.rawAddChildren(ASTFactory.leaf(JavaTokenType.LPARENTH, "("));
- parenthExpr.rawAddChildren(dummyExpr);
- parenthExpr.rawAddChildren(ASTFactory.leaf(JavaTokenType.RPARENTH, ")"));
-
- try {
- CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(manager.getProject());
- PsiElement formatted = codeStyleManager.reformat(SourceTreeToPsiMap.treeToPsiNotNull(parenthExpr));
- parenthExpr = (CompositeElement)SourceTreeToPsiMap.psiToTreeNotNull(formatted);
- }
- catch (IncorrectOperationException e) {
- LOG.error(e); // should not happen
- }
-
- newChild.putUserData(CharTable.CHAR_TABLE_KEY, SharedImplUtil.findCharTableByTree(newChild));
- dummyExpr.getTreeParent().replaceChild(dummyExpr, newChild);
-
- // TODO remove explicit caches drop since this should be ok if we will use ChangeUtil for the modification
- TreeUtil.clearCaches(TreeUtil.getFileElement(parenthExpr));
- return parenthExpr;
+ public static TreeElement addParenthToReplacedChild(@NotNull IElementType parenthType, @NotNull TreeElement newChild, @NotNull PsiManager manager) {
+ return JavaSourceUtil.addParenthToReplacedChild(parenthType, newChild, manager);
}
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ExpressionPsiElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ExpressionPsiElement.java
index 1d8693efc55c..e0b122e95592 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ExpressionPsiElement.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ExpressionPsiElement.java
@@ -13,10 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-/*
- * @author max
- */
package com.intellij.psi.impl.source.tree.java;
import com.intellij.lang.ASTNode;
@@ -24,13 +20,11 @@ import com.intellij.psi.impl.source.tree.*;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
+/**
+ * @author max
+ */
public class ExpressionPsiElement extends CompositePsiElement {
- private final int myHC = CompositePsiElement.ourHC++;
-
- @Override
- public final int hashCode() {
- return myHC;
- }
+ @SuppressWarnings("AssignmentToStaticFieldFromInstanceMethod") private final int myHC = CompositePsiElement.ourHC++;
public ExpressionPsiElement(final IElementType type) {
super(type);
@@ -42,9 +36,14 @@ public class ExpressionPsiElement extends CompositePsiElement {
ElementType.EXPRESSION_BIT_SET.contains(newElement.getElementType())) {
boolean needParenth = ReplaceExpressionUtil.isNeedParenthesis(child, newElement);
if (needParenth) {
- newElement = SourceUtil.addParenthToReplacedChild(JavaElementType.PARENTH_EXPRESSION, newElement, getManager());
+ newElement = JavaSourceUtil.addParenthToReplacedChild(JavaElementType.PARENTH_EXPRESSION, newElement, getManager());
}
}
super.replaceChildInternal(child, newElement);
}
+
+ @Override
+ public final int hashCode() {
+ return myHC;
+ }
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodElement.java
index 31fb4bca8833..1edd7cbaec76 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodElement.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodElement.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -41,14 +41,15 @@ public class MethodElement extends CompositeElement implements Constants {
@Override
public int getTextOffset() {
- return findChildByRole(ChildRole.NAME).getStartOffset();
+ ASTNode name = findChildByType(IDENTIFIER);
+ return name != null ? name.getStartOffset() : this.getStartOffset();
}
@Override
public TreeElement addInternal(TreeElement first, ASTNode last, ASTNode anchor, Boolean before) {
- if (first == last && first.getElementType() == JavaElementType.CODE_BLOCK){
- ASTNode semicolon = findChildByRole(ChildRole.CLOSING_SEMICOLON);
- if (semicolon != null){
+ if (first == last && first.getElementType() == JavaElementType.CODE_BLOCK) {
+ ASTNode semicolon = TreeUtil.findChildBackward(this, SEMICOLON);
+ if (semicolon != null) {
deleteChildInternal(semicolon);
}
}
@@ -64,7 +65,7 @@ public class MethodElement extends CompositeElement implements Constants {
@Override
public void deleteChildInternal(@NotNull ASTNode child) {
- if (child.getElementType() == CODE_BLOCK){
+ if (child.getElementType() == CODE_BLOCK) {
final ASTNode prevWS = TreeUtil.prevLeaf(child);
if (prevWS != null && prevWS.getElementType() == TokenType.WHITE_SPACE) {
removeChild(prevWS);
@@ -80,9 +81,9 @@ public class MethodElement extends CompositeElement implements Constants {
}
@Override
- public ASTNode findChildByRole(int role){
+ public ASTNode findChildByRole(int role) {
LOG.assertTrue(ChildRole.isUnique(role));
- switch(role){
+ switch (role) {
default:
return null;
@@ -161,5 +162,4 @@ public class MethodElement extends CompositeElement implements Constants {
protected boolean isVisibilitySupported() {
return true;
}
-
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java
index 2209efe4141b..95171ba30bc9 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java
@@ -434,7 +434,7 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase
return true;
}
- final PsiSubstitutor subst = result.getSubstitutor();
+ PsiSubstitutor subst = result.getSubstitutor();
PsiType methodReturnType = null;
PsiClass containingClass = null;
@@ -451,6 +451,12 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase
return false;
}
+ PsiClass qContainingClass = PsiMethodReferenceUtil.getQualifierResolveResult(this).getContainingClass();
+ if (qContainingClass != null && containingClass != null && InheritanceUtil.isInheritorOrSelf(qContainingClass, containingClass, true)) {
+ subst = TypeConversionUtil.getClassSubstitutor(containingClass, qContainingClass, subst);
+ LOG.assertTrue(subst != null);
+ }
+
methodReturnType = subst.substitute(returnType);
}
else if (resolve instanceof PsiClass) {
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPackageStatementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPackageStatementImpl.java
index 5a42715590ef..29d072970560 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPackageStatementImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPackageStatementImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -38,7 +38,7 @@ public class PsiPackageStatementImpl extends CompositePsiElement implements PsiP
@Override
public String getPackageName() {
PsiJavaCodeReferenceElement ref = getPackageReference();
- return ref == null ? null : SourceUtil.getReferenceText(ref);
+ return ref == null ? null : JavaSourceUtil.getReferenceText(ref);
}
@Override
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
index 02ffaa6f3c20..8dd43933c660 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
@@ -761,7 +761,7 @@ public class PsiReferenceExpressionImpl extends PsiReferenceExpressionBase imple
private String getCachedNormalizedText() {
String whiteSpaceAndComments = myCachedNormalizedText;
if (whiteSpaceAndComments == null) {
- myCachedNormalizedText = whiteSpaceAndComments = SourceUtil.getReferenceText(this);
+ myCachedNormalizedText = whiteSpaceAndComments = JavaSourceUtil.getReferenceText(this);
}
return whiteSpaceAndComments;
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java
index f136c843aa87..59083c625f82 100644
--- a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java
+++ b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java
@@ -550,10 +550,10 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
final PsiSubstitutor methodSubstitutor1 = calculateMethodSubstitutor(typeParameters1, method1, siteSubstitutor1, types1, types2AtSite,
languageLevel);
- boolean applicable12 = isApplicableTo(types2AtSite, method1, languageLevel, varargsPosition, methodSubstitutor1, method2, siteSubstitutor1);
+ boolean applicable12 = isApplicableTo(types2AtSite, method1, languageLevel, varargsPosition, methodSubstitutor1, method2);
final PsiSubstitutor methodSubstitutor2 = calculateMethodSubstitutor(typeParameters2, method2, siteSubstitutor2, types2, types1AtSite, languageLevel);
- boolean applicable21 = isApplicableTo(types1AtSite, method2, languageLevel, varargsPosition, methodSubstitutor2, method1, siteSubstitutor2);
+ boolean applicable21 = isApplicableTo(types1AtSite, method2, languageLevel, varargsPosition, methodSubstitutor2, method1);
if (!myLanguageLevel.isAtLeast(LanguageLevel.JDK_1_8)) {
final boolean typeArgsApplicable12 = GenericsUtil.isTypeArgumentsApplicable(typeParameters1, methodSubstitutor1, myArgumentsList, !applicable21);
@@ -604,9 +604,9 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
if (toCompareFunctional) {
final boolean applicable12ignoreFunctionalType = isApplicableTo(types2AtSite, method1, languageLevel, varargsPosition,
- calculateMethodSubstitutor(typeParameters1, method1, siteSubstitutor1, types1, types2AtSite, languageLevel), null, null);
+ calculateMethodSubstitutor(typeParameters1, method1, siteSubstitutor1, types1, types2AtSite, languageLevel), null);
final boolean applicable21ignoreFunctionalType = isApplicableTo(types1AtSite, method2, languageLevel, varargsPosition,
- calculateMethodSubstitutor(typeParameters2, method2, siteSubstitutor2, types2, types1AtSite, languageLevel), null, null);
+ calculateMethodSubstitutor(typeParameters2, method2, siteSubstitutor2, types2, types1AtSite, languageLevel), null);
if (applicable12ignoreFunctionalType || applicable21ignoreFunctionalType) {
Specifics specifics = null;
@@ -694,12 +694,11 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
@NotNull LanguageLevel languageLevel,
boolean varargsPosition,
@NotNull PsiSubstitutor methodSubstitutor1,
- PsiMethod method2,
- PsiSubstitutor siteSubstitutor1) {
+ PsiMethod method2) {
if (languageLevel.isAtLeast(LanguageLevel.JDK_1_8) && method2 != null && method1.getTypeParameters().length > 0 && myArgumentsList instanceof PsiExpressionList) {
final PsiElement parent = myArgumentsList.getParent();
if (parent instanceof PsiCallExpression && ((PsiCallExpression)parent).getTypeArguments().length == 0) {
- return InferenceSession.isMoreSpecific(method2, method1, siteSubstitutor1, ((PsiExpressionList)myArgumentsList).getExpressions(), myArgumentsList, varargsPosition);
+ return InferenceSession.isMoreSpecific(method2, method1, ((PsiExpressionList)myArgumentsList).getExpressions(), myArgumentsList, varargsPosition);
}
}
final int applicabilityLevel = PsiUtil.getApplicabilityLevel(method1, methodSubstitutor1, types2AtSite, languageLevel, false, varargsPosition);
diff --git a/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail.java b/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail.java
new file mode 100644
index 000000000000..aa5945895222
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail.java
@@ -0,0 +1,7 @@
+class Foo {
+ {
+ foo("someTestAttachment", "".getByt<caret>)
+ }
+
+ void foo(String s, byte[] z) {}
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail_after.java b/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail_after.java
new file mode 100644
index 000000000000..a89e601edec6
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail_after.java
@@ -0,0 +1,7 @@
+class Foo {
+ {
+ foo("someTestAttachment", "".getBytes(<caret>))
+ }
+
+ void foo(String s, byte[] z) {}
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/completion/normal/SmartEnterNoNewLine.java b/java/java-tests/testData/codeInsight/completion/normal/SmartEnterNoNewLine.java
new file mode 100644
index 000000000000..49f9b65ec7b3
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/SmartEnterNoNewLine.java
@@ -0,0 +1,9 @@
+
+class Tester {
+ private void build(EntityBuilder builder) {
+ }
+
+ public void test1(int abc, int abd) {
+ System.out.println(a<caret>);
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/completion/normal/SmartEnterNoNewLine_after.java b/java/java-tests/testData/codeInsight/completion/normal/SmartEnterNoNewLine_after.java
new file mode 100644
index 000000000000..ce2b8956d9ac
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/SmartEnterNoNewLine_after.java
@@ -0,0 +1,9 @@
+
+class Tester {
+ private void build(EntityBuilder builder) {
+ }
+
+ public void test1(int abc, int abd) {
+ System.out.println(abc);<caret>
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/completion/normal/SmartEnterWithNewLine.java b/java/java-tests/testData/codeInsight/completion/normal/SmartEnterWithNewLine.java
new file mode 100644
index 000000000000..d21cac7e5efa
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/SmartEnterWithNewLine.java
@@ -0,0 +1,9 @@
+
+class Tester {
+ private void build(EntityBuilder builder) {
+ }
+
+ public void test1(int abc, int abd) {
+ if(a<caret>)
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/completion/normal/SmartEnterWithNewLine_after.java b/java/java-tests/testData/codeInsight/completion/normal/SmartEnterWithNewLine_after.java
new file mode 100644
index 000000000000..1b70dd9760a1
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/SmartEnterWithNewLine_after.java
@@ -0,0 +1,11 @@
+
+class Tester {
+ private void build(EntityBuilder builder) {
+ }
+
+ public void test1(int abc, int abd) {
+ if (abc) {
+ <caret>
+ }
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/completion/normal/UnimportedStaticInnerClass.java b/java/java-tests/testData/codeInsight/completion/normal/UnimportedStaticInnerClass.java
new file mode 100644
index 000000000000..4dcd4a5d770f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/UnimportedStaticInnerClass.java
@@ -0,0 +1,6 @@
+class Zoo {
+ void foo() {
+ new Super.I<caret>
+ }
+
+}
diff --git a/java/java-tests/testData/codeInsight/completion/normal/UnimportedStaticInnerClass_after.java b/java/java-tests/testData/codeInsight/completion/normal/UnimportedStaticInnerClass_after.java
new file mode 100644
index 000000000000..6db6912f48d2
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/UnimportedStaticInnerClass_after.java
@@ -0,0 +1,8 @@
+import foo.Super;
+
+class Zoo {
+ void foo() {
+ new Super.Inner()<caret>
+ }
+
+}
diff --git a/java/java-tests/testData/codeInsight/completion/smartType/AutoImportExpectedType.java b/java/java-tests/testData/codeInsight/completion/smartType/AutoImportExpectedType.java
new file mode 100644
index 000000000000..e120ecb7bd2b
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/smartType/AutoImportExpectedType.java
@@ -0,0 +1,5 @@
+class Main<T extends Foo> {
+ {
+ List<Foo> list = new <caret>
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/typeAnnotations.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/typeAnnotations.java
index 28035c8c1698..01f7486ea89a 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/typeAnnotations.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/typeAnnotations.java
@@ -114,6 +114,7 @@ class Outer {
void <error descr="Annotations are not allowed here">@TA</error> misplaced() { }
@TA Outer() { }
+ <T> <error descr="Annotations are not allowed here">@TA</error> Outer(T t) { }
class MyClass<@TA @TPA T> { }
interface MyInterface<@TA @TPA E> { }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/IDEA127584.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/IDEA127584.java
new file mode 100644
index 000000000000..f1222505a708
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/IDEA127584.java
@@ -0,0 +1,22 @@
+class Test {
+ public static <Tfoo, Vfoo> Future<Vfoo> foo(Future<Tfoo> future, Function<Tfoo, Vfoo> function) {
+ return future.map(function);
+ }
+
+ // These interfaces inspired by FoundationDB Java client class files
+ interface PartialFunction <TP, VP> {
+ VP apply(TP t) throws java.lang.Exception;
+ }
+
+ interface Function <TF, VF> extends PartialFunction<TF, VF> {
+ VF apply(TF t);
+ }
+
+ interface PartialFuture <TPP> {
+ <VPP> PartialFuture<VPP> map(PartialFunction<TPP, VPP> partialFunction);
+ }
+
+ interface Future <TFF> extends PartialFuture<TFF> {
+ <VFF> Future<VFF> map(Function<TFF, VFF> function);
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA127596.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA127596.java
new file mode 100644
index 000000000000..20636674141b
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA127596.java
@@ -0,0 +1,9 @@
+class Executor<E> {
+ <K> void bar(Executor<K> e) {
+ Runnable r = () -> foo(e);
+ }
+
+ private <T> T foo(final Executor<T> e) {
+ return null;
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA126969.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA126969.java
new file mode 100644
index 000000000000..e981d28298b5
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA126969.java
@@ -0,0 +1,15 @@
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Stream;
+
+class IDEA126969 {
+ void foo(final Stream<List<Integer>> stream) {
+
+ stream.flatMap(List::stream)
+ .forEach(i -> System.out.println(i.floatValue()));
+
+ stream.flatMap(Collection::stream)
+ .forEach(i -> System.out.println(i.floatValue()));
+
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA127506.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA127506.java
new file mode 100644
index 000000000000..7abf6ba9427a
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA127506.java
@@ -0,0 +1,24 @@
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Stream;
+
+class Validator {
+ static boolean thereAreConstraintViolationsIn1(final Stream<Object> objectStream, Validator validator) {
+ Stream<Set<List<Object>>> rStream = objectStream
+ .map(validator::validate);
+ return rStream
+ .flatMap(set -> set.stream())
+ .findAny()
+ .isPresent();
+ }
+
+ static void thereAreConstraintViolationsIn(final Stream<Object> objectStream, Validator validator) {
+ Stream<Set<List<Object>>> rStream = objectStream.map(validator ::validate);
+
+ Stream<Set<List<Object>>> lStream = objectStream.map((a) -> validator.validate(a));
+ }
+
+ <T> Set<List<T>> validate(T var1, Class<?> ... var2) {
+ return null;
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterShortenFQNs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterShortenFQNs.java
new file mode 100644
index 000000000000..9fea89ffa684
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterShortenFQNs.java
@@ -0,0 +1,10 @@
+import java.util.List;
+
+// "Cast parameter to 'java.util.List'" "true"
+class Test {
+ void m(Object o) {
+ foo((List) o);
+ }
+
+ private void foo(final java.util.List o) {}
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeShortenFQNs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeShortenFQNs.java
new file mode 100644
index 000000000000..e53d8b1e6c31
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeShortenFQNs.java
@@ -0,0 +1,8 @@
+// "Cast parameter to 'java.util.List'" "true"
+class Test {
+ void m(Object o) {
+ foo(<caret>o);
+ }
+
+ private void foo(final java.util.List o) {}
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeObjectInferredButIntExpected.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeObjectInferredButIntExpected.java
new file mode 100644
index 000000000000..3a82478ec678
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeObjectInferredButIntExpected.java
@@ -0,0 +1,16 @@
+// "Replace with lambda" "false"
+import java.util.function.Function;
+
+class Test {
+ void ab() {
+ comparing(new Func<caret>tion<Integer, String>() {
+ public String apply(Integer pObj) {
+ return Integer.toString(pObj);
+ }
+ });
+
+ }
+
+ static <T> void comparing(Function<T, String> keyExtractor){}
+
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/afterMultipleMethodsMultipleFields.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/afterMultipleMethodsMultipleFields.java
new file mode 100644
index 000000000000..9d1502b44bc0
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/afterMultipleMethodsMultipleFields.java
@@ -0,0 +1,17 @@
+// "Convert to local" "true"
+class MyClassTest {
+
+ private boolean editable = false;
+
+ boolean isEditable() {
+ return editable;
+ }
+
+ void setEditable(boolean editable) {
+ this.editable = editable;
+ }
+
+ public void setEditable1(final boolean editable1) {
+ boolean editable11 = editable1;
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeMultipleMethodsMultipleFields.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeMultipleMethodsMultipleFields.java
new file mode 100644
index 000000000000..4c6ead704f57
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeMultipleMethodsMultipleFields.java
@@ -0,0 +1,18 @@
+// "Convert to local" "true"
+class MyClassTest {
+
+ private boolean editable = false;
+ private boolean edit<caret>able1 = false;
+
+ boolean isEditable() {
+ return editable;
+ }
+
+ void setEditable(boolean editable) {
+ this.editable = editable;
+ }
+
+ public void setEditable1(final boolean editable1) {
+ this.editable1 = editable1;
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeMultipleMethodsOnReadOnly.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeMultipleMethodsOnReadOnly.java
new file mode 100644
index 000000000000..db61483db9ad
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeMultipleMethodsOnReadOnly.java
@@ -0,0 +1,18 @@
+// "Convert to local" "false"
+class MyClassTest {
+
+ private boolean edit<caret>able = false;
+ private boolean editable1 = false;
+
+ boolean isEditable() {
+ return editable;
+ }
+
+ void setEditable(boolean editable) {
+ this.editable = editable;
+ }
+
+ public void setEditable1(final boolean editable1) {
+ this.editable1 = editable1;
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/beforeInsideInterface.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/beforeInsideInterface.java
new file mode 100644
index 000000000000..74627f9409ee
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/beforeInsideInterface.java
@@ -0,0 +1,7 @@
+// "Create Field 'myFoo'" "false"
+
+interface Test {
+ default String get() {
+ return my<caret>Foo;
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/afterStaticInInterface.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/afterStaticInInterface.java
new file mode 100644
index 000000000000..66a2b59a9a10
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/afterStaticInInterface.java
@@ -0,0 +1,10 @@
+// "Create Method 'f'" "true"
+interface X {
+ public static void m() {
+ f();
+ }
+
+ static void f() {
+
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/beforeStaticInInterface.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/beforeStaticInInterface.java
new file mode 100644
index 000000000000..81afbe358fbe
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/beforeStaticInInterface.java
@@ -0,0 +1,6 @@
+// "Create Method 'f'" "true"
+interface X {
+ public static void m() {
+ f<caret>();
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterAmbiguityWithoutSuperMethods.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterAmbiguityWithoutSuperMethods.java
new file mode 100644
index 000000000000..54310c8da75f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterAmbiguityWithoutSuperMethods.java
@@ -0,0 +1,11 @@
+// "Replace lambda with method reference" "true"
+import java.io.PrintStream;
+import java.util.function.BiConsumer;
+
+class Test {
+ {
+ BiConsumer<PrintStream, String> printer = PrintStream::println;
+ }
+
+
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeAmbiguityWithoutSuperMethods.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeAmbiguityWithoutSuperMethods.java
new file mode 100644
index 000000000000..7c68e5ec9fbc
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeAmbiguityWithoutSuperMethods.java
@@ -0,0 +1,11 @@
+// "Replace lambda with method reference" "true"
+import java.io.PrintStream;
+import java.util.function.BiConsumer;
+
+class Test {
+ {
+ BiConsumer<PrintStream, String> printer = (printStream, x) -> printSt<caret>ream.println(x);
+ }
+
+
+}
diff --git a/java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.html b/java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.html
new file mode 100644
index 000000000000..c9b08d63be93
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.html
@@ -0,0 +1,2 @@
+<html><head> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Test"><code>Test</code></a></b></small><PRE>public&nbsp;void&nbsp;<b>foo</b>(@<a href="psi_element://java.lang.Deprecated"><code>Deprecated</code></a>&nbsp;<a href="psi_element://java.lang.String"><code>String</code></a>&nbsp;s,
+ @<a href="psi_element://java.lang.Deprecated"><code>Deprecated</code></a>&nbsp;<a href="psi_element://java.lang.String"><code>String</code></a>&nbsp;p)</PRE></body></html> \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.java b/java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.java
new file mode 100644
index 000000000000..676ff2d3e7cc
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.java
@@ -0,0 +1,4 @@
+class Test {
+ public void foo(@Deprecated String s,
+ @Deprecated String p){}
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html b/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html
new file mode 100644
index 000000000000..fbfd2983208a
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html
@@ -0,0 +1,6 @@
+<html><head> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Test"><code>Test</code></a></b></small><PRE>public <a href="psi_element://java.lang.String"><code>String</code></a> <b>field = null</b></PRE>
+ <pre>
+ foo
+ <p></p>
+ bar
+ </pre></body></html> \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.java b/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.java
new file mode 100644
index 000000000000..0627e4b99510
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.java
@@ -0,0 +1,10 @@
+class Test {
+ /**
+ * <pre>
+ * foo
+ * <p/>
+ * bar
+ * </pre>
+ */
+ public String field = null;
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/nullityinferrer/afterMethodReturnValue.java b/java/java-tests/testData/codeInsight/nullityinferrer/afterMethodReturnValue.java
index 6ae0b5b7994f..6503f431ec28 100644
--- a/java/java-tests/testData/codeInsight/nullityinferrer/afterMethodReturnValue.java
+++ b/java/java-tests/testData/codeInsight/nullityinferrer/afterMethodReturnValue.java
@@ -15,6 +15,7 @@ class Test {
return s;
}
+ @NotNull
String foo4(@NotNull String s) {
return s.substring(0);
}
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/cast/ternary.java b/java/java-tests/testData/codeInsight/template/postfix/templates/cast/ternary.java
new file mode 100644
index 000000000000..0e0ff3741921
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/cast/ternary.java
@@ -0,0 +1,5 @@
+public class Foo {
+ void m(String s) {
+ Object o = s.isEmpty() ? s.concat("a").cast<caret> : s.concat("b");
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/cast/ternary_after.java b/java/java-tests/testData/codeInsight/template/postfix/templates/cast/ternary_after.java
new file mode 100644
index 000000000000..486e88ba2dc3
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/cast/ternary_after.java
@@ -0,0 +1,5 @@
+public class Foo {
+ void m(String s) {
+ Object o = s.isEmpty() ? (() s.concat("a")) : s.concat("b");
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/columnMode_after.java b/java/java-tests/testData/codeInsight/typing/columnMode_after.java
new file mode 100644
index 000000000000..78c14369ab56
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/columnMode_after.java
@@ -0,0 +1,5 @@
+class Foo {
+ void m() {
+ System.exit(<caret>)
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/columnMode_before.java b/java/java-tests/testData/codeInsight/typing/columnMode_before.java
new file mode 100644
index 000000000000..ba4c1bfa09ff
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/columnMode_before.java
@@ -0,0 +1,5 @@
+class Foo {
+ void m() {
+ System.exit<caret>
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/annotations.xml
new file mode 100644
index 000000000000..0314b02a4d7b
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/annotations.xml
@@ -0,0 +1,345 @@
+<root>
+ <item name="java.awt.Component boolean action(java.awt.Event, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;false;_,!null-&gt;false;_,null-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean contains(java.awt.Point) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component boolean dispatchMouseWheelToAncestor(java.awt.event.MouseWheelEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component boolean dispatchMouseWheelToAncestor(java.awt.event.MouseWheelEvent)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean eventEnabled(java.awt.AWTEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component boolean gotFocus(java.awt.Event, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;false;_,!null-&gt;false;_,null-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean handleEvent(java.awt.Event) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component boolean keyDown(java.awt.Event, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean keyUp(java.awt.Event, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean lostFocus(java.awt.Event, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;false;_,!null-&gt;false;_,null-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean mouseDown(java.awt.Event, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;false;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean mouseDrag(java.awt.Event, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;false;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean mouseEnter(java.awt.Event, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;false;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean mouseExit(java.awt.Event, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;false;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean mouseMove(java.awt.Event, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;false;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean mouseUp(java.awt.Event, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;false;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component boolean postEvent(java.awt.Event) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.awt.AWTEvent coalesceEvents(java.awt.AWTEvent, java.awt.AWTEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.awt.AWTEvent coalesceEvents(java.awt.AWTEvent, java.awt.AWTEvent)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component java.awt.Component findUnderMouseInWindow(java.awt.PointerInfo)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component java.awt.Component getComponentAt(java.awt.Point) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.awt.Dimension getMaximumSize()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.awt.Dimension getSize(java.awt.Dimension)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component java.awt.Dimension minimumSize()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.awt.Dimension preferredSize()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.awt.Dimension size()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.awt.Point getLocation(java.awt.Point)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component java.awt.Point location()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.awt.Point pointRelativeToComponent(java.awt.Point) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.awt.Point pointRelativeToComponent(java.awt.Point)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.awt.Rectangle bounds()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.awt.Rectangle getBounds(java.awt.Rectangle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component java.awt.Window getContainingWindow(java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Component java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component javax.accessibility.AccessibleStateSet getAccessibleStateSet()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component void add(java.awt.PopupMenu) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component void applyComponentOrientation(java.awt.ComponentOrientation) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component void createBufferStrategy(int, java.awt.BufferCapabilities) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component void dispatchEventImpl(java.awt.AWTEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component void list(java.io.PrintStream, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component void list(java.io.PrintWriter, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component void resize(java.awt.Dimension) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component void setBounds(java.awt.Rectangle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component void setLocation(java.awt.Point) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component.FlipBufferStrategy FlipBufferStrategy(java.awt.Component, int, java.awt.BufferCapabilities) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Component.FlipBufferStrategy void createBuffers(int, java.awt.BufferCapabilities) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container boolean eventEnabled(java.awt.AWTEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container boolean isAncestorOf(java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Container boolean isRemoveNotifyNeeded(java.awt.Component, java.awt.Container, java.awt.Container)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,null-&gt;false;_,null,_-&gt;false;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Container java.awt.Component add(java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Container java.awt.Component add(java.awt.Component, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Container java.awt.Component add(java.lang.String, java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Container java.awt.Component findComponentAt(java.awt.Point) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container java.awt.Component getComponentAt(java.awt.Point) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container java.awt.Component[] getComponents()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container java.awt.Component[] getComponents_NoClientCode()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void addDelicately(java.awt.Component, java.awt.Container, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void addImpl(java.awt.Component, java.lang.Object, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void applyComponentOrientation(java.awt.ComponentOrientation) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void checkAdding(java.awt.Component, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void deliverEvent(java.awt.Event) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void dispatchEventImpl(java.awt.AWTEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void dispatchEventToSelf(java.awt.AWTEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void list(java.io.PrintStream, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void list(java.io.PrintWriter, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void remove(java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void removeDelicately(java.awt.Component, java.awt.Container, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void reparentTraverse(java.awt.peer.ContainerPeer, java.awt.Container) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void setComponentZOrder(java.awt.Component, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Container void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Dimension Dimension(java.awt.Dimension) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Dimension boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Dimension java.awt.Dimension getSize()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Dimension java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Dimension void setSize(java.awt.Dimension) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Frame java.lang.String constructComponentName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Frame void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Frame void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window Window(java.awt.Frame) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window Window(java.awt.Window) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window Window(java.awt.Window, java.awt.GraphicsConfiguration) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window boolean dispatchMouseWheelToAncestor(java.awt.event.MouseWheelEvent)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;false;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Window boolean eventEnabled(java.awt.AWTEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window boolean postEvent(java.awt.Event)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.awt.Window java.lang.Object access$000(java.awt.Window) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window java.lang.String constructComponentName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window void connectOwnedWindow(java.awt.Window) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window void dispatchEventImpl(java.awt.AWTEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window void ownedInit(java.awt.Window) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window void preProcessKeyEvent(java.awt.event.KeyEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.awt.Window void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/event/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/event/annotations.xml
new file mode 100644
index 000000000000..7b9c87e9eb3f
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/event/annotations.xml
@@ -0,0 +1,5 @@
+<root>
+ <item name="java.awt.event.ActionEvent java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/beans/beancontext/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/beans/beancontext/annotations.xml
new file mode 100644
index 000000000000..60214de88d04
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/beans/beancontext/annotations.xml
@@ -0,0 +1,79 @@
+<root>
+ <item name="java.beans.beancontext.BeanContextServicesSupport boolean addService(java.lang.Class, java.beans.beancontext.BeanContextServiceProvider, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport boolean addService(java.lang.Class, java.beans.beancontext.BeanContextServiceProvider, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport boolean hasService(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport java.beans.beancontext.BeanContextServicesListener getChildBeanContextServicesListener(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport java.beans.beancontext.BeanContextServicesSupport.BCSSServiceProvider createBCSSServiceProvider(java.lang.Class, java.beans.beancontext.BeanContextServiceProvider)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport java.beans.beancontext.BeanContextSupport.BCSChild createBCSChild(java.lang.Object, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport java.lang.Object getService(java.beans.beancontext.BeanContextChild, java.lang.Object, java.lang.Class, java.lang.Object, java.beans.beancontext.BeanContextServiceRevokedListener) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport java.lang.Object getService(java.beans.beancontext.BeanContextChild, java.lang.Object, java.lang.Class, java.lang.Object, java.beans.beancontext.BeanContextServiceRevokedListener) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport java.lang.Object getService(java.beans.beancontext.BeanContextChild, java.lang.Object, java.lang.Class, java.lang.Object, java.beans.beancontext.BeanContextServiceRevokedListener) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport java.lang.Object getService(java.beans.beancontext.BeanContextChild, java.lang.Object, java.lang.Class, java.lang.Object, java.beans.beancontext.BeanContextServiceRevokedListener) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport java.util.Iterator getCurrentServiceClasses()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void addBeanContextServicesListener(java.beans.beancontext.BeanContextServicesListener) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void bcsPreDeserializationHook(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void bcsPreSerializationHook(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void childJustRemovedHook(java.lang.Object, java.beans.beancontext.BeanContextSupport.BCSChild) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void releaseService(java.beans.beancontext.BeanContextChild, java.lang.Object, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void releaseService(java.beans.beancontext.BeanContextChild, java.lang.Object, java.lang.Object) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void releaseService(java.beans.beancontext.BeanContextChild, java.lang.Object, java.lang.Object) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void removeBeanContextServicesListener(java.beans.beancontext.BeanContextServicesListener) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void revokeService(java.lang.Class, java.beans.beancontext.BeanContextServiceProvider, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void revokeService(java.lang.Class, java.beans.beancontext.BeanContextServiceProvider, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void serviceAvailable(java.beans.beancontext.BeanContextServiceAvailableEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void serviceRevoked(java.beans.beancontext.BeanContextServiceRevokedEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.beans.beancontext.BeanContextServicesSupport void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/io/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/io/annotations.xml
new file mode 100644
index 000000000000..868b0f3f11c0
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/io/annotations.xml
@@ -0,0 +1,395 @@
+<root>
+ <item name="java.io.BufferedInputStream int read(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.BufferedReader BufferedReader(java.io.Reader) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.BufferedReader BufferedReader(java.io.Reader, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.BufferedReader int read(char[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.BufferedWriter BufferedWriter(java.io.Writer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.BufferedWriter BufferedWriter(java.io.Writer, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.BufferedWriter void write(char[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ByteArrayInputStream ByteArrayInputStream(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ByteArrayInputStream ByteArrayInputStream(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ByteArrayInputStream int read(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ByteArrayOutputStream java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ByteArrayOutputStream java.lang.String toString(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ByteArrayOutputStream java.lang.String toString(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ByteArrayOutputStream java.lang.String toString(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ByteArrayOutputStream void write(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ByteArrayOutputStream void writeTo(java.io.OutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.DataInputStream int read(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.DataInputStream java.lang.String readUTF()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.DataInputStream java.lang.String readUTF(java.io.DataInput) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.DataInputStream java.lang.String readUTF(java.io.DataInput)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.DataInputStream void readFully(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File File(java.io.File, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File File(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File File(java.lang.String, java.io.File) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File File(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File File(java.net.URI) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.io.File java.io.File createTempFile(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File java.io.File createTempFile(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File java.io.File createTempFile(java.lang.String, java.lang.String, java.io.File) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File java.io.File createTempFile(java.lang.String, java.lang.String, java.io.File)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File java.io.File generateFile(java.lang.String, java.lang.String, java.io.File)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File java.io.File getAbsoluteFile()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File java.io.File getCanonicalFile()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File java.lang.String getName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File java.lang.String slashify(java.lang.String, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File java.net.URI toURI()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File java.net.URL toURL()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.File void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.FileInputStream FileInputStream(java.io.FileDescriptor) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.FileInputStream int read(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.FileOutputStream FileOutputStream(java.io.FileDescriptor) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.FileOutputStream void write(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.FileReader FileReader(java.io.FileDescriptor) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.FileWriter FileWriter(java.io.FileDescriptor) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.FilterOutputStream void write(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.FilterOutputStream void write(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.InputStream int read(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.InputStream int read(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.InputStreamReader InputStreamReader(java.io.InputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.InputStreamReader InputStreamReader(java.io.InputStream, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.InputStreamReader InputStreamReader(java.io.InputStream, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.InputStreamReader InputStreamReader(java.io.InputStream, java.nio.charset.Charset) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.InputStreamReader InputStreamReader(java.io.InputStream, java.nio.charset.Charset) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.InputStreamReader InputStreamReader(java.io.InputStream, java.nio.charset.CharsetDecoder) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.InputStreamReader InputStreamReader(java.io.InputStream, java.nio.charset.CharsetDecoder) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream boolean access$400(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream int access$000(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream int access$002(java.io.ObjectInputStream, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream int read(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream java.io.ObjectInputStream.BlockDataInputStream access$200(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream java.io.ObjectInputStream.HandleTable access$100(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream java.io.ObjectStreamClass readClassDescriptor()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream java.io.ObjectStreamClass readNonProxyDesc(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream java.lang.Class resolveClass(java.io.ObjectStreamClass) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream java.lang.Class resolveProxyClass(java.lang.String[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream java.lang.Object access$300(java.io.ObjectInputStream, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream java.lang.Object resolveObject(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.io.ObjectInputStream void access$500(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream void defaultReadFields(java.lang.Object, java.io.ObjectStreamClass) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream void readExternalData(java.io.Externalizable, java.io.ObjectStreamClass) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream void readFully(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream void readFully(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectInputStream void readSerialData(java.lang.Object, java.io.ObjectStreamClass) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream java.io.ObjectOutputStream.BlockDataOutputStream access$000(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream java.lang.Object replaceObject(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.io.ObjectOutputStream void access$100(java.io.ObjectOutputStream, java.lang.Object, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void defaultWriteFields(java.lang.Object, java.io.ObjectStreamClass) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void write(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void write(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void writeArray(java.lang.Object, java.io.ObjectStreamClass, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void writeArray(java.lang.Object, java.io.ObjectStreamClass, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void writeClassDescriptor(java.io.ObjectStreamClass) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void writeEnum(java.lang.Enum, java.io.ObjectStreamClass, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void writeEnum(java.lang.Enum, java.io.ObjectStreamClass, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void writeExternalData(java.io.Externalizable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void writeNonProxyDesc(java.io.ObjectStreamClass, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void writeOrdinaryObject(java.lang.Object, java.io.ObjectStreamClass, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void writeProxyDesc(java.io.ObjectStreamClass, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.ObjectOutputStream void writeSerialData(java.lang.Object, java.io.ObjectStreamClass) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.OutputStream void write(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.OutputStream void write(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.OutputStreamWriter OutputStreamWriter(java.io.OutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.OutputStreamWriter OutputStreamWriter(java.io.OutputStream, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.OutputStreamWriter OutputStreamWriter(java.io.OutputStream, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.OutputStreamWriter OutputStreamWriter(java.io.OutputStream, java.nio.charset.Charset) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.OutputStreamWriter OutputStreamWriter(java.io.OutputStream, java.nio.charset.Charset) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.OutputStreamWriter OutputStreamWriter(java.io.OutputStream, java.nio.charset.CharsetEncoder) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.OutputStreamWriter OutputStreamWriter(java.io.OutputStream, java.nio.charset.CharsetEncoder) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.PrintStream PrintStream(boolean, java.io.OutputStream) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.PrintStream PrintStream(java.io.File, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.PrintStream PrintStream(java.io.OutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.PrintStream PrintStream(java.io.OutputStream, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.PrintStream PrintStream(java.io.OutputStream, boolean, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.PrintStream PrintStream(java.io.OutputStream, boolean, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.PrintStream PrintStream(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.PrintStream java.io.PrintStream append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.PrintStream java.io.PrintStream append(java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.PrintStream java.io.PrintStream append(java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.PrintStream void init(java.io.OutputStreamWriter) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.RandomAccessFile RandomAccessFile(java.io.File, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.RandomAccessFile RandomAccessFile(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.RandomAccessFile int read(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.RandomAccessFile java.lang.String readUTF()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.RandomAccessFile void readFully(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.RandomAccessFile void write(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.RandomAccessFile void writeBytes(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.RandomAccessFile void writeChars(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.Reader Reader(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.Reader int read(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.Reader int read(java.nio.CharBuffer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.Writer Writer(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.Writer java.io.Writer append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.Writer java.io.Writer append(java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.Writer java.io.Writer append(java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.Writer void write(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.Writer void write(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.io.Writer void write(java.lang.String, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotation/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotation/annotations.xml
new file mode 100644
index 000000000000..21d29c1ed4df
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotation/annotations.xml
@@ -0,0 +1,5 @@
+<root>
+ <item name="java.lang.annotation.IncompleteAnnotationException IncompleteAnnotationException(java.lang.Class&lt;? extends java.lang.annotation.Annotation&gt;, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotations.xml
new file mode 100644
index 000000000000..8d157485ada1
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotations.xml
@@ -0,0 +1,1347 @@
+<root>
+ <item name="java.lang.AbstractStringBuilder int indexOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder int lastIndexOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder append(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder append(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder append(char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder append(char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder append(double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder append(float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder append(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder append(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder append(java.lang.StringBuffer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder append(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder appendCodePoint(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder delete(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder deleteCharAt(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder insert(int, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder insert(int, char[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder insert(int, char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder insert(int, char[], int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder insert(int, char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder insert(int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder replace(int, int, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.AbstractStringBuilder replace(int, int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.AbstractStringBuilder java.lang.String substring(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Boolean boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Boolean boolean parseBoolean(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Boolean boolean toBoolean(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Boolean int compareTo(java.lang.Boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Boolean int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Boolean java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Boolean java.lang.String toString(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte Byte(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Byte byte parseByte(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte byte parseByte(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte int compareTo(java.lang.Byte) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte java.lang.Byte decode(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte java.lang.Byte decode(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte java.lang.Byte valueOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte java.lang.Byte valueOf(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte java.lang.Byte valueOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte java.lang.Byte valueOf(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Byte java.lang.String toString(byte)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Character char[] toChars(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character int codePointAt(char[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character int codePointAt(java.lang.CharSequence, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character int codePointBefore(char[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character int codePointBefore(java.lang.CharSequence, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character int compareTo(java.lang.Character) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character int toChars(int, char[], int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character java.lang.Character valueOf(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character java.lang.String toString(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Character void toSurrogates(int, char[], int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class A getAnnotation(java.lang.Class&lt;A&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class T cast(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Class boolean access$202(boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;false-&gt;false;true-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Class boolean access$302(boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;false-&gt;false;true-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Class boolean isAnnotationPresent(java.lang.Class&lt;? extends java.lang.annotation.Annotation&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.Class toClass(java.lang.reflect.Type)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Class java.lang.Class&lt;? extends U&gt; asSubclass(java.lang.Class&lt;U&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.Class&lt;? extends U&gt; asSubclass(java.lang.Class&lt;U&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.String argumentTypesToString(java.lang.Class[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.String getSimpleName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.String resolveName(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Class java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Constructor[] copyConstructors(java.lang.reflect.Constructor[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Field getDeclaredField(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Field getField(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Field getField0(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Field searchFields(java.lang.reflect.Field[], java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Field searchFields(java.lang.reflect.Field[], java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Field[] copyFields(java.lang.reflect.Field[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Method getDeclaredMethod(java.lang.String, java.lang.Class...) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Method getMethod(java.lang.String, java.lang.Class...) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Method getMethod0(java.lang.String, java.lang.Class[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Method searchMethods(java.lang.reflect.Method[], java.lang.String, java.lang.Class[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Method searchMethods(java.lang.reflect.Method[], java.lang.String, java.lang.Class[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class java.lang.reflect.Method[] copyMethods(java.lang.reflect.Method[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Class void addAll(java.util.Collection, java.lang.reflect.Field[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ClassLoader boolean compareCerts(java.security.cert.Certificate[], java.security.cert.Certificate[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ClassLoader boolean loadLibrary0(java.lang.Class, java.io.File)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.ClassLoader java.lang.Package definePackage(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.net.URL)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ClassLoader java.lang.String findLibrary(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.ClassLoader java.lang.String[] initializePath(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ClassLoader java.net.URL findResource(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.ClassLoader java.util.Enumeration findResources(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ClassLoader java.util.Enumeration getBootstrapResources(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ClassLoader java.util.Enumeration getResources(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ClassLoader java.util.Enumeration getSystemResources(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ClassLoader void checkCerts(java.lang.String, java.security.CodeSource) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ClassLoader void setSigners(java.lang.Class, java.lang.Object[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Double boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Double int compareTo(java.lang.Double) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Double int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Double java.lang.Double valueOf(double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Double java.lang.Double valueOf(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Enum T valueOf(java.lang.Class&lt;T&gt;, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Enum int compareTo(E) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Enum int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Float boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Float int compareTo(java.lang.Float) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Float int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Float java.lang.Float valueOf(float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Float java.lang.Float valueOf(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer Integer(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Integer int compareTo(java.lang.Integer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer int parseInt(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer int parseInt(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.Integer decode(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.Integer decode(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.Integer getInteger(java.lang.String, java.lang.Integer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Integer java.lang.Integer valueOf(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.Integer valueOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.Integer valueOf(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.Integer valueOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.Integer valueOf(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.String toBinaryString(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.String toHexString(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.String toOctalString(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.String toString(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.String toString(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer java.lang.String toUnsignedString(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Integer void getChars(int, int, char[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long Long(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Long int compareTo(java.lang.Long) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.Long decode(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.Long decode(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.Long getLong(java.lang.String, java.lang.Long)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Long java.lang.Long valueOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.Long valueOf(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.Long valueOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.Long valueOf(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.String toBinaryString(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.String toHexString(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.String toOctalString(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.String toString(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.String toString(long, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long java.lang.String toUnsignedString(long, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long long parseLong(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long long parseLong(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Long void getChars(long, int, char[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.NumberFormatException java.lang.NumberFormatException forInputString(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Object java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short Short(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.Short int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short int compareTo(java.lang.Short) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short java.lang.Short decode(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short java.lang.Short decode(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short java.lang.Short valueOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short java.lang.Short valueOf(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short java.lang.Short valueOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short java.lang.Short valueOf(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short java.lang.Short valueOf(short)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short java.lang.String toString(short)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short short parseShort(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Short short parseShort(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(byte[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(byte[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(byte[], int, int, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(byte[], int, int, java.lang.String) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(byte[], java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(byte[], java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(char[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(int[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(java.lang.StringBuffer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String String(java.lang.StringBuilder) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String boolean contains(java.lang.CharSequence) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String boolean contentEquals(java.lang.CharSequence) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String boolean contentEquals(java.lang.StringBuffer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String boolean endsWith(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String boolean regionMatches(boolean, int, java.lang.String, int, int) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String boolean regionMatches(int, java.lang.String, int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String boolean startsWith(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String boolean startsWith(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String byte[] getBytes(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String char[] toCharArray()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String int compareTo(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String int indexOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String int indexOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String int lastIndexOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String int lastIndexOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.CharSequence subSequence(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String concat(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String concat(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String copyValueOf(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String copyValueOf(char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String copyValueOf(char[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String copyValueOf(char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String replace(java.lang.CharSequence, java.lang.CharSequence) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String replace(java.lang.CharSequence, java.lang.CharSequence) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String substring(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String substring(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String toLowerCase(java.util.Locale) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String toUpperCase(java.util.Locale) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String valueOf(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String valueOf(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String valueOf(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String valueOf(char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String valueOf(char[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String valueOf(char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String valueOf(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String java.lang.String valueOf(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.String java.lang.String valueOf(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String void checkBounds(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String.CaseInsensitiveComparator int compare(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.String.CaseInsensitiveComparator int compare(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer StringBuffer(java.lang.CharSequence) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer StringBuffer(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer int indexOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer int indexOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer int lastIndexOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer int lastIndexOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(java.lang.StringBuffer)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder append(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder appendCodePoint(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder delete(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder deleteCharAt(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, char[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, char[], int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder insert(int, long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder replace(int, int, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder replace(int, int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.AbstractStringBuilder reverse()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.Appendable append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.Appendable append(java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.Appendable append(java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.CharSequence subSequence(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.String substring(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.String substring(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(java.lang.StringBuffer)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer append(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer appendCodePoint(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer delete(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer deleteCharAt(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, char[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, char[], int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer insert(int, long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer replace(int, int, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer replace(int, int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer java.lang.StringBuffer reverse()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuffer void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder StringBuilder(java.lang.CharSequence) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder StringBuilder(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder int indexOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder int indexOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder int lastIndexOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder int lastIndexOf(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(java.lang.StringBuffer)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder append(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder appendCodePoint(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder delete(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder deleteCharAt(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, char[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, char[], int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder insert(int, long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder replace(int, int, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder replace(int, int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.AbstractStringBuilder reverse()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.Appendable append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.Appendable append(java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.Appendable append(java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(java.lang.StringBuffer)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(java.lang.StringBuilder)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder append(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder appendCodePoint(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder delete(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder deleteCharAt(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, char[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, char[], int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, char[], int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, java.lang.CharSequence)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, java.lang.CharSequence, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder insert(int, long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder replace(int, int, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder replace(int, int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder java.lang.StringBuilder reverse()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.StringBuilder void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.System java.lang.String clearProperty(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.System java.lang.String getProperty(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.System java.lang.String getProperty(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.System java.lang.String setProperty(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.System void checkKey(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.System.2 sun.reflect.ConstantPool getConstantPool(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.System.2 sun.reflect.annotation.AnnotationType getAnnotationType(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.System.2 void blockedOn(java.lang.Thread, sun.nio.ch.Interruptible) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.System.2 void setAnnotationType(java.lang.Class, sun.reflect.annotation.AnnotationType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Thread Thread(java.lang.Runnable, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Thread Thread(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Thread Thread(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Thread Thread(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String, long) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Thread Thread(java.lang.ThreadGroup, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Thread java.lang.String getName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Thread java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Thread void init(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String, long) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Thread void setName(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal int access$400(java.lang.ThreadLocal) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal java.lang.ThreadLocal.ThreadLocalMap createInheritedMap(java.lang.ThreadLocal.ThreadLocalMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal java.lang.ThreadLocal.ThreadLocalMap createInheritedMap(java.lang.ThreadLocal.ThreadLocalMap)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal java.lang.ThreadLocal.ThreadLocalMap getMap(java.lang.Thread) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal void createMap(java.lang.Thread, T) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap ThreadLocalMap(java.lang.ThreadLocal, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap ThreadLocalMap(java.lang.ThreadLocal.ThreadLocalMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap ThreadLocalMap(java.lang.ThreadLocal.ThreadLocalMap, java.lang.ThreadLocal.1) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap java.lang.ThreadLocal.ThreadLocalMap.Entry access$000(java.lang.ThreadLocal.ThreadLocalMap, java.lang.ThreadLocal) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap java.lang.ThreadLocal.ThreadLocalMap.Entry access$000(java.lang.ThreadLocal.ThreadLocalMap, java.lang.ThreadLocal) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap java.lang.ThreadLocal.ThreadLocalMap.Entry getEntry(java.lang.ThreadLocal) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap java.lang.ThreadLocal.ThreadLocalMap.Entry getEntryAfterMiss(java.lang.ThreadLocal, int, java.lang.ThreadLocal.ThreadLocalMap.Entry)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap void access$100(java.lang.ThreadLocal.ThreadLocalMap, java.lang.ThreadLocal, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap void access$100(java.lang.ThreadLocal.ThreadLocalMap, java.lang.ThreadLocal, java.lang.Object) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap void access$200(java.lang.ThreadLocal.ThreadLocalMap, java.lang.ThreadLocal) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap void access$200(java.lang.ThreadLocal.ThreadLocalMap, java.lang.ThreadLocal) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap void remove(java.lang.ThreadLocal) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.ThreadLocal.ThreadLocalMap void set(java.lang.ThreadLocal, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Throwable java.lang.Throwable initCause(java.lang.Throwable)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Throwable void printEnclosedStackTrace(java.lang.Throwable.PrintStreamOrWriter, java.lang.StackTraceElement[], java.lang.String, java.lang.String, java.util.Set&lt;java.lang.Throwable&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Throwable void printEnclosedStackTrace(java.lang.Throwable.PrintStreamOrWriter, java.lang.StackTraceElement[], java.lang.String, java.lang.String, java.util.Set&lt;java.lang.Throwable&gt;) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Throwable void printStackTrace(java.lang.Throwable.PrintStreamOrWriter) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Throwable void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Throwable void setStackTrace(java.lang.StackTraceElement[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.Throwable void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/invoke/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/invoke/annotations.xml
new file mode 100644
index 000000000000..f800dab8c906
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/invoke/annotations.xml
@@ -0,0 +1,1872 @@
+<root>
+ <item name="java.lang.invoke.AdapterMethodHandle AdapterMethodHandle(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, long) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle AdapterMethodHandle(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, long, java.lang.Object) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle AdapterMethodHandle(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, long, java.lang.invoke.AdapterMethodHandle.1) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canBoxArgument(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;false;_,!null-&gt;false;_,null-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canCheckCast(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canCheckCast(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canCheckCast(java.lang.invoke.MethodType, java.lang.invoke.MethodType, int, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_,_-&gt;false;null,_,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canConvertArgument(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canDupArguments(java.lang.invoke.MethodType, java.lang.invoke.MethodType, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_,_-&gt;false;null,_,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canPairwiseConvert(java.lang.invoke.MethodType, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canPairwiseConvert(java.lang.invoke.MethodType, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canPrimCast(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canPrimCast(java.lang.invoke.MethodType, java.lang.invoke.MethodType, int, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_,_-&gt;false;null,_,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canRotateArguments(java.lang.invoke.MethodType, java.lang.invoke.MethodType, int, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_,_,_-&gt;false;null,_,_,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canSpreadArguments(java.lang.invoke.MethodType, java.lang.invoke.MethodType, java.lang.Class&lt;?&gt;, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_,_,_-&gt;false;null,_,_,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canSwapArguments(java.lang.invoke.MethodType, java.lang.invoke.MethodType, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_,_-&gt;false;null,_,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canUnboxArgument(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle boolean canUnboxArgument(java.lang.invoke.MethodType, java.lang.invoke.MethodType, int, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_,_-&gt;false;null,_,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle int diffReturnTypes(java.lang.invoke.MethodType, java.lang.invoke.MethodType, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle int diffReturnTypes(java.lang.invoke.MethodType, java.lang.invoke.MethodType, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle int diffTypes(java.lang.invoke.MethodType, java.lang.invoke.MethodType, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle int diffTypes(java.lang.invoke.MethodType, java.lang.invoke.MethodType, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeBoxArgument(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;null;_,!null,_,_-&gt;null;_,_,_,!null-&gt;null;_,_,_,null-&gt;null;_,null,_,_-&gt;null;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeCheckCast(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int, java.lang.Class&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeDropArguments(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeDupArguments(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makePairwiseConvert(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makePermutation(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makePermutation(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makePrimCast(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int, java.lang.Class&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makePrimCast(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeRetype(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeRetypeOnly(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeRetypeRaw(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeRotateArguments(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int, int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeRotateArguments(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeSpreadArguments(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, java.lang.Class&lt;?&gt;, int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeSwapArguments(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeUnboxArgument(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeUnboxArgument(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, int, java.lang.Class&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeVarargsCollector(java.lang.invoke.MethodHandle, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle makeVarargsCollector(java.lang.invoke.MethodHandle, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle java.lang.invoke.MethodHandle nonAdapter(java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle.AsVarargsCollector AsVarargsCollector(java.lang.invoke.MethodHandle, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.AdapterMethodHandle.AsVarargsCollector java.lang.invoke.MethodHandle asType(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle BoundMethodHandle(java.lang.invoke.DirectMethodHandle, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle BoundMethodHandle(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle BoundMethodHandle(java.lang.invoke.MethodHandle, java.lang.Object, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle BoundMethodHandle(java.lang.invoke.MethodType, java.lang.Object, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle BoundMethodHandle(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, java.lang.Object, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle BoundMethodHandle(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, java.lang.Object, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle java.lang.Object bindPrimitiveArgument(java.lang.Object, java.lang.invoke.MethodHandle, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle java.lang.Object checkReferenceArgument(java.lang.Object, java.lang.invoke.MethodHandle, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle java.lang.Object checkReferenceArgument(java.lang.Object, java.lang.invoke.MethodHandle, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle java.lang.RuntimeException badBoundArgumentException(java.lang.Object, java.lang.invoke.MethodHandle, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle java.lang.RuntimeException badBoundArgumentException(java.lang.Object, java.lang.invoke.MethodHandle, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle java.lang.String noParens(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.BoundMethodHandle java.lang.String noParens(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.CallSite CallSite(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.CallSite CallSite(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.CallSite java.lang.Object maybeReBox(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.CallSite java.lang.invoke.CallSite makeSite(java.lang.invoke.MethodHandle, java.lang.String, java.lang.invoke.MethodType, java.lang.Object, java.lang.invoke.MemberName, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.CallSite java.lang.invoke.CallSite makeSite(java.lang.invoke.MethodHandle, java.lang.String, java.lang.invoke.MethodType, java.lang.Object, java.lang.invoke.MemberName, int) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.CallSite java.lang.invoke.WrongMethodTypeException wrongTargetType(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.CallSite void checkTargetChange(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.CallSite void checkTargetChange(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.CallSite void maybeReBoxElements(java.lang.Object[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ConstantCallSite ConstantCallSite(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.DirectMethodHandle DirectMethodHandle(java.lang.invoke.MethodType, java.lang.invoke.MemberName, boolean, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.DirectMethodHandle DirectMethodHandle(java.lang.invoke.MethodType, java.lang.invoke.MemberName, boolean, java.lang.Class&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric FilterGeneric(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.FilterGeneric of(java.lang.invoke.FilterGeneric.Kind, int, java.lang.invoke.MethodType, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.FilterGeneric.Adapter findAdapter(java.lang.invoke.MethodType, java.lang.invoke.FilterGeneric.Kind, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.FilterGeneric.Adapter findAdapter(java.lang.invoke.MethodType, java.lang.invoke.FilterGeneric.Kind, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.FilterGeneric.Adapter getAdapter(java.lang.invoke.FilterGeneric.Kind, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodHandle make(java.lang.invoke.FilterGeneric.Kind, int, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodHandle make(java.lang.invoke.FilterGeneric.Kind, int, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodHandle make(java.lang.invoke.FilterGeneric.Kind, int, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodHandle makeArgumentCollector(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodHandle makeArgumentCollector(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodHandle makeArgumentFilter(int, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodHandle makeArgumentFilter(int, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodHandle makeArgumentFolder(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodHandle makeArgumentFolder(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodHandle makeFlyby(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodHandle makeFlyby(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodType entryType(java.lang.invoke.FilterGeneric.Kind, int, java.lang.invoke.MethodType, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodType entryType(java.lang.invoke.FilterGeneric.Kind, int, java.lang.invoke.MethodType, java.lang.invoke.MethodType)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodType targetType(java.lang.invoke.MethodType, java.lang.invoke.FilterGeneric.Kind, int, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric java.lang.invoke.MethodType targetType(java.lang.invoke.MethodType, java.lang.invoke.FilterGeneric.Kind, int, java.lang.invoke.MethodType)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.Adapter Adapter(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.Adapter Adapter(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F0 F0(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F0 F0(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F0 java.lang.invoke.FilterGeneric.F0 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F0 java.lang.invoke.FilterGeneric.F0 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F1 F1(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F1 F1(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F1 java.lang.invoke.FilterGeneric.F1 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F1 java.lang.invoke.FilterGeneric.F1 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F10 F10(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F10 F10(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F10 java.lang.invoke.FilterGeneric.F10 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F10 java.lang.invoke.FilterGeneric.F10 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F11 F11(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F11 F11(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F11 java.lang.invoke.FilterGeneric.F11 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F11 java.lang.invoke.FilterGeneric.F11 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F12 F12(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F12 F12(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F12 java.lang.invoke.FilterGeneric.F12 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F12 java.lang.invoke.FilterGeneric.F12 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F13 F13(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F13 F13(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F13 java.lang.invoke.FilterGeneric.F13 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F13 java.lang.invoke.FilterGeneric.F13 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F14 F14(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F14 F14(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F14 java.lang.invoke.FilterGeneric.F14 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F14 java.lang.invoke.FilterGeneric.F14 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F15 F15(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F15 F15(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F15 java.lang.invoke.FilterGeneric.F15 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F15 java.lang.invoke.FilterGeneric.F15 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F16 F16(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F16 F16(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F16 java.lang.invoke.FilterGeneric.F16 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F16 java.lang.invoke.FilterGeneric.F16 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F17 F17(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F17 F17(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F17 java.lang.invoke.FilterGeneric.F17 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F17 java.lang.invoke.FilterGeneric.F17 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F18 F18(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F18 F18(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F18 java.lang.invoke.FilterGeneric.F18 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F18 java.lang.invoke.FilterGeneric.F18 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F19 F19(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F19 F19(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F19 java.lang.invoke.FilterGeneric.F19 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F19 java.lang.invoke.FilterGeneric.F19 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F2 F2(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F2 F2(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F2 java.lang.invoke.FilterGeneric.F2 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F2 java.lang.invoke.FilterGeneric.F2 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F20 F20(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F20 F20(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F20 java.lang.invoke.FilterGeneric.F20 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F20 java.lang.invoke.FilterGeneric.F20 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F3 F3(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F3 F3(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F3 java.lang.invoke.FilterGeneric.F3 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F3 java.lang.invoke.FilterGeneric.F3 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F4 F4(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F4 F4(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F4 java.lang.invoke.FilterGeneric.F4 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F4 java.lang.invoke.FilterGeneric.F4 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F5 F5(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F5 F5(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F5 java.lang.invoke.FilterGeneric.F5 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F5 java.lang.invoke.FilterGeneric.F5 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F6 F6(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F6 F6(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F6 java.lang.invoke.FilterGeneric.F6 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F6 java.lang.invoke.FilterGeneric.F6 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F7 F7(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F7 F7(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F7 java.lang.invoke.FilterGeneric.F7 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F7 java.lang.invoke.FilterGeneric.F7 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F8 F8(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F8 F8(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F8 java.lang.invoke.FilterGeneric.F8 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F8 java.lang.invoke.FilterGeneric.F8 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F9 F9(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F9 F9(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F9 java.lang.invoke.FilterGeneric.F9 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.F9 java.lang.invoke.FilterGeneric.F9 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterGeneric.Kind java.lang.String invokerName(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FilterOneArgument java.lang.invoke.MethodHandle make(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.FromGeneric FromGeneric(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric java.lang.invoke.FromGeneric of(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric java.lang.invoke.FromGeneric.Adapter findAdapter(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric java.lang.invoke.FromGeneric.Adapter makeInstance(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric java.lang.invoke.MethodHandle computeReturnConversion(java.lang.invoke.MethodType, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric java.lang.invoke.MethodHandle computeReturnConversion(java.lang.invoke.MethodType, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric java.lang.invoke.MethodHandle computeUnboxingInvoker(java.lang.invoke.MethodType, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric java.lang.invoke.MethodHandle computeUnboxingInvoker(java.lang.invoke.MethodType, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric java.lang.invoke.MethodHandle make(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A0 A0(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A0 A0(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A0 java.lang.invoke.FromGeneric.A0 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A0 java.lang.invoke.FromGeneric.A0 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A1 A1(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A1 A1(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A1 java.lang.invoke.FromGeneric.A1 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A1 java.lang.invoke.FromGeneric.A1 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A10 A10(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A10 A10(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A10 java.lang.invoke.FromGeneric.A10 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A10 java.lang.invoke.FromGeneric.A10 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A2 A2(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A2 A2(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A2 java.lang.invoke.FromGeneric.A2 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A2 java.lang.invoke.FromGeneric.A2 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A3 A3(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A3 A3(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A3 java.lang.invoke.FromGeneric.A3 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A3 java.lang.invoke.FromGeneric.A3 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A4 A4(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A4 A4(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A4 java.lang.invoke.FromGeneric.A4 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A4 java.lang.invoke.FromGeneric.A4 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A5 A5(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A5 A5(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A5 java.lang.invoke.FromGeneric.A5 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A5 java.lang.invoke.FromGeneric.A5 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A6 A6(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A6 A6(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A6 java.lang.invoke.FromGeneric.A6 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A6 java.lang.invoke.FromGeneric.A6 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A7 A7(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A7 A7(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A7 java.lang.invoke.FromGeneric.A7 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A7 java.lang.invoke.FromGeneric.A7 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A8 A8(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A8 A8(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A8 java.lang.invoke.FromGeneric.A8 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A8 java.lang.invoke.FromGeneric.A8 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A9 A9(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A9 A9(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A9 java.lang.invoke.FromGeneric.A9 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.A9 java.lang.invoke.FromGeneric.A9 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.Adapter Adapter(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.FromGeneric.Adapter Adapter(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.InvokeGeneric boolean returnConversionNeeded(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.InvokeGeneric boolean returnConversionNeeded(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.InvokeGeneric java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.InvokeGeneric java.lang.invoke.MethodHandle dispatch(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.InvokeGeneric java.lang.invoke.MethodHandle dispatch(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.InvokeGeneric java.lang.invoke.MethodHandle dispatchWithConversion(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.InvokeGeneric java.lang.invoke.MethodHandle dispatchWithConversion(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.InvokeGeneric java.lang.invoke.MethodHandle dispatcher(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.InvokeGeneric java.lang.invoke.MethodHandle dropDispatchArguments(java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.Invokers Invokers(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.Invokers java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.Invokers java.lang.invoke.MethodType invokerType(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName MemberName(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName MemberName(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName MemberName(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName MemberName(java.lang.reflect.Constructor) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName MemberName(java.lang.reflect.Field) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName MemberName(java.lang.reflect.Method) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName int access$200(java.lang.invoke.MemberName) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName java.lang.IllegalAccessException makeAccessException(java.lang.String, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName java.lang.Object access$100(java.lang.invoke.MemberName) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName java.lang.Object access$102(java.lang.invoke.MemberName, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName java.lang.Object access$102(java.lang.invoke.MemberName, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MemberName java.lang.ReflectiveOperationException makeAccessException(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName java.lang.String access$000(java.lang.invoke.MemberName) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName java.lang.String access$002(java.lang.invoke.MemberName, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName java.lang.String access$002(java.lang.invoke.MemberName, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MemberName java.lang.String getName(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MemberName.Factory boolean resolveInPlace(java.lang.invoke.MemberName, boolean, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MemberName.Factory java.lang.invoke.MemberName resolveOrNull(java.lang.invoke.MemberName, boolean, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandle MethodHandle(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandle java.lang.Object invokeWithArguments(java.util.List&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandle java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandle java.lang.invoke.MethodHandle asCollector(java.lang.Class&lt;?&gt;, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandle java.lang.invoke.MethodHandle asSpreader(java.lang.Class&lt;?&gt;, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandle java.lang.invoke.MethodHandle asVarargsCollector(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandle java.lang.invoke.MethodHandle asVarargsCollector(java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle accessArrayElement(java.lang.Class&lt;?&gt;, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle accessField(java.lang.invoke.MemberName, boolean, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle accessField(java.lang.invoke.MemberName, boolean, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle asVarargsCollector(java.lang.invoke.MethodHandle, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle asVarargsCollector(java.lang.invoke.MethodHandle, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle bindArgument(java.lang.invoke.MethodHandle, int, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle bindArgument(java.lang.invoke.MethodHandle, int, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle bindReceiver(java.lang.invoke.MethodHandle, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle collectArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, int, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle dropArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle dropArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle filterArgument(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle filterArgument(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle findMethod(java.lang.invoke.MemberName, boolean, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle foldArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle foldArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle makeAllocator(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle makeGuardWithCatch(java.lang.invoke.MethodHandle, java.lang.Class&lt;? extends java.lang.Throwable&gt;, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle makeGuardWithCatch(java.lang.invoke.MethodHandle, java.lang.Class&lt;? extends java.lang.Throwable&gt;, java.lang.invoke.MethodHandle) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle makeGuardWithTest(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle makeGuardWithTest(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl java.lang.invoke.MethodHandle spreadArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.AllocateObject AllocateObject(java.lang.invoke.MethodHandle, java.lang.Class&lt;C&gt;, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.AllocateObject java.lang.invoke.MethodHandle make(java.lang.Class&lt;?&gt;, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.AllocateObject java.lang.invoke.MethodType makeConType(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor FieldAccessor(java.lang.invoke.MemberName, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor V getElementL(java.lang.Class&lt;V[]&gt;, V[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor boolean doCache(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor boolean getElementZ(boolean[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor byte getElementB(byte[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor char getElementC(char[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor double getElementD(double[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor float getElementF(float[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor int getElementI(int[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor java.lang.Object getElementL(java.lang.Object[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor java.lang.Object staticBase(java.lang.invoke.MemberName) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor java.lang.String aname(java.lang.Class&lt;?&gt;, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor java.lang.String aname(java.lang.Class&lt;?&gt;, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor java.lang.String fname(java.lang.Class&lt;?&gt;, boolean, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor java.lang.invoke.MethodHandle ahandle(java.lang.Class&lt;?&gt;, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor java.lang.invoke.MethodHandle fhandle(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;, boolean, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor java.lang.invoke.MethodHandle fhandle(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;, boolean, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor java.lang.invoke.MethodType atype(java.lang.Class&lt;?&gt;, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor long getElementJ(long[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor short getElementS(short[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor void setElementB(byte[], int, byte) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor void setElementC(char[], int, char) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor void setElementD(double[], int, double) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor void setElementF(float[], int, float) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor void setElementI(int[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor void setElementJ(long[], int, long) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor void setElementL(java.lang.Class&lt;V[]&gt;, V[], int, V) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor void setElementL(java.lang.Object[], int, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor void setElementS(short[], int, short) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.FieldAccessor void setElementZ(boolean[], int, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.GuardWithCatch GuardWithCatch(java.lang.invoke.MethodHandle, java.lang.Class&lt;? extends java.lang.Throwable&gt;, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.GuardWithCatch GuardWithCatch(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.Class&lt;? extends java.lang.Throwable&gt;, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.GuardWithTest GuardWithTest(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.GuardWithTest java.lang.invoke.MethodHandle make(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleImpl.GuardWithTest java.lang.invoke.MethodHandle make(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleNatives java.lang.Object[] makeTarget(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.String, int, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleNatives java.lang.invoke.CallSite makeDynamicCallSite(java.lang.invoke.MethodHandle, java.lang.String, java.lang.invoke.MethodType, java.lang.Object, java.lang.invoke.MemberName, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleNatives java.lang.invoke.CallSite makeDynamicCallSite(java.lang.invoke.MethodHandle, java.lang.String, java.lang.invoke.MethodType, java.lang.Object, java.lang.invoke.MemberName, int) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleNatives java.lang.invoke.MethodHandle linkMethodHandleConstant(java.lang.Class&lt;?&gt;, int, java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleNatives java.lang.invoke.MethodHandle linkMethodHandleConstant(java.lang.Class&lt;?&gt;, int, java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Object) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleNatives java.lang.invoke.MethodType findMethodHandleType(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleNatives void notifyGenericMethodType(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleNatives void raiseException(int, java.lang.Object, java.lang.Object) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleStatics java.lang.Error uncaughtException(java.lang.Exception)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleStatics java.lang.RuntimeException newIllegalArgumentException(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleStatics java.lang.RuntimeException newIllegalArgumentException(java.lang.String, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleStatics java.lang.RuntimeException newIllegalStateException(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleStatics java.lang.RuntimeException newIllegalStateException(java.lang.String, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleStatics java.lang.String addTypeString(java.lang.Object, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MethodHandleStatics java.lang.String getNameString(java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleStatics java.lang.String getNameString(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleStatics java.lang.String getNameString(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandleStatics java.lang.String message(java.lang.String, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MethodHandles T asInstance(java.lang.invoke.MethodHandle, java.lang.Class&lt;T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles T asInstance(java.lang.invoke.MethodHandle, java.lang.Class&lt;T&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles T1 checkValue(java.lang.Class&lt;T0&gt;, java.lang.Class&lt;T1&gt;, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles boolean access$100(java.lang.reflect.Method) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles boolean isObjectMethod(java.lang.reflect.Method) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.Class&lt;?&gt; wrapperInstanceType(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.Object access$200(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.Object callObjectMethod(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.RuntimeException misMatchedTypes(java.lang.String, java.lang.invoke.MethodType, java.lang.invoke.MethodType)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle arrayElementGetter(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle arrayElementSetter(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle asVarargsCollector(java.lang.invoke.MethodHandle, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle asVarargsCollector(java.lang.invoke.MethodHandle, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle catchException(java.lang.invoke.MethodHandle, java.lang.Class&lt;? extends java.lang.Throwable&gt;, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle catchException(java.lang.invoke.MethodHandle, java.lang.Class&lt;? extends java.lang.Throwable&gt;, java.lang.invoke.MethodHandle) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle collectArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle collectArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle constant(java.lang.Class&lt;?&gt;, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle convertArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle dropArguments(java.lang.invoke.MethodHandle, int, java.lang.Class&lt;?&gt;...) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle dropArguments(java.lang.invoke.MethodHandle, int, java.lang.Class&lt;?&gt;...)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle dropArguments(java.lang.invoke.MethodHandle, int, java.util.List&lt;java.lang.Class&lt;?&gt;&gt;) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle dropArguments(java.lang.invoke.MethodHandle, int, java.util.List&lt;java.lang.Class&lt;?&gt;&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle exactInvoker(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle explicitCastArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle filterArguments(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle...) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle filterArguments(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle...) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle filterReturnValue(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle filterReturnValue(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle foldArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle foldArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle genericInvoker(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle guardWithTest(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle guardWithTest(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle guardWithTest(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle insertArguments(java.lang.invoke.MethodHandle, int, java.lang.Object...) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle insertArguments(java.lang.invoke.MethodHandle, int, java.lang.Object...) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle permuteArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, int...) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle permuteArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, int...) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle permuteArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, int...) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle spreadArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle spreadArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle spreadInvoker(java.lang.invoke.MethodType, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle throwException(java.lang.Class&lt;?&gt;, java.lang.Class&lt;? extends java.lang.Throwable&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandle wrapperInstanceTarget(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.invoke.MethodHandles.Lookup lookup()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.reflect.Constructor getSingleConstructor(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles java.lang.reflect.Method getSingleMethod(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles sun.invoke.WrapperInstance asWrapperInstance(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles sun.invoke.WrapperInstance asWrapperInstance(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MethodHandles void checkReorder(int[], java.lang.invoke.MethodType, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles void checkReorder(int[], java.lang.invoke.MethodType, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles void checkReorder(int[], java.lang.invoke.MethodType, java.lang.invoke.MethodType) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.1 java.lang.Object invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.String accessFailedMessage(java.lang.Class&lt;?&gt;, java.lang.invoke.MemberName) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.String accessFailedMessage(java.lang.Class&lt;?&gt;, java.lang.invoke.MemberName)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MemberName resolveOrFail(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MemberName resolveOrFail(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;, boolean) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MemberName resolveOrFail(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MemberName resolveOrFail(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType, boolean) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MemberName resolveOrFail(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType, boolean, boolean, java.lang.Class&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MemberName resolveOrFail(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType, boolean, boolean, java.lang.Class&lt;?&gt;) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle bind(java.lang.Object, java.lang.String, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle bind(java.lang.Object, java.lang.String, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle bind(java.lang.Object, java.lang.String, java.lang.invoke.MethodType) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findConstructor(java.lang.Class&lt;?&gt;, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findGetter(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findGetter(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findSetter(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findSetter(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findSpecial(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType, java.lang.Class&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findSpecial(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType, java.lang.Class&lt;?&gt;) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findStatic(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findStatic(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findStaticGetter(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findStaticGetter(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findStaticSetter(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findStaticSetter(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findVirtual(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle findVirtual(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.invoke.MethodType) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle fixVarargs(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle fixVarargs(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle makeAccessor(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;, boolean, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle makeAccessor(java.lang.Class&lt;?&gt;, java.lang.String, java.lang.Class&lt;?&gt;, boolean, boolean) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle makeAccessor(java.lang.Class&lt;?&gt;, java.lang.invoke.MemberName, boolean, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle makeAccessor(java.lang.Class&lt;?&gt;, java.lang.invoke.MemberName, boolean, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,true,_-&gt;!null;_,null,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle restrictProtectedReceiver(java.lang.invoke.MemberName, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle restrictProtectedReceiver(java.lang.invoke.MemberName, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle restrictReceiver(java.lang.invoke.MemberName, java.lang.invoke.MethodHandle, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle restrictReceiver(java.lang.invoke.MemberName, java.lang.invoke.MethodHandle, java.lang.Class&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle unreflect(java.lang.reflect.Method) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle unreflectConstructor(java.lang.reflect.Constructor) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle unreflectGetter(java.lang.reflect.Field) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle unreflectSetter(java.lang.reflect.Field) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandle unreflectSpecial(java.lang.reflect.Method, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandles.Lookup in(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup java.lang.invoke.MethodHandles.Lookup in(java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup void checkMethod(java.lang.Class&lt;?&gt;, java.lang.invoke.MemberName, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodHandles.Lookup void checkUnprivilegedlookupClass(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType MethodType(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType MethodType(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType boolean equals(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType int checkPtype(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType int checkPtypes(java.lang.Class&lt;?&gt;[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.IndexOutOfBoundsException newIndexOutOfBoundsException(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.IndexOutOfBoundsException newIndexOutOfBoundsException(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType appendParameterTypes(java.lang.Class&lt;?&gt;...) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType appendParameterTypes(java.util.List&lt;java.lang.Class&lt;?&gt;&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType insertParameterTypes(int, java.lang.Class&lt;?&gt;...) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType insertParameterTypes(int, java.util.List&lt;java.lang.Class&lt;?&gt;&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType makeImpl(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;[], boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType methodType(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType methodType(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType methodType(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;...) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType methodType(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;...) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType methodType(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType methodType(java.lang.Class&lt;?&gt;, java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType methodType(java.lang.Class&lt;?&gt;, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType methodType(java.lang.Class&lt;?&gt;, java.util.List&lt;java.lang.Class&lt;?&gt;&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType methodType(java.lang.Class&lt;?&gt;, java.util.List&lt;java.lang.Class&lt;?&gt;&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType unwrapWithNoPrims(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.lang.invoke.MethodType wrapWithPrims(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType java.util.List&lt;java.lang.Class&lt;?&gt;&gt; parameterList()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType void MethodType_init(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType void MethodType_init(java.lang.Class&lt;?&gt;, java.lang.Class&lt;?&gt;[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType void checkRtype(java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodType void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodTypeForm MethodTypeForm(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodTypeForm int[] primsAtEndOrder(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodTypeForm java.lang.Class&lt;?&gt; canonicalize(java.lang.Class&lt;?&gt;, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MethodTypeForm java.lang.Class&lt;?&gt;[] canonicalizes(java.lang.Class&lt;?&gt;[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodTypeForm java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodTypeForm java.lang.invoke.MethodType canonicalize(java.lang.invoke.MethodType, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MethodTypeForm java.lang.invoke.MethodType reorderParameters(java.lang.invoke.MethodType, int[], java.lang.Class&lt;?&gt;[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.MethodTypeForm java.lang.invoke.MethodTypeForm findForm(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MutableCallSite MutableCallSite(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MutableCallSite MutableCallSite(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.MutableCallSite void syncAll(java.lang.invoke.MutableCallSite[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric java.lang.Object check(java.lang.Object, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric java.lang.Object select(java.lang.Object, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric java.lang.invoke.MethodHandle access$000(java.lang.invoke.SpreadGeneric) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric java.lang.invoke.MethodHandle make(java.lang.invoke.MethodHandle, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric java.lang.invoke.MethodHandle makeInstance(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric java.lang.invoke.MethodType preSpreadType(java.lang.invoke.MethodType, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric java.lang.invoke.SpreadGeneric of(java.lang.invoke.MethodType, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric java.lang.invoke.SpreadGeneric.Adapter findAdapter(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric java.lang.invoke.SpreadGeneric.Adapter findAdapter(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.Adapter Adapter(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S0 S0(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S0 java.lang.invoke.SpreadGeneric.S0 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S0 java.lang.invoke.SpreadGeneric.S0 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S1 S1(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S1 java.lang.invoke.SpreadGeneric.S1 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S1 java.lang.invoke.SpreadGeneric.S1 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S10 S10(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S10 java.lang.invoke.SpreadGeneric.S10 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S10 java.lang.invoke.SpreadGeneric.S10 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S2 S2(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S2 java.lang.invoke.SpreadGeneric.S2 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S2 java.lang.invoke.SpreadGeneric.S2 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S3 S3(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S3 java.lang.invoke.SpreadGeneric.S3 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S3 java.lang.invoke.SpreadGeneric.S3 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S4 S4(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S4 java.lang.invoke.SpreadGeneric.S4 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S4 java.lang.invoke.SpreadGeneric.S4 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S5 S5(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S5 java.lang.invoke.SpreadGeneric.S5 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S5 java.lang.invoke.SpreadGeneric.S5 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S6 S6(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S6 java.lang.invoke.SpreadGeneric.S6 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S6 java.lang.invoke.SpreadGeneric.S6 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S7 S7(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S7 java.lang.invoke.SpreadGeneric.S7 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S7 java.lang.invoke.SpreadGeneric.S7 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S8 S8(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S8 java.lang.invoke.SpreadGeneric.S8 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S8 java.lang.invoke.SpreadGeneric.S8 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S9 S9(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S9 java.lang.invoke.SpreadGeneric.S9 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SpreadGeneric.S9 java.lang.invoke.SpreadGeneric.S9 makeInstance(java.lang.invoke.SpreadGeneric, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.SwitchPoint java.lang.invoke.MethodHandle guardWithTest(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.SwitchPoint void invalidateAll(java.lang.invoke.SwitchPoint[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric ToGeneric(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric java.lang.invoke.MethodHandle computeReturnConversion(java.lang.invoke.MethodType, java.lang.invoke.MethodType, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric java.lang.invoke.MethodHandle computeReturnConversion(java.lang.invoke.MethodType, java.lang.invoke.MethodType, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric java.lang.invoke.MethodHandle make(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric java.lang.invoke.MethodHandle make(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric java.lang.invoke.MethodHandle makeRawArgumentFilter(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, java.lang.invoke.MethodType) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric java.lang.invoke.MethodHandle makeRawArgumentFilter(java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, java.lang.invoke.MethodType)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.lang.invoke.ToGeneric java.lang.invoke.ToGeneric of(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric java.lang.invoke.ToGeneric.Adapter findAdapter(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric java.lang.invoke.ToGeneric.Adapter makeInstance(java.lang.invoke.MethodType, java.lang.invoke.MethodHandle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A0 A0(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A0 A0(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A0 java.lang.invoke.ToGeneric.A0 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A0 java.lang.invoke.ToGeneric.A0 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A1 A1(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A1 A1(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A1 java.lang.invoke.ToGeneric.A1 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A1 java.lang.invoke.ToGeneric.A1 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A10 A10(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A10 A10(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A10 java.lang.invoke.ToGeneric.A10 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A10 java.lang.invoke.ToGeneric.A10 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A2 A2(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A2 A2(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A2 java.lang.invoke.ToGeneric.A2 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A2 java.lang.invoke.ToGeneric.A2 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A3 A3(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A3 A3(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A3 java.lang.invoke.ToGeneric.A3 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A3 java.lang.invoke.ToGeneric.A3 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A4 A4(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A4 A4(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A4 java.lang.invoke.ToGeneric.A4 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A4 java.lang.invoke.ToGeneric.A4 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A5 A5(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A5 A5(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A5 java.lang.invoke.ToGeneric.A5 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A5 java.lang.invoke.ToGeneric.A5 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A6 A6(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A6 A6(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A6 java.lang.invoke.ToGeneric.A6 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A6 java.lang.invoke.ToGeneric.A6 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A7 A7(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A7 A7(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A7 java.lang.invoke.ToGeneric.A7 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A7 java.lang.invoke.ToGeneric.A7 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A8 A8(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A8 A8(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A8 java.lang.invoke.ToGeneric.A8 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A8 java.lang.invoke.ToGeneric.A8 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A9 A9(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A9 A9(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A9 java.lang.invoke.ToGeneric.A9 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.A9 java.lang.invoke.ToGeneric.A9 makeInstance(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.Adapter Adapter(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.ToGeneric.Adapter Adapter(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.VolatileCallSite VolatileCallSite(java.lang.invoke.MethodHandle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.lang.invoke.VolatileCallSite VolatileCallSite(java.lang.invoke.MethodType) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/net/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/net/annotations.xml
new file mode 100644
index 000000000000..6c410bc4ed65
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/net/annotations.xml
@@ -0,0 +1,422 @@
+<root>
+ <item name="java.net.DatagramPacket DatagramPacket(byte[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramPacket DatagramPacket(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramPacket DatagramPacket(byte[], int, int, java.net.InetAddress, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramPacket DatagramPacket(byte[], int, int, java.net.SocketAddress) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramPacket DatagramPacket(byte[], int, int, java.net.SocketAddress) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramPacket DatagramPacket(byte[], int, java.net.InetAddress, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramPacket DatagramPacket(byte[], int, java.net.SocketAddress) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramPacket DatagramPacket(byte[], int, java.net.SocketAddress) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramPacket java.net.SocketAddress getSocketAddress()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramPacket void setData(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramPacket void setData(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramPacket void setSocketAddress(java.net.SocketAddress) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramSocket DatagramSocket(java.net.DatagramSocketImpl) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramSocket void connect(java.net.InetAddress, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramSocket void connect(java.net.SocketAddress) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramSocket void connectInternal(java.net.InetAddress, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramSocket void receive(java.net.DatagramPacket) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.DatagramSocket void send(java.net.DatagramPacket) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;false;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.InetAddress int checkNumericZone(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress java.lang.Object checkLookupTable(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.InetAddress java.lang.Object getCachedAddress(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress java.lang.Object readResolve()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress java.lang.String getHostFromNameService(java.net.InetAddress, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress java.net.InetAddress getByAddress(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress java.net.InetAddress getByAddress(byte[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress java.net.InetAddress getByAddress(java.lang.String, byte[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress java.net.InetAddress getByAddress(java.lang.String, byte[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress java.net.InetAddress[] getAllByName(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.InetAddress java.net.InetAddress[] getAllByName0(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress java.net.InetAddress[] getAllByName0(java.lang.String, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.InetAddress sun.net.spi.nameservice.NameService access$002(sun.net.spi.nameservice.NameService)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.ServerSocket ServerSocket(java.net.Proxy) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.ServerSocket java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.ServerSocket java.net.Socket accept()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.ServerSocket java.net.SocketImpl access$000(java.net.ServerSocket) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.ServerSocket void implAccept(java.net.Socket) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.Socket Socket(java.net.SocketAddress, java.net.SocketAddress, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.Socket java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.Socket void connect(java.net.SocketAddress, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI int access$2502(java.net.URI, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI int compareTo(java.net.URI) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI int join(char[], int[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI int join(char[], int[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI int needsNormalization(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String access$002(java.net.URI, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String access$002(java.net.URI, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String access$1002(java.net.URI, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String access$1002(java.net.URI, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String access$1102(java.net.URI, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String access$1102(java.net.URI, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String access$1402(java.net.URI, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String access$1402(java.net.URI, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String access$1502(java.net.URI, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String access$1502(java.net.URI, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String access$2202(java.net.URI, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String access$2202(java.net.URI, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String access$2302(java.net.URI, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String access$2302(java.net.URI, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String access$2402(java.net.URI, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String access$2402(java.net.URI, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String access$702(java.net.URI, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String access$702(java.net.URI, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String decode(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String encode(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String encode(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String normalize(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String normalize(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String quote(java.lang.String, long, long) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String quote(java.lang.String, long, long)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.lang.String resolvePath(java.lang.String, java.lang.String, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String resolvePath(java.lang.String, java.lang.String, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.lang.String toString(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.net.URI create(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.net.URI normalize(java.net.URI) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.net.URI normalize(java.net.URI)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.net.URI parseServerAuthority()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.net.URI relativize(java.net.URI) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.net.URI relativize(java.net.URI)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.net.URI relativize(java.net.URI, java.net.URI) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.net.URI relativize(java.net.URI, java.net.URI)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URI java.net.URI resolve(java.net.URI) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.net.URI resolve(java.net.URI, java.net.URI) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI java.net.URL toURL()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI long highMask(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI long lowMask(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI void appendEscape(java.lang.StringBuffer, byte) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI void maybeAddLeadingDot(char[], int[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI void removeDots(char[], int[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI void removeDots(char[], int[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI void split(char[], int[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI void split(char[], int[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URI void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL URL(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL URL(java.lang.String, java.lang.String, int, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL URL(java.lang.String, java.lang.String, int, java.lang.String, java.net.URLStreamHandler) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL URL(java.lang.String, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL URL(java.net.URL, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL URL(java.net.URL, java.lang.String, java.net.URLStreamHandler) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URL boolean isValidProtocol(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL java.net.URI toURI()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL java.net.URLConnection openConnection(java.net.Proxy) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL void checkSpecifyHandler(java.lang.SecurityManager) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL void set(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URL void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URLConnection boolean checkfpx(java.io.InputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URLConnection int readBytes(int[], int, java.io.InputStream) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URLConnection java.lang.String getContentHandlerPkgPrefixes()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URLConnection java.lang.String getDefaultRequestProperty(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URLConnection java.lang.String getHeaderField(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URLConnection java.lang.String guessContentTypeFromStream(java.io.InputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URLConnection java.lang.String stripOffParameters(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.net.URLConnection java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URLConnection java.lang.String typeToPackageName(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URLConnection java.lang.String typeToPackageName(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URLConnection java.net.ContentHandler lookupContentHandlerClassFor(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URLConnection java.net.FileNameMap getFileNameMap()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URLConnection void addRequestProperty(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.net.URLConnection void setRequestProperty(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/security/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/security/annotations.xml
new file mode 100644
index 000000000000..756cbfcdd13e
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/security/annotations.xml
@@ -0,0 +1,132 @@
+<root>
+ <item name="java.security.Identity boolean identityEquals(java.security.Identity) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Identity boolean keyEquals(java.security.Key, java.security.Key) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Identity boolean keyEquals(java.security.Key, java.security.Key) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Identity java.lang.String printKeys()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Identity java.lang.String toString(boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;true-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.security.Identity java.security.Certificate[] certificates()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Identity void addCertificate(java.security.Certificate) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Policy java.security.PermissionCollection getPermissions(java.security.ProtectionDomain)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.security.Policy void initPolicy(java.security.Policy) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider java.lang.String[] getTypeAndAlgorithm(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider java.util.Collection values()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider java.util.Set keySet()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider void implPutAll(java.util.Map) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider void parseLegacyPut(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider void putAll(java.util.Map) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider void putPropertyStrings(java.security.Provider.Service) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider void putService(java.security.Provider.Service) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider void removeInvalidServices(java.util.Map&lt;java.security.Provider.ServiceKey,java.security.Provider.Service&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider void removePropertyStrings(java.security.Provider.Service) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Provider void removeService(java.security.Provider.Service) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security boolean isConstraintSatisfied(java.lang.String, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security boolean isCriterionSatisfied(java.security.Provider, java.lang.String, java.lang.String, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security boolean isStandardAttr(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security int addProvider(java.security.Provider) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security int insertProviderAt(java.security.Provider, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security java.io.File securityPropFile(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security java.lang.String getProviderProperty(java.lang.String, java.security.Provider) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security java.lang.String[] getFilterComponents(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security java.lang.String[] getFilterComponents(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security java.lang.String[] getFilterComponents(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security java.security.Provider[] getProviders(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security java.security.Provider[] getProviders(java.util.Map) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security java.util.LinkedHashSet getAllQualifyingCandidates(java.lang.String, java.lang.String, java.security.Provider[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security java.util.LinkedHashSet getAllQualifyingCandidates(java.lang.String, java.lang.String, java.security.Provider[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security java.util.LinkedHashSet getAllQualifyingCandidates(java.lang.String, java.lang.String, java.security.Provider[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security java.util.LinkedHashSet getProvidersNotUsingCache(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.security.Provider[]) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security void invalidateSMCache(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Security void setProperty(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Signer java.lang.String printKeys()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Signer java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.security.Signer void setKeyPair(java.security.KeyPair) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/sql/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/sql/annotations.xml
new file mode 100644
index 000000000000..2aaa71e67f39
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/sql/annotations.xml
@@ -0,0 +1,78 @@
+<root>
+ <item name="java.sql.Date java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.Date java.sql.Date valueOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.DriverInfo boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.sql.DriverInfo java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.DriverManager boolean isDriverAllowed(java.sql.Driver, java.lang.Class&lt;?&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.sql.DriverManager boolean isDriverAllowed(java.sql.Driver, java.lang.ClassLoader)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.sql.DriverManager java.sql.Connection getConnection(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.DriverManager java.sql.Connection getConnection(java.lang.String, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.DriverManager java.sql.Connection getConnection(java.lang.String, java.util.Properties) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.DriverManager java.sql.Connection getConnection(java.lang.String, java.util.Properties, java.lang.Class&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.DriverManager void registerDriver(java.sql.Driver) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.SQLException java.util.Iterator&lt;java.lang.Throwable&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.Time java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.Time java.sql.Time valueOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.Time java.sql.Time valueOf(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.Timestamp boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.sql.Timestamp boolean equals(java.sql.Timestamp)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.sql.Timestamp int compareTo(java.sql.Timestamp) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.Timestamp int compareTo(java.util.Date) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.Timestamp java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.Timestamp java.sql.Timestamp valueOf(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.sql.Timestamp java.sql.Timestamp valueOf(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/annotations.xml
new file mode 100644
index 000000000000..363b81c827b4
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/annotations.xml
@@ -0,0 +1,1533 @@
+<root>
+ <item name="java.util.AbstractCollection T[] toArray(T[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractCollection boolean addAll(java.util.Collection&lt;? extends E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractCollection boolean containsAll(java.util.Collection&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractCollection java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractList boolean add(E)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;true;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.AbstractList boolean addAll(int, java.util.Collection&lt;? extends E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractList java.lang.String outOfBoundsMsg(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractList java.util.Iterator&lt;E&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractList java.util.List&lt;E&gt; subList(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractList java.util.ListIterator&lt;E&gt; listIterator(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractMap java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractMap void putAll(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractMap.1 java.util.Iterator&lt;K&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractMap.2 java.util.Iterator&lt;V&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractMap.SimpleEntry SimpleEntry(java.util.Map.Entry&lt;K,V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractMap.SimpleEntry boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.AbstractMap.SimpleEntry java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractQueue boolean add(E)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;true;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.AbstractQueue boolean addAll(java.util.Collection&lt;? extends E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractSequentialList boolean addAll(int, java.util.Collection&lt;? extends E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.AbstractSet boolean removeAll(java.util.Collection&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.ArrayList ArrayList(java.util.Collection&lt;? extends E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.ArrayList T[] toArray(T[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.ArrayList boolean add(E)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;true;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.ArrayList boolean addAll(int, java.util.Collection&lt;? extends E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.ArrayList boolean addAll(java.util.Collection&lt;? extends E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.ArrayList java.lang.Object[] toArray()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.ArrayList void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.ArrayList void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays T[] cloneSubarray(T[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int binarySearch(T[], T, java.util.Comparator&lt;? super T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int binarySearch(byte[], byte) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int binarySearch(char[], char) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int binarySearch(double[], double) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int binarySearch(float[], float) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int binarySearch(int[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int binarySearch(java.lang.Object[], java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int binarySearch(long[], long) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int binarySearch(short[], short) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int med3(byte[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int med3(char[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int med3(double[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int med3(float[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int med3(int[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int med3(long[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays int med3(short[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.lang.String deepToString(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.lang.String toString(boolean[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.lang.String toString(byte[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.lang.String toString(char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.lang.String toString(double[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.lang.String toString(float[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.lang.String toString(int[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.lang.String toString(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.lang.String toString(long[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.lang.String toString(short[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.util.List&lt;T&gt; asList(T...) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays java.util.List&lt;T&gt; asList(T...)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void deepToString(java.lang.Object[], java.lang.StringBuilder, java.util.Set&lt;java.lang.Object[]&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(boolean[], boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(boolean[], int, int, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(byte[], byte) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(byte[], int, int, byte) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(char[], char) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(char[], int, int, char) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(double[], double) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(double[], int, int, double) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(float[], float) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(float[], int, int, float) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(int[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(int[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(java.lang.Object[], int, int, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(java.lang.Object[], java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(long[], int, int, long) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(long[], long) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(short[], int, int, short) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void fill(short[], short) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(T[], int, int, java.util.Comparator&lt;? super T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(T[], java.util.Comparator&lt;? super T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(char[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(double[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(double[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(float[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(float[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(int[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(int[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(java.lang.Object[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(java.lang.Object[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(long[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(long[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(short[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void sort(short[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void swap(byte[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void swap(char[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void swap(double[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void swap(float[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void swap(int[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void swap(java.lang.Object[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void swap(long[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays void swap(short[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Arrays.ArrayList ArrayList(E[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar boolean after(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Calendar boolean before(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Calendar java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar java.util.Calendar createCalendar(java.util.TimeZone, java.util.Locale) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar java.util.Calendar createCalendar(java.util.TimeZone, java.util.Locale)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar java.util.Calendar getInstance()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar java.util.Calendar getInstance(java.util.Locale) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar java.util.Calendar getInstance(java.util.Locale)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar java.util.Calendar getInstance(java.util.TimeZone)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar java.util.Calendar getInstance(java.util.TimeZone, java.util.Locale) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar java.util.Calendar getInstance(java.util.TimeZone, java.util.Locale)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar java.util.Date getTime()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar void setTime(java.util.Date) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Calendar void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections T get(java.util.ListIterator&lt;? extends T&gt;, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections T max(java.util.Collection&lt;? extends T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections T max(java.util.Collection&lt;? extends T&gt;, java.util.Comparator&lt;? super T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections T min(java.util.Collection&lt;? extends T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections T min(java.util.Collection&lt;? extends T&gt;, java.util.Comparator&lt;? super T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections boolean addAll(java.util.Collection&lt;? super T&gt;, T...) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections boolean disjoint(java.util.Collection&lt;?&gt;, java.util.Collection&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections boolean disjoint(java.util.Collection&lt;?&gt;, java.util.Collection&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections boolean replaceAll(java.util.List&lt;T&gt;, T, T) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections int binarySearch(java.util.List&lt;? extends T&gt;, T, java.util.Comparator&lt;? super T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections int binarySearch(java.util.List&lt;? extends java.lang.Comparable&lt;? super T&gt;&gt;, T) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections int frequency(java.util.Collection&lt;?&gt;, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections int indexOfSubList(java.util.List&lt;?&gt;, java.util.List&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections int indexOfSubList(java.util.List&lt;?&gt;, java.util.List&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections int indexedBinarySearch(java.util.List&lt;? extends T&gt;, T, java.util.Comparator&lt;? super T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections int indexedBinarySearch(java.util.List&lt;? extends java.lang.Comparable&lt;? super T&gt;&gt;, T) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections int iteratorBinarySearch(java.util.List&lt;? extends T&gt;, T, java.util.Comparator&lt;? super T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections int iteratorBinarySearch(java.util.List&lt;? extends java.lang.Comparable&lt;? super T&gt;&gt;, T) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections int lastIndexOfSubList(java.util.List&lt;?&gt;, java.util.List&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections int lastIndexOfSubList(java.util.List&lt;?&gt;, java.util.List&lt;?&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.ArrayList&lt;T&gt; list(java.util.Enumeration&lt;T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Collection&lt;E&gt; checkedCollection(java.util.Collection&lt;E&gt;, java.lang.Class&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Collection&lt;E&gt; checkedCollection(java.util.Collection&lt;E&gt;, java.lang.Class&lt;E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Collection&lt;E&gt; checkedCollection(java.util.Collection&lt;E&gt;, java.lang.Class&lt;E&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Collection&lt;T&gt; synchronizedCollection(java.util.Collection&lt;T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Collection&lt;T&gt; synchronizedCollection(java.util.Collection&lt;T&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Collection&lt;T&gt; synchronizedCollection(java.util.Collection&lt;T&gt;, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Collection&lt;T&gt; unmodifiableCollection(java.util.Collection&lt;? extends T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Collection&lt;T&gt; unmodifiableCollection(java.util.Collection&lt;? extends T&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Enumeration&lt;T&gt; enumeration(java.util.Collection&lt;T&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Iterator&lt;E&gt; singletonIterator(E)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.List&lt;E&gt; checkedList(java.util.List&lt;E&gt;, java.lang.Class&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.List&lt;E&gt; checkedList(java.util.List&lt;E&gt;, java.lang.Class&lt;E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.List&lt;E&gt; checkedList(java.util.List&lt;E&gt;, java.lang.Class&lt;E&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.List&lt;T&gt; nCopies(int, T)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.List&lt;T&gt; singletonList(T)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.List&lt;T&gt; synchronizedList(java.util.List&lt;T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.List&lt;T&gt; synchronizedList(java.util.List&lt;T&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.List&lt;T&gt; synchronizedList(java.util.List&lt;T&gt;, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.List&lt;T&gt; unmodifiableList(java.util.List&lt;? extends T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.List&lt;T&gt; unmodifiableList(java.util.List&lt;? extends T&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Map&lt;K,V&gt; checkedMap(java.util.Map&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Map&lt;K,V&gt; checkedMap(java.util.Map&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Map&lt;K,V&gt; checkedMap(java.util.Map&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Map&lt;K,V&gt; checkedMap(java.util.Map&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Map&lt;K,V&gt; singletonMap(K, V)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Map&lt;K,V&gt; synchronizedMap(java.util.Map&lt;K,V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Map&lt;K,V&gt; synchronizedMap(java.util.Map&lt;K,V&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Map&lt;K,V&gt; unmodifiableMap(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Map&lt;K,V&gt; unmodifiableMap(java.util.Map&lt;? extends K,? extends V&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Queue&lt;T&gt; asLifoQueue(java.util.Deque&lt;T&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Set&lt;E&gt; checkedSet(java.util.Set&lt;E&gt;, java.lang.Class&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Set&lt;E&gt; checkedSet(java.util.Set&lt;E&gt;, java.lang.Class&lt;E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Set&lt;E&gt; checkedSet(java.util.Set&lt;E&gt;, java.lang.Class&lt;E&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Set&lt;E&gt; newSetFromMap(java.util.Map&lt;E,java.lang.Boolean&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Set&lt;E&gt; newSetFromMap(java.util.Map&lt;E,java.lang.Boolean&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Set&lt;T&gt; singleton(T)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Set&lt;T&gt; synchronizedSet(java.util.Set&lt;T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Set&lt;T&gt; synchronizedSet(java.util.Set&lt;T&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Set&lt;T&gt; synchronizedSet(java.util.Set&lt;T&gt;, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Set&lt;T&gt; unmodifiableSet(java.util.Set&lt;? extends T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.Set&lt;T&gt; unmodifiableSet(java.util.Set&lt;? extends T&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedMap&lt;K,V&gt; checkedSortedMap(java.util.SortedMap&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedMap&lt;K,V&gt; checkedSortedMap(java.util.SortedMap&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedMap&lt;K,V&gt; checkedSortedMap(java.util.SortedMap&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedMap&lt;K,V&gt; checkedSortedMap(java.util.SortedMap&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedMap&lt;K,V&gt; synchronizedSortedMap(java.util.SortedMap&lt;K,V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedMap&lt;K,V&gt; synchronizedSortedMap(java.util.SortedMap&lt;K,V&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedMap&lt;K,V&gt; unmodifiableSortedMap(java.util.SortedMap&lt;K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedMap&lt;K,V&gt; unmodifiableSortedMap(java.util.SortedMap&lt;K,? extends V&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedSet&lt;E&gt; checkedSortedSet(java.util.SortedSet&lt;E&gt;, java.lang.Class&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedSet&lt;E&gt; checkedSortedSet(java.util.SortedSet&lt;E&gt;, java.lang.Class&lt;E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedSet&lt;E&gt; checkedSortedSet(java.util.SortedSet&lt;E&gt;, java.lang.Class&lt;E&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedSet&lt;T&gt; synchronizedSortedSet(java.util.SortedSet&lt;T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedSet&lt;T&gt; synchronizedSortedSet(java.util.SortedSet&lt;T&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedSet&lt;T&gt; unmodifiableSortedSet(java.util.SortedSet&lt;T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections java.util.SortedSet&lt;T&gt; unmodifiableSortedSet(java.util.SortedSet&lt;T&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void copy(java.util.List&lt;? super T&gt;, java.util.List&lt;? extends T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void copy(java.util.List&lt;? super T&gt;, java.util.List&lt;? extends T&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void fill(java.util.List&lt;? super T&gt;, T) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void reverse(java.util.List&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void rotate(java.util.List&lt;?&gt;, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void rotate1(java.util.List&lt;T&gt;, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void rotate2(java.util.List&lt;?&gt;, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void shuffle(java.util.List&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void shuffle(java.util.List&lt;?&gt;, java.util.Random) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void sort(java.util.List&lt;T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void sort(java.util.List&lt;T&gt;, java.util.Comparator&lt;? super T&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void swap(java.lang.Object[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections void swap(java.util.List&lt;?&gt;, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.AsLIFOQueue boolean add(E)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;true;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.CheckedCollection CheckedCollection(java.util.Collection&lt;E&gt;, java.lang.Class&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedCollection CheckedCollection(java.util.Collection&lt;E&gt;, java.lang.Class&lt;E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedCollection java.lang.String badElementMsg(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedCollection java.lang.String badElementMsg(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedCollection java.util.Collection&lt;E&gt; checkedCopyOf(java.util.Collection&lt;? extends E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedCollection java.util.Collection&lt;E&gt; checkedCopyOf(java.util.Collection&lt;? extends E&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedCollection java.util.Iterator&lt;E&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedList CheckedList(java.util.List&lt;E&gt;, java.lang.Class&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedList CheckedList(java.util.List&lt;E&gt;, java.lang.Class&lt;E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedList java.util.List&lt;E&gt; subList(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedList java.util.ListIterator&lt;E&gt; listIterator(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap CheckedMap(java.util.Map&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap CheckedMap(java.util.Map&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap CheckedMap(java.util.Map&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap java.lang.String badKeyMsg(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap java.lang.String badKeyMsg(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap java.lang.String badValueMsg(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap java.lang.String badValueMsg(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap void putAll(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap.CheckedEntrySet T[] toArray(T[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap.CheckedEntrySet boolean contains(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.CheckedMap.CheckedEntrySet boolean containsAll(java.util.Collection&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap.CheckedEntrySet boolean remove(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.CheckedMap.CheckedEntrySet java.util.Collections.CheckedMap.CheckedEntrySet.CheckedEntry&lt;K,V,T&gt; checkedEntry(java.util.Map.Entry&lt;K,V&gt;, java.lang.Class&lt;T&gt;)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap.CheckedEntrySet java.util.Iterator&lt;java.util.Map.Entry&lt;K,V&gt;&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap.CheckedEntrySet.1 java.util.Map.Entry&lt;K,V&gt; next()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap.CheckedEntrySet.CheckedEntry java.lang.String badValueMsg(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedMap.CheckedEntrySet.CheckedEntry java.lang.String badValueMsg(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedRandomAccessList CheckedRandomAccessList(java.util.List&lt;E&gt;, java.lang.Class&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedRandomAccessList CheckedRandomAccessList(java.util.List&lt;E&gt;, java.lang.Class&lt;E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedRandomAccessList java.util.List&lt;E&gt; subList(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSet CheckedSet(java.util.Set&lt;E&gt;, java.lang.Class&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSet CheckedSet(java.util.Set&lt;E&gt;, java.lang.Class&lt;E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSortedMap CheckedSortedMap(java.util.SortedMap&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSortedMap CheckedSortedMap(java.util.SortedMap&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSortedMap CheckedSortedMap(java.util.SortedMap&lt;K,V&gt;, java.lang.Class&lt;K&gt;, java.lang.Class&lt;V&gt;) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSortedMap java.util.SortedMap&lt;K,V&gt; headMap(K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSortedMap java.util.SortedMap&lt;K,V&gt; subMap(K, K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSortedMap java.util.SortedMap&lt;K,V&gt; tailMap(K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSortedSet CheckedSortedSet(java.util.SortedSet&lt;E&gt;, java.lang.Class&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSortedSet CheckedSortedSet(java.util.SortedSet&lt;E&gt;, java.lang.Class&lt;E&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSortedSet java.util.SortedSet&lt;E&gt; headSet(E)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSortedSet java.util.SortedSet&lt;E&gt; subSet(E, E)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CheckedSortedSet java.util.SortedSet&lt;E&gt; tailSet(E)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CopiesList T[] toArray(T[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CopiesList java.lang.Object[] toArray()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.CopiesList java.util.List&lt;E&gt; subList(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.EmptyList T[] toArray(T[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.EmptyList T[] toArray(T[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.EmptyList boolean contains(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;false;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.EmptyList boolean containsAll(java.util.Collection&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.EmptyList boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.EmptyList java.lang.Object[] toArray()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.EmptyMap V get(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.EmptyMap boolean containsKey(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;false;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.EmptyMap boolean containsValue(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;false;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.EmptyMap boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.EmptySet T[] toArray(T[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.EmptySet T[] toArray(T[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.EmptySet boolean contains(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;false;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.EmptySet boolean containsAll(java.util.Collection&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.EmptySet java.lang.Object[] toArray()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.ReverseComparator int compare(java.lang.Comparable&lt;java.lang.Object&gt;, java.lang.Comparable&lt;java.lang.Object&gt;) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SetFromMap SetFromMap(java.util.Map&lt;E,java.lang.Boolean&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SetFromMap void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SingletonList java.util.Iterator&lt;E&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SingletonSet java.util.Iterator&lt;E&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedCollection SynchronizedCollection(java.util.Collection&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedCollection void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedList SynchronizedList(java.util.List&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedList java.lang.Object readResolve()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedList java.util.List&lt;E&gt; subList(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedMap SynchronizedMap(java.util.Map&lt;K,V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedMap void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedRandomAccessList SynchronizedRandomAccessList(java.util.List&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedRandomAccessList java.lang.Object writeReplace()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedRandomAccessList java.util.List&lt;E&gt; subList(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedSet SynchronizedSet(java.util.Set&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedSortedMap SynchronizedSortedMap(java.util.SortedMap&lt;K,V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedSortedMap java.util.SortedMap&lt;K,V&gt; headMap(K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedSortedMap java.util.SortedMap&lt;K,V&gt; subMap(K, K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedSortedMap java.util.SortedMap&lt;K,V&gt; tailMap(K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedSortedSet SynchronizedSortedSet(java.util.SortedSet&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedSortedSet java.util.SortedSet&lt;E&gt; headSet(E)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedSortedSet java.util.SortedSet&lt;E&gt; subSet(E, E)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.SynchronizedSortedSet java.util.SortedSet&lt;E&gt; tailSet(E)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableCollection UnmodifiableCollection(java.util.Collection&lt;? extends E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableCollection java.util.Iterator&lt;E&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableList UnmodifiableList(java.util.List&lt;? extends E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableList java.lang.Object readResolve()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableList java.util.List&lt;E&gt; subList(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableList java.util.ListIterator&lt;E&gt; listIterator(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableMap UnmodifiableMap(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableMap.UnmodifiableEntrySet T[] toArray(T[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableMap.UnmodifiableEntrySet UnmodifiableEntrySet(java.util.Set&lt;? extends java.util.Map.Entry&lt;? extends K,? extends V&gt;&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableMap.UnmodifiableEntrySet boolean contains(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Collections.UnmodifiableMap.UnmodifiableEntrySet boolean containsAll(java.util.Collection&lt;?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableMap.UnmodifiableEntrySet java.util.Iterator&lt;java.util.Map.Entry&lt;K,V&gt;&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableMap.UnmodifiableEntrySet.1 java.util.Map.Entry&lt;K,V&gt; next()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableRandomAccessList UnmodifiableRandomAccessList(java.util.List&lt;? extends E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableRandomAccessList java.lang.Object writeReplace()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableRandomAccessList java.util.List&lt;E&gt; subList(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableSet UnmodifiableSet(java.util.Set&lt;? extends E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableSortedMap UnmodifiableSortedMap(java.util.SortedMap&lt;K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableSortedMap java.util.SortedMap&lt;K,V&gt; headMap(K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableSortedMap java.util.SortedMap&lt;K,V&gt; subMap(K, K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableSortedMap java.util.SortedMap&lt;K,V&gt; tailMap(K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableSortedSet UnmodifiableSortedSet(java.util.SortedSet&lt;E&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableSortedSet java.util.SortedSet&lt;E&gt; headSet(E)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableSortedSet java.util.SortedSet&lt;E&gt; subSet(E, E)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Collections.UnmodifiableSortedSet java.util.SortedSet&lt;E&gt; tailSet(E)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Date Date(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Date boolean after(java.util.Date) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Date boolean before(java.util.Date) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Date boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Date int compareTo(java.util.Date) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Date long parse(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Date void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Date void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.GregorianCalendar boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.GregorianCalendar int floorDivide(int, int, int[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.GregorianCalendar int floorDivide(long, int, int[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.GregorianCalendar java.util.Date getGregorianChange()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.GregorianCalendar long computeJulianDay(boolean, int, int[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.GregorianCalendar void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.GregorianCalendar void setGregorianChange(java.util.Date) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.HashMap HashMap(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.HashMap T maskNull(T)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.HashMap T unmaskNull(T)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.HashMap boolean eq(java.lang.Object, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.HashMap int hash(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.HashMap java.util.HashMap.Entry&lt;K,V&gt; removeMapping(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.HashMap java.util.Iterator&lt;K&gt; newKeyIterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.HashMap java.util.Iterator&lt;V&gt; newValueIterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.HashMap java.util.Iterator&lt;java.util.Map.Entry&lt;K,V&gt;&gt; newEntryIterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.HashMap void putAll(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.HashMap void putAllForCreate(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.HashMap void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.HashMap void transfer(java.util.HashMap.Entry[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.HashMap void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable Hashtable(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable V get(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable V put(K, V) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable V put(K, V) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable V remove(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable boolean contains(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable boolean containsKey(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable int access$200(java.util.Hashtable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable int access$210(java.util.Hashtable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable int access$500(java.util.Hashtable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable int access$508(java.util.Hashtable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable java.util.Hashtable.Entry[] access$400(java.util.Hashtable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable java.util.Iterator access$100(java.util.Hashtable, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable void putAll(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable void reconstitutionPut(java.util.Hashtable.Entry[], K, V) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable void reconstitutionPut(java.util.Hashtable.Entry[], K, V) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable void reconstitutionPut(java.util.Hashtable.Entry[], K, V) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable.Entry V setValue(V) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable.Entry boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Hashtable.Entry java.lang.Object clone()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable.Entry java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Hashtable.EntrySet boolean contains(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Hashtable.EntrySet boolean remove(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.IdentityHashMap IdentityHashMap(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap boolean access$1500(java.util.IdentityHashMap, java.lang.Object, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap boolean access$1600(java.util.IdentityHashMap, java.lang.Object, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap int access$000(java.util.IdentityHashMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap int access$010(java.util.IdentityHashMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap int access$200(java.util.IdentityHashMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap int access$204(java.util.IdentityHashMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap java.lang.Object access$600(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.IdentityHashMap java.lang.Object maskNull(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.IdentityHashMap java.lang.Object unmaskNull(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.IdentityHashMap java.lang.Object[] access$100(java.util.IdentityHashMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap void putAll(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap.EntryIterator.Entry int access$800(java.util.IdentityHashMap.EntryIterator.Entry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap.EntryIterator.Entry int access$802(java.util.IdentityHashMap.EntryIterator.Entry, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap.EntryIterator.Entry java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap.EntrySet T[] toArray(T[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap.EntrySet boolean contains(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.IdentityHashMap.EntrySet boolean remove(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.IdentityHashMap.EntrySet java.util.Iterator&lt;java.util.Map.Entry&lt;K,V&gt;&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap.KeySet java.util.Iterator&lt;K&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.IdentityHashMap.Values java.util.Iterator&lt;V&gt; iterator()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale Locale(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale Locale(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale Locale(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale Locale(java.lang.String, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale Locale(java.lang.String, java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale Locale(java.lang.String, java.lang.String, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String convertOldISOCodes(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String formatList(java.lang.String[], java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String formatList(java.lang.String[], java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,null-&gt;!null;_,null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Locale java.lang.String getDisplayCountry(java.util.Locale)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Locale java.lang.String getDisplayLanguage(java.util.Locale)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Locale java.lang.String getDisplayString(java.lang.String, java.util.Locale, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String getDisplayString(java.lang.String, java.util.Locale, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Locale java.lang.String getISO3Code(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String getISO3Code(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.Locale java.lang.String toLowerCase(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String toLowerCase(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String toUpperCase(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String toUpperCase(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String[] composeList(java.text.MessageFormat, java.lang.String[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String[] getISO2Table(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String[] getISOCountries()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.lang.String[] getISOLanguages()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.util.Locale createSingleton(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.util.Locale getInstance(java.lang.String, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.util.Locale getInstance(java.lang.String, java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale java.util.Locale getInstance(java.lang.String, java.lang.String, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Locale void setDefault(java.util.Locale) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties java.lang.String getProperty(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties java.lang.String loadConvert(char[], int, int, char[]) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties java.lang.String loadConvert(char[], int, int, char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties java.lang.String saveConvert(java.lang.String, boolean, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties java.lang.String saveConvert(java.lang.String, boolean, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties void list(java.io.PrintStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties void list(java.io.PrintWriter) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties void load0(java.util.Properties.LineReader) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties void loadFromXML(java.io.InputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties void store(java.io.OutputStream, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties void store(java.io.Writer, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties void store0(java.io.BufferedWriter, java.lang.String, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties void storeToXML(java.io.OutputStream, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties void storeToXML(java.io.OutputStream, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties void writeComments(java.io.BufferedWriter, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Properties void writeComments(java.io.BufferedWriter, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Random void nextBytes(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Random void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.Random void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap K key(java.util.TreeMap.Entry&lt;K,?&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap TreeMap(java.util.SortedMap&lt;K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap boolean colorOf(java.util.TreeMap.Entry&lt;K,V&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.TreeMap boolean valueSearchNonNull(java.util.TreeMap.Entry, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap boolean valueSearchNonNull(java.util.TreeMap.Entry, java.lang.Object) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap boolean valueSearchNull(java.util.TreeMap.Entry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap int access$100(java.util.TreeMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap int access$1600(java.util.TreeMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap int access$900(java.util.TreeMap, java.lang.Object, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.lang.Object access$1200(java.util.TreeMap.Entry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.util.Comparator access$1000(java.util.TreeMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.util.SortedMap&lt;K,V&gt; headMap(K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.util.SortedMap&lt;K,V&gt; subMap(K, K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.util.SortedMap&lt;K,V&gt; tailMap(K)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.util.TreeMap.Entry access$1100(java.util.TreeMap, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.util.TreeMap.Entry access$1300(java.util.TreeMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.util.TreeMap.Entry access$1400(java.util.TreeMap, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.util.TreeMap.Entry access$300(java.util.TreeMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.util.TreeMap.Entry access$400(java.util.TreeMap, java.util.TreeMap.Entry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.util.TreeMap.Entry access$400(java.util.TreeMap, java.util.TreeMap.Entry)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.TreeMap java.util.TreeMap.Entry access$800(java.util.TreeMap, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap java.util.TreeMap.Entry&lt;K,V&gt; leftOf(java.util.TreeMap.Entry&lt;K,V&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.TreeMap java.util.TreeMap.Entry&lt;K,V&gt; parentOf(java.util.TreeMap.Entry&lt;K,V&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.TreeMap java.util.TreeMap.Entry&lt;K,V&gt; rightOf(java.util.TreeMap.Entry&lt;K,V&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.TreeMap java.util.TreeMap.Entry&lt;K,V&gt; successor(java.util.TreeMap.Entry&lt;K,V&gt;)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="java.util.TreeMap void access$600(java.util.TreeMap, java.util.TreeMap.Entry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap void access$600(java.util.TreeMap, java.util.TreeMap.Entry) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap void deleteEntry(java.util.TreeMap.Entry&lt;K,V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap void fixAfterInsertion(java.util.TreeMap.Entry&lt;K,V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap void putAll(java.util.Map&lt;? extends K,? extends V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap void rotateLeft(java.util.TreeMap.Entry&lt;K,V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap void rotateRight(java.util.TreeMap.Entry&lt;K,V&gt;) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.TreeMap void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/annotations.xml
new file mode 100644
index 000000000000..3c186b1661ef
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/annotations.xml
@@ -0,0 +1,5 @@
+<root>
+ <item name="java.util.concurrent.TimeUnit long convert(long, java.util.concurrent.TimeUnit) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/atomic/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/atomic/annotations.xml
new file mode 100644
index 000000000000..def395c4cf42
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/atomic/annotations.xml
@@ -0,0 +1,98 @@
+<root>
+ <item name="java.util.concurrent.atomic.AtomicBoolean java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicInteger java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicIntegerArray AtomicIntegerArray(int[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicIntegerArray java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicIntegerFieldUpdater java.util.concurrent.atomic.AtomicIntegerFieldUpdater&lt;U&gt; newUpdater(java.lang.Class&lt;U&gt;, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicIntegerFieldUpdater java.util.concurrent.atomic.AtomicIntegerFieldUpdater&lt;U&gt; newUpdater(java.lang.Class&lt;U&gt;, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicIntegerFieldUpdater java.util.concurrent.atomic.AtomicIntegerFieldUpdater&lt;U&gt; newUpdater(java.lang.Class&lt;U&gt;, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicIntegerFieldUpdater.AtomicIntegerFieldUpdaterImpl AtomicIntegerFieldUpdaterImpl(java.lang.Class&lt;T&gt;, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicIntegerFieldUpdater.AtomicIntegerFieldUpdaterImpl AtomicIntegerFieldUpdaterImpl(java.lang.Class&lt;T&gt;, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicLong java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicLongArray AtomicLongArray(long[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicLongArray java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicLongFieldUpdater java.util.concurrent.atomic.AtomicLongFieldUpdater&lt;U&gt; newUpdater(java.lang.Class&lt;U&gt;, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicLongFieldUpdater java.util.concurrent.atomic.AtomicLongFieldUpdater&lt;U&gt; newUpdater(java.lang.Class&lt;U&gt;, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicLongFieldUpdater java.util.concurrent.atomic.AtomicLongFieldUpdater&lt;U&gt; newUpdater(java.lang.Class&lt;U&gt;, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicLongFieldUpdater.CASUpdater CASUpdater(java.lang.Class&lt;T&gt;, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicLongFieldUpdater.CASUpdater CASUpdater(java.lang.Class&lt;T&gt;, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicLongFieldUpdater.LockedUpdater LockedUpdater(java.lang.Class&lt;T&gt;, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicLongFieldUpdater.LockedUpdater LockedUpdater(java.lang.Class&lt;T&gt;, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicMarkableReference V get(boolean[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicMarkableReference.ReferenceBooleanPair boolean access$100(java.util.concurrent.atomic.AtomicMarkableReference.ReferenceBooleanPair) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicMarkableReference.ReferenceBooleanPair java.lang.Object access$000(java.util.concurrent.atomic.AtomicMarkableReference.ReferenceBooleanPair) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicReferenceArray AtomicReferenceArray(E[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicReferenceArray java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicReferenceFieldUpdater java.util.concurrent.atomic.AtomicReferenceFieldUpdater&lt;U,W&gt; newUpdater(java.lang.Class&lt;U&gt;, java.lang.Class&lt;W&gt;, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicReferenceFieldUpdater java.util.concurrent.atomic.AtomicReferenceFieldUpdater&lt;U,W&gt; newUpdater(java.lang.Class&lt;U&gt;, java.lang.Class&lt;W&gt;, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicReferenceFieldUpdater java.util.concurrent.atomic.AtomicReferenceFieldUpdater&lt;U,W&gt; newUpdater(java.lang.Class&lt;U&gt;, java.lang.Class&lt;W&gt;, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicReferenceFieldUpdater.AtomicReferenceFieldUpdaterImpl AtomicReferenceFieldUpdaterImpl(java.lang.Class&lt;T&gt;, java.lang.Class&lt;V&gt;, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicReferenceFieldUpdater.AtomicReferenceFieldUpdaterImpl AtomicReferenceFieldUpdaterImpl(java.lang.Class&lt;T&gt;, java.lang.Class&lt;V&gt;, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicStampedReference V get(int[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicStampedReference.ReferenceIntegerPair int access$100(java.util.concurrent.atomic.AtomicStampedReference.ReferenceIntegerPair) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.atomic.AtomicStampedReference.ReferenceIntegerPair java.lang.Object access$000(java.util.concurrent.atomic.AtomicStampedReference.ReferenceIntegerPair) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/locks/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/locks/annotations.xml
new file mode 100644
index 000000000000..a5aef3c11bb8
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/locks/annotations.xml
@@ -0,0 +1,134 @@
+<root>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer boolean acquireQueued(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer boolean hasWaiters(java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer boolean isOnSyncQueue(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer boolean isQueued(java.lang.Thread) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer boolean owns(java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer boolean shouldParkAfterFailedAcquire(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node, java.util.concurrent.locks.AbstractQueuedSynchronizer.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer boolean transferAfterCancelledWait(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer int getWaitQueueLength(java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer java.util.Collection&lt;java.lang.Thread&gt; getWaitingThreads(java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer java.util.concurrent.locks.AbstractQueuedSynchronizer.Node addWaiter(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer java.util.concurrent.locks.AbstractQueuedSynchronizer.Node enq(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer void setHead(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer void setHeadAndPropagate(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer void unparkSuccessor(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject boolean await(long, java.util.concurrent.TimeUnit) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject boolean awaitUntil(java.util.Date) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject java.util.concurrent.locks.AbstractQueuedSynchronizer.Node addConditionWaiter()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject void doSignal(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject void doSignalAll(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantLock boolean hasWaiters(java.util.concurrent.locks.Condition) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantLock boolean tryLock(long, java.util.concurrent.TimeUnit) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantLock int getWaitQueueLength(java.util.concurrent.locks.Condition) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantLock java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantLock java.util.Collection&lt;java.lang.Thread&gt; getWaitingThreads(java.util.concurrent.locks.Condition) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantLock java.util.concurrent.locks.Condition newCondition()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantLock.Sync java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject newCondition()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantLock.Sync void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock boolean hasWaiters(java.util.concurrent.locks.Condition) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock int getWaitQueueLength(java.util.concurrent.locks.Condition) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock java.util.Collection&lt;java.lang.Thread&gt; getWaitingThreads(java.util.concurrent.locks.Condition) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock ReadLock(java.util.concurrent.locks.ReentrantReadWriteLock) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock boolean tryLock(long, java.util.concurrent.TimeUnit) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.Sync java.lang.IllegalMonitorStateException unmatchedUnlockException()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.Sync java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject newCondition()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.Sync void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.Sync.ThreadLocalHoldCounter java.lang.Object initialValue()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.Sync.ThreadLocalHoldCounter java.util.concurrent.locks.ReentrantReadWriteLock.Sync.HoldCounter initialValue()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock WriteLock(java.util.concurrent.locks.ReentrantReadWriteLock) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock boolean tryLock(long, java.util.concurrent.TimeUnit) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock java.util.concurrent.locks.Condition newCondition()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/javax/swing/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/javax/swing/annotations.xml
new file mode 100644
index 000000000000..c0738eb8897d
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/javax/swing/annotations.xml
@@ -0,0 +1,527 @@
+<root>
+ <item name="javax.swing.AbstractButton java.beans.PropertyChangeListener createActionPropertyChangeListener(javax.swing.Action)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.AbstractButton java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.AbstractButton javax.swing.AbstractButton.Handler access$000(javax.swing.AbstractButton) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.AbstractButton void access$100(javax.swing.AbstractButton) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JButton java.lang.String getUIClassID()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JButton java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JButton void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent boolean isLightweightComponent(java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent boolean processKeyBinding(javax.swing.KeyStroke, java.awt.event.KeyEvent, int, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JComponent boolean processKeyBindings(java.awt.event.KeyEvent, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent boolean processKeyBindings(java.awt.event.KeyEvent, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JComponent byte getWriteObjCounter(javax.swing.JComponent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent java.awt.Dimension getSize(java.awt.Dimension)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JComponent java.awt.Graphics getComponentGraphics(java.awt.Graphics)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JComponent java.awt.Point getLocation(java.awt.Point)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JComponent java.awt.Point getPopupLocation(java.awt.event.MouseEvent)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JComponent java.awt.Point getToolTipLocation(java.awt.event.MouseEvent)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JComponent java.awt.Rectangle getBounds(java.awt.Rectangle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JComponent java.awt.Rectangle getVisibleRect()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent java.lang.String getUIClassID()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent javax.swing.JToolTip createToolTip()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent void computeVisibleRect(java.awt.Component, java.awt.Rectangle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent void computeVisibleRect(java.awt.Component, java.awt.Rectangle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent void computeVisibleRect(java.awt.Rectangle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent void paintImmediately(java.awt.Rectangle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent void paintWithOffscreenBuffer(javax.swing.JComponent, java.awt.Graphics, int, int, int, int, java.awt.Image) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent void paintWithOffscreenBuffer(javax.swing.JComponent, java.awt.Graphics, int, int, int, int, java.awt.Image) 6">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent void processKeyEvent(java.awt.event.KeyEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent void repaint(java.awt.Rectangle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent void setWriteObjCounter(javax.swing.JComponent, byte) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent.AccessibleJComponent java.lang.String getBorderTitle(javax.swing.border.Border)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JComponent.AccessibleJComponent javax.accessibility.AccessibleExtendedComponent getAccessibleExtendedComponent()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JComponent.AccessibleJComponent javax.swing.JComponent access$100(javax.swing.JComponent.AccessibleJComponent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JDialog java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JDialog javax.swing.JRootPane createRootPane()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JDialog void processWindowEvent(java.awt.event.WindowEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JFrame java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JFrame javax.swing.JRootPane createRootPane()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JFrame void processWindowEvent(java.awt.event.WindowEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JLabel java.lang.String getUIClassID()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JLabel java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JLabel void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JPanel java.lang.String getUIClassID()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JPanel java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JPanel void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JScrollPane java.awt.Component getCorner(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JScrollPane java.awt.Rectangle getViewportBorderBounds()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JScrollPane java.lang.String getUIClassID()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JScrollPane java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JScrollPane javax.swing.JScrollBar createHorizontalScrollBar()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JScrollPane javax.swing.JScrollBar createVerticalScrollBar()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JScrollPane javax.swing.JViewport createViewport()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JScrollPane void setCorner(java.lang.String, java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JScrollPane void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable boolean print(int, java.text.MessageFormat, java.text.MessageFormat, boolean, javax.print.attribute.PrintRequestAttributeSet)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,_,false,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JTable int columnAtPoint(java.awt.Point) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable int getScrollableBlockIncrement(java.awt.Rectangle, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable int rowAtPoint(java.awt.Point) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable int[] getSelectedRows()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable java.awt.Component prepareEditor(javax.swing.table.TableCellEditor, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable java.awt.Component prepareRenderer(javax.swing.table.TableCellRenderer, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable java.awt.Dimension getIntercellSpacing()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable java.awt.print.Printable getPrintable(int, java.text.MessageFormat, java.text.MessageFormat)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable java.lang.String getToolTipText(java.awt.event.MouseEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable java.lang.String getUIClassID()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable java.lang.String paramString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable javax.swing.JScrollPane createScrollPaneForTable(javax.swing.JTable)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable javax.swing.ListSelectionModel createDefaultSelectionModel()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable javax.swing.table.JTableHeader createDefaultTableHeader()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable javax.swing.table.TableCellEditor getDefaultEditor(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JTable javax.swing.table.TableCellRenderer getDefaultRenderer(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.JTable javax.swing.table.TableColumnModel createDefaultColumnModel()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable javax.swing.table.TableModel createDefaultDataModel()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void addColumn(javax.swing.table.TableColumn) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void adjustSizes(long, javax.swing.JTable.Resizable2, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void adjustSizes(long, javax.swing.JTable.Resizable3, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void changeSelectionModel(javax.swing.ListSelectionModel, int, boolean, boolean, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void columnSelectionChanged(javax.swing.event.ListSelectionEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void setColumnModel(javax.swing.table.TableColumnModel) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void setGridColor(java.awt.Color) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void setIntercellSpacing(java.awt.Dimension) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void setLazyValue(java.util.Hashtable, java.lang.Class, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void setModel(javax.swing.table.TableModel) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void setSelectionBackground(java.awt.Color) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void setSelectionForeground(java.awt.Color) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void setSelectionModel(javax.swing.ListSelectionModel) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void tableRowsDeleted(javax.swing.event.TableModelEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void tableRowsInserted(javax.swing.event.TableModelEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void valueChanged(javax.swing.event.ListSelectionEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.JTable void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities boolean isDescendingFrom(java.awt.Component, java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities boolean isLeftMouseButton(java.awt.event.MouseEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities boolean isLeftToRight(java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities boolean isMiddleMouseButton(java.awt.event.MouseEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities boolean isRectangleContainingRectangle(java.awt.Rectangle, java.awt.Rectangle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities boolean isRectangleContainingRectangle(java.awt.Rectangle, java.awt.Rectangle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities boolean isRightMouseButton(java.awt.event.MouseEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities boolean isValidKeyEventForKeyBindings(java.awt.event.KeyEvent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities boolean notifyAction(javax.swing.Action, javax.swing.KeyStroke, java.awt.event.KeyEvent, java.lang.Object, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,null,_,_-&gt;false;null,_,_,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities boolean processKeyBindings(java.awt.event.KeyEvent)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities int computeStringWidth(java.awt.FontMetrics, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities int getAccessibleChildrenCount(java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities int getAccessibleIndexInParent(java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Component getDeepestComponentAt(java.awt.Component, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Container getAncestorNamed(java.lang.String, java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Container getAncestorOfClass(java.lang.Class, java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Point convertPoint(java.awt.Component, int, int, java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;!null;_,_,_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Point convertPoint(java.awt.Component, java.awt.Point, java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null;_,!null,_-&gt;!null;_,_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Point convertScreenLocationToParent(java.awt.Container, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Point convertScreenLocationToParent(java.awt.Container, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Rectangle calculateInnerArea(javax.swing.JComponent, java.awt.Rectangle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Rectangle computeIntersection(int, int, int, int, java.awt.Rectangle) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Rectangle computeIntersection(int, int, int, int, java.awt.Rectangle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,_,_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Rectangle computeUnion(int, int, int, int, java.awt.Rectangle) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Rectangle computeUnion(int, int, int, int, java.awt.Rectangle)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,_,_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Rectangle convertRectangle(java.awt.Component, java.awt.Rectangle, java.awt.Component) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Rectangle convertRectangle(java.awt.Component, java.awt.Rectangle, java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Rectangle getLocalBounds(java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Rectangle getLocalBounds(java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Rectangle[] computeDifference(java.awt.Rectangle, java.awt.Rectangle)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Window getWindowAncestor(java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.Window windowForComponent(java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.event.MouseEvent convertMouseEvent(java.awt.Component, java.awt.event.MouseEvent, java.awt.Component) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.awt.event.MouseEvent convertMouseEvent(java.awt.Component, java.awt.event.MouseEvent, java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabel(java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int) 7">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabel(java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int) 8">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabel(java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int) 9">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabel(java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null,_,_,_,_,_,_,_,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabel(javax.swing.JComponent, java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int) 10">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabel(javax.swing.JComponent, java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int) 8">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabel(javax.swing.JComponent, java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int) 9">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabel(javax.swing.JComponent, java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,!null,_,_,_,_,_,_,_,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabelImpl(javax.swing.JComponent, java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int) 10">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabelImpl(javax.swing.JComponent, java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int) 8">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabelImpl(javax.swing.JComponent, java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int) 9">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities java.lang.String layoutCompoundLabelImpl(javax.swing.JComponent, java.awt.FontMetrics, java.lang.String, javax.swing.Icon, int, int, int, int, java.awt.Rectangle, java.awt.Rectangle, java.awt.Rectangle, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,!null,_,_,_,_,_,_,_,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities javax.accessibility.Accessible getAccessibleAt(java.awt.Component, java.awt.Point)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities javax.accessibility.Accessible getAccessibleChild(java.awt.Component, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities javax.accessibility.AccessibleStateSet getAccessibleStateSet(java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities javax.swing.ActionMap getUIActionMap(javax.swing.JComponent) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities javax.swing.CellRendererPane getCellRendererPane(java.awt.Component, java.awt.Container) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities javax.swing.InputMap getUIInputMap(javax.swing.JComponent, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities javax.swing.JRootPane getRootPane(java.awt.Component)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="javax.swing.SwingUtilities void convertPointFromScreen(java.awt.Point, java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities void convertPointFromScreen(java.awt.Point, java.awt.Component) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities void convertPointToScreen(java.awt.Point, java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities void convertPointToScreen(java.awt.Point, java.awt.Component) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities void paintComponent(java.awt.Graphics, java.awt.Component, java.awt.Container, int, int, int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities void paintComponent(java.awt.Graphics, java.awt.Component, java.awt.Container, java.awt.Rectangle) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities void paintComponent(java.awt.Graphics, java.awt.Component, java.awt.Container, java.awt.Rectangle) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities void replaceUIActionMap(javax.swing.JComponent, javax.swing.ActionMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities void replaceUIInputMap(javax.swing.JComponent, int, javax.swing.InputMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="javax.swing.SwingUtilities void updateComponentTreeUI(java.awt.Component) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/annotations.xml
new file mode 100644
index 000000000000..08e265e17fcf
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/annotations.xml
@@ -0,0 +1,40 @@
+<root>
+ <item name="org.apache.commons.collections.ExtendedProperties ExtendedProperties(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.ExtendedProperties ExtendedProperties(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.ExtendedProperties boolean access$000(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.ExtendedProperties boolean endsWithSlash(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.ExtendedProperties java.lang.String escape(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.ExtendedProperties java.lang.String escape(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.ExtendedProperties java.lang.String interpolateHelper(java.lang.String, java.util.List)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.collections.ExtendedProperties java.lang.String testBoolean(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.ExtendedProperties java.lang.String unescape(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.ExtendedProperties java.lang.String unescape(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.ExtendedProperties org.apache.commons.collections.ExtendedProperties convertProperties(java.util.Properties) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.ExtendedProperties void combine(org.apache.commons.collections.ExtendedProperties) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/map/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/map/annotations.xml
new file mode 100644
index 000000000000..26b98c6bdf92
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/map/annotations.xml
@@ -0,0 +1,161 @@
+<root>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap AbstractHashedMap(java.util.Map) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap boolean isEqualKey(java.lang.Object, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap boolean isEqualValue(java.lang.Object, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap int entryHashCode(org.apache.commons.collections.map.AbstractHashedMap.HashEntry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap int hash(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap java.lang.Object convertKey(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap java.lang.Object entryKey(org.apache.commons.collections.map.AbstractHashedMap.HashEntry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap java.lang.Object entryValue(org.apache.commons.collections.map.AbstractHashedMap.HashEntry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap org.apache.commons.collections.map.AbstractHashedMap.HashEntry createEntry(org.apache.commons.collections.map.AbstractHashedMap.HashEntry, int, java.lang.Object, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap org.apache.commons.collections.map.AbstractHashedMap.HashEntry entryNext(org.apache.commons.collections.map.AbstractHashedMap.HashEntry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap void destroyEntry(org.apache.commons.collections.map.AbstractHashedMap.HashEntry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap void doReadObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap void doWriteObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap void putAll(java.util.Map) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap void removeEntry(org.apache.commons.collections.map.AbstractHashedMap.HashEntry, int, org.apache.commons.collections.map.AbstractHashedMap.HashEntry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap void reuseEntry(org.apache.commons.collections.map.AbstractHashedMap.HashEntry, int, int, java.lang.Object, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap void updateEntry(org.apache.commons.collections.map.AbstractHashedMap.HashEntry, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap.EntrySet boolean contains(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap.EntrySet boolean remove(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap.EntrySetIterator EntrySetIterator(org.apache.commons.collections.map.AbstractHashedMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap.HashEntry java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap.HashIterator HashIterator(org.apache.commons.collections.map.AbstractHashedMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap.HashIterator java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap.HashMapIterator HashMapIterator(org.apache.commons.collections.map.AbstractHashedMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap.KeySetIterator KeySetIterator(org.apache.commons.collections.map.AbstractHashedMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractHashedMap.ValuesIterator ValuesIterator(org.apache.commons.collections.map.AbstractHashedMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap AbstractLinkedMap(java.util.Map) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap org.apache.commons.collections.map.AbstractHashedMap.HashEntry createEntry(org.apache.commons.collections.map.AbstractHashedMap.HashEntry, int, java.lang.Object, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap org.apache.commons.collections.map.AbstractLinkedMap.LinkEntry entryAfter(org.apache.commons.collections.map.AbstractLinkedMap.LinkEntry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap org.apache.commons.collections.map.AbstractLinkedMap.LinkEntry entryBefore(org.apache.commons.collections.map.AbstractLinkedMap.LinkEntry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap void addEntry(org.apache.commons.collections.map.AbstractHashedMap.HashEntry, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap void removeEntry(org.apache.commons.collections.map.AbstractHashedMap.HashEntry, int, org.apache.commons.collections.map.AbstractHashedMap.HashEntry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap.EntrySetIterator EntrySetIterator(org.apache.commons.collections.map.AbstractLinkedMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap.KeySetIterator KeySetIterator(org.apache.commons.collections.map.AbstractLinkedMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap.LinkIterator LinkIterator(org.apache.commons.collections.map.AbstractLinkedMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap.LinkIterator java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap.LinkMapIterator LinkMapIterator(org.apache.commons.collections.map.AbstractLinkedMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.AbstractLinkedMap.ValuesIterator ValuesIterator(org.apache.commons.collections.map.AbstractLinkedMap) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.LRUMap LRUMap(java.util.Map) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.LRUMap LRUMap(java.util.Map, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.LRUMap boolean removeLRU(org.apache.commons.collections.map.AbstractLinkedMap.LinkEntry)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;true;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.collections.map.LRUMap void doReadObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.LRUMap void doWriteObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.LRUMap void moveToMRU(org.apache.commons.collections.map.AbstractLinkedMap.LinkEntry) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.LRUMap void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.LRUMap void reuseMapping(org.apache.commons.collections.map.AbstractLinkedMap.LinkEntry, int, int, java.lang.Object, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.LRUMap void updateEntry(org.apache.commons.collections.map.AbstractHashedMap.HashEntry, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.collections.map.LRUMap void writeObject(java.io.ObjectOutputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/annotations.xml
new file mode 100644
index 000000000000..e36a5e269c9a
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/annotations.xml
@@ -0,0 +1,1581 @@
+<root>
+ <item name="org.apache.commons.lang.ArrayUtils boolean isEmpty(boolean[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean isEmpty(byte[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean isEmpty(char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean isEmpty(double[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean isEmpty(float[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean isEmpty(int[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean isEmpty(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean isEmpty(long[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean isEmpty(short[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean isSameType(java.lang.Object, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean isSameType(java.lang.Object, java.lang.Object) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean[] clone(boolean[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean[] remove(boolean[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean[] subarray(boolean[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean[] toPrimitive(java.lang.Boolean[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils boolean[] toPrimitive(java.lang.Boolean[], boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils byte[] clone(byte[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils byte[] remove(byte[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils byte[] subarray(byte[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils byte[] toPrimitive(java.lang.Byte[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils byte[] toPrimitive(java.lang.Byte[], byte)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils char[] clone(char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils char[] remove(char[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils char[] subarray(char[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils char[] toPrimitive(java.lang.Character[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils char[] toPrimitive(java.lang.Character[], char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils double[] clone(double[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils double[] remove(double[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils double[] subarray(double[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils double[] toPrimitive(java.lang.Double[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils double[] toPrimitive(java.lang.Double[], double)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils float[] clone(float[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils float[] remove(float[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils float[] subarray(float[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils float[] toPrimitive(java.lang.Float[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils float[] toPrimitive(java.lang.Float[], float)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils int[] clone(int[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils int[] remove(int[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils int[] subarray(int[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils int[] toPrimitive(java.lang.Integer[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils int[] toPrimitive(java.lang.Integer[], int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Boolean[] toObject(boolean[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Byte[] toObject(byte[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Character[] toObject(char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Double[] toObject(double[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Float[] toObject(float[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Integer[] toObject(int[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Long[] toObject(long[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Object remove(java.lang.Object, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Object[] clone(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Object[] remove(java.lang.Object[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Object[] subarray(java.lang.Object[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.lang.Short[] toObject(short[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils java.util.Map toMap(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils long[] clone(long[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils long[] remove(long[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils long[] subarray(long[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils long[] toPrimitive(java.lang.Long[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils long[] toPrimitive(java.lang.Long[], long)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils short[] clone(short[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils short[] remove(short[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils short[] subarray(short[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils short[] toPrimitive(java.lang.Short[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ArrayUtils short[] toPrimitive(java.lang.Short[], short)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.BooleanUtils boolean isFalse(java.lang.Boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.BooleanUtils boolean isTrue(java.lang.Boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.BooleanUtils boolean toBoolean(java.lang.Boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.BooleanUtils boolean xor(boolean[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.BooleanUtils java.lang.Boolean negate(java.lang.Boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.BooleanUtils java.lang.Boolean toBooleanObject(java.lang.Integer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.BooleanUtils java.lang.Boolean xor(java.lang.Boolean[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.BooleanUtils java.lang.Integer toIntegerObject(java.lang.Boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharEncoding boolean isSupported(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharRange boolean contains(org.apache.commons.lang.CharRange) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.CharSet CharSet(java.lang.String[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.CharSet org.apache.commons.lang.CharSet getInstance(java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharSetUtils java.lang.String delete(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharSetUtils java.lang.String delete(java.lang.String, java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharSetUtils java.lang.String keep(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharSetUtils java.lang.String keep(java.lang.String, java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharSetUtils java.lang.String modify(java.lang.String, java.lang.String[], boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.CharSetUtils java.lang.String modify(java.lang.String, java.lang.String[], boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.CharSetUtils java.lang.String squeeze(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharSetUtils java.lang.String squeeze(java.lang.String, java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharSetUtils java.lang.String translate(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharSetUtils org.apache.commons.lang.CharSet evaluateSet(java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharUtils char toChar(java.lang.Character) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.CharUtils char toChar(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.CharUtils int toIntValue(java.lang.Character) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.CharUtils java.lang.Character toCharacterObject(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharUtils java.lang.String toString(java.lang.Character)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.CharUtils java.lang.String unicodeEscaped(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.CharUtils java.lang.String unicodeEscaped(java.lang.Character)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils boolean isAssignable(java.lang.Class, java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils boolean isInnerClass(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.Class primitiveToWrapper(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.Class[] primitivesToWrappers(java.lang.Class[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.Class[] toClass(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.Class[] wrappersToPrimitives(java.lang.Class[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.String getPackageCanonicalName(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.String getPackageCanonicalName(java.lang.Object, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.String getPackageCanonicalName(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.String getPackageName(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.String getPackageName(java.lang.Object, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.String getPackageName(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.String getShortCanonicalName(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.String getShortClassName(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.String getShortClassName(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.String toCanonicalName(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.reflect.Method getPublicMethod(java.lang.Class, java.lang.String, java.lang.Class[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.lang.reflect.Method getPublicMethod(java.lang.Class, java.lang.String, java.lang.Class[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.util.List convertClassNamesToClasses(java.util.List)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.util.List convertClassesToClassNames(java.util.List)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.util.List getAllInterfaces(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ClassUtils java.util.List getAllSuperclasses(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.Entities java.io.StringWriter createStringWriter(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Entities java.io.StringWriter createStringWriter(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Entities java.lang.String escape(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Entities java.lang.String unescape(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Entities void addEntities(java.lang.String[][]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Entities void doUnescape(java.io.Writer, java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Entities void doUnescape(java.io.Writer, java.lang.String, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Entities void escape(java.io.Writer, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Entities void fillWithHtml40Entities(org.apache.commons.lang.Entities) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Entities void unescape(java.io.Writer, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Entities void unescape(java.io.Writer, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.IllegalClassException java.lang.String safeGetClassName(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.IncompleteArgumentException java.lang.String safeArrayToString(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.IntHashMap boolean contains(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.LocaleUtils java.util.List localeLookupList(java.util.Locale)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.LocaleUtils java.util.List localeLookupList(java.util.Locale, java.util.Locale)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.LocaleUtils java.util.Locale toLocale(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.NumberRange NumberRange(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.NumberRange NumberRange(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.NumberRange NumberRange(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.NumberRange boolean includesNumber(java.lang.Number)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.NumberRange boolean includesRange(org.apache.commons.lang.NumberRange)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.NumberRange boolean overlaps(org.apache.commons.lang.NumberRange)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.NumberRange java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils boolean isAllZeros(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils boolean isDigits(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils boolean isNumber(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils java.lang.Double createDouble(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils java.lang.Float createFloat(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils java.lang.Integer createInteger(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils java.lang.Integer createInteger(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils java.lang.Long createLong(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils java.lang.Long createLong(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils java.lang.Number createNumber(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils java.math.BigDecimal createBigDecimal(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.NumberUtils java.math.BigInteger createBigInteger(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ObjectUtils java.lang.Object defaultIfNull(java.lang.Object, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ObjectUtils java.lang.String identityToString(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ObjectUtils java.lang.String toString(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ObjectUtils java.lang.StringBuffer appendIdentityToString(java.lang.StringBuffer, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.ObjectUtils void identityToString(java.lang.StringBuffer, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.ObjectUtils void identityToString(java.lang.StringBuffer, java.lang.Object) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.RandomStringUtils java.lang.String random(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.RandomStringUtils java.lang.String random(int, boolean, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.RandomStringUtils java.lang.String random(int, char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.RandomStringUtils java.lang.String random(int, int, int, boolean, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.RandomStringUtils java.lang.String random(int, int, int, boolean, boolean, char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.RandomStringUtils java.lang.String random(int, int, int, boolean, boolean, char[], java.util.Random)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.RandomStringUtils java.lang.String random(int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.RandomStringUtils java.lang.String randomAlphabetic(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.RandomStringUtils java.lang.String randomAlphanumeric(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.RandomStringUtils java.lang.String randomAscii(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.RandomStringUtils java.lang.String randomNumeric(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.SerializationUtils java.lang.Object deserialize(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.SerializationUtils java.lang.Object deserialize(java.io.InputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.SerializationUtils void serialize(java.io.Serializable, java.io.OutputStream) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils java.lang.String escapeHtml(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils java.lang.String escapeJavaStyleString(java.lang.String, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils java.lang.String escapeSql(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils java.lang.String escapeXml(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils java.lang.String unescapeCsv(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils java.lang.String unescapeHtml(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils java.lang.String unescapeJava(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils java.lang.String unescapeXml(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils void escapeHtml(java.io.Writer, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils void escapeJava(java.io.Writer, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils void escapeJavaScript(java.io.Writer, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils void escapeJavaStyleString(java.io.Writer, java.lang.String, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils void escapeXml(java.io.Writer, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils void unescapeHtml(java.io.Writer, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils void unescapeJava(java.io.Writer, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils void unescapeJavaScript(java.io.Writer, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringEscapeUtils void unescapeXml(java.io.Writer, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean contains(java.lang.String, char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean contains(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean containsAny(java.lang.String, char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean containsAny(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean containsIgnoreCase(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean containsNone(java.lang.String, char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean containsNone(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean containsOnly(java.lang.String, char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean containsOnly(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;false;null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean isAlpha(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean isAlphaSpace(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean isAlphanumeric(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean isAlphanumericSpace(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean isAsciiPrintable(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean isBlank(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean isEmpty(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean isNumeric(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean isNumericSpace(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils boolean isWhitespace(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils int getLevenshteinDistance(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils int getLevenshteinDistance(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String abbreviate(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String abbreviate(java.lang.String, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String capitalise(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String capitaliseAllWords(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String capitalize(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String center(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String center(java.lang.String, int, char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String center(java.lang.String, int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String chomp(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String chomp(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String chompLast(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String chompLast(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String chompLast(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String chompLast(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String chop(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String chopNewline(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String chopNewline(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String clean(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String concatenate(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String defaultString(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String defaultString(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String deleteSpaces(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String deleteWhitespace(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String difference(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String getChomp(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String getChomp(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String getChomp(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String getCommonPrefix(java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String getNestedString(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String getNestedString(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,null-&gt;null;_,null,_-&gt;null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String getPrechomp(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String getPrechomp(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String getPrechomp(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String join(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String join(java.lang.Object[], char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String join(java.lang.Object[], char, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;!null;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String join(java.lang.Object[], java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String join(java.lang.Object[], java.lang.String, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;!null;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String join(java.util.Collection, char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String join(java.util.Collection, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String join(java.util.Iterator, char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String join(java.util.Iterator, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String left(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String leftPad(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String leftPad(java.lang.String, int, char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String leftPad(java.lang.String, int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String lowerCase(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String mid(java.lang.String, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String overlay(java.lang.String, java.lang.String, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;!null;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String overlayString(java.lang.String, java.lang.String, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String overlayString(java.lang.String, java.lang.String, int, int) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String overlayString(java.lang.String, java.lang.String, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String padding(int, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String prechomp(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String prechomp(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String prechomp(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String remove(java.lang.String, char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String remove(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String removeEnd(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String removeEndIgnoreCase(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String removeStart(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String removeStartIgnoreCase(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String repeat(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String replace(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String replace(java.lang.String, java.lang.String, java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;!null;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String replaceChars(java.lang.String, char, char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String replaceChars(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String replaceEach(java.lang.String, java.lang.String[], java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String replaceEach(java.lang.String, java.lang.String[], java.lang.String[], boolean, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String replaceEachRepeatedly(java.lang.String, java.lang.String[], java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String replaceOnce(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String reverse(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String reverseDelimited(java.lang.String, char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String reverseDelimitedString(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String right(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String rightPad(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String rightPad(java.lang.String, int, char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String rightPad(java.lang.String, int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String stripEnd(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String stripStart(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String stripToEmpty(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String stripToNull(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String substring(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String substring(java.lang.String, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String substringAfter(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String substringAfterLast(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String substringBefore(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String substringBeforeLast(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String substringBetween(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String substringBetween(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,null-&gt;null;_,null,_-&gt;null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String swapCase(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String trim(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String trimToEmpty(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String trimToNull(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String uncapitalise(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String uncapitalize(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String upperCase(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] split(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] split(java.lang.String, char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] split(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] split(java.lang.String, java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitByCharacterType(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitByCharacterType(java.lang.String, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitByCharacterTypeCamelCase(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitByWholeSeparator(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitByWholeSeparator(java.lang.String, java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitByWholeSeparatorPreserveAllTokens(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitByWholeSeparatorPreserveAllTokens(java.lang.String, java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitByWholeSeparatorWorker(java.lang.String, java.lang.String, int, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitPreserveAllTokens(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitPreserveAllTokens(java.lang.String, char)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitPreserveAllTokens(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitPreserveAllTokens(java.lang.String, java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitWorker(java.lang.String, char, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] splitWorker(java.lang.String, java.lang.String, int, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] stripAll(java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] stripAll(java.lang.String[], java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.StringUtils java.lang.String[] substringsBetween(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.SystemUtils boolean getJavaVersionMatches(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.SystemUtils boolean getOSMatches(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.SystemUtils java.io.File getJavaHome()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.SystemUtils java.io.File getJavaIoTmpDir()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.SystemUtils java.io.File getUserDir()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.SystemUtils java.io.File getUserHome()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void allElementsOfType(java.util.Collection, java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void allElementsOfType(java.util.Collection, java.lang.Class) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void allElementsOfType(java.util.Collection, java.lang.Class, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void allElementsOfType(java.util.Collection, java.lang.Class, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void noNullElements(java.lang.Object[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void noNullElements(java.lang.Object[], java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void noNullElements(java.util.Collection) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void noNullElements(java.util.Collection, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void notEmpty(java.lang.Object[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void notEmpty(java.lang.Object[], java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void notEmpty(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void notEmpty(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void notEmpty(java.util.Collection) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void notEmpty(java.util.Collection, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void notEmpty(java.util.Map) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void notEmpty(java.util.Map, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void notNull(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.Validate void notNull(java.lang.Object, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String abbreviate(java.lang.String, int, int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;!null;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String capitalize(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String capitalize(java.lang.String, char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String capitalizeFully(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String capitalizeFully(java.lang.String, char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String initials(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String initials(java.lang.String, char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String swapCase(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String uncapitalize(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String uncapitalize(java.lang.String, char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String wrap(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.WordUtils java.lang.String wrap(java.lang.String, int, java.lang.String, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;!null;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/builder/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/builder/annotations.xml
new file mode 100644
index 000000000000..c46c851e0fa1
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/builder/annotations.xml
@@ -0,0 +1,574 @@
+<root>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(boolean, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(boolean[], boolean[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(byte, byte)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(byte[], byte[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(char, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(char[], char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(double, double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(double[], double[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(float, float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(float[], float[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(int[], int[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(java.lang.Object, java.lang.Object, java.util.Comparator)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(java.lang.Object[], java.lang.Object[], java.util.Comparator)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_-&gt;!null;null,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(long, long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(long[], long[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(short, short)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder append(short[], short[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder org.apache.commons.lang.builder.CompareToBuilder appendSuper(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.CompareToBuilder void reflectionAppend(java.lang.Object, java.lang.Object, java.lang.Class, org.apache.commons.lang.builder.CompareToBuilder, boolean, java.lang.String[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(boolean, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(boolean[], boolean[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(byte, byte)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(byte[], byte[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(char, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(char[], char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(double[], double[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(float[], float[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(int[], int[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(java.lang.Object, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(java.lang.Object[], java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(long, long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(long[], long[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(short, short)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder append(short[], short[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;!null;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder org.apache.commons.lang.builder.EqualsBuilder appendSuper(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.EqualsBuilder void reflectionAppend(java.lang.Object, java.lang.Object, java.lang.Class, org.apache.commons.lang.builder.EqualsBuilder, boolean, java.lang.String[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder int reflectionHashCode(int, int, java.lang.Object) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder int reflectionHashCode(int, int, java.lang.Object, boolean) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder int reflectionHashCode(int, int, java.lang.Object, boolean, java.lang.Class) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder int reflectionHashCode(int, int, java.lang.Object, boolean, java.lang.Class, java.lang.String[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder int reflectionHashCode(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder int reflectionHashCode(java.lang.Object, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder int reflectionHashCode(java.lang.Object, java.lang.String[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder int reflectionHashCode(java.lang.Object, java.util.Collection) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder java.lang.Integer toIdentityHashCodeInteger(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(boolean[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(byte)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(byte[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(double[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(float[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(int[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(long[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(short)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder append(short[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder org.apache.commons.lang.builder.HashCodeBuilder appendSuper(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.HashCodeBuilder.1 java.lang.Object initialValue()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ReflectionToStringBuilder boolean accept(java.lang.reflect.Field) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ReflectionToStringBuilder java.lang.Object getValue(java.lang.reflect.Field) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ReflectionToStringBuilder java.lang.String[] toNoNullStringArray(java.lang.Object[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ReflectionToStringBuilder org.apache.commons.lang.builder.ReflectionToStringBuilder setExcludeFieldNames(java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ReflectionToStringBuilder org.apache.commons.lang.builder.ToStringBuilder reflectionAppendArray(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ReflectionToStringBuilder void appendFieldsIn(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(boolean[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(byte)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(byte[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(double[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(float[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(int[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[], boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, byte)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, byte[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, byte[], boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[], boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, double)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, double[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, double[], boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, float)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, float[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, float[], boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[], boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[], boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[], boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[], boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(long[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(short)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder append(short[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder appendAsObjectToString(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder appendSuper(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder org.apache.commons.lang.builder.ToStringBuilder appendToString(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringBuilder void setDefaultStyle(org.apache.commons.lang.builder.ToStringStyle) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle java.lang.String getShortClassName(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendContentEnd(java.lang.StringBuffer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendContentStart(java.lang.StringBuffer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, boolean[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, boolean[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, byte) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, byte[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, char) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, char[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, double) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, double[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, double[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, float) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, float[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, float[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, int[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, int[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, java.lang.Object[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, java.lang.Object[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, java.util.Collection) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, java.util.Map) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, long) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, long[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, long[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, short) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, short[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendDetail(java.lang.StringBuffer, java.lang.String, short[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendFieldSeparator(java.lang.StringBuffer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendNullText(java.lang.StringBuffer, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummary(java.lang.StringBuffer, java.lang.String, boolean[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummary(java.lang.StringBuffer, java.lang.String, byte[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummary(java.lang.StringBuffer, java.lang.String, char[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummary(java.lang.StringBuffer, java.lang.String, double[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummary(java.lang.StringBuffer, java.lang.String, float[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummary(java.lang.StringBuffer, java.lang.String, int[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummary(java.lang.StringBuffer, java.lang.String, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummary(java.lang.StringBuffer, java.lang.String, java.lang.Object) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummary(java.lang.StringBuffer, java.lang.String, java.lang.Object[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummary(java.lang.StringBuffer, java.lang.String, long[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummary(java.lang.StringBuffer, java.lang.String, short[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void appendSummarySize(java.lang.StringBuffer, java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void reflectionAppendArrayDetail(java.lang.StringBuffer, java.lang.String, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle void removeLastFieldSeparator(java.lang.StringBuffer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.builder.ToStringStyle.1 java.lang.Object initialValue()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enum/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enum/annotations.xml
new file mode 100644
index 000000000000..be5d5ca8d20e
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enum/annotations.xml
@@ -0,0 +1,50 @@
+<root>
+ <item name="org.apache.commons.lang.enum.Enum Enum(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.Enum java.lang.String getNameInOtherClassLoader(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.Enum java.util.Iterator iterator(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.Enum java.util.List getEnumList(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.Enum java.util.Map getEnumMap(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.Enum org.apache.commons.lang.enum.Enum getEnum(java.lang.Class, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.Enum org.apache.commons.lang.enum.Enum.Entry createEntry(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.Enum org.apache.commons.lang.enum.Enum.Entry getEntry(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.EnumUtils java.util.Iterator iterator(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.EnumUtils java.util.List getEnumList(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.EnumUtils java.util.Map getEnumMap(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.EnumUtils org.apache.commons.lang.enum.Enum getEnum(java.lang.Class, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.EnumUtils org.apache.commons.lang.enum.ValuedEnum getEnum(java.lang.Class, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.ValuedEnum ValuedEnum(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.ValuedEnum int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enum.ValuedEnum org.apache.commons.lang.enum.Enum getEnum(java.lang.Class, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enums/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enums/annotations.xml
new file mode 100644
index 000000000000..0e7d219fd30a
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enums/annotations.xml
@@ -0,0 +1,50 @@
+<root>
+ <item name="org.apache.commons.lang.enums.Enum Enum(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.Enum java.lang.String getNameInOtherClassLoader(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.Enum java.util.Iterator iterator(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.Enum java.util.List getEnumList(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.Enum java.util.Map getEnumMap(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.Enum org.apache.commons.lang.enums.Enum getEnum(java.lang.Class, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.Enum org.apache.commons.lang.enums.Enum.Entry createEntry(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.Enum org.apache.commons.lang.enums.Enum.Entry getEntry(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.EnumUtils java.util.Iterator iterator(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.EnumUtils java.util.List getEnumList(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.EnumUtils java.util.Map getEnumMap(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.EnumUtils org.apache.commons.lang.enums.Enum getEnum(java.lang.Class, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.EnumUtils org.apache.commons.lang.enums.ValuedEnum getEnum(java.lang.Class, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.ValuedEnum ValuedEnum(java.lang.String, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.ValuedEnum int getValueInOtherClassLoader(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.enums.ValuedEnum org.apache.commons.lang.enums.Enum getEnum(java.lang.Class, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/exception/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/exception/annotations.xml
new file mode 100644
index 000000000000..2924cb9a5731
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/exception/annotations.xml
@@ -0,0 +1,72 @@
+<root>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils boolean isNestedThrowable(java.lang.Throwable)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils boolean setCause(java.lang.Throwable, java.lang.Throwable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils java.lang.String getFullStackTrace(java.lang.Throwable)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils java.lang.String getMessage(java.lang.Throwable)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils java.lang.String getRootCauseMessage(java.lang.Throwable)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils java.lang.String getStackTrace(java.lang.Throwable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils java.lang.String getStackTrace(java.lang.Throwable)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils java.lang.String[] toArray(java.util.List) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils java.lang.Throwable getCause(java.lang.Throwable)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils java.lang.Throwable getCause(java.lang.Throwable, java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils java.lang.Throwable getCauseUsingWellKnownTypes(java.lang.Throwable)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils java.util.ArrayList getCauseMethodNameList()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils java.util.List getStackFrameList(java.lang.Throwable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils void removeCommonFrames(java.util.List, java.util.List) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.ExceptionUtils void removeCommonFrames(java.util.List, java.util.List) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.NestableDelegate NestableDelegate(org.apache.commons.lang.exception.Nestable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.NestableDelegate java.lang.String getMessage(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.exception.NestableDelegate java.lang.String[] getStackFrames(java.lang.Throwable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.NestableDelegate void printStackTrace(java.io.PrintStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.exception.NestableDelegate void trimStackFrames(java.util.List) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/math/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/math/annotations.xml
new file mode 100644
index 000000000000..c799fc9bc0fd
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/math/annotations.xml
@@ -0,0 +1,309 @@
+<root>
+ <item name="org.apache.commons.lang.math.DoubleRange DoubleRange(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.DoubleRange DoubleRange(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.DoubleRange DoubleRange(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.DoubleRange boolean containsNumber(java.lang.Number)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.DoubleRange boolean containsRange(org.apache.commons.lang.math.Range)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.DoubleRange boolean overlapsRange(org.apache.commons.lang.math.Range)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.FloatRange FloatRange(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.FloatRange FloatRange(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.FloatRange FloatRange(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.FloatRange boolean containsNumber(java.lang.Number)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.FloatRange boolean containsRange(org.apache.commons.lang.math.Range)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.FloatRange boolean overlapsRange(org.apache.commons.lang.math.Range)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction abs()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction add(org.apache.commons.lang.math.Fraction) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction add(org.apache.commons.lang.math.Fraction)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction addSub(org.apache.commons.lang.math.Fraction, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction addSub(org.apache.commons.lang.math.Fraction, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;_,false-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction divideBy(org.apache.commons.lang.math.Fraction) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction getFraction(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction getFraction(int, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction getFraction(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction invert()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction multiplyBy(org.apache.commons.lang.math.Fraction) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction negate()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction subtract(org.apache.commons.lang.math.Fraction) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Fraction org.apache.commons.lang.math.Fraction subtract(org.apache.commons.lang.math.Fraction)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.IEEE754rUtils double max(double[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.IEEE754rUtils double min(double[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.IEEE754rUtils float max(float[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.IEEE754rUtils float min(float[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.IntRange IntRange(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.IntRange IntRange(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.IntRange IntRange(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.IntRange boolean containsNumber(java.lang.Number)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.IntRange boolean containsRange(org.apache.commons.lang.math.Range)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.IntRange boolean overlapsRange(org.apache.commons.lang.math.Range)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.LongRange LongRange(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.LongRange LongRange(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.LongRange LongRange(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.LongRange boolean containsNumber(java.lang.Number)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.LongRange boolean containsRange(org.apache.commons.lang.math.Range)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.LongRange boolean overlapsRange(org.apache.commons.lang.math.Range)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberRange NumberRange(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberRange NumberRange(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberRange NumberRange(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberRange boolean containsNumber(java.lang.Number)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils boolean isAllZeros(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils boolean isDigits(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils boolean isNumber(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils byte max(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils byte min(byte[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils double max(double[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils double min(double[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils float max(float[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils float min(float[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils int max(int[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils int min(int[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils java.lang.Double createDouble(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils java.lang.Float createFloat(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils java.lang.Integer createInteger(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils java.lang.Long createLong(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils java.lang.Number createNumber(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils java.math.BigDecimal createBigDecimal(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils java.math.BigInteger createBigInteger(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils long max(long[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils long min(long[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils short max(short[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.NumberUtils short min(short[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.RandomUtils boolean nextBoolean(java.util.Random) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.RandomUtils double nextDouble(java.util.Random) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.RandomUtils float nextFloat(java.util.Random) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.RandomUtils int nextInt(java.util.Random) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.RandomUtils int nextInt(java.util.Random, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.RandomUtils long nextLong(java.util.Random) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.math.Range boolean containsDouble(java.lang.Number)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.Range boolean containsFloat(java.lang.Number)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.Range boolean containsInteger(java.lang.Number)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.Range boolean containsLong(java.lang.Number)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.Range boolean containsRange(org.apache.commons.lang.math.Range)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.Range boolean overlapsRange(org.apache.commons.lang.math.Range)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.math.Range java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/mutable/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/mutable/annotations.xml
new file mode 100644
index 000000000000..dd2d7d0d82ab
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/mutable/annotations.xml
@@ -0,0 +1,192 @@
+<root>
+ <item name="org.apache.commons.lang.mutable.MutableBoolean MutableBoolean(java.lang.Boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableBoolean boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableBoolean int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableBoolean java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableBoolean void setValue(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableByte MutableByte(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableByte boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableByte int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableByte java.lang.Byte toByte()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableByte java.lang.Object getValue()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableByte java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableByte void add(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableByte void setValue(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableByte void subtract(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableDouble MutableDouble(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableDouble boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableDouble int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableDouble java.lang.Double toDouble()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableDouble java.lang.Object getValue()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableDouble void add(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableDouble void setValue(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableDouble void subtract(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableFloat MutableFloat(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableFloat boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableFloat int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableFloat java.lang.Float toFloat()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableFloat java.lang.Object getValue()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableFloat void add(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableFloat void setValue(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableFloat void subtract(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableInt MutableInt(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableInt boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableInt int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableInt java.lang.Integer toInteger()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableInt java.lang.Object getValue()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableInt java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableInt void add(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableInt void setValue(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableInt void subtract(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableLong MutableLong(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableLong boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableLong int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableLong java.lang.Long toLong()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableLong java.lang.Object getValue()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableLong java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableLong void add(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableLong void setValue(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableLong void subtract(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableObject boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableShort MutableShort(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableShort boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableShort int compareTo(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableShort java.lang.Object getValue()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableShort java.lang.Short toShort()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableShort java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableShort void add(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableShort void setValue(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.mutable.MutableShort void subtract(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/text/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/text/annotations.xml
new file mode 100644
index 000000000000..d6d4e6ec1483
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/text/annotations.xml
@@ -0,0 +1,422 @@
+<root>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat boolean containsElements(java.util.Collection)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat int readArgumentIndex(java.lang.String, java.text.ParsePosition) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat int readArgumentIndex(java.lang.String, java.text.ParsePosition) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat java.lang.String insertFormats(java.lang.String, java.util.ArrayList)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat java.lang.String parseFormatDescription(java.lang.String, java.text.ParsePosition) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat java.lang.String parseFormatDescription(java.lang.String, java.text.ParsePosition) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat java.lang.String parseFormatDescription(java.lang.String, java.text.ParsePosition)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat java.lang.StringBuffer appendQuotedString(java.lang.String, java.text.ParsePosition, java.lang.StringBuffer, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat java.lang.StringBuffer appendQuotedString(java.lang.String, java.text.ParsePosition, java.lang.StringBuffer, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat java.lang.StringBuffer appendQuotedString(java.lang.String, java.text.ParsePosition, java.lang.StringBuffer, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,!null,_-&gt;!null;_,_,null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat java.text.Format getFormat(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat java.text.ParsePosition next(java.text.ParsePosition) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat java.text.ParsePosition next(java.text.ParsePosition)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat void getQuotedString(java.lang.String, java.text.ParsePosition, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat void getQuotedString(java.lang.String, java.text.ParsePosition, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat void seekNonWs(java.lang.String, java.text.ParsePosition) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.ExtendedMessageFormat void seekNonWs(java.lang.String, java.text.ParsePosition) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder boolean endsWith(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder boolean equals(org.apache.commons.lang.text.StrBuilder)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder boolean equalsIgnoreCase(org.apache.commons.lang.text.StrBuilder)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder boolean startsWith(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder char[] getChars(char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder java.io.Reader asReader()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder java.io.Writer asWriter()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder java.lang.String leftString(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder java.lang.String midString(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder java.lang.String rightString(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder java.lang.String substring(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder java.lang.StringBuffer toStringBuffer()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder append(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder append(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder append(char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder append(char[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder append(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder append(java.lang.String, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder append(java.lang.StringBuffer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder append(java.lang.StringBuffer, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder append(org.apache.commons.lang.text.StrBuilder)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder append(org.apache.commons.lang.text.StrBuilder, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder appendAll(java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder appendAll(java.util.Collection)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder appendAll(java.util.Iterator)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder appendSeparator(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder appendSeparator(char, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder appendSeparator(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder appendSeparator(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder appendWithSeparators(java.lang.Object[], java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder appendWithSeparators(java.util.Collection, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder appendWithSeparators(java.util.Iterator, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder clear()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder delete(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder deleteCharAt(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder deleteFirst(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder ensureCapacity(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder insert(int, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder insert(int, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder insert(int, char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder insert(int, char[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder insert(int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder minimizeCapacity()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder replace(int, int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder replace(org.apache.commons.lang.text.StrMatcher, java.lang.String, int, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder replaceFirst(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder replaceImpl(org.apache.commons.lang.text.StrMatcher, java.lang.String, int, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder setCharAt(int, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder setNewLineText(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrBuilder setNullText(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder org.apache.commons.lang.text.StrTokenizer asTokenizer()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrBuilder.StrBuilderReader int read(char[], int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrLookup org.apache.commons.lang.text.StrLookup mapLookup(java.util.Map)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrMatcher int isMatch(char[], int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrMatcher org.apache.commons.lang.text.StrMatcher charMatcher(char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrMatcher.CharMatcher int isMatch(char[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrMatcher.CharSetMatcher CharSetMatcher(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrMatcher.CharSetMatcher int isMatch(char[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrMatcher.StringMatcher StringMatcher(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrMatcher.TrimMatcher int isMatch(char[], int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor boolean replaceIn(java.lang.StringBuffer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor boolean replaceIn(java.lang.StringBuffer, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor boolean replaceIn(org.apache.commons.lang.text.StrBuilder)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor boolean replaceIn(org.apache.commons.lang.text.StrBuilder, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor boolean substitute(org.apache.commons.lang.text.StrBuilder, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor int substitute(org.apache.commons.lang.text.StrBuilder, int, int, java.util.List) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor java.lang.String replace(char[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor java.lang.String replace(char[], int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor java.lang.String replace(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor java.lang.String replace(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor java.lang.String replace(java.lang.String, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor java.lang.String replace(java.lang.StringBuffer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor java.lang.String replace(java.lang.StringBuffer, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor java.lang.String replace(org.apache.commons.lang.text.StrBuilder)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor java.lang.String replace(org.apache.commons.lang.text.StrBuilder, int, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor org.apache.commons.lang.text.StrSubstitutor setVariablePrefix(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor org.apache.commons.lang.text.StrSubstitutor setVariablePrefixMatcher(org.apache.commons.lang.text.StrMatcher) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor org.apache.commons.lang.text.StrSubstitutor setVariablePrefixMatcher(org.apache.commons.lang.text.StrMatcher)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor org.apache.commons.lang.text.StrSubstitutor setVariableSuffix(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor org.apache.commons.lang.text.StrSubstitutor setVariableSuffixMatcher(org.apache.commons.lang.text.StrMatcher) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor org.apache.commons.lang.text.StrSubstitutor setVariableSuffixMatcher(org.apache.commons.lang.text.StrMatcher)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrSubstitutor void checkCyclicSubstitution(java.lang.String, java.util.List) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrTokenizer int readWithQuotes(char[], int, int, org.apache.commons.lang.text.StrBuilder, java.util.List, int, int) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrTokenizer java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrTokenizer org.apache.commons.lang.text.StrTokenizer reset()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrTokenizer org.apache.commons.lang.text.StrTokenizer reset(char[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrTokenizer org.apache.commons.lang.text.StrTokenizer reset(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrTokenizer org.apache.commons.lang.text.StrTokenizer setDelimiterMatcher(org.apache.commons.lang.text.StrMatcher)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrTokenizer org.apache.commons.lang.text.StrTokenizer setEmptyTokenAsNull(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrTokenizer org.apache.commons.lang.text.StrTokenizer setIgnoreEmptyTokens(boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrTokenizer org.apache.commons.lang.text.StrTokenizer setIgnoredMatcher(org.apache.commons.lang.text.StrMatcher)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrTokenizer org.apache.commons.lang.text.StrTokenizer setQuoteMatcher(org.apache.commons.lang.text.StrMatcher)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.text.StrTokenizer org.apache.commons.lang.text.StrTokenizer setTrimmerMatcher(org.apache.commons.lang.text.StrMatcher)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/time/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/time/annotations.xml
new file mode 100644
index 000000000000..b392cffbce52
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/time/annotations.xml
@@ -0,0 +1,481 @@
+<root>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(java.util.Calendar, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(java.util.Calendar, java.lang.String, java.util.Locale) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(java.util.Calendar, java.lang.String, java.util.TimeZone) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(java.util.Calendar, java.lang.String, java.util.TimeZone, java.util.Locale) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(java.util.Date, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(java.util.Date, java.lang.String, java.util.Locale) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(java.util.Date, java.lang.String, java.util.TimeZone) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(java.util.Date, java.lang.String, java.util.TimeZone, java.util.Locale) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(long, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(long, java.lang.String, java.util.Locale) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(long, java.lang.String, java.util.TimeZone) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String format(long, java.lang.String, java.util.TimeZone, java.util.Locale) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String formatUTC(java.util.Date, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String formatUTC(java.util.Date, java.lang.String, java.util.Locale) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String formatUTC(long, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateFormatUtils java.lang.String formatUTC(long, java.lang.String, java.util.Locale) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils boolean isSameDay(java.util.Calendar, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils boolean isSameDay(java.util.Calendar, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils boolean isSameDay(java.util.Date, java.util.Date) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils boolean isSameDay(java.util.Date, java.util.Date) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils boolean isSameInstant(java.util.Calendar, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils boolean isSameInstant(java.util.Calendar, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils boolean isSameInstant(java.util.Date, java.util.Date) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils boolean isSameInstant(java.util.Date, java.util.Date) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils boolean isSameLocalTime(java.util.Calendar, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils boolean isSameLocalTime(java.util.Calendar, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Calendar round(java.util.Calendar, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Calendar truncate(java.util.Calendar, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date add(java.util.Date, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date add(java.util.Date, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addDays(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addDays(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addHours(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addHours(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addMilliseconds(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addMilliseconds(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addMinutes(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addMinutes(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addMonths(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addMonths(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addSeconds(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addSeconds(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addWeeks(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addWeeks(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addYears(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date addYears(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date parseDate(java.lang.String, java.lang.String[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date parseDate(java.lang.String, java.lang.String[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date round(java.lang.Object, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date round(java.lang.Object, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date round(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date round(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date set(java.util.Date, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date set(java.util.Date, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setDays(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setDays(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setHours(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setHours(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setMilliseconds(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setMilliseconds(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setMinutes(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setMinutes(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setMonths(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setMonths(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setSeconds(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setSeconds(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setYears(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date setYears(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date truncate(java.lang.Object, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date truncate(java.lang.Object, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date truncate(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Date truncate(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Iterator iterator(java.lang.Object, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Iterator iterator(java.lang.Object, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Iterator iterator(java.util.Calendar, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Iterator iterator(java.util.Calendar, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Iterator iterator(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils java.util.Iterator iterator(java.util.Date, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragment(java.util.Calendar, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragment(java.util.Date, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragmentInDays(java.util.Calendar, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragmentInDays(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragmentInHours(java.util.Calendar, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragmentInHours(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragmentInMilliseconds(java.util.Calendar, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragmentInMilliseconds(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragmentInMinutes(java.util.Calendar, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragmentInMinutes(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragmentInSeconds(java.util.Calendar, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils long getFragmentInSeconds(java.util.Date, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DateUtils void modify(java.util.Calendar, int, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String format(org.apache.commons.lang.time.DurationFormatUtils.Token[], int, int, int, int, int, int, int, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String format(org.apache.commons.lang.time.DurationFormatUtils.Token[], int, int, int, int, int, int, int, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String formatDuration(long, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String formatDuration(long, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String formatDuration(long, java.lang.String, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String formatDuration(long, java.lang.String, boolean)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String formatDurationHMS(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String formatDurationISO(long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String formatPeriod(long, long, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String formatPeriod(long, long, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String formatPeriod(long, long, java.lang.String, boolean, java.util.TimeZone) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String formatPeriod(long, long, java.lang.String, boolean, java.util.TimeZone)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils java.lang.String formatPeriodISO(long, long)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils org.apache.commons.lang.time.DurationFormatUtils.Token[] lexx(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils.Token boolean containsTokenWithValue(org.apache.commons.lang.time.DurationFormatUtils.Token[], java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.DurationFormatUtils.Token boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat FastDateFormat(java.lang.String, java.util.TimeZone, java.util.Locale) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.Object parseObject(java.lang.String, java.text.ParsePosition) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.Object parseObject(java.lang.String, java.text.ParsePosition)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;null;_,!null-&gt;null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.String format(java.util.Calendar)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.String format(java.util.Date) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.String format(java.util.Date)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.String parseToken(java.lang.String, int[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.String parseToken(java.lang.String, int[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.String parseToken(java.lang.String, int[])">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.StringBuffer applyRules(java.util.Calendar, java.lang.StringBuffer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat java.lang.StringBuffer format(java.util.Date, java.lang.StringBuffer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat org.apache.commons.lang.time.FastDateFormat getInstance(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat org.apache.commons.lang.time.FastDateFormat getInstance(java.lang.String, java.util.Locale) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat org.apache.commons.lang.time.FastDateFormat getInstance(java.lang.String, java.util.TimeZone) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat org.apache.commons.lang.time.FastDateFormat getInstance(java.lang.String, java.util.TimeZone, java.util.Locale) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat org.apache.commons.lang.time.FastDateFormat.NumberRule selectNumberRule(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat void readObject(java.io.ObjectInputStream) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.CharacterLiteral void appendTo(java.lang.StringBuffer, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.PaddedNumberField void appendTo(java.lang.StringBuffer, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.PaddedNumberField void appendTo(java.lang.StringBuffer, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.PaddedNumberField void appendTo(java.lang.StringBuffer, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.Pair java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.StringLiteral void appendTo(java.lang.StringBuffer, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TextField void appendTo(java.lang.StringBuffer, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TextField void appendTo(java.lang.StringBuffer, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TimeZoneNameRule void appendTo(java.lang.StringBuffer, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TimeZoneNumberRule void appendTo(java.lang.StringBuffer, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TimeZoneNumberRule void appendTo(java.lang.StringBuffer, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TwelveHourField void appendTo(java.lang.StringBuffer, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TwentyFourHourField void appendTo(java.lang.StringBuffer, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TwoDigitMonthField void appendTo(java.lang.StringBuffer, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TwoDigitMonthField void appendTo(java.lang.StringBuffer, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TwoDigitMonthField void appendTo(java.lang.StringBuffer, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TwoDigitNumberField void appendTo(java.lang.StringBuffer, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TwoDigitNumberField void appendTo(java.lang.StringBuffer, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TwoDigitNumberField void appendTo(java.lang.StringBuffer, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TwoDigitYearField void appendTo(java.lang.StringBuffer, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TwoDigitYearField void appendTo(java.lang.StringBuffer, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.TwoDigitYearField void appendTo(java.lang.StringBuffer, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.UnpaddedMonthField void appendTo(java.lang.StringBuffer, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.UnpaddedMonthField void appendTo(java.lang.StringBuffer, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.UnpaddedMonthField void appendTo(java.lang.StringBuffer, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.UnpaddedNumberField void appendTo(java.lang.StringBuffer, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.UnpaddedNumberField void appendTo(java.lang.StringBuffer, java.util.Calendar) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.FastDateFormat.UnpaddedNumberField void appendTo(java.lang.StringBuffer, java.util.Calendar) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.StopWatch java.lang.String toSplitString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.commons.lang.time.StopWatch java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/anakia/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/anakia/annotations.xml
new file mode 100644
index 000000000000..a2e1c91b68a7
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/anakia/annotations.xml
@@ -0,0 +1,108 @@
+<root>
+ <item name="org.apache.velocity.anakia.AnakiaElement java.util.List getAttributes()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaElement java.util.List getChildren()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaElement java.util.List getChildren(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaElement java.util.List getChildren(java.lang.String, org.jdom.Namespace)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaElement java.util.List getContent()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaElement org.apache.velocity.anakia.NodeList selectNodes(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaJDOMFactory org.jdom.Element element(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaJDOMFactory org.jdom.Element element(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaJDOMFactory org.jdom.Element element(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaJDOMFactory org.jdom.Element element(java.lang.String, org.jdom.Namespace)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaTask java.lang.String getRelativePath(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaTask org.apache.velocity.anakia.AnakiaTask.Context createContext()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaTask void ensureDirectoryFor(java.io.File) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaTask void setLastModifiedCheck(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaTask void setTemplatePath(java.io.File) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.AnakiaTask.Context void setName(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.Escape java.lang.String getText(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.Escape java.lang.String getText(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.NodeList NodeList(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.NodeList NodeList(java.util.List) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.NodeList NodeList(java.util.List, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.NodeList NodeList(org.jdom.Document) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.NodeList NodeList(org.jdom.Element) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.NodeList boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.anakia.NodeList java.util.List subList(int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.NodeList org.apache.velocity.anakia.NodeList selectNodes(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.NodeList.AttributeXMLOutputter void output(org.jdom.Attribute, java.io.Writer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.NodeList.AttributeXMLOutputter void output(org.jdom.Attribute, java.io.Writer) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.TreeWalker org.apache.velocity.anakia.NodeList allElements(org.jdom.Element) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.TreeWalker org.apache.velocity.anakia.NodeList allElements(org.jdom.Element)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.TreeWalker void treeWalk(org.jdom.Element, java.util.Collection) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.XPathTool org.apache.velocity.anakia.NodeList applyTo(java.lang.String, java.util.List)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.XPathTool org.apache.velocity.anakia.NodeList applyTo(java.lang.String, org.jdom.Document)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.anakia.XPathTool org.apache.velocity.anakia.NodeList applyTo(java.lang.String, org.jdom.Element)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/annotations.xml
new file mode 100644
index 000000000000..fac918657687
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/annotations.xml
@@ -0,0 +1,29 @@
+<root>
+ <item name="org.apache.velocity.app.FieldMethodizer void addObject(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.FieldMethodizer void inspect(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.Velocity boolean evaluate(org.apache.velocity.context.Context, java.io.Writer, java.lang.String, java.io.InputStream) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.Velocity boolean mergeTemplate(java.lang.String, java.lang.String, org.apache.velocity.context.Context, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;true;_,!null,_,_-&gt;true;_,_,!null,_-&gt;true;_,_,_,!null-&gt;true;_,_,_,null-&gt;true;_,_,null,_-&gt;true;_,null,_,_-&gt;true;null,_,_,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.Velocity boolean mergeTemplate(java.lang.String, org.apache.velocity.context.Context, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;true;_,!null,_-&gt;true;_,_,!null-&gt;true;_,_,null-&gt;true;_,null,_-&gt;true;null,_,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.VelocityEngine boolean evaluate(org.apache.velocity.context.Context, java.io.Writer, java.lang.String, java.io.InputStream) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.VelocityEngine boolean mergeTemplate(java.lang.String, java.lang.String, org.apache.velocity.context.Context, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;true;_,!null,_,_-&gt;true;_,_,!null,_-&gt;true;_,_,_,!null-&gt;true;_,_,_,null-&gt;true;_,_,null,_-&gt;true;_,null,_,_-&gt;true;null,_,_,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/annotations.xml
new file mode 100644
index 000000000000..ad9def7fd362
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/annotations.xml
@@ -0,0 +1,89 @@
+<root>
+ <item name="org.apache.velocity.app.event.EventCartridge boolean addEventHandler(org.apache.velocity.app.event.EventHandler)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.event.EventCartridge boolean attachToContext(org.apache.velocity.context.Context)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.event.EventCartridge boolean removeEventHandler(org.apache.velocity.app.event.EventHandler)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil boolean shouldLogOnNullSet(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil boolean shouldLogOnNullSet(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.Object invalidGetMethod(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.Object, java.lang.String, org.apache.velocity.util.introspection.Info) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.Object invalidGetMethod(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.Object, java.lang.String, org.apache.velocity.util.introspection.Info) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.Object invalidMethod(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.Object, java.lang.String, org.apache.velocity.util.introspection.Info) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.Object invalidMethod(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.Object, java.lang.String, org.apache.velocity.util.introspection.Info) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.Object invalidReferenceHandlerCall(org.apache.velocity.app.event.EventHandlerMethodExecutor, org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.Object invalidReferenceHandlerCall(org.apache.velocity.app.event.EventHandlerMethodExecutor, org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.Object invalidReferenceHandlerCall(org.apache.velocity.app.event.EventHandlerMethodExecutor, org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.Object methodException(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.Class, java.lang.String, java.lang.Exception) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.Object methodException(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.Class, java.lang.String, java.lang.Exception) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.Object referenceInsert(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.Object referenceInsert(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.Object) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.String includeEvent(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil java.lang.String includeEvent(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil void invalidSetMethod(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.String, org.apache.velocity.util.introspection.Info) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.EventHandlerUtil void invalidSetMethod(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.String, org.apache.velocity.util.introspection.Info) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.IncludeEventHandler.IncludeEventExecutor void execute(org.apache.velocity.app.event.EventHandler) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.InvalidReferenceEventHandler.InvalidGetMethodExecutor void execute(org.apache.velocity.app.event.EventHandler) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.InvalidReferenceEventHandler.InvalidMethodExecutor void execute(org.apache.velocity.app.event.EventHandler) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.InvalidReferenceEventHandler.InvalidSetMethodExecutor void execute(org.apache.velocity.app.event.EventHandler) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.MethodExceptionEventHandler.MethodExceptionExecutor void execute(org.apache.velocity.app.event.EventHandler) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.NullSetEventHandler.ShouldLogOnNullSetExecutor void execute(org.apache.velocity.app.event.EventHandler) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.ReferenceInsertionEventHandler.referenceInsertExecutor void execute(org.apache.velocity.app.event.EventHandler) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/implement/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/implement/annotations.xml
new file mode 100644
index 000000000000..5591ed681847
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/implement/annotations.xml
@@ -0,0 +1,90 @@
+<root>
+ <item name="org.apache.velocity.app.event.implement.EscapeHtmlReference java.lang.String escape(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.EscapeHtmlReference java.lang.String getMatchAttribute()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.EscapeJavaScriptReference java.lang.String escape(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.EscapeJavaScriptReference java.lang.String getMatchAttribute()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.EscapeReference java.lang.Object referenceInsert(java.lang.String, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.EscapeReference void setRuntimeServices(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.EscapeSqlReference java.lang.String escape(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.EscapeSqlReference java.lang.String getMatchAttribute()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.EscapeXmlReference java.lang.String escape(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.EscapeXmlReference java.lang.String getMatchAttribute()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.IncludeNotFound void setRuntimeServices(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.IncludeRelativePath java.lang.String includeEvent(java.lang.String, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.IncludeRelativePath java.lang.String includeEvent(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.InvalidReferenceInfo InvalidReferenceInfo(java.lang.String, org.apache.velocity.util.introspection.Info) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.InvalidReferenceInfo java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.PrintExceptions java.lang.Object methodException(java.lang.Class, java.lang.String, java.lang.Exception) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.PrintExceptions java.lang.Object methodException(java.lang.Class, java.lang.String, java.lang.Exception)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.PrintExceptions java.lang.String getStackTrace(java.lang.Throwable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.ReportInvalidReferences boolean invalidSetMethod(org.apache.velocity.context.Context, java.lang.String, java.lang.String, org.apache.velocity.util.introspection.Info) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.ReportInvalidReferences boolean invalidSetMethod(org.apache.velocity.context.Context, java.lang.String, java.lang.String, org.apache.velocity.util.introspection.Info)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;false;_,!null,_,_-&gt;false;_,_,!null,_-&gt;false;_,_,_,!null-&gt;false;_,_,_,null-&gt;false;_,_,null,_-&gt;false;_,null,_,_-&gt;false;null,_,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.ReportInvalidReferences java.lang.Object invalidGetMethod(org.apache.velocity.context.Context, java.lang.String, java.lang.Object, java.lang.String, org.apache.velocity.util.introspection.Info) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.ReportInvalidReferences java.lang.Object invalidGetMethod(org.apache.velocity.context.Context, java.lang.String, java.lang.Object, java.lang.String, org.apache.velocity.util.introspection.Info)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_,_-&gt;null;_,!null,_,_,_-&gt;null;_,_,!null,_,_-&gt;null;_,_,_,!null,_-&gt;null;_,_,_,_,!null-&gt;null;_,_,_,_,null-&gt;null;_,_,_,null,_-&gt;null;_,_,null,_,_-&gt;null;_,null,_,_,_-&gt;null;null,_,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.ReportInvalidReferences java.lang.Object invalidMethod(org.apache.velocity.context.Context, java.lang.String, java.lang.Object, java.lang.String, org.apache.velocity.util.introspection.Info) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.ReportInvalidReferences java.lang.Object invalidMethod(org.apache.velocity.context.Context, java.lang.String, java.lang.Object, java.lang.String, org.apache.velocity.util.introspection.Info)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_,_-&gt;null;_,!null,_,_,_-&gt;null;_,_,!null,_,_-&gt;null;_,_,_,!null,_-&gt;null;_,_,_,_,!null-&gt;null;_,_,_,_,null-&gt;null;_,_,_,null,_-&gt;null;_,_,null,_,_-&gt;null;_,null,_,_,_-&gt;null;null,_,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.ReportInvalidReferences void reportInvalidReference(java.lang.String, org.apache.velocity.util.introspection.Info) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.event.implement.ReportInvalidReferences void setRuntimeServices(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/tools/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/tools/annotations.xml
new file mode 100644
index 000000000000..855a668ec63b
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/tools/annotations.xml
@@ -0,0 +1,39 @@
+<root>
+ <item name="org.apache.velocity.app.tools.VelocityFormatter java.lang.Object isNull(java.lang.Object, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.tools.VelocityFormatter java.lang.String formatArray(java.lang.Object, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.tools.VelocityFormatter java.lang.String formatVector(java.util.List, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.tools.VelocityFormatter java.lang.String formatVector(java.util.List, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.tools.VelocityFormatter java.lang.String limitLen(int, java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.tools.VelocityFormatter java.lang.String limitLen(int, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.app.tools.VelocityFormatter java.lang.String makeAlternator(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.tools.VelocityFormatter java.lang.String makeAlternator(java.lang.String, java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.tools.VelocityFormatter java.lang.String makeAlternator(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.tools.VelocityFormatter java.lang.String makeAutoAlternator(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.app.tools.VelocityFormatter.VelocityAlternator java.lang.String alternate()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/context/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/context/annotations.xml
new file mode 100644
index 000000000000..2e739fb35c61
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/context/annotations.xml
@@ -0,0 +1,37 @@
+<root>
+ <item name="org.apache.velocity.context.AbstractContext boolean containsKey(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.context.AbstractContext java.lang.Object get(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.context.AbstractContext java.lang.Object put(java.lang.String, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.context.AbstractContext java.lang.Object remove(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.context.EvaluateContext EvaluateContext(org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.RuntimeServices) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.context.EvaluateContext void initContext(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.context.InternalContextAdapterImpl org.apache.velocity.context.InternalContextAdapter getBaseContext()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.context.ProxyVMContext boolean isConstant(org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.context.ProxyVMContext void addVMProxyArg(org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.String, org.apache.velocity.runtime.parser.node.Node) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/convert/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/convert/annotations.xml
new file mode 100644
index 000000000000..8303b86a3cba
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/convert/annotations.xml
@@ -0,0 +1,33 @@
+<root>
+ <item name="org.apache.velocity.convert.WebMacro boolean writeTemplate(java.lang.String, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.convert.WebMacro boolean writeTemplate(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.convert.WebMacro java.lang.String convertName(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.convert.WebMacro java.lang.String convertName(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.convert.WebMacro java.lang.String extractPath(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.convert.WebMacro java.lang.String extractPath(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.convert.WebMacro java.lang.String makeSubstRE(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.convert.WebMacro void convert(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.convert.WebMacro void main(java.lang.String[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/exception/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/exception/annotations.xml
new file mode 100644
index 000000000000..d7d2ee1dcb64
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/exception/annotations.xml
@@ -0,0 +1,17 @@
+<root>
+ <item name="org.apache.velocity.exception.MethodInvocationException java.lang.String getMessage()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.exception.ParseErrorException ParseErrorException(java.lang.String, org.apache.velocity.util.introspection.Info) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.exception.ParseErrorException ParseErrorException(java.lang.String, org.apache.velocity.util.introspection.Info, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.exception.ParseErrorException ParseErrorException(org.apache.velocity.exception.VelocityException, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.exception.ParseErrorException ParseErrorException(org.apache.velocity.runtime.parser.ParseException, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/io/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/io/annotations.xml
new file mode 100644
index 000000000000..75ca57304d5b
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/io/annotations.xml
@@ -0,0 +1,8 @@
+<root>
+ <item name="org.apache.velocity.io.UnicodeInputStream org.apache.velocity.io.UnicodeInputStream.UnicodeBOM match(org.apache.velocity.io.UnicodeInputStream.UnicodeBOM, org.apache.velocity.io.UnicodeInputStream.UnicodeBOM) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.io.VelocityWriter void write(char[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/annotations.xml
new file mode 100644
index 000000000000..457ea7d9dd4b
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/annotations.xml
@@ -0,0 +1,98 @@
+<root>
+ <item name="org.apache.velocity.runtime.ParserPoolImpl void initialize(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.ParserPoolImpl void put(org.apache.velocity.runtime.parser.Parser) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance boolean addVelocimacro(java.lang.String, java.lang.String, java.lang.String[], java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance boolean addVelocimacro(java.lang.String, org.apache.velocity.runtime.parser.node.Node, java.lang.String[], java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance boolean evaluate(org.apache.velocity.context.Context, java.io.Writer, java.lang.String, java.io.Reader) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance boolean invokeVelocimacro(java.lang.String, java.lang.String, java.lang.String[], org.apache.velocity.context.Context, java.io.Writer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance boolean invokeVelocimacro(java.lang.String, java.lang.String, java.lang.String[], org.apache.velocity.context.Context, java.io.Writer) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance boolean invokeVelocimacro(java.lang.String, java.lang.String, java.lang.String[], org.apache.velocity.context.Context, java.io.Writer) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance boolean isVelocimacro(java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance boolean render(org.apache.velocity.context.Context, java.io.Writer, java.lang.String, org.apache.velocity.runtime.parser.node.SimpleNode)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;true;_,!null,_,_-&gt;true;_,_,!null,_-&gt;true;_,_,_,!null-&gt;true;_,_,_,null-&gt;true;_,_,null,_-&gt;true;_,null,_,_-&gt;true;null,_,_,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance org.apache.velocity.app.event.EventHandler initializeSpecificEventHandler(java.lang.String, java.lang.String, java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,null-&gt;null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance org.apache.velocity.runtime.parser.Parser createNewParser()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance void addDirective(org.apache.velocity.runtime.directive.Directive) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance void init(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance void init(java.util.Properties) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance void setProperties(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.RuntimeInstance void setProperties(java.util.Properties) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroFactory VelocimacroFactory(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroFactory boolean addVelocimacro(java.lang.String, java.lang.String, java.lang.String[], java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroFactory boolean addVelocimacro(java.lang.String, java.lang.String, java.lang.String[], java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroFactory boolean addVelocimacro(java.lang.String, java.lang.String, java.lang.String[], java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroFactory boolean addVelocimacro(java.lang.String, java.lang.String, java.lang.String[], java.lang.String) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroFactory boolean addVelocimacro(java.lang.String, org.apache.velocity.runtime.parser.node.Node, java.lang.String[], java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroFactory boolean addVelocimacro(java.lang.String, org.apache.velocity.runtime.parser.node.Node, java.lang.String[], java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroFactory boolean addVelocimacro(java.lang.String, org.apache.velocity.runtime.parser.node.Node, java.lang.String[], java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroFactory boolean addVelocimacro(java.lang.String, org.apache.velocity.runtime.parser.node.Node, java.lang.String[], java.lang.String) 3">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroManager boolean addVM(java.lang.String, org.apache.velocity.runtime.parser.node.Node, java.lang.String[], java.lang.String, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroManager boolean addVM(java.lang.String, org.apache.velocity.runtime.parser.node.Node, java.lang.String[], java.lang.String, boolean)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_,_-&gt;true;_,!null,_,_,_-&gt;true;_,_,!null,_,_-&gt;true;_,_,_,!null,_-&gt;true;_,_,_,_,false-&gt;true;_,_,_,_,true-&gt;true;_,_,_,null,_-&gt;true;_,_,null,_,_-&gt;true;null,_,_,_,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroManager.MacroEntry MacroEntry(java.lang.String, org.apache.velocity.runtime.parser.node.Node, java.lang.String[], java.lang.String, org.apache.velocity.runtime.RuntimeServices) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.VelocimacroManager.MacroEntry MacroEntry(java.lang.String, org.apache.velocity.runtime.parser.node.Node, java.lang.String[], java.lang.String, org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.runtime.VelocimacroManager.1) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/directive/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/directive/annotations.xml
new file mode 100644
index 000000000000..f6cd67632cb8
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/directive/annotations.xml
@@ -0,0 +1,209 @@
+<root>
+ <item name="org.apache.velocity.runtime.directive.Block java.lang.String id(org.apache.velocity.context.InternalContextAdapter) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Block void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Block void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.BlockMacro void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.BlockMacro void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Break boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Break boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;false;_,!null,_-&gt;false;_,_,!null-&gt;false;_,null,_-&gt;false;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Break java.lang.String getName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Break void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Define boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Define boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;true;_,!null,_-&gt;true;_,_,!null-&gt;true;_,_,null-&gt;true;_,null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Define java.lang.String getName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Define void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Define void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Directive org.apache.velocity.runtime.directive.Scope makeScope(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Evaluate boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Evaluate boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Evaluate java.lang.String getName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Evaluate void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Foreach boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Foreach boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Foreach java.lang.String getName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Foreach void clean(org.apache.velocity.context.InternalContextAdapter, java.lang.Object, java.lang.Object, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Foreach void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Foreach void put(org.apache.velocity.context.InternalContextAdapter, java.lang.String, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Include boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Include boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;true;_,!null,_-&gt;true;_,_,!null-&gt;true;_,null,_-&gt;true;null,_,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Include boolean renderOutput(org.apache.velocity.runtime.parser.node.Node, org.apache.velocity.context.InternalContextAdapter, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null,_-&gt;false;null,_,_-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Include java.lang.String getName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.InputBase java.lang.String getInputEncoding(org.apache.velocity.context.InternalContextAdapter) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Literal boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Literal boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;true;_,!null,_-&gt;true;_,_,!null-&gt;true;_,_,null-&gt;true;null,_,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Literal java.lang.String getName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Literal void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Macro boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;true;_,!null,_-&gt;true;_,_,!null-&gt;true;_,_,null-&gt;true;_,null,_-&gt;true;null,_,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Macro java.lang.String getName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Macro java.lang.StringBuffer macroToString(java.lang.StringBuffer, java.lang.String[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Macro java.lang.StringBuffer macroToString(java.lang.StringBuffer, java.lang.String[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Macro java.lang.String[] getArgArray(org.apache.velocity.runtime.parser.node.Node, org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Macro void checkArgs(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.runtime.parser.Token, org.apache.velocity.runtime.parser.node.Node, java.lang.String) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Macro void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Macro void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.MacroParseException java.lang.String getMessage()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.MacroParseException void appendTemplateInfo(java.lang.StringBuffer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Parse boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Parse boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Parse java.lang.String getName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Parse java.lang.String getScopeName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.RuntimeMacro RuntimeMacro(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.RuntimeMacro boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node, org.apache.velocity.runtime.Renderable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.RuntimeMacro java.lang.String getScopeName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.RuntimeMacro void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Scope.Info java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Stop boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Stop java.lang.String getName()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.Stop void init(org.apache.velocity.runtime.RuntimeServices, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.StopCommand java.lang.String getMessage()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.VelocimacroProxy boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node, org.apache.velocity.runtime.Renderable) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.VelocimacroProxy boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer, org.apache.velocity.runtime.parser.node.Node, org.apache.velocity.runtime.Renderable)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;true;_,!null,_,_-&gt;true;_,_,!null,_-&gt;true;_,_,_,!null-&gt;true;_,_,_,null-&gt;true;_,null,_,_-&gt;true;null,_,_,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.VelocimacroProxy java.lang.String buildErrorMsg(org.apache.velocity.runtime.parser.node.Node, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.VelocimacroProxy void checkArgs(org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.Node, boolean) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.VelocimacroProxy void init(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.directive.VelocimacroProxy void setArgArray(java.lang.String[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/log/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/log/annotations.xml
new file mode 100644
index 000000000000..b49c0f73e389
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/log/annotations.xml
@@ -0,0 +1,76 @@
+<root>
+ <item name="org.apache.velocity.runtime.log.AvalonLogChute void init(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.AvalonLogChute void initTarget(java.lang.String, org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.CommonsLogLogChute void init(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.JdkLogChute void init(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.Log java.lang.String formatFileString(java.lang.String, int, int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.Log java.lang.String formatFileString(org.apache.velocity.runtime.directive.Directive) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.Log java.lang.String formatFileString(org.apache.velocity.runtime.directive.Directive)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.Log java.lang.String formatFileString(org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.Log java.lang.String formatFileString(org.apache.velocity.runtime.parser.node.Node)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.Log java.lang.String formatFileString(org.apache.velocity.util.introspection.Info) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.Log java.lang.String formatFileString(org.apache.velocity.util.introspection.Info)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.Log void setLogChute(org.apache.velocity.runtime.log.LogChute) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.LogDisplayWrapper LogDisplayWrapper(org.apache.velocity.runtime.log.Log, java.lang.String, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.LogManager boolean isProbablyProvidedLogChute(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.log.LogManager org.apache.velocity.runtime.log.LogChute createLogChute(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.LogManager void updateLog(org.apache.velocity.runtime.log.Log, org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.LogManager void updateLog(org.apache.velocity.runtime.log.Log, org.apache.velocity.runtime.RuntimeServices) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.RuntimeLoggerLog RuntimeLoggerLog(org.apache.velocity.runtime.RuntimeLogger) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.ServletLogChute int toLevel(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.ServletLogChute void init(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.SystemLogChute int toLevel(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.SystemLogChute java.lang.String getPrefix(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.SystemLogChute void init(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.log.SystemLogChute void write(java.io.PrintStream, java.lang.String, java.lang.String, java.lang.Throwable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/annotations.xml
new file mode 100644
index 000000000000..7d0bc8cdefa1
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/annotations.xml
@@ -0,0 +1,73 @@
+<root>
+ <item name="org.apache.velocity.runtime.parser.JJTParserState void closeNodeScope(org.apache.velocity.runtime.parser.node.Node, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.JJTParserState void openNodeScope(org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.ParseException java.lang.String add_escapes(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.ParseException java.lang.String add_escapes(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.Parser Parser(org.apache.velocity.runtime.RuntimeServices) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.Parser java.lang.String escapedDirective(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.Parser java.lang.String escapedDirective(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.Parser org.apache.velocity.runtime.parser.ParseException generateParseException()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.ParserTokenManager org.apache.velocity.runtime.parser.Token jjFillToken()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.TemplateParseException java.lang.String getMessage()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.TemplateParseException void appendTemplateInfo(java.lang.StringBuffer) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.Token org.apache.velocity.runtime.parser.Token newToken(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.TokenMgrError TokenMgrError(boolean, int, int, int, java.lang.String, char, int) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.TokenMgrError java.lang.String LexicalError(boolean, int, int, int, java.lang.String, char) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.TokenMgrError java.lang.String LexicalError(boolean, int, int, int, java.lang.String, char)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.TokenMgrError java.lang.String addEscapes(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.TokenMgrError java.lang.String addEscapes(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.VelocityCharStream VelocityCharStream(java.io.InputStream, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.VelocityCharStream VelocityCharStream(java.io.InputStream, int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.VelocityCharStream char[] GetSuffix(int)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.VelocityCharStream java.lang.String GetImage()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.VelocityCharStream void ReInit(java.io.InputStream, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.VelocityCharStream void ReInit(java.io.InputStream, int, int, int) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/node/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/node/annotations.xml
new file mode 100644
index 000000000000..5f78c94ea501
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/node/annotations.xml
@@ -0,0 +1,475 @@
+<root>
+ <item name="org.apache.velocity.runtime.parser.node.ASTAddNode java.lang.Number perform(java.lang.Number, java.lang.Number, org.apache.velocity.context.InternalContextAdapter) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTAddNode java.lang.Number perform(java.lang.Number, java.lang.Number, org.apache.velocity.context.InternalContextAdapter) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTAndNode java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTAssignment java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTBlock boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;true;_,!null-&gt;true;_,null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTBlock java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTComment boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTComment boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;true;_,!null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTComment java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTComment java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTDirective boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;true;_,!null-&gt;true;_,null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTDirective java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTDirective java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTDivNode java.lang.Number perform(java.lang.Number, java.lang.Number, org.apache.velocity.context.InternalContextAdapter) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTEQNode java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTElseIfStatement java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTElseStatement boolean evaluate(org.apache.velocity.context.InternalContextAdapter)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;true;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTElseStatement java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTEscape boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTEscape boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;true;_,!null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTEscape java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTEscape java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTEscapedDirective boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTEscapedDirective boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;true;_,!null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTEscapedDirective java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTExpression java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTFalse boolean evaluate(org.apache.velocity.context.InternalContextAdapter)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;false;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTFalse java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTFloatingPointLiteral java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTFloatingPointLiteral java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTGENode java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTGTNode java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIdentifier java.lang.Object execute(java.lang.Object, org.apache.velocity.context.InternalContextAdapter) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIdentifier java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIdentifier java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIfStatement boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;true;_,!null-&gt;true;_,null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIfStatement java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIncludeStatement java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIndex java.lang.Object adjMinusIndexArg(java.lang.Object, java.lang.Object, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.SimpleNode)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_,_-&gt;!null;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIndex java.lang.Object execute(java.lang.Object, org.apache.velocity.context.InternalContextAdapter) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIndex java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIntegerLiteral java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIntegerLiteral java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTIntegerRange java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTLENode java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTLTNode java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMap java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMathNode java.lang.Object handleSpecial(java.lang.Object, java.lang.Object, org.apache.velocity.context.InternalContextAdapter)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;null;_,!null,_-&gt;null;_,_,!null-&gt;null;_,_,null-&gt;null;_,null,_-&gt;null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMathNode java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMathNode java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMethod java.lang.Object execute(java.lang.Object, org.apache.velocity.context.InternalContextAdapter) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMethod java.lang.Object handleInvocationException(java.lang.Object, org.apache.velocity.context.InternalContextAdapter, java.lang.Throwable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMethod java.lang.Object handleInvocationException(java.lang.Object, org.apache.velocity.context.InternalContextAdapter, java.lang.Throwable) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMethod java.lang.Object handleInvocationException(java.lang.Object, org.apache.velocity.context.InternalContextAdapter, java.lang.Throwable) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMethod java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMethod java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMethod.MethodCacheKey boolean equals(java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTModNode java.lang.Number perform(java.lang.Number, java.lang.Number, org.apache.velocity.context.InternalContextAdapter) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMulNode java.lang.Number perform(java.lang.Number, java.lang.Number, org.apache.velocity.context.InternalContextAdapter) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTMulNode java.lang.Number perform(java.lang.Number, java.lang.Number, org.apache.velocity.context.InternalContextAdapter) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTNENode java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTNotNode java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTObjectArray java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTOrNode java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTParameters java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTReference boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;true;_,!null-&gt;true;_,null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTReference java.lang.Object getVariableValue(org.apache.velocity.context.Context, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTReference java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTReference java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTReference java.lang.String getDollarBang()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTReference java.lang.String getNullString(org.apache.velocity.context.InternalContextAdapter) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTReference java.lang.String printClass(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTSetDirective java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTSetDirective java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTStringLiteral java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTStringLiteral java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTStringLiteral java.lang.String replaceQuotes(java.lang.String, char) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTStringLiteral java.lang.String unescape(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTStringLiteral void adjTokenLineNums(org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTSubtractNode java.lang.Number perform(java.lang.Number, java.lang.Number, org.apache.velocity.context.InternalContextAdapter) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTSubtractNode java.lang.Number perform(java.lang.Number, java.lang.Number, org.apache.velocity.context.InternalContextAdapter) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTText boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTText boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;true;_,!null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTText java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTText java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTTextblock boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTTextblock boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;true;_,!null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTTextblock java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTTextblock java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTTrue boolean evaluate(org.apache.velocity.context.InternalContextAdapter)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;true;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTTrue java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTVariable java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTWord java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.ASTprocess java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.BooleanPropertyExecutor BooleanPropertyExecutor(org.apache.velocity.runtime.RuntimeLogger, org.apache.velocity.util.introspection.Introspector, java.lang.Class, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.GetExecutor GetExecutor(org.apache.velocity.runtime.RuntimeLogger, org.apache.velocity.util.introspection.Introspector, java.lang.Class, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MapGetExecutor java.lang.Object execute(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MapSetExecutor java.lang.Object execute(java.lang.Object, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils boolean isInteger(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils boolean isZero(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils int compare(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils int compare(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils int findCalculationBase(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils int findCalculationBase(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number add(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number add(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number divide(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number divide(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number modulo(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number modulo(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number multiply(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number multiply(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number subtract(java.lang.Number, java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number subtract(java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number wrapPrimitive(long, java.lang.Number, java.lang.Number) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.lang.Number wrapPrimitive(long, java.lang.Number, java.lang.Number) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.math.BigDecimal toBigDecimal(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.math.BigDecimal toBigDecimal(java.lang.Number)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.MathUtils java.math.BigInteger toBigInteger(java.lang.Number) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.NodeUtils java.lang.String interpolate(java.lang.String, org.apache.velocity.context.Context) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.NodeUtils java.lang.String specialText(org.apache.velocity.runtime.parser.Token) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.NodeUtils java.lang.String tokenLiteral(org.apache.velocity.runtime.parser.Token) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.NodeUtils org.apache.commons.lang.text.StrBuilder getSpecialText(org.apache.velocity.runtime.parser.Token) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.PropertyExecutor PropertyExecutor(org.apache.velocity.runtime.RuntimeLogger, org.apache.velocity.util.introspection.Introspector, java.lang.Class, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.SimpleNode boolean evaluate(org.apache.velocity.context.InternalContextAdapter)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;false;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.SimpleNode boolean render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;true;_,!null-&gt;true;_,null-&gt;true;null,_-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.SimpleNode java.lang.Object childrenAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.SimpleNode java.lang.Object execute(java.lang.Object, org.apache.velocity.context.InternalContextAdapter)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;null;_,!null-&gt;null;_,null-&gt;null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.SimpleNode java.lang.Object init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,!null-&gt;!null;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.SimpleNode java.lang.Object jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.SimpleNode java.lang.Object value(org.apache.velocity.context.InternalContextAdapter)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.SimpleNode java.lang.String getLocation(org.apache.velocity.context.InternalContextAdapter)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.parser.node.SimpleNode java.lang.String toString(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/annotations.xml
new file mode 100644
index 000000000000..c85589b43d33
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/annotations.xml
@@ -0,0 +1,5 @@
+<root>
+ <item name="org.apache.velocity.runtime.resource.ResourceManagerImpl org.apache.velocity.runtime.resource.Resource refreshResource(org.apache.velocity.runtime.resource.Resource, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/loader/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/loader/annotations.xml
new file mode 100644
index 000000000000..5fc5b3a6b8f0
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/loader/annotations.xml
@@ -0,0 +1,102 @@
+<root>
+ <item name="org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader boolean isSourceModified(org.apache.velocity.runtime.resource.Resource)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;false;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader java.io.InputStream getResourceStream(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader boolean isSourceModified(org.apache.velocity.runtime.resource.Resource) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader java.io.InputStream getResourceStream(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader java.sql.PreparedStatement getStatement(java.sql.Connection, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader long getLastModified(org.apache.velocity.runtime.resource.Resource) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader long readLastModified(org.apache.velocity.runtime.resource.Resource, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader void init(org.apache.commons.collections.ExtendedProperties) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.FileResourceLoader boolean isSourceModified(org.apache.velocity.runtime.resource.Resource) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.FileResourceLoader boolean resourceExists(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.FileResourceLoader java.io.File getFile(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.FileResourceLoader java.io.File getFile(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.FileResourceLoader java.io.InputStream getResourceStream(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.FileResourceLoader long getLastModified(org.apache.velocity.runtime.resource.Resource) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.FileResourceLoader void init(org.apache.commons.collections.ExtendedProperties) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.JarHolder JarHolder(org.apache.velocity.runtime.RuntimeServices, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.JarResourceLoader boolean isSourceModified(org.apache.velocity.runtime.resource.Resource)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;true;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.JarResourceLoader java.io.InputStream getResourceStream(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.JarResourceLoader void init(org.apache.commons.collections.ExtendedProperties) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.JarResourceLoader void loadJar(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.ResourceLoader void commonInit(org.apache.velocity.runtime.RuntimeServices, org.apache.commons.collections.ExtendedProperties) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.ResourceLoaderFactory org.apache.velocity.runtime.resource.loader.ResourceLoader getLoader(org.apache.velocity.runtime.RuntimeServices, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.StringResourceLoader boolean isSourceModified(org.apache.velocity.runtime.resource.Resource) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.StringResourceLoader boolean resourceExists(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;false&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.StringResourceLoader java.io.InputStream getResourceStream(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.StringResourceLoader long getLastModified(org.apache.velocity.runtime.resource.Resource) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.StringResourceLoader void init(org.apache.commons.collections.ExtendedProperties) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.URLResourceLoader boolean isSourceModified(org.apache.velocity.runtime.resource.Resource)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;true&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.URLResourceLoader long getLastModified(org.apache.velocity.runtime.resource.Resource) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.resource.loader.URLResourceLoader void init(org.apache.commons.collections.ExtendedProperties) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/visitor/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/visitor/annotations.xml
new file mode 100644
index 000000000000..0ec8ac7715d5
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/visitor/annotations.xml
@@ -0,0 +1,245 @@
+<root>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTAddNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTAndNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTAssignment, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTBlock, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTComment, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTDirective, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTDivNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTEQNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTElseIfStatement, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTElseStatement, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTEscape, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTEscapedDirective, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTExpression, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTFalse, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTFloatingPointLiteral, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTGENode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTGTNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTIdentifier, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTIfStatement, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTIntegerLiteral, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTIntegerRange, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTLENode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTLTNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTMap, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTMethod, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTModNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTMulNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTNENode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTNotNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTObjectArray, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTOrNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTReference, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTSetDirective, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTStringLiteral, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTSubtractNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTText, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTTrue, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTWord, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTprocess, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.BaseVisitor java.lang.Object visit(org.apache.velocity.runtime.parser.node.SimpleNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object showNode(org.apache.velocity.runtime.parser.node.Node, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTAddNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTAndNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTAssignment, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTBlock, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTDirective, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTDivNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTEQNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTElseIfStatement, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTElseStatement, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTEscape, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTEscapedDirective, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTExpression, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTFalse, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTFloatingPointLiteral, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTGENode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTGTNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTIdentifier, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTIfStatement, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTIntegerLiteral, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTIntegerRange, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTLENode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTLTNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTMap, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTMethod, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTModNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTMulNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTNENode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTNotNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTObjectArray, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTOrNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTReference, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTSetDirective, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTStringLiteral, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTSubtractNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTText, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTTrue, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTWord, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.ASTprocess, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.Object visit(org.apache.velocity.runtime.parser.node.SimpleNode, java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.runtime.visitor.NodeViewMode java.lang.String indentString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/servlet/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/servlet/annotations.xml
new file mode 100644
index 000000000000..a1d5f80fe4ca
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/servlet/annotations.xml
@@ -0,0 +1,23 @@
+<root>
+ <item name="org.apache.velocity.servlet.VelocityServlet java.util.Properties loadConfiguration(javax.servlet.ServletConfig) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.servlet.VelocityServlet java.util.Properties loadConfiguration(javax.servlet.ServletConfig)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.servlet.VelocityServlet org.apache.velocity.context.Context createContext(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.servlet.VelocityServlet void error(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Exception) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.servlet.VelocityServlet void error(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Exception) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.servlet.VelocityServlet void mergeTemplate(org.apache.velocity.Template, org.apache.velocity.context.Context, javax.servlet.http.HttpServletResponse) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.servlet.VelocityServlet void setContentType(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/annotations.xml
new file mode 100644
index 000000000000..bea0f093ad72
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/annotations.xml
@@ -0,0 +1,14 @@
+<root>
+ <item name="org.apache.velocity.texen.Generator Generator(java.util.Properties) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.texen.Generator java.io.Writer getWriter(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.texen.Generator void fillContextDefaults(org.apache.velocity.context.Context) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.texen.Generator void fillContextHash(org.apache.velocity.context.Context, java.util.Hashtable) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/ant/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/ant/annotations.xml
new file mode 100644
index 000000000000..5b553dea86e3
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/ant/annotations.xml
@@ -0,0 +1,11 @@
+<root>
+ <item name="org.apache.velocity.texen.ant.TexenTask org.apache.velocity.context.Context initControlContext()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.texen.ant.TexenTask void populateInitialContext(org.apache.velocity.context.Context) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.texen.ant.TexenTask void setOutputDirectory(java.io.File) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/util/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/util/annotations.xml
new file mode 100644
index 000000000000..353ade77c7bc
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/util/annotations.xml
@@ -0,0 +1,23 @@
+<root>
+ <item name="org.apache.velocity.texen.util.FileUtil java.io.File file(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.texen.util.FileUtil java.io.File file(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.texen.util.FileUtil java.io.File file(java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.texen.util.FileUtil java.io.File file(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.texen.util.PropertiesUtil java.util.Properties loadFromClassPath(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.texen.util.PropertiesUtil java.util.Properties loadFromClassPath(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.texen.util.PropertiesUtil java.util.Properties loadFromTemplatePath(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/annotations.xml
new file mode 100644
index 000000000000..e60004f3fd63
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/annotations.xml
@@ -0,0 +1,109 @@
+<root>
+ <item name="org.apache.velocity.util.ArrayIterator ArrayIterator(java.lang.Object) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.ClassUtils java.io.InputStream getResourceAsStream(java.lang.Class, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.ClassUtils org.apache.velocity.util.introspection.VelMethod getMethod(java.lang.String, java.lang.Object[], java.lang.Class[], java.lang.Object, org.apache.velocity.context.InternalContextAdapter, org.apache.velocity.runtime.parser.node.SimpleNode, boolean) 4">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.ExceptionUtils java.lang.Throwable createWithCause(java.lang.Class, java.lang.String, java.lang.Throwable)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils boolean allEmpty(java.util.List) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String capitalizeFirstLetter(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String capitalizeFirstLetter(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String chop(java.lang.String, int)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_-&gt;!null;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String chop(java.lang.String, int, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String collapseNewlines(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String collapseNewlines(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String collapseSpaces(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String collapseSpaces(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String concat(java.util.List) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String concat(java.util.List)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String firstLetterCaps(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String firstLetterCaps(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String getPackageAsPath(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String getPackageAsPath(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String normalizePath(java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String nullTrim(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String removeAndHump(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String removeAndHump(java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String removeUnderScores(java.lang.String)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String stackTrace(java.lang.Throwable)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String sub(java.lang.String, java.lang.String, java.lang.String) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String sub(java.lang.String, java.lang.String, java.lang.String) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.String sub(java.lang.String, java.lang.String, java.lang.String)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null,_,_-&gt;!null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.StringBuffer stringSubstitution(java.lang.String, java.util.Hashtable) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.lang.StringBuffer stringSubstitution(java.lang.String, java.util.Map) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.StringUtils java.util.List trimStrings(java.util.List)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;!null-&gt;!null;null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/introspection/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/introspection/annotations.xml
new file mode 100644
index 000000000000..4518a467c463
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/introspection/annotations.xml
@@ -0,0 +1,127 @@
+<root>
+ <item name="org.apache.velocity.util.introspection.ClassMap java.lang.reflect.Method findMethod(java.lang.String, java.lang.Object[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.ClassMap void populateMethodCacheWithInterface(org.apache.velocity.util.introspection.ClassMap.MethodCache, java.lang.Class) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.ClassMap.MethodCache java.lang.String makeMethodKey(java.lang.String, java.lang.Object[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.ClassMap.MethodCache java.lang.String makeMethodKey(java.lang.reflect.Method) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.ClassMap.MethodCache java.lang.reflect.Method get(java.lang.String, java.lang.Object[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.ClassMap.MethodCache void access$100(org.apache.velocity.util.introspection.ClassMap.MethodCache, java.lang.reflect.Method) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.ClassMap.MethodCache void access$100(org.apache.velocity.util.introspection.ClassMap.MethodCache, java.lang.reflect.Method) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.ClassMap.MethodCache void put(java.lang.reflect.Method) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.Info Info(org.apache.velocity.runtime.parser.node.Node) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.Info java.lang.String toString()">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.IntrospectionUtils boolean isMethodInvocationConvertible(java.lang.Class, java.lang.Class, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.IntrospectionUtils boolean isStrictMethodInvocationConvertible(java.lang.Class, java.lang.Class, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.Introspector Introspector(org.apache.velocity.runtime.RuntimeLogger) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.Introspector java.lang.reflect.Method getMethod(java.lang.Class, java.lang.String, java.lang.Object[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.Introspector java.lang.reflect.Method getMethod(java.lang.Class, java.lang.String, java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.introspection.IntrospectorBase java.lang.reflect.Method getMethod(java.lang.Class, java.lang.String, java.lang.Object[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.IntrospectorBase java.lang.reflect.Method getMethod(java.lang.Class, java.lang.String, java.lang.Object[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.IntrospectorCacheImpl org.apache.velocity.util.introspection.ClassMap get(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.IntrospectorCacheImpl org.apache.velocity.util.introspection.ClassMap put(java.lang.Class) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.IntrospectorCacheImpl org.apache.velocity.util.introspection.ClassMap put(java.lang.Class)">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.MethodMap boolean isApplicable(java.lang.reflect.Method, java.lang.Class[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.MethodMap boolean isApplicable(java.lang.reflect.Method, java.lang.Class[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.MethodMap boolean isConvertible(java.lang.Class, java.lang.Class, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.MethodMap boolean isStrictConvertible(java.lang.Class, java.lang.Class, boolean) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.MethodMap int compare(java.lang.Class[], java.lang.Class[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.MethodMap int compare(java.lang.Class[], java.lang.Class[]) 1">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.MethodMap java.lang.reflect.Method find(java.lang.String, java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,null-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.introspection.MethodMap java.lang.reflect.Method getBestMatch(java.util.List, java.lang.Class[]) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.MethodMap void add(java.lang.reflect.Method) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.SecureIntrospectorImpl java.lang.reflect.Method getMethod(java.lang.Class, java.lang.String, java.lang.Object[])">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;_,_,null-&gt;null;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.introspection.SecureUberspector java.util.Iterator getIterator(java.lang.Object, org.apache.velocity.util.introspection.Info)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.introspection.UberspectImpl java.util.Iterator getIterator(java.lang.Object, org.apache.velocity.util.introspection.Info) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.UberspectImpl org.apache.velocity.util.introspection.VelMethod getMethod(java.lang.Object, java.lang.String, java.lang.Object[], org.apache.velocity.util.introspection.Info)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.introspection.UberspectImpl org.apache.velocity.util.introspection.VelPropertyGet getPropertyGet(java.lang.Object, java.lang.String, org.apache.velocity.util.introspection.Info)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.introspection.UberspectImpl org.apache.velocity.util.introspection.VelPropertySet getPropertySet(java.lang.Object, java.lang.String, java.lang.Object, org.apache.velocity.util.introspection.Info)">
+ <annotation name="org.jetbrains.annotations.Contract">
+ <val val="&quot;null,_,_,_-&gt;null&quot;"/>
+ </annotation>
+ </item>
+ <item name="org.apache.velocity.util.introspection.UberspectImpl void setRuntimeLogger(org.apache.velocity.runtime.RuntimeLogger) 0">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+ <item name="org.apache.velocity.util.introspection.UberspectImpl.VelMethodImpl java.lang.Object[] handleVarArg(java.lang.Class, int, java.lang.Object[]) 2">
+ <annotation name="org.jetbrains.annotations.NotNull"/>
+ </item>
+</root>
diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/src/Example.java b/java/java-tests/testData/codeInspection/bytecodeAnalysis/src/Example.java
new file mode 100644
index 000000000000..5738a372e6ca
--- /dev/null
+++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/src/Example.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.ClassUtils;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import java.io.FilterOutputStream;
+import java.io.IOException;
+
+public class Example {
+ void test() {
+
+ if (<warning descr="Condition 'ArrayUtils.toMap(null) == null' is always 'true'">ArrayUtils.toMap(null) == null</warning>) {
+ System.out.println("null");
+ }
+
+ if (<warning descr="Condition 'ClassUtils.getPackageName((String)null) == null' is always 'false'">ClassUtils.getPackageName((String)null) == null</warning>) {
+ System.out.println("null");
+ }
+
+ @NotNull Class x = <warning descr="Expression 'ClassUtils.primitiveToWrapper(null)' might evaluate to null but is assigned to a variable that is annotated with @NotNull">ClassUtils.primitiveToWrapper(null)</warning>;
+ }
+
+ void writeBytes(@Nullable byte[] bytes) throws IOException {
+ new FilterOutputStream(null).write(<warning descr="Argument 'bytes' might be null">bytes</warning>);
+ }
+}
diff --git a/java/java-tests/testData/compiler/notNullVerification/CustomExceptionType.java b/java/java-tests/testData/compiler/notNullVerification/CustomExceptionType.java
new file mode 100644
index 000000000000..055b339c5f9c
--- /dev/null
+++ b/java/java-tests/testData/compiler/notNullVerification/CustomExceptionType.java
@@ -0,0 +1,5 @@
+import org.jetbrains.annotations.NotNull;
+
+public class CustomExceptionType {
+ public void foo(Object obj, @NotNull(exception = NullPointerException.class) Object obj2) { }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/compiler/notNullVerification/annotations.jar b/java/java-tests/testData/compiler/notNullVerification/annotations.jar
index 45860d829e91..d96bb1d6bed4 100644
--- a/java/java-tests/testData/compiler/notNullVerification/annotations.jar
+++ b/java/java-tests/testData/compiler/notNullVerification/annotations.jar
Binary files differ
diff --git a/java/java-tests/testData/inspection/dataFlow/AlexBug/src/Test.java b/java/java-tests/testData/inspection/dataFlow/AlexBug/src/Test.java
index 1953a6a43c55..e397de3faf8a 100644
--- a/java/java-tests/testData/inspection/dataFlow/AlexBug/src/Test.java
+++ b/java/java-tests/testData/inspection/dataFlow/AlexBug/src/Test.java
@@ -1,6 +1,8 @@
public class Test {
- public String foo(String path) {
- String smth = new String(path);
+ public Test(String s) { }
+
+ public Test foo(String path) {
+ Test smth = new Test(path);
if (path == null) return null;
return smth;
}
diff --git a/java/java-tests/testData/inspection/dataFlow/caseAndNpe/expected.xml b/java/java-tests/testData/inspection/dataFlow/caseAndNpe/expected.xml
index 184e6c5f85f1..e65851b5b821 100644
--- a/java/java-tests/testData/inspection/dataFlow/caseAndNpe/expected.xml
+++ b/java/java-tests/testData/inspection/dataFlow/caseAndNpe/expected.xml
@@ -22,6 +22,11 @@
</problem>
<problem>
<file>CaseAndNpe.java</file>
+ <line>56</line>
+ <description>Condition &lt;code&gt;i &lt; 5&lt;/code&gt; is always &lt;code&gt;false&lt;/code&gt;</description>
+ </problem>
+ <problem>
+ <file>CaseAndNpe.java</file>
<line>80</line>
<description>Condition is always true</description>
</problem>
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/AccessingSameArrayElements.java b/java/java-tests/testData/inspection/dataFlow/fixture/AccessingSameArrayElements.java
new file mode 100644
index 000000000000..a5a0001517d6
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/AccessingSameArrayElements.java
@@ -0,0 +1,56 @@
+abstract class Test {
+ void testSameEquals(int[] arr1, int[] arr2) {
+ if (arr1[0] == arr2[0] && <warning descr="Condition 'arr1[0] == arr2[0]' is always 'true' when reached">arr1[0] == arr2[0]</warning>) {
+ }
+ }
+
+ void testMatrices(int[][][] arr1, int[][][] arr2) {
+ if (arr1[0][1][2] == arr1[0][1][3] &&
+ <warning descr="Condition 'arr1[0][1][2] == arr1[0][1][3]' is always 'true' when reached">arr1[0][1][2] == arr1[0][1][3]</warning>) {
+ }
+ }
+
+ void testNotEquals(int[] arr1, int[] arr2) {
+ if (arr1[0] != arr2[0]) return;
+
+ if (<warning descr="Condition 'arr1[0] == arr2[0]' is always 'true'">arr1[0] == arr2[0]</warning>) {}
+ }
+
+ void testInvalidatingCall(int[] arr1, int[] arr2) {
+ if (arr1[0] != arr2[0]) return;
+
+ changeArray(arr1);
+
+ if (arr1[0] == arr2[0]) {}
+ }
+ abstract void changeArray(int[] array);
+
+
+ void testIndirectlyInvalidatingCall(int[] arr1, int[] arr2, int[][] arr3) {
+ arr3[0] = arr1;
+
+ if (arr1[0] != arr2[0]) return;
+
+ changeSubArray(arr3);
+
+ if (arr1[0] == arr2[0]) {}
+ }
+ abstract void changeSubArray(int[][] array);
+
+
+ void testAssigning(int[] arr1, int j) {
+ arr1[0] = j;
+ if (<warning descr="Condition 'arr1[0] == j' is always 'true'">arr1[0] == j</warning>) { }
+ }
+
+ void testReassigning(int[] arr1) {
+ arr1[0] = 1;
+ arr1[1] = 3;
+ if (<warning descr="Condition 'arr1[0] == 1' is always 'true'">arr1[0] == 1</warning>) { }
+
+ for (int i = 0; i < arr1.length; i++) {
+ arr1[i] = 2;
+ }
+ if (arr1[0] == 1) { }
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/AssertThat.java b/java/java-tests/testData/inspection/dataFlow/fixture/AssertThat.java
new file mode 100644
index 000000000000..b3d614cd8cb3
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/AssertThat.java
@@ -0,0 +1,18 @@
+import org.hamcrest.CoreMatchers;
+import org.jetbrains.annotations.Nullable;
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+
+class Contracts {
+
+ private void checkNotNullValue(@Nullable Object o) {
+ assertThat(o, CoreMatchers.<Object>notNullValue());
+ System.out.println(o.hashCode());
+ }
+
+ private void checkNotEqualToNull(@Nullable String test) {
+ assertThat("String is null", test, not(equalTo(null)));
+ int length = test.length();
+ }
+
+} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/CatchRuntimeException.java b/java/java-tests/testData/inspection/dataFlow/fixture/CatchRuntimeException.java
index 8f6508642352..e635b8dbd9a9 100644
--- a/java/java-tests/testData/inspection/dataFlow/fixture/CatchRuntimeException.java
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/CatchRuntimeException.java
@@ -36,7 +36,7 @@ class BrokenAlignment {
}
public void bar(@NotNull Object foo) {
- assert <warning descr="Condition 'foo != null' is always 'true'">foo != null</warning>;
+ if (<warning descr="Condition 'foo != null' is always 'true'">foo != null</warning>);
}
public void bar2(@NotNull Object foo) {
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ContractInferenceBewareOverriding.java b/java/java-tests/testData/inspection/dataFlow/fixture/ContractInferenceBewareOverriding.java
new file mode 100644
index 000000000000..a1d263f778f6
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/ContractInferenceBewareOverriding.java
@@ -0,0 +1,21 @@
+import org.jetbrains.annotations.Nullable;
+
+class Doo {
+
+ boolean isMaybeNotNull(@Nullable Object o) {
+ return o != null;
+ }
+
+ void foo(@Nullable String s) {
+ if (isMaybeNotNull(s)) {
+ System.out.println(<warning descr="Method invocation 's.length()' may produce 'java.lang.NullPointerException'">s.length()</warning>);
+ }
+ }
+
+}
+
+class DooImpl extends Doo {
+ boolean isMaybeNotNull(@Nullable Object o) {
+ return hashCode() == 42;
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/FinalFieldDuringSuperInitialization.java b/java/java-tests/testData/inspection/dataFlow/fixture/FinalFieldDuringSuperInitialization.java
new file mode 100644
index 000000000000..59fc5fba349a
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/FinalFieldDuringSuperInitialization.java
@@ -0,0 +1,20 @@
+class Parent {
+ Parent() {
+ callProtectedMethod();
+ }
+ protected void callProtectedMethod() { }
+}
+
+class Child extends Parent {
+ private final Object myField;
+ Child() {
+ super();
+ myField = new Object();
+ }
+ @Override
+ protected void callProtectedMethod() {
+ if (myField != null) { // HERE myField CAN be null
+ System.out.println();
+ }
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/GuavaCheckNotNull.java b/java/java-tests/testData/inspection/dataFlow/fixture/GuavaCheckNotNull.java
new file mode 100644
index 000000000000..4a11daa71c77
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/GuavaCheckNotNull.java
@@ -0,0 +1,11 @@
+import org.jetbrains.annotations.Nullable;
+
+class Contracts {
+
+ private void check(@Nullable Object o) {
+ com.google.common.base.Preconditions.checkNotNull(o);
+ System.out.println(o.hashCode());
+ }
+
+
+} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NumberComparisonsWhenValueIsKnown.java b/java/java-tests/testData/inspection/dataFlow/fixture/NumberComparisonsWhenValueIsKnown.java
new file mode 100644
index 000000000000..71cca5352cf2
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/NumberComparisonsWhenValueIsKnown.java
@@ -0,0 +1,16 @@
+import java.util.Arrays;
+
+class Test {
+ int[] mIndex = null;
+ int mSize = 0;
+
+ void indexValues() {
+ float loadFactor = mIndex == null ? 1.f : ((float) mSize) / ((float) mIndex.length);
+
+ if (loadFactor < 0.25f || 0.75f <= loadFactor) {
+ mIndex = new int[mSize * 2];
+ }
+
+ mIndex[0] = -1;
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences.java
index d81b46724a81..dbb4f50f44a5 100644
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences.java
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences.java
@@ -1,13 +1,15 @@
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
class Test {
- private void test2(@NotNull Object bar) {
+ private void test2(@NotNull Object bar) {}
+
+ void println(@Nullable Object o) {}
- }
private Object test(Object foo, Object bar) {
if (foo == null) {
- System.out.println(<warning descr="Value 'foo' is always 'null'"><caret>foo</warning>);
- System.out.println(<warning descr="Value 'foo' is always 'null'">foo</warning>);
+ println(<warning descr="Value 'foo' is always 'null'"><caret>foo</warning>);
+ println(<warning descr="Value 'foo' is always 'null'">foo</warning>);
return <warning descr="Expression 'foo' might evaluate to null but is returned by the method which is not declared as @Nullable">foo</warning>;
}
if (bar == null) {
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_NotInComplexAssignment.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_NotInComplexAssignment.java
deleted file mode 100644
index a13f0f1b5d60..000000000000
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_NotInComplexAssignment.java
+++ /dev/null
@@ -1,6 +0,0 @@
-class Test {
- void foo() {
- int x = 42;
- <caret>x += 100;
- }
-} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_OverloadedCall.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_OverloadedCall.java
new file mode 100644
index 000000000000..82c1e9122cc1
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_OverloadedCall.java
@@ -0,0 +1,14 @@
+import org.jetbrains.annotations.Nullable;
+
+class Test {
+ void method(@Nullable String o) {}
+
+ void method(@Nullable Integer o) {}
+
+ private void test(String foo) {
+ if (foo == null) {
+ method(<warning descr="Value 'foo' is always 'null'"><caret>foo</warning>);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_OverloadedCall_after.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_OverloadedCall_after.java
new file mode 100644
index 000000000000..22524625216d
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_OverloadedCall_after.java
@@ -0,0 +1,14 @@
+import org.jetbrains.annotations.Nullable;
+
+class Test {
+ void method(@Nullable String o) {}
+
+ void method(@Nullable Integer o) {}
+
+ private void test(String foo) {
+ if (foo == null) {
+ method(<caret>(String) null);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithEnum.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithEnum.java
deleted file mode 100644
index 2ed16ce0c6f5..000000000000
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithEnum.java
+++ /dev/null
@@ -1,7 +0,0 @@
-class Test {
- private void test() {
- foo.MyEnum s = foo.MyEnum.FOO;
- System.out.println(<caret><warning descr="Value 's' is always 'FOO'">s</warning>);
- }
-
-} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithEnum_after.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithEnum_after.java
deleted file mode 100644
index 29552fa61615..000000000000
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithEnum_after.java
+++ /dev/null
@@ -1,9 +0,0 @@
-import foo.MyEnum;
-
-class Test {
- private void test() {
- foo.MyEnum s = foo.MyEnum.FOO;
- System.out.println(MyEnum.FOO);
- }
-
-} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithIntConstant.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithIntConstant.java
deleted file mode 100644
index 5388bcda069f..000000000000
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithIntConstant.java
+++ /dev/null
@@ -1,10 +0,0 @@
-class Test {
- public static final int CONST = 23942;
- private void test(int a) {
- if (a == CONST) {
- System.out.println(<caret><warning descr="Value 'a' is always 'CONST'">a</warning>);
- }
-
- }
-
-} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithIntConstant_after.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithIntConstant_after.java
deleted file mode 100644
index 11feed5f7903..000000000000
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithIntConstant_after.java
+++ /dev/null
@@ -1,10 +0,0 @@
-class Test {
- public static final int CONST = 23942;
- private void test(int a) {
- if (a == CONST) {
- System.out.println(<caret>CONST);
- }
-
- }
-
-} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithString.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithString.java
deleted file mode 100644
index fcff4846b378..000000000000
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithString.java
+++ /dev/null
@@ -1,8 +0,0 @@
-class Test {
- public static final String CONST = "foo bar";
- private void test() {
- String s = CONST;
- System.out.println(<caret><warning descr="Value 's' is always 'CONST'">s</warning>);
- }
-
-} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithString_after.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithString_after.java
deleted file mode 100644
index a462170b2b31..000000000000
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_ReplaceWithString_after.java
+++ /dev/null
@@ -1,8 +0,0 @@
-class Test {
- public static final String CONST = "foo bar";
- private void test() {
- String s = CONST;
- System.out.println(CONST);
- }
-
-} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_Switch.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_Switch.java
deleted file mode 100644
index e48dc19555bb..000000000000
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_Switch.java
+++ /dev/null
@@ -1,22 +0,0 @@
-class Test {
- private void test() {
- int state = 1;
- switch (<warning descr="Value 'state' is always '1'">state</warning>) {
- case 1: break;
- }
- }
-
- private void test2(int state) {
- switch (state) {
- case ONE:
- case TWO:
- if (state == TWO) {
- System.out.println("hello");
- }
- }
- }
-
- public static final int ONE = 1;
- public static final int TWO = 2;
-
-} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_after.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_after.java
index 0d187397afc9..395fd486c388 100644
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_after.java
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_after.java
@@ -1,13 +1,15 @@
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
class Test {
- private void test2(@NotNull Object bar) {
+ private void test2(@NotNull Object bar) {}
+
+ void println(@Nullable Object o) {}
- }
private Object test(Object foo, Object bar) {
if (foo == null) {
- System.out.println(<caret>null);
- System.out.println(foo);
+ println(<caret>null);
+ println(foo);
return foo;
}
if (bar == null) {
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/UseInferredContracts.java b/java/java-tests/testData/inspection/dataFlow/fixture/UseInferredContracts.java
new file mode 100644
index 000000000000..34b9d708a4b2
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/UseInferredContracts.java
@@ -0,0 +1,15 @@
+import org.jetbrains.annotations.Nullable;
+
+class Doo {
+
+ static boolean isNotNull(@Nullable Object o) {
+ return o != null;
+ }
+
+ void foo(@Nullable String s) {
+ if (isNotNull(s)) {
+ System.out.println(s.length());
+ }
+ }
+
+}
diff --git a/java/java-tests/testData/inspection/nullableProblems/GetterSetterProblems.java b/java/java-tests/testData/inspection/nullableProblems/GetterSetterProblems.java
index d49cd9ca6fd0..c8a5816ec741 100644
--- a/java/java-tests/testData/inspection/nullableProblems/GetterSetterProblems.java
+++ b/java/java-tests/testData/inspection/nullableProblems/GetterSetterProblems.java
@@ -2,7 +2,7 @@ import org.jetbrains.annotations.NotNull;
class B {
@NotNull
- B b;
+ B b = new B();
public B <warning descr="Getter for @NotNull field might be annotated @NotNull itself">getB</warning>() {
return b;
@@ -39,7 +39,7 @@ class C {
this.c = c;
}
- @NotNull C c1;
+ @NotNull C c1 = new C(null);
@org.jetbrains.annotations.Nullable
public C getC1() {
if (c1 != null) {
diff --git a/java/java-tests/testData/inspection/nullableProblems/NotNullCustomException.java b/java/java-tests/testData/inspection/nullableProblems/NotNullCustomException.java
new file mode 100644
index 000000000000..42e2798ed1ab
--- /dev/null
+++ b/java/java-tests/testData/inspection/nullableProblems/NotNullCustomException.java
@@ -0,0 +1,8 @@
+import org.jetbrains.annotations.*;
+
+class Test {
+ public void foo(@NotNull(exception = NullPointerException.class) String a) { }
+ public void foo2(@NotNull(exception = <warning descr="Custom exception class should have a constructor with a single message parameter of String type">CustomException.class</warning>) String a) { }
+}
+
+class CustomException extends Exception {} \ No newline at end of file
diff --git a/java/java-tests/testData/inspection/nullableProblems/NotNullFieldNotInitialized.java b/java/java-tests/testData/inspection/nullableProblems/NotNullFieldNotInitialized.java
new file mode 100644
index 000000000000..918d5db30fd2
--- /dev/null
+++ b/java/java-tests/testData/inspection/nullableProblems/NotNullFieldNotInitialized.java
@@ -0,0 +1,9 @@
+import org.jetbrains.annotations.*;
+
+class Test {
+ <warning descr="Not-null fields must be initialized">@NotNull</warning> Object member;
+
+ private void accessMember() {
+ member = new Object();
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java
index 200c37e7fa32..4e90d08eb3ea 100644
--- a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java
+++ b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java
@@ -1,2 +1,8 @@
@Ann(<error descr="Cannot find method 'value'">0</error>) class D {
+
+ <error>@EJB</error>
+ Runnable myMissingEjbRef;
+
+ public <T> @SafeVarargs
+ static void m();
} \ No newline at end of file
diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt
index 9f1efdb6d2e4..678025fdf06a 100644
--- a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt
+++ b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt
@@ -69,5 +69,96 @@ PsiJavaFile:Errors.java
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
+ PsiWhiteSpace('\n\n ')
+ PsiModifierList:
+ <empty list>
+ PsiErrorElement:Identifier or type expected
+ PsiTypeParameterList
+ PsiJavaToken:LT('<')
+ PsiTypeParameter:error
+ PsiIdentifier:error('error')
+ PsiElement(EXTENDS_BOUND_LIST)
+ <empty list>
+ PsiJavaToken:GT('>')
+ PsiModifierList:@EJB
+ PsiAnnotation
+ PsiJavaToken:AT('@')
+ PsiJavaCodeReferenceElement:EJB
+ PsiIdentifier:EJB('EJB')
+ PsiReferenceParameterList
+ <empty list>
+ PsiAnnotationParameterList
+ <empty list>
+ PsiErrorElement:Identifier or type expected
+ PsiTypeParameterList
+ PsiJavaToken:LT('<')
+ PsiErrorElement:Type parameter expected
+ <empty list>
+ PsiErrorElement:'>' expected.
+ <empty list>
+ PsiErrorElement:Unexpected token
+ PsiJavaToken:DIV('/')
+ PsiModifierList:
+ <empty list>
+ PsiTypeElement:error
+ PsiJavaCodeReferenceElement:error
+ PsiIdentifier:error('error')
+ PsiReferenceParameterList
+ <empty list>
+ PsiErrorElement:Identifier expected
+ <empty list>
+ PsiErrorElement:Unexpected token
+ PsiJavaToken:GT('>')
+ PsiWhiteSpace('\n ')
+ PsiField:myMissingEjbRef
+ PsiModifierList:
+ <empty list>
+ PsiTypeElement:Runnable
+ PsiJavaCodeReferenceElement:Runnable
+ PsiIdentifier:Runnable('Runnable')
+ PsiReferenceParameterList
+ <empty list>
+ PsiWhiteSpace(' ')
+ PsiIdentifier:myMissingEjbRef('myMissingEjbRef')
+ PsiJavaToken:SEMICOLON(';')
+ PsiWhiteSpace('\n\n ')
+ PsiModifierList:public
+ PsiKeyword:public('public')
+ PsiWhiteSpace(' ')
+ PsiErrorElement:Identifier or type expected
+ PsiTypeParameterList
+ PsiJavaToken:LT('<')
+ PsiTypeParameter:T
+ PsiIdentifier:T('T')
+ PsiElement(EXTENDS_BOUND_LIST)
+ <empty list>
+ PsiJavaToken:GT('>')
+ PsiWhiteSpace(' ')
+ PsiMethod:m
+ PsiModifierList:@SafeVarargs
+ static
+ PsiAnnotation
+ PsiJavaToken:AT('@')
+ PsiJavaCodeReferenceElement:SafeVarargs
+ PsiIdentifier:SafeVarargs('SafeVarargs')
+ PsiReferenceParameterList
+ <empty list>
+ PsiAnnotationParameterList
+ <empty list>
+ PsiWhiteSpace('\n ')
+ PsiKeyword:static('static')
+ PsiTypeParameterList
+ <empty list>
+ PsiWhiteSpace(' ')
+ PsiTypeElement:void
+ PsiKeyword:void('void')
+ PsiWhiteSpace(' ')
+ PsiIdentifier:m('m')
+ PsiParameterList:()
+ PsiJavaToken:LPARENTH('(')
+ PsiJavaToken:RPARENTH(')')
+ PsiReferenceList
+ <empty list>
+ PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiJavaToken:RBRACE('}') \ No newline at end of file
diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.java b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.java
index a74d4d6bbfad..de61404de20d 100644
--- a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.java
+++ b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.java
@@ -47,6 +47,11 @@ class SpecSamples {
try (@A Reader r = new @B FileReader("/dev/zero"); @A Writer w = new @B FileWriter("/dev/null")) { }
}
+ interface TestClass {
+ <T> @Nullable List<T> test();
+ <T> @Positive int test(T t);
+ }
+
//
// 2. An annotation on a wildcard type argument appears before the wildcard ...
//
@@ -72,6 +77,7 @@ class SpecSamples {
//
@Immutable SpecSamples() { }
+ <T> @Immutable SpecSamples(T t) { }
//
// todo [r.sh] 5. It is permitted to explicitly declare the method receiver as the first formal parameter ...
diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.txt b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.txt
index 54cf4b873ea8..0cc33a82fa2c 100644
--- a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.txt
+++ b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/TypeAnnotations.txt
@@ -1045,6 +1045,104 @@ PsiJavaFile:TypeAnnotations.java
PsiWhiteSpace('\n ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n\n ')
+ PsiClass:TestClass
+ PsiModifierList:
+ <empty list>
+ PsiKeyword:interface('interface')
+ PsiWhiteSpace(' ')
+ PsiIdentifier:TestClass('TestClass')
+ PsiTypeParameterList
+ <empty list>
+ PsiReferenceList
+ <empty list>
+ PsiReferenceList
+ <empty list>
+ PsiWhiteSpace(' ')
+ PsiJavaToken:LBRACE('{')
+ PsiWhiteSpace('\n ')
+ PsiMethod:test
+ PsiModifierList:
+ <empty list>
+ PsiTypeParameterList
+ PsiJavaToken:LT('<')
+ PsiTypeParameter:T
+ PsiIdentifier:T('T')
+ PsiElement(EXTENDS_BOUND_LIST)
+ <empty list>
+ PsiJavaToken:GT('>')
+ PsiWhiteSpace(' ')
+ PsiTypeElement:@Nullable List<T>
+ PsiAnnotation
+ PsiJavaToken:AT('@')
+ PsiJavaCodeReferenceElement:Nullable
+ PsiIdentifier:Nullable('Nullable')
+ PsiReferenceParameterList
+ <empty list>
+ PsiAnnotationParameterList
+ <empty list>
+ PsiWhiteSpace(' ')
+ PsiJavaCodeReferenceElement:List<T>
+ PsiIdentifier:List('List')
+ PsiReferenceParameterList
+ PsiJavaToken:LT('<')
+ PsiTypeElement:T
+ PsiJavaCodeReferenceElement:T
+ PsiIdentifier:T('T')
+ PsiReferenceParameterList
+ <empty list>
+ PsiJavaToken:GT('>')
+ PsiWhiteSpace(' ')
+ PsiIdentifier:test('test')
+ PsiParameterList:()
+ PsiJavaToken:LPARENTH('(')
+ PsiJavaToken:RPARENTH(')')
+ PsiReferenceList
+ <empty list>
+ PsiJavaToken:SEMICOLON(';')
+ PsiWhiteSpace('\n ')
+ PsiMethod:test
+ PsiModifierList:
+ <empty list>
+ PsiTypeParameterList
+ PsiJavaToken:LT('<')
+ PsiTypeParameter:T
+ PsiIdentifier:T('T')
+ PsiElement(EXTENDS_BOUND_LIST)
+ <empty list>
+ PsiJavaToken:GT('>')
+ PsiWhiteSpace(' ')
+ PsiTypeElement:@Positive int
+ PsiAnnotation
+ PsiJavaToken:AT('@')
+ PsiJavaCodeReferenceElement:Positive
+ PsiIdentifier:Positive('Positive')
+ PsiReferenceParameterList
+ <empty list>
+ PsiAnnotationParameterList
+ <empty list>
+ PsiWhiteSpace(' ')
+ PsiKeyword:int('int')
+ PsiWhiteSpace(' ')
+ PsiIdentifier:test('test')
+ PsiParameterList:(T t)
+ PsiJavaToken:LPARENTH('(')
+ PsiParameter:t
+ PsiModifierList:
+ <empty list>
+ PsiTypeElement:T
+ PsiJavaCodeReferenceElement:T
+ PsiIdentifier:T('T')
+ PsiReferenceParameterList
+ <empty list>
+ PsiWhiteSpace(' ')
+ PsiIdentifier:t('t')
+ PsiJavaToken:RPARENTH(')')
+ PsiReferenceList
+ <empty list>
+ PsiJavaToken:SEMICOLON(';')
+ PsiWhiteSpace('\n ')
+ PsiJavaToken:RBRACE('}')
+ PsiWhiteSpace('\n\n ')
PsiComment(END_OF_LINE_COMMENT)('//')
PsiWhiteSpace('\n ')
PsiComment(END_OF_LINE_COMMENT)('// 2. An annotation on a wildcard type argument appears before the wildcard ...')
@@ -1485,6 +1583,48 @@ PsiJavaFile:TypeAnnotations.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
+ PsiWhiteSpace('\n ')
+ PsiMethod:SpecSamples
+ PsiModifierList:
+ <empty list>
+ PsiTypeParameterList
+ PsiJavaToken:LT('<')
+ PsiTypeParameter:T
+ PsiIdentifier:T('T')
+ PsiElement(EXTENDS_BOUND_LIST)
+ <empty list>
+ PsiJavaToken:GT('>')
+ PsiWhiteSpace(' ')
+ PsiAnnotation
+ PsiJavaToken:AT('@')
+ PsiJavaCodeReferenceElement:Immutable
+ PsiIdentifier:Immutable('Immutable')
+ PsiReferenceParameterList
+ <empty list>
+ PsiAnnotationParameterList
+ <empty list>
+ PsiWhiteSpace(' ')
+ PsiIdentifier:SpecSamples('SpecSamples')
+ PsiParameterList:(T t)
+ PsiJavaToken:LPARENTH('(')
+ PsiParameter:t
+ PsiModifierList:
+ <empty list>
+ PsiTypeElement:T
+ PsiJavaCodeReferenceElement:T
+ PsiIdentifier:T('T')
+ PsiReferenceParameterList
+ <empty list>
+ PsiWhiteSpace(' ')
+ PsiIdentifier:t('t')
+ PsiJavaToken:RPARENTH(')')
+ PsiReferenceList
+ <empty list>
+ PsiWhiteSpace(' ')
+ PsiCodeBlock
+ PsiJavaToken:LBRACE('{')
+ PsiWhiteSpace(' ')
+ PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n\n ')
PsiComment(END_OF_LINE_COMMENT)('//')
PsiWhiteSpace('\n ')
diff --git a/java/java-tests/testData/refactoring/inlineMethod/ThisNameConflict.java b/java/java-tests/testData/refactoring/inlineMethod/ThisNameConflict.java
new file mode 100644
index 000000000000..262eae47d2a3
--- /dev/null
+++ b/java/java-tests/testData/refactoring/inlineMethod/ThisNameConflict.java
@@ -0,0 +1,11 @@
+class Test {
+ private final String test = "";
+
+ {
+ foo();
+ }
+
+ void fo<caret>o() {
+ if (test.isEmpty());
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/inlineMethod/ThisNameConflict.java.after b/java/java-tests/testData/refactoring/inlineMethod/ThisNameConflict.java.after
new file mode 100644
index 000000000000..76ed281eedb8
--- /dev/null
+++ b/java/java-tests/testData/refactoring/inlineMethod/ThisNameConflict.java.after
@@ -0,0 +1,8 @@
+class Test {
+ private final String test = "";
+
+ {
+ if (test.isEmpty());
+ }
+
+} \ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/pullUp/AsDefaultMethodOverAbstract.java b/java/java-tests/testData/refactoring/pullUp/AsDefaultMethodOverAbstract.java
new file mode 100644
index 000000000000..2a1b9f1ace61
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pullUp/AsDefaultMethodOverAbstract.java
@@ -0,0 +1,12 @@
+class Test {
+ interface Printer {
+ void foo();
+
+ }
+
+ abstract class AbstractPrinter implements Printer {
+ @Override
+ public void f<caret>oo() {
+ }
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/pullUp/AsDefaultMethodOverAbstract_after.java b/java/java-tests/testData/refactoring/pullUp/AsDefaultMethodOverAbstract_after.java
new file mode 100644
index 000000000000..2a1b9f1ace61
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pullUp/AsDefaultMethodOverAbstract_after.java
@@ -0,0 +1,12 @@
+class Test {
+ interface Printer {
+ void foo();
+
+ }
+
+ abstract class AbstractPrinter implements Printer {
+ @Override
+ public void f<caret>oo() {
+ }
+ }
+} \ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/TestClassesFilterTest.java b/java/java-tests/testSrc/com/intellij/TestClassesFilterTest.java
index 2bbdb91be897..802189ddff83 100644
--- a/java/java-tests/testSrc/com/intellij/TestClassesFilterTest.java
+++ b/java/java-tests/testSrc/com/intellij/TestClassesFilterTest.java
@@ -21,6 +21,8 @@ import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+import java.util.Collections;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -41,7 +43,7 @@ public class TestClassesFilterTest {
"com.intellij.package6.ExcludedTest\n" +
"com.intellij.package7.*package8";
- TestClassesFilter classesFilter = GroupBasedTestClassFilter.createOn(getReader(filterText), "Group1");
+ TestClassesFilter classesFilter = GroupBasedTestClassFilter.createOn(getReader(filterText), Collections.singletonList("Group1"));
assertTrue(classesFilter.matches("com.intellij.package1.Test"));
assertTrue(classesFilter.matches("com.intellij.package1.Test2"));
assertFalse(classesFilter.matches("com.intellij.package2.Test"));
@@ -59,7 +61,7 @@ public class TestClassesFilterTest {
assertFalse(classesFilter.matches("com.intellij.package7.package5.package8"));
assertFalse(classesFilter.matches("com.intellij.package7"));
- classesFilter = GroupBasedTestClassFilter.createOn(getReader(filterText), "Group2");
+ classesFilter = GroupBasedTestClassFilter.createOn(getReader(filterText), Collections.singletonList("Group2"));
assertFalse(classesFilter.matches("com.intellij.package1.Test"));
assertFalse(classesFilter.matches("com.intellij.package1.Test2"));
assertFalse(classesFilter.matches("com.intellij.package2.Test"));
@@ -77,18 +79,29 @@ public class TestClassesFilterTest {
assertTrue(classesFilter.matches("com.intellij.package7.package5.package8"));
assertFalse(classesFilter.matches("com.intellij.package7"));
- classesFilter = GroupBasedTestClassFilter.createOn(getReader(filterText), null);
- checkForNullGroup(classesFilter);
+ classesFilter = GroupBasedTestClassFilter.createOn(getReader(filterText),
+ Collections.singletonList(GroupBasedTestClassFilter.ALL_EXCLUDE_DEFINED));
+ checkForAllExcludedDefinedGroup(classesFilter);
- classesFilter = GroupBasedTestClassFilter.createOn(getReader(filterText), GroupBasedTestClassFilter.ALL_EXCLUDE_DEFINED);
- checkForNullGroup(classesFilter);
+ classesFilter = GroupBasedTestClassFilter.createOn(getReader(filterText), Collections.<String>emptyList());
+ checkForAllExcludedDefinedGroup(classesFilter);
+
+ classesFilter = GroupBasedTestClassFilter.createOn(getReader(filterText), Arrays.asList("Group1", "Group2"));
+ assertTrue(classesFilter.matches("com.intellij.package1.Test"));
+ assertTrue(classesFilter.matches("com.intellij.package5.Test"));
+ assertFalse(classesFilter.matches("com.intellij.package4.Test"));
+
+ classesFilter = GroupBasedTestClassFilter.createOn(getReader(filterText), Arrays.asList("Group1", GroupBasedTestClassFilter.ALL_EXCLUDE_DEFINED));
+ assertTrue(classesFilter.matches("com.intellij.package1.Test"));
+ assertFalse(classesFilter.matches("com.intellij.package5.Test"));
+ assertTrue(classesFilter.matches("com.intellij.package4.Test"));
}
private static InputStreamReader getReader(String filterText) throws UnsupportedEncodingException {
return new InputStreamReader(new ByteArrayInputStream(filterText.getBytes("UTF-8")));
}
- private static void checkForNullGroup(TestClassesFilter classesFilter) {
+ private static void checkForAllExcludedDefinedGroup(TestClassesFilter classesFilter) {
assertFalse(classesFilter.matches("com.intellij.package1.Test"));
assertFalse(classesFilter.matches("com.intellij.package1.Test2"));
assertTrue(classesFilter.matches("com.intellij.package2.Test"));
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java
index 8c3837fe1722..f59162a6d5b2 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInsight;
+import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase;
@@ -57,6 +58,13 @@ public class JavaTypingTest extends LightPlatformCodeInsightFixtureTestCase {
doTest('"');
}
+ public void testColumnMode() {
+ myFixture.configureByFile(getTestName(true) + "_before.java");
+ ((EditorEx)myFixture.getEditor()).setColumnMode(true);
+ myFixture.type('(');
+ myFixture.checkResultByFile(getTestName(true) + "_after.java");
+ }
+
private void doTest(char c) {
myFixture.configureByFile(getTestName(true) + "_before.java");
myFixture.type(c);
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy
index 8a54c9594144..7391f93a1ab2 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy
@@ -42,6 +42,7 @@ import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.EditorFactory
import com.intellij.openapi.editor.LogicalPosition
import com.intellij.openapi.editor.actionSystem.EditorActionManager
+import com.intellij.openapi.editor.ex.EditorEx
import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.extensions.LoadingOrder
import com.intellij.openapi.fileEditor.FileEditor
@@ -1642,4 +1643,14 @@ class Foo {
assert lookup
assert myFixture.lookupElementStrings == ['goo']
}
+
+ public void "test in column selection mode"() {
+ myFixture.configureByText "a.java", """
+class Foo {{
+ <caret>
+}}"""
+ edt { ((EditorEx)myFixture.editor).setColumnMode(true) }
+ type 'toStr'
+ assert lookup
+ }
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy
index 79a94aaa8148..77b4c0cc64a7 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy
@@ -768,6 +768,8 @@ public class ListUtils {
assertStringItems("fofoo", "fofoo");
}
+ public void testMethodMergingMinimalTail() { doTest() }
+
public void testAnnotationQualifiedName() throws Throwable {
doTest();
}
@@ -920,6 +922,9 @@ public class ListUtils {
}
public void testSmartEnterWrapsConstructorCall() throws Throwable { doTest(Lookup.COMPLETE_STATEMENT_SELECT_CHAR as String) }
+ public void testSmartEnterNoNewLine() { doTest(Lookup.COMPLETE_STATEMENT_SELECT_CHAR as String) }
+ public void testSmartEnterWithNewLine() { doTest(Lookup.COMPLETE_STATEMENT_SELECT_CHAR as String) }
+
public void testTabReplacesMethodNameWithLocalVariableName() throws Throwable { doTest('\t'); }
public void testMethodParameterAnnotationClass() throws Throwable { doTest(); }
public void testPrimitiveCastOverwrite() throws Throwable { doTest '\t' }
@@ -1469,6 +1474,11 @@ class Bar {
doTest()
}
+ public void testUnimportedStaticInnerClass() {
+ myFixture.addClass("package foo; public class Super { public static class Inner {} }");
+ doTest()
+ }
+
public void testNoJavaLangPackagesInImport() { doAntiTest() }
public void testNoStaticDuplicatesFromExpectedMemberFactories() {
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy
index b19da5ac6f67..1d258fe01367 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy
@@ -52,12 +52,12 @@ public class SmartTypeCompletionOrderingTest extends CompletionSortingTestCase {
public void testNewListAlwaysFirst() {
def lookup = invokeCompletion(getTestName(false) + ".java")
- assertPreferredItems 1, 'List', 'AbstractList', 'AbstractSequentialList', 'ArrayList'
+ assertPreferredItems 1, 'List', 'ArrayList', 'AbstractList', 'AbstractSequentialList'
for (int i = 0; i < StatisticsManager.OBLIVION_THRESHOLD + 10; i++) {
- imitateItemSelection(lookup, 3) //ArrayList
+ imitateItemSelection(lookup, 3) //AbstractSequentialList
}
refreshSorting(lookup)
- assertPreferredItems 1, 'List', 'ArrayList', 'AbstractList', 'AbstractSequentialList'
+ assertPreferredItems 1, 'List', 'AbstractSequentialList', 'ArrayList', 'AbstractList'
}
public void testNoStatsOnUnsuccessfulAttempt() {
@@ -170,11 +170,11 @@ public class SmartTypeCompletionOrderingTest extends CompletionSortingTestCase {
public void testStatisticsAffectsNonPreferableExpectedItems() throws Throwable {
final LookupImpl lookup = invokeCompletion(getTestName(false) + ".java");
- assertPreferredItems(1, "List", "AbstractList", "AbstractSequentialList", "ArrayList");
+ assertPreferredItems(1, "List", "ArrayList", "AbstractList", "AbstractSequentialList");
incUseCount(lookup, 0);
- assertPreferredItems(1, "List", "AbstractList", "AbstractSequentialList", "ArrayList");
+ assertPreferredItems(1, "List", "ArrayList", "AbstractList", "AbstractSequentialList");
incUseCount(lookup, 0);
- assertPreferredItems(0, "List", "AbstractList", "AbstractSequentialList", "ArrayList");
+ assertPreferredItems(0, "List", "ArrayList", "AbstractList", "AbstractSequentialList");
}
public void testPreferNonRecursiveMethodParams() throws Throwable {
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java
index ed2b792fc5a9..d2e8825cc16d 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java
@@ -1029,6 +1029,19 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase {
assertStringItems("Bar", "Goo");
}
+ public void testAutoImportExpectedType() throws Throwable {
+ boolean old = CodeInsightSettings.getInstance().ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY;
+ CodeInsightSettings.getInstance().ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY = true;
+ try {
+ configureByTestName();
+ performAction();
+ myFixture.assertPreferredCompletionItems(1, "List", "ArrayList", "AbstractList");
+ }
+ finally {
+ CodeInsightSettings.getInstance().ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY = old;
+ }
+ }
+
public void testNoWrongSubstitutorFromStats() throws Throwable {
doTest();
FileDocumentManager.getInstance().saveDocument(myFixture.getEditor().getDocument());
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java
index a3b60429e297..d6831d4a2d4a 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java
@@ -34,7 +34,6 @@ import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiElement;
import com.intellij.testFramework.IdeaTestUtil;
import org.jdom.Element;
-import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.List;
@@ -44,7 +43,7 @@ import java.util.List;
* For "heavyweight" tests use AdvHighlightingTest
*/
public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase {
- @NonNls static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/advHighlighting7";
+ private static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/advHighlighting7";
private void doTest(boolean checkWarnings, boolean checkInfos, Class<?>... classes) {
setLanguageLevel(LanguageLevel.JDK_1_7);
@@ -102,12 +101,9 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase {
public void testHighlightInaccessibleFromClassModifierList() { doTest(false, false); }
public void testInnerInTypeArguments() { doTest(false, false); }
public void testRawSubstitutor() { doTest(false, false); }
+ public void testIncompleteDiamonds() { doTest(false, false); }
- public void testIncompleteDiamonds() throws Exception {
- doTest(false, false);
- }
-
- public void testDynamicallyAddIgnoredAnnotations() throws Exception {
+ public void testDynamicallyAddIgnoredAnnotations() {
ExtensionPoint<EntryPoint> point = Extensions.getRootArea().getExtensionPoint(ToolExtensionPoints.DEAD_CODE_TOOL);
EntryPoint extension = new EntryPoint() {
@NotNull @Override public String getDisplayName() { return "duh"; }
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java
index 7a73bfed6cbd..9bb7d4801944 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java
@@ -111,6 +111,10 @@ public class MostSpecificResolutionTest extends LightDaemonAnalyzerTestCase {
doTest();
}
+ public void testIDEA127584() throws Exception {
+ doTest();
+ }
+
private void doTest() {
doTest(true);
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java
index 6bd7654b72af..ea9ada93ca77 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,214 +31,64 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase {
@Override
protected LocalInspectionTool[] configureLocalInspectionTools() {
return new LocalInspectionTool[]{
- new UnusedSymbolLocalInspection(),
+ new UnusedSymbolLocalInspection()
};
}
- public void testIDEA93586() throws Exception {
- doTest();
- }
-
- public void testIDEA113573() throws Exception {
- doTest();
- }
-
- public void testIDEA112922() throws Exception {
- doTest();
- }
-
- public void testIDEA113504() throws Exception {
- doTest();
- }
-
- public void testAfterAbstractPipeline2() throws Exception {
- doTest();
- }
-
- public void testIDEA116252() throws Exception {
- doTest();
- }
-
- public void testIDEA106670() throws Exception {
- doTest();
- }
-
- public void testIDEA116548() throws Exception {
- doTest();
- }
-
- public void testOverloadResolutionSAM() throws Exception {
- doTest();
- }
-
- public void testIntersectionTypesDuringInference() throws Exception {
- doTest();
- }
-
- public void testIncludeConstraintsWhenParentMethodIsDuringCalculation() throws Exception {
- doTest();
- }
-
- public void testUseCalculatedSubstitutor() throws Exception {
- doTest();
- }
-
- public void testArgumentOfAnonymousClass() throws Exception {
- doTest();
- }
-
- public void testEllipsis() throws Exception {
- doTest();
- }
-
- public void testOuterMethodPropagation() throws Exception {
- doTest();
- }
-
- public void testRecursiveCalls() throws Exception {
- doTest();
- }
-
- public void testGroundTargetTypeForImplicitLambdas() throws Exception {
- doTest();
- }
-
- public void testAdditionalConstraintsReduceOrder() throws Exception {
- doTest();
- }
-
- public void testAdditionalConstraintSubstitution() throws Exception {
- doTest();
- }
- public void testFunctionalInterfacesCalculation() throws Exception {
- doTest();
- }
-
- public void testMissedSiteSubstitutorDuringDeepAdditionalConstraintsGathering() throws Exception {
- doTest();
- }
-
- public void testIDEA120992() throws Exception {
- doTest();
- }
-
- public void testTargetTypeConflictResolverShouldNotTryToEvaluateCurrentArgumentType() throws Exception {
- doTest();
- }
-
- public void testIDEA119535() throws Exception {
- doTest();
- }
-
- public void testIDEA119003() throws Exception {
- doTest();
- }
-
- public void testIDEA117124() throws Exception {
- doTest();
- }
-
- public void testWildcardParameterization() throws Exception {
- doTest();
- }
-
- public void testDiamondInLambdaReturn() throws Exception {
- doTest();
- }
-
- public void testIDEA118965() throws Exception {
- doTest();
- }
-
- public void testIDEA121315() throws Exception {
- doTest();
- }
-
- public void testIDEA118965comment() throws Exception {
- doTest();
- }
-
- public void testIDEA122074() throws Exception {
- doTest();
- }
-
- public void testIDEA122084() throws Exception {
- doTest();
- }
-
- public void testAdditionalConstraintDependsOnNonMentionedVars() throws Exception {
- doTest();
- }
-
- public void testIDEA122616() throws Exception {
- doTest();
- }
-
- public void testIDEA122700() throws Exception {
- doTest();
- }
-
- public void testIDEA122406() throws Exception {
- doTest();
- }
-
- public void testNestedCallsInsideLambdaReturnExpression() throws Exception {
- doTest();
- }
-
- public void testIDEA123731() throws Exception {
- doTest();
- }
-
- public void testIDEA123869() throws Exception {
- doTest();
- }
-
- public void testIDEA123848() throws Exception {
- doTest();
- }
-
- public void testOnlyLambdaAtTypeParameterPlace() throws Exception {
- doTest();
- }
-
- public void testLiftedIntersectionType() throws Exception {
- doTest();
- }
-
- public void testInferenceFromReturnStatements() throws Exception {
- doTest();
- }
-
- public void testDownUpThroughLambdaReturnStatements() throws Exception {
- doTest();
- }
-
- public void testIDEA124547() throws Exception {
- doTest();
- }
-
- public void testIDEA118362() throws Exception {
- doTest();
- }
-
- public void testIDEA126056() throws Exception {
- doTest();
- }
-
- public void testIDEA125254() throws Exception {
- doTest();
- }
-
- public void testIDEA124961() throws Exception {
- doTest();
- }
-
- public void testIDEA126109() throws Exception {
- doTest();
- }
-
- public void testIDEA126809() throws Exception {
+ public void testIDEA93586() { doTest(); }
+ public void testIDEA113573() { doTest(); }
+ public void testIDEA112922() { doTest(); }
+ public void testIDEA113504() { doTest(); }
+ public void testAfterAbstractPipeline2() { doTest(); }
+ public void testIDEA116252() { doTest(); }
+ public void testIDEA106670() { doTest(); }
+ public void testIDEA116548() { doTest(); }
+ public void testOverloadResolutionSAM() { doTest(); }
+ public void testIntersectionTypesDuringInference() { doTest(); }
+ public void testIncludeConstraintsWhenParentMethodIsDuringCalculation() { doTest(); }
+ public void testUseCalculatedSubstitutor() { doTest(); }
+ public void testArgumentOfAnonymousClass() { doTest(); }
+ public void testEllipsis() { doTest(); }
+ public void testOuterMethodPropagation() { doTest(); }
+ public void testRecursiveCalls() { doTest(); }
+ public void testGroundTargetTypeForImplicitLambdas() { doTest(); }
+ public void testAdditionalConstraintsReduceOrder() { doTest(); }
+ public void testAdditionalConstraintSubstitution() { doTest(); }
+ public void testFunctionalInterfacesCalculation() { doTest(); }
+ public void testMissedSiteSubstitutorDuringDeepAdditionalConstraintsGathering() { doTest(); }
+ public void testIDEA120992() { doTest(); }
+ public void testTargetTypeConflictResolverShouldNotTryToEvaluateCurrentArgumentType() { doTest(); }
+ public void testIDEA119535() { doTest(); }
+ public void testIDEA119003() { doTest(); }
+ public void testIDEA117124() { doTest(); }
+ public void testWildcardParameterization() { doTest(); }
+ public void testDiamondInLambdaReturn() { doTest(); }
+ public void testIDEA118965() { doTest(); }
+ public void testIDEA121315() { doTest(); }
+ public void testIDEA118965comment() { doTest(); }
+ public void testIDEA122074() { doTest(); }
+ public void testIDEA122084() { doTest(); }
+ public void testAdditionalConstraintDependsOnNonMentionedVars() { doTest(); }
+ public void testIDEA122616() { doTest(); }
+ public void testIDEA122700() { doTest(); }
+ public void testIDEA122406() { doTest(); }
+ public void testNestedCallsInsideLambdaReturnExpression() { doTest(); }
+ public void testIDEA123731() { doTest(); }
+ public void testIDEA123869() { doTest(); }
+ public void testIDEA123848() { doTest(); }
+ public void testOnlyLambdaAtTypeParameterPlace() { doTest(); }
+ public void testLiftedIntersectionType() { doTest(); }
+ public void testInferenceFromReturnStatements() { doTest(); }
+ public void testDownUpThroughLambdaReturnStatements() { doTest(); }
+ public void testIDEA124547() { doTest(); }
+ public void testIDEA118362() { doTest(); }
+ public void testIDEA126056() { doTest(); }
+ public void testIDEA125254() { doTest(); }
+ public void testIDEA124961() { doTest(); }
+ public void testIDEA126109() { doTest(); }
+ public void testIDEA126809() { doTest(); }
+
+ public void testIDEA127596() throws Exception {
doTest();
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java
index 6860bc0c88fa..dd7ceb566139 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java
@@ -273,6 +273,14 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase {
doTest();
}
+ public void testIDEA126969() throws Exception {
+ doTest();
+ }
+
+ public void testIDEA127506() throws Exception {
+ doTest();
+ }
+
private void doTest() {
doTest(false);
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateFieldFromUsageTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateFieldFromUsageTest.java
index fba0c7714bef..2c5c52141ea9 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateFieldFromUsageTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateFieldFromUsageTest.java
@@ -24,6 +24,7 @@ public class CreateFieldFromUsageTest extends LightQuickFixTestCase {
public void testInsideStaticInnerClass() throws Exception { doSingleTest(); }
public void testCreateFromEquals() throws Exception { doSingleTest(); }
public void testCreateFromEqualsToPrimitiveType() throws Exception { doSingleTest(); }
+ public void testInsideInterface() throws Exception { doSingleTest(); }
public void testWithAlignment() throws Exception {
final CommonCodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()).getCommonSettings(JavaLanguage.INSTANCE);
boolean old = settings.ALIGN_GROUP_FIELD_DECLARATIONS;
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RenameWrongReferenceTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RenameWrongReferenceTest.java
index ae2c847128b3..7b19bbd5cd27 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RenameWrongReferenceTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RenameWrongReferenceTest.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package com.intellij.codeInsight.daemon.quickFix;
public class RenameWrongReferenceTest extends LightQuickFixAvailabilityTestCase {
@@ -9,4 +24,3 @@ public class RenameWrongReferenceTest extends LightQuickFixAvailabilityTestCase
return "/codeInsight/daemonCodeAnalyzer/quickFix/renameWrongReference";
}
}
-
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy
index 2047f13b795d..5d823e001f82 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy
@@ -608,7 +608,7 @@ class Test {
configure(testNow, shouldIgnoreRoots(), fourteen, pi, title, c, file);
}
- pubic void configure(boolean testNow, boolean shouldIgnoreRoots, int times, float pi, String title, char terminate, File file) {
+ pubic void configure(boolean testNow, boolean shouldIgnoreRoots, int times, float pii, String title, char terminate, File file) {
System.out.println();
System.out.println();
}
@@ -672,7 +672,7 @@ public class VarArgTest {
assert regions[1].placeholderText == "test: 13"
}
- public void "test inline if argument length is one (EA-57555)"() {
+ public void "test do not inline if parameter length is one or two"() {
def text = """
public class CharSymbol {
@@ -681,7 +681,7 @@ public class CharSymbol {
count(1, false);
}
- public void count(int test, boolean fast) {
+ public void count(int t, boolean fa) {
int temp = test;
boolean isFast = fast;
}
@@ -689,13 +689,78 @@ public class CharSymbol {
"""
configure text
def regions = myFixture.editor.foldingModel.allFoldRegions.sort { it.startOffset }
+ assert regions.size() == 2
+ }
+
+ public void "test do not inline known subsequent parameter names"() {
+ def text = """
+public class Test {
+ public void main() {
+ test1(1, 2);
+ test2(1, 2);
+ test3(1, 2);
+ doTest("first", "second");
+ }
+
+ public void test1(int first, int second) {
+ int start = first;
+ int end = second;
+ }
+
+ public void test2(int key, int value) {
+ int start = key;
+ int end = value;
+ }
+
+ public void test3(int key, int value) {
+ int start = key;
+ int end = value;
+ }
+}
+"""
+ configure text
+ def regions = myFixture.editor.foldingModel.allFoldRegions
assert regions.size() == 4
+ }
- checkRangeOffsetByPositionInText(regions[1], text, "1")
- assert regions[1].placeholderText == "test: 1"
+ public void "test do not inline paired ranged names"() {
+ def text = """
+public class CharSymbol {
- checkRangeOffsetByPositionInText(regions[2], text, "false")
- assert regions[2].placeholderText == "fast: false"
+ public void main() {
+ String s = "AAA";
+ int last = 3;
+
+ substring1(1, last);
+ substring2(1, last);
+ substring3(1, last);
+ substring4(1, last);
+ }
+
+ public void substring1(int beginIndex, int endIndex) {
+ int start = beginIndex;
+ int end = endIndex;
+ }
+
+ public void substring2(int startIndex, int endIndex) {
+ int start = startIndex;
+ int end = endIndex;
+ }
+
+ public void substring3(int from, int to) {
+ int start = from;
+ int end = to;
+ }
+
+ public void substring4(int first, int last) {
+ int start = first;
+ int end = last;
+ }
+}
+"""
+ configure text
+ def regions = myFixture.editor.foldingModel.allFoldRegions.sort { it.startOffset }
+ assert regions.size() == 5
}
public void "test inline names if literal expression can be assigned to method parameter"() {
@@ -764,7 +829,7 @@ public class Test {
}
abstract class Checker {
- Checker(boolean applyToFirst, boolean applyToSecond) {}
+ Checker(boolean isActive, boolean requestFocus) {}
abstract void test();
}
}
@@ -773,8 +838,8 @@ public class Test {
def regions = myFixture.editor.foldingModel.allFoldRegions.sort { it.startOffset }
assert regions.length == 6
- assert regions[1].placeholderText == "applyToFirst: true"
- assert regions[2].placeholderText == "applyToSecond: false"
+ assert regions[1].placeholderText == "isActive: true"
+ assert regions[2].placeholderText == "requestFocus: false"
checkRangeOffsetByPositionInText(regions[1], text, "true")
checkRangeOffsetByPositionInText(regions[2], text, "false")
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddImportActionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddImportActionTest.groovy
index ead75a2936e2..4b169fcc9249 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddImportActionTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddImportActionTest.groovy
@@ -177,6 +177,66 @@ class Test {
'''
}
+ public void "test import class in class reference expression"() {
+ myFixture.configureByText 'a.java', '''
+class Test {
+ {
+ equals(Co<caret>llection.class);
+ }
+}
+'''
+ importClass();
+ myFixture.checkResult '''import java.util.Collection;
+
+class Test {
+ {
+ equals(Co<caret>llection.class);
+ }
+}
+'''
+ }
+
+ public void "test import class in qualifier expression"() {
+ myFixture.configureByText 'a.java', '''
+class Test {
+ {
+ equals(Co<caret>llections.emptySet());
+ }
+}
+'''
+ importClass();
+ myFixture.checkResult '''import java.util.Collections;
+
+class Test {
+ {
+ equals(Co<caret>llections.emptySet());
+ }
+}
+'''
+ }
+
+ public void "test don't import class in method call argument"() {
+ myFixture.configureByText 'a.java', '''
+class Test {
+ {
+ equals(Co<caret>llection);
+ }
+}
+'''
+ assert !myFixture.filterAvailableIntentions("Import Class")
+ }
+
+ public void "test don't import class in assignment"() {
+ myFixture.configureByText 'a.java', '''
+class Test {
+ {
+ Co<caret>llection = 2;
+ }
+}
+'''
+ assert !myFixture.filterAvailableIntentions("Import Class")
+ }
+
private def importClass() {
myFixture.launchAction(myFixture.findSingleIntention("Import Class"))
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java
index 454bb7f97a58..8bac921916d3 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java
@@ -80,6 +80,10 @@ public class JavaDocInfoGeneratorTest extends CodeInsightTestCase {
doTestField();
}
+ public void testAnnotationsInParams() throws Exception {
+ doTestMethod();
+ }
+
public void testLiteral() throws Exception {
doTestField();
}
@@ -88,6 +92,10 @@ public class JavaDocInfoGeneratorTest extends CodeInsightTestCase {
doTestField();
}
+ public void testPInsidePre() throws Exception {
+ doTestField();
+ }
+
public void testEnumConstantOrdinal() throws Exception {
PsiClass psiClass = getTestClass();
PsiField field = psiClass.getFields() [0];
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy
index 3acb9845df66..d866ddd783cf 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy
@@ -797,4 +797,30 @@ class Foo {
}
"""
}
+
+ public void "test two static imports"() {
+ myFixture.configureByText "a.java", """
+
+class Foo {
+ {
+ <caret>
+ }
+}
+"""
+ final TemplateManager manager = TemplateManager.getInstance(getProject());
+ final Template template = manager.createTemplate("xxx", "user", 'java.lang.Math.abs(java.lang.Math.PI);');
+ template.setValue(USE_STATIC_IMPORT_IF_POSSIBLE, true);
+
+ startTemplate(template);
+ myFixture.checkResult """\
+import static java.lang.Math.PI;
+import static java.lang.Math.abs;
+
+class Foo {
+ {
+ abs(PI);<caret>
+ }
+}
+"""
+ }
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/CastPostfixTemplateTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/CastPostfixTemplateTest.java
index d5cae6ab30cf..9a50a6b353c5 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/CastPostfixTemplateTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/CastPostfixTemplateTest.java
@@ -43,4 +43,7 @@ public class CastPostfixTemplateTest extends PostfixTemplateTestCase {
public void testChainCall() {
doTest();
}
+ public void testTernary() {
+ doTest();
+ }
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/ContractInferenceFromSourceTest.groovy b/java/java-tests/testSrc/com/intellij/codeInspection/ContractInferenceFromSourceTest.groovy
index 32982f3687df..23eac589e2db 100644
--- a/java/java-tests/testSrc/com/intellij/codeInspection/ContractInferenceFromSourceTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/ContractInferenceFromSourceTest.groovy
@@ -220,12 +220,74 @@ class ContractInferenceFromSourceTest extends LightCodeInsightFixtureTestCase {
assert c == ['_ -> true']
}
+ public void "test boolean autoboxing"() {
+ def c = inferContracts("""
+ static Object test1(Object o1) {
+ return o1 == null;
+ }""")
+ assert c == []
+ }
+
+ public void "test non-returning delegation"() {
+ def c = inferContracts("""
+ static void test2(Object o) {
+ assertNotNull(o);
+ }
+
+ static boolean assertNotNull(Object o) {
+ if (o == null) {
+ throw new NullPointerException();
+ }
+ return true;
+ }
+ """)
+ assert c == ['null -> fail']
+ }
+
+ public void "test instanceof notnull"() {
+ def c = inferContracts("""
+ public boolean test2(Object o) {
+ if (o != null) {
+ return o instanceof String;
+ } else {
+ return test1(o);
+ }
+ }
+ static boolean test1(Object o1) {
+ return o1 == null;
+ }
+ """)
+ assert c == []
+ }
+
+ public void "test no duplicates in delegation"() {
+ def c = inferContracts("""
+ static boolean test2(Object o1, Object o2) {
+ return test1(o1, o1);
+ }
+ static boolean test1(Object o1, Object o2) {
+ return o1 != null && o2 != null;
+ }
+ """)
+ assert c == ['null, _ -> false', '!null, _ -> true']
+ }
+
+ public void "test take explicit parameter notnull into account"() {
+ def c = inferContracts("""
+ final Object foo(@org.jetbrains.annotations.NotNull Object bar) {
+ if (!(bar instanceof CharSequence)) return null;
+ return new String("abc");
+ }
+ """)
+ assert c == []
+ }
+
private String inferContract(String method) {
return assertOneElement(inferContracts(method))
}
private List<String> inferContracts(String method) {
- def clazz = myFixture.addClass("class Foo { $method }")
+ def clazz = myFixture.addClass("final class Foo { $method }")
return ContractInference.inferContracts(clazz.methods[0]).collect { it as String }
}
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java
index 833b5196d74a..4cba2ab918a7 100644
--- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java
@@ -139,6 +139,12 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase {
myFixture.checkResultByFile(getTestName(false) + "_after.java");
}
+ public void testReportConstantReferences_OverloadedCall() {
+ doTestReportConstantReferences();
+ myFixture.launchAction(myFixture.findSingleIntention("Replace with 'null'"));
+ myFixture.checkResultByFile(getTestName(false) + "_after.java");
+ }
+
public void testReportConstantReferencesAfterFinalFieldAccess() { doTestReportConstantReferences(); }
private void doTestReportConstantReferences() {
@@ -148,28 +154,6 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase {
myFixture.testHighlighting(true, false, true, getTestName(false) + ".java");
}
- public void _testReportConstantReferences_ReplaceWithString() {
- doTestReportConstantReferences();
- myFixture.launchAction(myFixture.findSingleIntention("Replace with 'CONST'"));
- myFixture.checkResultByFile(getTestName(false) + "_after.java");
- }
- public void _testReportConstantReferences_ReplaceWithIntConstant() {
- doTestReportConstantReferences();
- myFixture.launchAction(myFixture.findSingleIntention("Replace with 'CONST'"));
- myFixture.checkResultByFile(getTestName(false) + "_after.java");
- }
- public void _testReportConstantReferences_ReplaceWithEnum() {
- myFixture.addClass("package foo; public enum MyEnum { FOO }");
- doTestReportConstantReferences();
- myFixture.launchAction(myFixture.findSingleIntention("Replace with 'FOO'"));
- myFixture.checkResultByFile(getTestName(false) + "_after.java");
- }
- public void _testReportConstantReferences_NotInComplexAssignment() {
- doTestReportConstantReferences();
- assertEmpty(myFixture.filterAvailableIntentions("Replace with"));
- }
- public void _testReportConstantReferences_Switch() { doTestReportConstantReferences(); }
-
public void testCheckFieldInitializers() {
doTest();
}
@@ -190,6 +174,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase {
public void testTransientFinalField() { doTest(); }
public void testFinalFieldDuringInitialization() { doTest(); }
+ public void testFinalFieldDuringSuperInitialization() { doTest(); }
public void _testSymmetricUncheckedCast() { doTest(); } // http://youtrack.jetbrains.com/issue/IDEABKL-6871
public void testNullCheckDoesntAffectUncheckedCast() { doTest(); }
public void testThrowNull() { doTest(); }
@@ -265,6 +250,13 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase {
public void testSameComparisonTwice() { doTest(); }
public void testRootThrowableCause() { doTest(); }
+ public void testUseInferredContracts() { doTest(); }
+ public void testContractInferenceBewareOverriding() { doTest(); }
+
+ public void testNumberComparisonsWhenValueIsKnown() { doTest(); }
+
+ public void testAccessingSameArrayElements() { doTest(); }
+
public void testParametersAreNonnullByDefault() {
myFixture.addClass("package javax.annotation; public @interface ParametersAreNonnullByDefault {}");
myFixture.addClass("package javax.annotation; public @interface ParametersAreNullableByDefault {}");
@@ -280,6 +272,29 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase {
myFixture.launchAction(myFixture.findSingleIntention("Remove redundant assignment"));
myFixture.checkResultByFile(getTestName(false) + "_after.java");
}
-
+
+ public void testAssertThat() {
+ myFixture.addClass("package org.hamcrest; public class CoreMatchers { " +
+ "public static <T> Matcher<T> notNullValue() {}\n" +
+ "public static <T> Matcher<T> not(Matcher<T> matcher) {}\n" +
+ "public static <T> Matcher<T> equalTo(T operand) {}\n" +
+ "}");
+ myFixture.addClass("package org.hamcrest; public interface Matcher<T> {}");
+ myFixture.addClass("package org.junit; public class Assert { " +
+ "public static <T> void assertThat(T actual, org.hamcrest.Matcher<? super T> matcher) {}\n" +
+ "public static <T> void assertThat(String msg, T actual, org.hamcrest.Matcher<? super T> matcher) {}\n" +
+ "}");
+ myFixture.enableInspections(new DataFlowInspection());
+ myFixture.testHighlighting(true, false, true, getTestName(false) + ".java");
+ }
+
+ public void testGuavaCheckNotNull() {
+ myFixture.addClass("package com.google.common.base; public class Preconditions { " +
+ "public static <T> T checkNotNull(T reference) {}\n" +
+ "}");
+ myFixture.enableInspections(new DataFlowInspection());
+ myFixture.testHighlighting(true, false, true, getTestName(false) + ".java");
+ }
+
public void _testNullCheckBeforeInstanceof() { doTest(); } // http://youtrack.jetbrains.com/issue/IDEA-113220
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java
index 843dcbbb8bfe..e925dd49a8ea 100644
--- a/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java
@@ -30,6 +30,8 @@ public class NullableStuffInspectionTest extends LightCodeInsightFixtureTestCase
public void testProblems2() throws Exception{ doTest(); }
public void testNullableFieldNotnullParam() throws Exception{ doTest(); }
public void testNotNullFieldNullableParam() throws Exception{ doTest(); }
+ public void testNotNullCustomException() throws Exception{ doTest(); }
+ public void testNotNullFieldNotInitialized() throws Exception{ doTest(); }
public void testGetterSetterProblems() throws Exception{ doTest(); }
public void testOverriddenMethods() throws Exception{
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java
new file mode 100644
index 000000000000..516b140cc0b1
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import com.intellij.codeInsight.AnnotationUtil;
+import com.intellij.codeInsight.ExternalAnnotationsManager;
+import com.intellij.codeInsight.InferredAnnotationsManager;
+import com.intellij.openapi.application.ex.PathManagerEx;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.projectRoots.SdkModificator;
+import com.intellij.openapi.roots.AnnotationOrderRootType;
+import com.intellij.openapi.roots.ModifiableRootModel;
+import com.intellij.openapi.roots.ModuleRootModificationUtil;
+import com.intellij.openapi.roots.libraries.Library;
+import com.intellij.openapi.roots.libraries.LibraryTable;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VfsUtilCore;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.vfs.VirtualFileVisitor;
+import com.intellij.psi.*;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.util.PsiFormatUtil;
+import com.intellij.testFramework.PsiTestUtil;
+import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
+import com.intellij.util.AsynchConsumer;
+import org.jetbrains.annotations.Contract;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author lambdamix
+ */
+public class BytecodeAnalysisIntegrationTest extends JavaCodeInsightFixtureTestCase {
+ public static final String ORG_JETBRAINS_ANNOTATIONS_CONTRACT = Contract.class.getName();
+
+ private InferredAnnotationsManager myInferredAnnotationsManager;
+ private ExternalAnnotationsManager myExternalAnnotationsManager;
+
+ private List<String> diffs = new ArrayList<String>();
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ setUpLibraries();
+ setUpExternalUpAnnotations();
+
+ myInferredAnnotationsManager = InferredAnnotationsManager.getInstance(myModule.getProject());
+ myExternalAnnotationsManager = ExternalAnnotationsManager.getInstance(myModule.getProject());
+ }
+
+ private void setUpLibraries() {
+ VirtualFile lib = LocalFileSystem.getInstance().refreshAndFindFileByPath(PathManagerEx.getTestDataPath() + "/../../../lib");
+ assertNotNull(lib);
+ PsiTestUtil.addLibrary(myModule, "velocity", lib.getPath(), new String[]{"/velocity.jar!/"}, new String[]{});
+ }
+
+ private void setUpExternalUpAnnotations() {
+ String annotationsPath = PathManagerEx.getTestDataPath() + "/codeInspection/bytecodeAnalysis/annotations";
+ final VirtualFile annotationsDir = LocalFileSystem.getInstance().refreshAndFindFileByPath(annotationsPath);
+ assertNotNull(annotationsDir);
+
+ ModuleRootModificationUtil.updateModel(myModule, new AsynchConsumer<ModifiableRootModel>() {
+ @Override
+ public void finished() {
+ }
+
+ @Override
+ public void consume(ModifiableRootModel modifiableRootModel) {
+ final LibraryTable libraryTable = modifiableRootModel.getModuleLibraryTable();
+ Library[] libs = libraryTable.getLibraries();
+ for (Library library : libs) {
+ final Library.ModifiableModel libraryModel = library.getModifiableModel();
+ libraryModel.addRoot(annotationsDir, AnnotationOrderRootType.getInstance());
+ libraryModel.commit();
+ }
+ Sdk sdk = modifiableRootModel.getSdk();
+ if (sdk != null) {
+ SdkModificator sdkModificator = sdk.getSdkModificator();
+ sdkModificator.addRoot(annotationsDir, AnnotationOrderRootType.getInstance());
+ sdkModificator.commitChanges();
+ }
+ }
+ });
+
+ VfsUtilCore.visitChildrenRecursively(annotationsDir, new VirtualFileVisitor() { });
+ annotationsDir.refresh(false, true);
+ }
+
+ public void testSdkAndLibAnnotations() {
+
+ final PsiPackage rootPackage = JavaPsiFacade.getInstance(getProject()).findPackage("");
+ assert rootPackage != null;
+
+ final GlobalSearchScope scope = GlobalSearchScope.allScope(getProject());
+ JavaRecursiveElementVisitor visitor = new JavaRecursiveElementVisitor() {
+ @Override
+ public void visitPackage(PsiPackage aPackage) {
+ for (PsiPackage subPackage : aPackage.getSubPackages(scope)) {
+ visitPackage(subPackage);
+ }
+ for (PsiClass aClass : aPackage.getClasses(scope)) {
+ for (PsiMethod method : aClass.getMethods()) {
+ checkMethodAnnotations(method);
+ }
+ }
+ }
+ };
+
+ rootPackage.accept(visitor);
+ assertEmpty(diffs);
+ }
+
+ private void checkMethodAnnotations(PsiMethod method) {
+ try {
+ if (ProjectBytecodeAnalysis.getKey(method) == -1) {
+ return;
+ }
+ }
+ catch (IOException e) {
+ fail();
+ }
+
+ // not null-result
+ String externalOutAnnotation =
+ myExternalAnnotationsManager.findExternalAnnotation(method, AnnotationUtil.NOT_NULL) == null ? "null" : "@NotNull";
+ String inferredOutAnnotation =
+ myInferredAnnotationsManager.findInferredAnnotation(method, AnnotationUtil.NOT_NULL) == null ? "null" : "@NotNull";
+ String methodKey = PsiFormatUtil.getExternalName(method, false, Integer.MAX_VALUE);
+
+ if (!externalOutAnnotation.equals(inferredOutAnnotation)) {
+ diffs.add(methodKey + ": " + externalOutAnnotation + " != " + inferredOutAnnotation);
+ }
+
+ for (PsiParameter parameter : method.getParameterList().getParameters()) {
+ String parameterKey = PsiFormatUtil.getExternalName(parameter, false, Integer.MAX_VALUE);
+ String externalParameterAnnotation =
+ myExternalAnnotationsManager.findExternalAnnotation(parameter, AnnotationUtil.NOT_NULL) == null ? "null" : "@NotNull";
+ String inferredParameterAnnotation =
+ myInferredAnnotationsManager.findInferredAnnotation(parameter, AnnotationUtil.NOT_NULL) == null ? "null" : "@NotNull";
+ if (!externalParameterAnnotation.equals(inferredParameterAnnotation)) {
+ diffs.add(parameterKey + ": " + externalParameterAnnotation + " != " + inferredParameterAnnotation);
+ }
+ }
+
+ PsiAnnotation externalContractAnnotation =
+ myExternalAnnotationsManager.findExternalAnnotation(method, ORG_JETBRAINS_ANNOTATIONS_CONTRACT);
+ PsiAnnotation inferredContractAnnotation =
+ myInferredAnnotationsManager.findInferredAnnotation(method, ORG_JETBRAINS_ANNOTATIONS_CONTRACT);
+
+ String externalContractAnnotationString =
+ externalContractAnnotation == null ? "null" : "@Contract(" + AnnotationUtil.getStringAttributeValue(externalContractAnnotation, null) + ")";
+ String inferredContractAnnotationString =
+ inferredContractAnnotation == null ? "null" : "@Contract(" + AnnotationUtil.getStringAttributeValue(inferredContractAnnotation, null) + ")";
+
+ if (!externalContractAnnotationString.equals(inferredContractAnnotationString)) {
+ diffs.add(methodKey + ": " + externalContractAnnotationString + " != " + inferredContractAnnotationString);
+ }
+
+ }
+
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisResultsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisResultsHighlightingTest.java
new file mode 100644
index 000000000000..dc67871e6283
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisResultsHighlightingTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import com.intellij.JavaTestUtil;
+import com.intellij.codeInspection.dataFlow.DataFlowInspection;
+import com.intellij.openapi.application.ex.PathManagerEx;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.testFramework.LightProjectDescriptor;
+import com.intellij.testFramework.PsiTestUtil;
+import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author lambdamix
+ */
+public class BytecodeAnalysisResultsHighlightingTest extends LightCodeInsightFixtureTestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ setUpLibraries();
+ }
+
+ @NotNull
+ @Override
+ protected LightProjectDescriptor getProjectDescriptor() {
+ return JAVA_1_7;
+ }
+
+ @Override
+ protected String getTestDataPath() {
+ return JavaTestUtil.getJavaTestDataPath() + "/codeInspection/bytecodeAnalysis/src/";
+ }
+
+ private void doTest() {
+ final DataFlowInspection inspection = new DataFlowInspection();
+ inspection.SUGGEST_NULLABLE_ANNOTATIONS = true;
+ inspection.REPORT_CONSTANT_REFERENCE_VALUES = false;
+ myFixture.enableInspections(inspection);
+ myFixture.testHighlighting(true, false, true, getTestName(false) + ".java");
+ }
+
+ public void testExample() {
+ doTest();
+ }
+
+ private void setUpLibraries() {
+ VirtualFile lib = LocalFileSystem.getInstance().refreshAndFindFileByPath(PathManagerEx.getTestDataPath() + "/../../../lib");
+ assertNotNull(lib);
+ PsiTestUtil.addLibrary(myModule, "velocity", lib.getPath(), new String[]{"/velocity.jar!/"}, new String[]{});
+ }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisTest.java
new file mode 100644
index 000000000000..09fa87fa95e9
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisTest.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import com.intellij.codeInsight.AnnotationUtil;
+import com.intellij.codeInsight.InferredAnnotationsManager;
+import com.intellij.codeInspection.bytecodeAnalysis.data.*;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.*;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.testFramework.PsiTestUtil;
+import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
+import com.intellij.util.ArrayUtil;
+import org.jetbrains.annotations.Contract;
+import org.jetbrains.org.objectweb.asm.*;
+import org.jetbrains.org.objectweb.asm.tree.MethodNode;
+import org.jetbrains.org.objectweb.asm.tree.analysis.AnalyzerException;
+import org.junit.Assert;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+
+/**
+ * @author lambdamix
+ */
+public class BytecodeAnalysisTest extends JavaCodeInsightFixtureTestCase {
+ public static final String ORG_JETBRAINS_ANNOTATIONS_CONTRACT = Contract.class.getName();
+ private final String myClassesProjectRelativePath = "/classes/" + Test01.class.getPackage().getName().replace('.', '/');
+ private JavaPsiFacade myJavaPsiFacade;
+ private InferredAnnotationsManager myInferredAnnotationsManager;
+ private BytecodeAnalysisConverter myBytecodeAnalysisConverter;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ myJavaPsiFacade = JavaPsiFacade.getInstance(myModule.getProject());
+ myInferredAnnotationsManager = InferredAnnotationsManager.getInstance(myModule.getProject());
+ myBytecodeAnalysisConverter = BytecodeAnalysisConverter.getInstance();
+
+ setUpDataClasses();
+ }
+
+ public void testInference() throws IOException {
+ checkAnnotations(Test01.class);
+ checkAnnotations(Test02.class);
+ checkAnnotations(Test03.class);
+ }
+
+ public void testConverter() throws IOException {
+ checkCompoundIds(Test01.class);
+ checkCompoundIds(TestConverterData.class);
+ checkCompoundIds(TestConverterData.StaticNestedClass.class);
+ checkCompoundIds(TestConverterData.InnerClass.class);
+ checkCompoundIds(TestConverterData.GenericStaticNestedClass.class);
+ checkCompoundIds(TestAnnotation.class);
+ }
+
+ public void testLeakingParametersAnalysis() throws IOException {
+ checkLeakingParameters(LeakingParametersData.class);
+ }
+
+ private static void checkLeakingParameters(Class<?> jClass) throws IOException {
+ final HashMap<Method, boolean[]> map = new HashMap<Method, boolean[]>();
+
+ // collecting leakedParameters
+ final ClassReader classReader = new ClassReader(new FileInputStream(jClass.getResource("/" + jClass.getName().replace('.', '/') + ".class").getFile()));
+ classReader.accept(new ClassVisitor(Opcodes.ASM5) {
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ final MethodNode node = new MethodNode(Opcodes.ASM5, access, name, desc, signature, exceptions);
+ final Method method = new Method(classReader.getClassName(), name, desc);
+ return new MethodVisitor(Opcodes.ASM5, node) {
+ @Override
+ public void visitEnd() {
+ super.visitEnd();
+ try {
+ map.put(method, cfg.leakingParameters(classReader.getClassName(), node));
+ }
+ catch (AnalyzerException ignore) {}
+ }
+ };
+ }
+ }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
+
+ for (java.lang.reflect.Method jMethod : jClass.getDeclaredMethods()) {
+ Method method = new Method(Type.getType(jClass).getInternalName(), jMethod.getName(), Type.getMethodDescriptor(jMethod));
+ Annotation[][] annotations = jMethod.getParameterAnnotations();
+ for (int i = 0; i < annotations.length; i++) {
+ boolean isLeaking = false;
+ Annotation[] parameterAnnotations = annotations[i];
+ for (Annotation parameterAnnotation : parameterAnnotations) {
+ if (parameterAnnotation.annotationType() == ExpectLeaking.class) {
+ isLeaking = true;
+ }
+ }
+ assertEquals(method.toString() + " #" + i, isLeaking, map.get(method)[i]);
+ }
+ }
+ }
+
+ private void checkAnnotations(Class<?> javaClass) {
+ PsiClass psiClass = myJavaPsiFacade.findClass(javaClass.getName(), GlobalSearchScope.moduleWithLibrariesScope(myModule));
+ assertNotNull(psiClass);
+
+ for (java.lang.reflect.Method javaMethod : javaClass.getDeclaredMethods()) {
+ PsiMethod psiMethod = psiClass.findMethodsByName(javaMethod.getName(), false)[0];
+ Annotation[][] annotations = javaMethod.getParameterAnnotations();
+
+ // not-null parameters
+ params: for (int i = 0; i < annotations.length; i++) {
+ Annotation[] parameterAnnotations = annotations[i];
+ PsiParameter psiParameter = psiMethod.getParameterList().getParameters()[i];
+ PsiAnnotation inferredAnnotation = myInferredAnnotationsManager.findInferredAnnotation(psiParameter, AnnotationUtil.NOT_NULL);
+ for (Annotation parameterAnnotation : parameterAnnotations) {
+ if (parameterAnnotation.annotationType() == ExpectNotNull.class) {
+ assertNotNull(javaMethod.toString() + " " + i, inferredAnnotation);
+ continue params;
+ }
+ }
+ assertNull(javaMethod.toString() + " " + i, inferredAnnotation);
+ }
+
+ // not-null result
+ ExpectNotNull expectedAnnotation = javaMethod.getAnnotation(ExpectNotNull.class);
+ PsiAnnotation actualAnnotation = myInferredAnnotationsManager.findInferredAnnotation(psiMethod, AnnotationUtil.NOT_NULL);
+ assertEquals(javaMethod.toString(), expectedAnnotation == null, actualAnnotation == null);
+
+
+ // contracts
+ ExpectContract expectedContract = javaMethod.getAnnotation(ExpectContract.class);
+ PsiAnnotation actualContractAnnotation = myInferredAnnotationsManager.findInferredAnnotation(psiMethod, ORG_JETBRAINS_ANNOTATIONS_CONTRACT);
+
+ assertEquals(expectedContract == null, actualContractAnnotation == null);
+
+ if (expectedContract != null) {
+ String expectedContractValue = expectedContract.value();
+ String actualContractValue = AnnotationUtil.getStringAttributeValue(actualContractAnnotation, null);
+ assertEquals(javaMethod.toString(), expectedContractValue, actualContractValue);
+ }
+
+ }
+ }
+
+ private void checkCompoundIds(Class<?> javaClass) throws IOException {
+ String javaClassName = javaClass.getCanonicalName();
+ PsiClass psiClass = myJavaPsiFacade.findClass(javaClassName, GlobalSearchScope.moduleWithLibrariesScope(myModule));
+ assertNotNull(psiClass);
+
+ for (java.lang.reflect.Method javaMethod : javaClass.getDeclaredMethods()) {
+ Method method = new Method(Type.getType(javaClass).getInternalName(), javaMethod.getName(), Type.getMethodDescriptor(javaMethod));
+ boolean noKey = javaMethod.getAnnotation(ExpectNoPsiKey.class) != null;
+ PsiMethod psiMethod = psiClass.findMethodsByName(javaMethod.getName(), false)[0];
+ checkCompoundId(method, psiMethod, noKey);
+ }
+
+ for (Constructor<?> constructor : javaClass.getDeclaredConstructors()) {
+ Method method = new Method(Type.getType(javaClass).getInternalName(), "<init>", Type.getConstructorDescriptor(constructor));
+ boolean noKey = constructor.getAnnotation(ExpectNoPsiKey.class) != null;
+ PsiMethod[] constructors = psiClass.getConstructors();
+ PsiMethod psiMethod = constructors[0];
+ checkCompoundId(method, psiMethod, noKey);
+ }
+ }
+
+ private void checkCompoundId(Method method, PsiMethod psiMethod, boolean noKey) throws IOException {
+ Direction direction = new Out();
+ int psiKey = myBytecodeAnalysisConverter.mkPsiKey(psiMethod, direction);
+ if (noKey) {
+ assertTrue(-1 == psiKey);
+ return;
+ }
+ else {
+ assertFalse(-1 == psiKey);
+ }
+
+ int asmKey = myBytecodeAnalysisConverter.mkAsmKey(new Key(method, direction, true));
+
+ Assert.assertEquals(asmKey, psiKey);
+ }
+
+ private void setUpDataClasses() throws IOException {
+ File classesDir = new File(Test01.class.getResource("/" + Test01.class.getPackage().getName().replace('.', '/')).getFile());
+ File destDir = new File(myModule.getProject().getBaseDir().getPath() + myClassesProjectRelativePath);
+ FileUtil.copyDir(classesDir, destDir);
+ VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(destDir);
+ assertNotNull(vFile);
+ PsiTestUtil.addLibrary(myModule, "dataClasses", vFile.getPath(), new String[]{""}, ArrayUtil.EMPTY_STRING_ARRAY);
+ }
+
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectContract.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectContract.java
new file mode 100644
index 000000000000..9b78f742eb9c
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectContract.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author lambdamix
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface ExpectContract {
+ String value() default "";
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectLeaking.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectLeaking.java
new file mode 100644
index 000000000000..3c5ded3427ba
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectLeaking.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * @author lambdamix
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExpectLeaking {
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectNoPsiKey.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectNoPsiKey.java
new file mode 100644
index 000000000000..dde06c0f153b
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectNoPsiKey.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * @author lambdamix
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExpectNoPsiKey {
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectNotNull.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectNotNull.java
new file mode 100644
index 000000000000..39f1c6e7f363
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/ExpectNotNull.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * @author lambdamix
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExpectNotNull {
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/LeakingParametersData.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/LeakingParametersData.java
new file mode 100644
index 000000000000..ff5887ff2dbb
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/LeakingParametersData.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis.data;
+
+import com.intellij.codeInspection.bytecodeAnalysis.ExpectLeaking;
+
+/**
+ * @author lambdamix
+ */
+public class LeakingParametersData {
+ int z;
+
+ void test01(@ExpectLeaking Object o1, @ExpectLeaking Object o2, @ExpectLeaking Object o3) {
+ o1.toString();
+ o2.toString();
+ o3.toString();
+ }
+
+ void test02(@ExpectLeaking LeakingParametersData d) {
+ System.out.println(d.z);
+ }
+
+ void test03(int i, @ExpectLeaking LeakingParametersData d) {
+ System.out.println(d.z);
+ }
+
+ void test04(long i, @ExpectLeaking LeakingParametersData d) {
+ System.out.println(d.z);
+ }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/Test01.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/Test01.java
new file mode 100644
index 000000000000..1b90bb640b39
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/Test01.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis.data;
+
+import com.intellij.codeInspection.bytecodeAnalysis.ExpectContract;
+import com.intellij.codeInspection.bytecodeAnalysis.ExpectNotNull;
+
+/**
+ * @author lambdamix
+ */
+public class Test01 {
+ static void f(@ExpectNotNull Object o1, @ExpectNotNull Object o2) {
+ if (o1 == null) throw new NullPointerException();
+ else s(o2, o2);
+ }
+
+ static void g(@ExpectNotNull Object o, boolean b) {
+ if (b) f(o, o);
+ else s(o, o);
+ }
+
+ static void s(@ExpectNotNull Object o1, Object o2) {
+ t(o1);
+ v(o2);
+ }
+
+ static void t(@ExpectNotNull Object o) {
+ o.toString();
+ }
+
+ static void v(Object o) {
+
+ }
+
+ @ExpectContract("null->null")
+ static String toString1(Object o) {
+ return o == null ? null : o.toString();
+ }
+
+ @ExpectContract("null->!null")
+ static String toString2(Object o) {
+ return o == null ? "null" : o.toString();
+ }
+
+ @ExpectNotNull
+ static String constantString() {
+ return "s";
+ }
+
+ @ExpectContract("!null->!null;null->null")
+ static String idString(String s) {
+ return s;
+ }
+
+ @ExpectNotNull
+ public Test01 getThis() {
+ return this;
+ }
+
+ @ExpectNotNull
+ protected Test01 createRoot() {
+ return new Test01();
+ }
+
+}
diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemOutputState.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/Test02.java
index 29ac0ae91918..f794ff23009b 100644
--- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactPackagingItemOutputState.java
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/Test02.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2010 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,18 +13,21 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.intellij.packaging.impl.compiler;
+package com.intellij.codeInspection.bytecodeAnalysis.data;
-import com.intellij.openapi.util.Pair;
-import com.intellij.util.SmartList;
+import com.intellij.codeInspection.bytecodeAnalysis.ExpectNotNull;
/**
-* @author nik
-*/
-public class ArtifactPackagingItemOutputState {
- public final SmartList<Pair<String, Long>> myDestinations;
+ * @author lambdamix
+ */
+public final class Test02 {
+ @ExpectNotNull
+ public String notNullString() {
+ return "";
+ }
- public ArtifactPackagingItemOutputState(SmartList<Pair<String, Long>> destinations) {
- myDestinations = destinations;
+ @ExpectNotNull
+ public String notNullStringDelegate() {
+ return notNullString();
}
}
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/ExplodedDestinationInfo.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/Test03.java
index 33a3a8e8da11..97903933190e 100644
--- a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/ExplodedDestinationInfo.java
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/Test03.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,21 +13,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.intellij.codeInspection.bytecodeAnalysis.data;
-package com.intellij.compiler.impl.packagingCompiler;
-
-import com.intellij.openapi.vfs.VirtualFile;
-import org.jetbrains.annotations.Nullable;
+import com.intellij.codeInspection.bytecodeAnalysis.ExpectNotNull;
/**
- * @author nik
+ * @author lambdamix
*/
-public class ExplodedDestinationInfo extends DestinationInfo {
- public ExplodedDestinationInfo(final String outputPath, @Nullable final VirtualFile outputFile) {
- super(outputPath, outputFile, outputPath);
+public class Test03 {
+
+ public String toString1() {
+ return toString();
}
+ @Override
+ @ExpectNotNull
public String toString() {
- return getOutputPath();
+ return "";
}
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/TestAnnotation.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/TestAnnotation.java
new file mode 100644
index 000000000000..cfe55ff5cd28
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/TestAnnotation.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis.data;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * @author lambdamix
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface TestAnnotation {
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/TestConverterData.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/TestConverterData.java
new file mode 100644
index 000000000000..254db418e55c
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/data/TestConverterData.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInspection.bytecodeAnalysis.data;
+
+import com.intellij.codeInspection.bytecodeAnalysis.BytecodeAnalysisConverter;
+import com.intellij.codeInspection.bytecodeAnalysis.ExpectNoPsiKey;
+
+/**
+ * @author lambdamix
+ */
+public class TestConverterData {
+
+ public static class StaticNestedClass {
+ public StaticNestedClass(Object o) {
+
+ }
+ public StaticNestedClass[] test01(StaticNestedClass[] ns, StaticNestedClass... ellipsis) {
+ return ns;
+ }
+ }
+
+ public class InnerClass {
+ // a reference to outer class should be inserted when translating PSI -> ASM
+ public InnerClass(Object o) {}
+
+ public InnerClass[] Inner2test01(InnerClass[] tests, InnerClass... ellipsis) {
+ return tests;
+ }
+ }
+
+ public static class GenericStaticNestedClass<A> {
+ public GenericStaticNestedClass(A a) {
+
+ }
+ public GenericStaticNestedClass[] test01(GenericStaticNestedClass[] ns, GenericStaticNestedClass... ellipsis) {
+ return ns;
+ }
+
+ public GenericStaticNestedClass<A>[] test02(GenericStaticNestedClass<A>[] ns, GenericStaticNestedClass<A>... ellipsis) {
+ return ns;
+ }
+
+ public class GenericInnerClass<B> {
+ public GenericInnerClass(B b) {}
+
+ public <C> GenericStaticNestedClass<A> test01(GenericInnerClass<C> c) {
+ return GenericStaticNestedClass.this;
+ }
+ }
+ }
+
+ public TestConverterData(int x) {}
+
+ // BytecodeAnalysisConverter class is not in the project path, so translation from PSI is impossible
+ @ExpectNoPsiKey
+ public BytecodeAnalysisConverter test01(BytecodeAnalysisConverter converter) {
+ return converter;
+ }
+
+ @TestAnnotation
+ public TestConverterData[] test02(@TestAnnotation TestConverterData[] tests) throws Exception {
+ return tests;
+ }
+
+ public boolean[] test03(boolean[] b) {
+ return b;
+ }
+}
diff --git a/java/java-tests/testSrc/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenterTest.java b/java/java-tests/testSrc/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenterTest.java
index 498a1172fa9a..e9d1da3aaf18 100644
--- a/java/java-tests/testSrc/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenterTest.java
+++ b/java/java-tests/testSrc/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenterTest.java
@@ -67,48 +67,48 @@ public class NotNullVerifyingInstrumenterTest extends UsefulTestCase {
}
public void testSimpleReturn() throws Exception {
- Class testClass = prepareTest();
+ Class<?> testClass = prepareTest();
Object instance = testClass.newInstance();
Method method = testClass.getMethod("test");
verifyCallThrowsException("@NotNull method SimpleReturn.test must not return null", instance, method);
}
public void testSimpleReturnWithMessage() throws Exception {
- Class testClass = prepareTest();
+ Class<?> testClass = prepareTest();
Object instance = testClass.newInstance();
Method method = testClass.getMethod("test");
verifyCallThrowsException("This method cannot return null", instance, method);
}
public void testMultipleReturns() throws Exception {
- Class testClass = prepareTest();
+ Class<?> testClass = prepareTest();
Object instance = testClass.newInstance();
Method method = testClass.getMethod("test", int.class);
verifyCallThrowsException("@NotNull method MultipleReturns.test must not return null", instance, method, 1);
}
public void testSimpleParam() throws Exception {
- Class testClass = prepareTest();
+ Class<?> testClass = prepareTest();
Object instance = testClass.newInstance();
Method method = testClass.getMethod("test", Object.class);
verifyCallThrowsException("Argument 0 for @NotNull parameter of SimpleParam.test must not be null", instance, method, (Object)null);
}
public void testSimpleParamWithMessage() throws Exception {
- Class testClass = prepareTest();
+ Class<?> testClass = prepareTest();
Object instance = testClass.newInstance();
Method method = testClass.getMethod("test", Object.class);
verifyCallThrowsException("SimpleParamWithMessage.test(o) cant be null", instance, method, (Object)null);
}
public void testConstructorParam() throws Exception {
- Class testClass = prepareTest();
+ Class<?> testClass = prepareTest();
Constructor method = testClass.getConstructor(Object.class);
verifyCallThrowsException("Argument 0 for @NotNull parameter of ConstructorParam.<init> must not be null", null, method, (Object)null);
}
public void testConstructorParamWithMessage() throws Exception {
- Class testClass = prepareTest();
+ Class<?> testClass = prepareTest();
Constructor method = testClass.getConstructor(Object.class);
verifyCallThrowsException("ConstructorParam.ConstructorParam.o cant be null", null, method, (Object)null);
}
@@ -132,6 +132,19 @@ public class NotNullVerifyingInstrumenterTest extends UsefulTestCase {
assertNotNull(field);
}
+ public void testCustomExceptionType() throws Exception {
+ Class<?> testClass = prepareTest();
+ try {
+ testClass.getMethod("foo", Object.class, Object.class).invoke(testClass.newInstance(), null, null);
+ fail();
+ }
+ catch (InvocationTargetException e) {
+ //noinspection ThrowableResultOfMethodCallIgnored
+ assertInstanceOf(e.getCause(), NullPointerException.class);
+ assertEquals("Argument 1 for @NotNull parameter of CustomExceptionType.foo must not be null", e.getCause().getMessage());
+ }
+ }
+
public void testEnumConstructorSecondParam() throws Exception {
Class testClass = prepareTest();
Object field = testClass.getField("Value");
diff --git a/java/java-tests/testSrc/com/intellij/find/FindInEditorMultiCaretTest.java b/java/java-tests/testSrc/com/intellij/find/FindInEditorMultiCaretTest.java
new file mode 100644
index 000000000000..02f8c589c43b
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/find/FindInEditorMultiCaretTest.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.find;
+
+import com.intellij.find.editorHeaderActions.*;
+import com.intellij.openapi.actionSystem.ActionPlaces;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.IdeActions;
+import com.intellij.openapi.util.Getter;
+import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase;
+
+import javax.swing.text.JTextComponent;
+import java.io.IOException;
+
+public class FindInEditorMultiCaretTest extends LightPlatformCodeInsightFixtureTestCase {
+ public void testBasic() throws IOException {
+ init("abc\n" +
+ "abc\n" +
+ "abc");
+ initFind();
+ setTextToFind("b");
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "abc\n" +
+ "abc");
+ addOccurrence();
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "a<selection>b<caret></selection>c\n" +
+ "abc");
+ nextOccurrence();
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "abc\n" +
+ "a<selection>b<caret></selection>c");
+ prevOccurrence();
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "a<selection>b<caret></selection>c\n" +
+ "abc");
+ removeOccurrence();
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "abc\n" +
+ "abc");
+ allOccurrences();
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "a<selection>b<caret></selection>c\n" +
+ "a<selection>b<caret></selection>c");
+ assertNull(getEditorSearchComponent());
+ }
+
+ public void testActionsWorkFromEditor() throws IOException {
+ init("abc\n" +
+ "abc\n" +
+ "abc");
+ initFind();
+ setTextToFind("b");
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "abc\n" +
+ "abc");
+ addOccurrenceFromEditor();
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "a<selection>b<caret></selection>c\n" +
+ "abc");
+ nextOccurrenceFromEditor();
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "abc\n" +
+ "a<selection>b<caret></selection>c");
+ prevOccurrenceFromEditor();
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "a<selection>b<caret></selection>c\n" +
+ "abc");
+ removeOccurrenceFromEditor();
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "abc\n" +
+ "abc");
+ allOccurrencesFromEditor();
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "a<selection>b<caret></selection>c\n" +
+ "a<selection>b<caret></selection>c");
+ assertNull(getEditorSearchComponent());
+ }
+
+ public void testCloseRetainsMulticaretSelection() throws IOException {
+ init("abc\n" +
+ "abc\n" +
+ "abc");
+ initFind();
+ setTextToFind("b");
+ addOccurrence();
+ closeFind();
+ checkResultByText("a<selection>b<caret></selection>c\n" +
+ "a<selection>b<caret></selection>c\n" +
+ "abc");
+ }
+
+ public void testTextModificationRemovesOldSelections() throws IOException {
+ init("abc\n" +
+ "abc\n" +
+ "abc");
+ initFind();
+ setTextToFind("b");
+ addOccurrence();
+ setTextToFind("bc");
+
+ assertEquals(1, myFixture.getEditor().getCaretModel().getCaretCount());
+ assertEquals("bc", myFixture.getEditor().getSelectionModel().getSelectedText());
+ }
+
+ public void testSecondFindNavigatesToTheSameOccurrence() throws IOException {
+ init("ab<caret>c\n" +
+ "abc\n" +
+ "abc");
+ initFind();
+ setTextToFind("abc");
+ checkResultByText("abc\n" +
+ "<selection>abc<caret></selection>\n" +
+ "abc");
+ closeFind();
+ initFind();
+ setTextToFind("abc");
+ checkResultByText("abc\n" +
+ "<selection>abc<caret></selection>\n" +
+ "abc");
+ }
+
+ private void setTextToFind(String text) {
+ EditorSearchComponent editorSearchComponent = getEditorSearchComponent();
+ assertNotNull(editorSearchComponent);
+ JTextComponent searchField = editorSearchComponent.getSearchField();
+ assertNotNull(searchField);
+ for (int i = 0; i <= text.length(); i++) {
+ searchField.setText(text.substring(0, i)); // emulate typing chars one by one
+ }
+ }
+
+ private void nextOccurrence() {
+ final EditorSearchComponent editorSearchComponent = getEditorSearchComponent();
+ executeAction(new NextOccurrenceAction(editorSearchComponent, new Getter<JTextComponent>() {
+ @Override
+ public JTextComponent get() {
+ return editorSearchComponent.getSearchField();
+ }
+ }));
+ }
+
+ private void prevOccurrence() {
+ final EditorSearchComponent editorSearchComponent = getEditorSearchComponent();
+ executeAction(new PrevOccurrenceAction(editorSearchComponent, new Getter<JTextComponent>() {
+ @Override
+ public JTextComponent get() {
+ return editorSearchComponent.getSearchField();
+ }
+ }));
+ }
+
+ private void addOccurrence() {
+ executeAction(new AddOccurrenceAction(getEditorSearchComponent()));
+ }
+
+ private void removeOccurrence() {
+ executeAction(new RemoveOccurrenceAction(getEditorSearchComponent()));
+ }
+
+ private void allOccurrences() {
+ executeAction(new SelectAllAction(getEditorSearchComponent()));
+ }
+
+ private void nextOccurrenceFromEditor() {
+ myFixture.performEditorAction(IdeActions.ACTION_FIND_NEXT);
+ }
+
+ private void prevOccurrenceFromEditor() {
+ myFixture.performEditorAction(IdeActions.ACTION_FIND_PREVIOUS);
+ }
+
+ private void addOccurrenceFromEditor() {
+ myFixture.performEditorAction(IdeActions.ACTION_SELECT_NEXT_OCCURENCE);
+ }
+
+ private void removeOccurrenceFromEditor() {
+ myFixture.performEditorAction(IdeActions.ACTION_UNSELECT_PREVIOUS_OCCURENCE);
+ }
+
+ private void allOccurrencesFromEditor() {
+ myFixture.performEditorAction(IdeActions.ACTION_SELECT_ALL_OCCURRENCES);
+ }
+
+ private void closeFind() {
+ EditorSearchComponent editorSearchComponent = getEditorSearchComponent();
+ executeAction(new CloseOnESCAction(editorSearchComponent, editorSearchComponent.getSearchField()));
+ }
+
+ private static void executeAction(EditorHeaderAction action) {
+ action.actionPerformed(AnActionEvent.createFromInputEvent(action, null, ActionPlaces.EDITOR_TOOLBAR));
+ }
+
+ private void initFind() {
+ myFixture.performEditorAction("Find");
+ }
+
+ private EditorSearchComponent getEditorSearchComponent() {
+ return (EditorSearchComponent)myFixture.getEditor().getHeaderComponent();
+ }
+
+ private void init(String text) {
+ myFixture.configureByText(getTestName(false) + ".txt", text);
+ }
+
+ private void checkResultByText(String text) {
+ myFixture.checkResult(text);
+ }
+}
diff --git a/java/java-tests/testSrc/com/intellij/find/FindInEditorTest.java b/java/java-tests/testSrc/com/intellij/find/FindInEditorTest.java
index cfe9cdde2273..043c755f8ca9 100644
--- a/java/java-tests/testSrc/com/intellij/find/FindInEditorTest.java
+++ b/java/java-tests/testSrc/com/intellij/find/FindInEditorTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,10 +15,14 @@
*/
package com.intellij.find;
+import com.intellij.codeInsight.hint.EditorHintListener;
import com.intellij.find.impl.livePreview.LivePreview;
import com.intellij.find.impl.livePreview.LivePreviewController;
import com.intellij.find.impl.livePreview.SearchResults;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.project.Project;
import com.intellij.testFramework.LightCodeInsightTestCase;
+import com.intellij.ui.LightweightHint;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
@@ -39,6 +43,13 @@ public class FindInEditorTest extends LightCodeInsightTestCase {
myOutputStream = new ByteArrayOutputStream();
LivePreview.ourTestOutput = new PrintStream(myOutputStream);
+ EditorHintListener listener = new EditorHintListener() {
+ @Override
+ public void hintShown(Project project, LightweightHint hint, int flags) {
+ LivePreview.processNotFound();
+ }
+ };
+ ApplicationManager.getApplication().getMessageBus().connect(myTestRootDisposable).subscribe(EditorHintListener.TOPIC, listener);
}
private void initFind() {
diff --git a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java
index 23895d64a39e..1e3e08a33ae7 100644
--- a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java
+++ b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java
@@ -188,7 +188,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
}
public void testDirInfos() throws IOException {
- checkInfoNull(myRootVFile);
+ assertNotInProject(myRootVFile);
// beware: files in directory index
checkInfo(myFileLibSrc, null, false, true, "", null, myModule);
@@ -206,21 +206,21 @@ public class DirectoryIndexTest extends IdeaTestCase {
checkInfo(myLibSrcDir, myModule, false, true, "", null, myModule2, myModule3);
checkInfo(myLibClsDir, myModule, true, false, "", null, myModule2, myModule3);
- assertEquals(myLibSrcDir, checkInfoNotNull(myLibSrcDir).getSourceRoot());
+ assertEquals(myLibSrcDir, assertInProject(myLibSrcDir).getSourceRoot());
checkInfo(myModule2Dir, myModule2, false, false, null, null);
checkInfo(mySrcDir2, myModule2, false, false, "", JavaSourceRootType.SOURCE, myModule2, myModule3);
- checkInfoNull(myCvsDir);
- checkInfoNull(myExcludeDir);
- checkInfoNull(myExcludedLibClsDir);
- checkInfoNull(myExcludedLibSrcDir);
+ assertNotInProject(myCvsDir);
+ assertExcluded(myExcludeDir, myModule2);
+ assertExcluded(myExcludedLibClsDir, myModule);
+ assertExcluded(myExcludedLibSrcDir, myModule);
- assertEquals(myModule1Dir, checkInfoNotNull(myLibClsDir).getContentRoot());
+ assertEquals(myModule1Dir, assertInProject(myLibClsDir).getContentRoot());
checkInfo(myModule3Dir, myModule3, false, false, null, null);
VirtualFile cvs = myPack1Dir.createChildDirectory(this, "CVS");
- checkInfoNull(cvs);
+ assertNotInProject(cvs);
assertNull(ProjectRootManager.getInstance(myProject).getFileIndex().getPackageNameByDirectory(cvs));
}
@@ -332,7 +332,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
VirtualFile newDir = myModule1Dir.createChildDirectory(this, "newDir");
myIndex.checkConsistency();
- checkInfoNotNull(newDir);
+ assertInProject(newDir);
final FileTypeManagerEx fileTypeManager = (FileTypeManagerEx)FileTypeManager.getInstance();
final String list = fileTypeManager.getIgnoredFilesList();
@@ -345,7 +345,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
}
});
myIndex.checkConsistency();
- checkInfoNull(newDir);
+ assertNotInProject(newDir);
}
finally {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@@ -354,10 +354,17 @@ public class DirectoryIndexTest extends IdeaTestCase {
fileTypeManager.setIgnoredFilesList(list);
}
});
- checkInfoNotNull(newDir);
+ assertInProject(newDir);
}
}
+ public void testIgnoredFile() throws IOException {
+ VirtualFile ignoredFile = myModule1Dir.createChildData(this, "CVS");
+ DirectoryInfo info = myIndex.getInfoForFile(ignoredFile);
+ assertTrue(info.isIgnored());
+ assertTrue(ProjectRootManager.getInstance(myProject).getFileIndex().isExcluded(ignoredFile));
+ }
+
public void testAddModule() throws Exception {
myIndex.checkConsistency();
@@ -379,16 +386,18 @@ public class DirectoryIndexTest extends IdeaTestCase {
public void testModuleUnderIgnoredDir() throws IOException {
final VirtualFile ignored = myRootVFile.createChildDirectory(this, "RCS");
assertTrue(FileTypeManager.getInstance().isFileIgnored(ignored));
+ assertTrue(ProjectRootManager.getInstance(myProject).getFileIndex().isExcluded(ignored));
final VirtualFile module4 = ignored.createChildDirectory(this, "module4");
assertFalse(FileTypeManager.getInstance().isFileIgnored(module4));
-
+ assertTrue(ProjectRootManager.getInstance(myProject).getFileIndex().isExcluded(module4));
+
new WriteCommandAction.Simple(getProject()) {
@Override
protected void run() throws Throwable {
ModuleManager moduleManager = ModuleManager.getInstance(myProject);
Module module = moduleManager.newModule(myRootVFile.getPath() + "/newModule.iml", StdModuleTypes.JAVA.getId());
PsiTestUtil.addContentRoot(module, module4);
- checkInfoNull(ignored);
+ assertNotInProject(ignored);
checkInfo(module4, module, false, false, null, null);
}
}.execute().throwException();
@@ -418,9 +427,9 @@ public class DirectoryIndexTest extends IdeaTestCase {
public void testExcludedDirsInLibraries() {
ProjectFileIndex index = ProjectRootManager.getInstance(myProject).getFileIndex();
assertFalse(index.isInLibraryClasses(myExcludedLibClsDir));
- assertTrue(index.isIgnored(myExcludedLibClsDir));
+ assertTrue(index.isExcluded(myExcludedLibClsDir));
assertFalse(index.isInLibrarySource(myExcludedLibSrcDir));
- assertTrue(index.isIgnored(myExcludedLibSrcDir));
+ assertTrue(index.isExcluded(myExcludedLibSrcDir));
}
public void testExplicitExcludeOfInner() throws Exception {
@@ -436,20 +445,20 @@ public class DirectoryIndexTest extends IdeaTestCase {
VirtualFile output1 = myModule1Dir.createChildDirectory(this, "output1");
VirtualFile output2 = myModule1Dir.createChildDirectory(this, "output2");
- checkInfoNotNull(output1);
- checkInfoNotNull(output2);
+ assertInProject(output1);
+ assertInProject(output2);
getCompilerProjectExtension().setCompilerOutputUrl(output1.getUrl());
fireRootsChanged();
- checkInfoNull(output1);
- checkInfoNotNull(output2);
+ assertExcluded(output1, myModule);
+ assertInProject(output2);
getCompilerProjectExtension().setCompilerOutputUrl(output2.getUrl());
fireRootsChanged();
- checkInfoNotNull(output1);
- checkInfoNull(output2);
+ assertInProject(output1);
+ assertExcluded(output2, myModule);
}
private void fireRootsChanged() {
@@ -460,12 +469,12 @@ public class DirectoryIndexTest extends IdeaTestCase {
ModuleRootModificationUtil.addModuleLibrary(myModule, "someLib", Collections.<String>emptyList(), Arrays.asList(mySrcDir1.getUrl()));
checkInfo(mySrcDir1, myModule, false, true, "", JavaSourceRootType.SOURCE, myModule, myModule);
- OrderEntry[] entries = myIndex.getInfoForDirectory(mySrcDir1).getOrderEntries();
+ OrderEntry[] entries = myIndex.getInfoForFile(mySrcDir1).getOrderEntries();
assertInstanceOf(entries[0], LibraryOrderEntry.class);
assertInstanceOf(entries[1], ModuleSourceOrderEntry.class);
checkInfo(myTestSrc1, myModule, false, true, "testSrc", JavaSourceRootType.TEST_SOURCE, myModule, myModule);
- entries = myIndex.getInfoForDirectory(myTestSrc1).getOrderEntries();
+ entries = myIndex.getInfoForFile(myTestSrc1).getOrderEntries();
assertInstanceOf(entries[0], LibraryOrderEntry.class);
assertInstanceOf(entries[1], ModuleSourceOrderEntry.class);
}
@@ -473,7 +482,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
public void testModuleSourceAsLibraryClasses() throws Exception {
ModuleRootModificationUtil.addModuleLibrary(myModule, "someLib", Arrays.asList(mySrcDir1.getUrl()), Collections.<String>emptyList());
checkInfo(mySrcDir1, myModule, true, false, "", JavaSourceRootType.SOURCE, myModule);
- assertInstanceOf(assertOneElement(checkInfoNotNull(mySrcDir1).getOrderEntries()), ModuleSourceOrderEntry.class);
+ assertInstanceOf(assertOneElement(assertInProject(mySrcDir1).getOrderEntries()), ModuleSourceOrderEntry.class);
}
public void testModulesWithSameSourceContentRoot() {
@@ -487,7 +496,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
checkInfo(myResDir, myModule, false, false, "", JavaResourceRootType.RESOURCE, myModule);
checkInfo(mySrcDir2, myModule2, false, false, "", JavaSourceRootType.SOURCE, myModule2, myModule3);
- assertEquals(myModule2Dir, myIndex.getInfoForDirectory(mySrcDir2).getContentRoot());
+ assertEquals(myModule2Dir, myIndex.getInfoForFile(mySrcDir2).getContentRoot());
}
public void testModuleWithSameSourceRoot() {
@@ -503,7 +512,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
public void testSameSourceAndOutput() {
PsiTestUtil.setCompilerOutputPath(myModule, mySrcDir1.getUrl(), false);
- checkInfoNull(mySrcDir1);
+ assertExcluded(mySrcDir1, myModule);
}
public void testExcludedDirShouldBeExcludedRightAfterItsCreation() throws Exception {
@@ -512,10 +521,10 @@ public class DirectoryIndexTest extends IdeaTestCase {
VirtualFile module2Output = myModule1Dir.createChildDirectory(this, "module2Output");
VirtualFile module2TestOutput = myModule2Dir.createChildDirectory(this, "module2TestOutput");
- checkInfoNotNull(excluded);
- checkInfoNotNull(projectOutput);
- checkInfoNotNull(module2Output);
- checkInfoNotNull(module2TestOutput);
+ assertInProject(excluded);
+ assertInProject(projectOutput);
+ assertInProject(module2Output);
+ assertInProject(module2TestOutput);
getCompilerProjectExtension().setCompilerOutputUrl(projectOutput.getUrl());
@@ -524,15 +533,10 @@ public class DirectoryIndexTest extends IdeaTestCase {
PsiTestUtil.setCompilerOutputPath(myModule2, module2TestOutput.getUrl(), true);
PsiTestUtil.setExcludeCompileOutput(myModule2, true);
- checkInfoNull(excluded);
- checkInfoNull(projectOutput);
- checkInfoNull(module2Output);
- checkInfoNull(module2TestOutput);
-
- assertFalse(myIndex.isProjectExcludeRoot(excluded));
- assertFalse(myIndex.isProjectExcludeRoot(projectOutput));
- assertFalse(myIndex.isProjectExcludeRoot(module2Output));
- assertFalse(myIndex.isProjectExcludeRoot(module2TestOutput));
+ assertExcluded(excluded, myModule);
+ assertExcluded(projectOutput, myModule);
+ assertExcluded(module2Output, myModule);
+ assertExcluded(module2TestOutput, myModule2);
excluded.delete(this);
projectOutput.delete(this);
@@ -544,46 +548,26 @@ public class DirectoryIndexTest extends IdeaTestCase {
@Override
public void fileCreated(@NotNull VirtualFileEvent e) {
VirtualFile file = e.getFile();
- checkInfoNull(file);
- created.add(file);
-
String fileName = e.getFileName();
- if (fileName.equals("projectOutput")) {
- assertFalse(myIndex.isProjectExcludeRoot(file));
- }
- if (fileName.equals("module2Output")) {
- assertFalse(myIndex.isProjectExcludeRoot(file));
- }
- if (fileName.equals("module2TestOutput")) {
- assertFalse(myIndex.isProjectExcludeRoot(file));
- }
+ assertExcluded(file, fileName.contains("module2TestOutput") ? myModule2 : myModule);
+ created.add(file);
}
};
VirtualFileManager.getInstance().addVirtualFileListener(l, getTestRootDisposable());
excluded = myModule1Dir.createChildDirectory(this, excluded.getName());
- assertFalse(myIndex.isProjectExcludeRoot(excluded));
-
+ assertExcluded(excluded, myModule);
+
projectOutput = myModule1Dir.createChildDirectory(this, projectOutput.getName());
- assertFalse(myIndex.isProjectExcludeRoot(projectOutput));
-
+ assertExcluded(projectOutput, myModule);
+
module2Output = myModule1Dir.createChildDirectory(this, module2Output.getName());
- assertFalse(myIndex.isProjectExcludeRoot(module2Output));
-
- module2TestOutput = myModule2Dir.createChildDirectory(this, module2TestOutput.getName());
- assertFalse(myIndex.isProjectExcludeRoot(module2TestOutput));
+ assertExcluded(module2Output, myModule);
- checkInfoNull(excluded);
- checkInfoNull(projectOutput);
- checkInfoNull(module2Output);
- checkInfoNull(module2TestOutput);
+ module2TestOutput = myModule2Dir.createChildDirectory(this, module2TestOutput.getName());
+ assertExcluded(module2TestOutput, myModule2);
assertEquals(created.toString(), 4, created.size());
-
- assertFalse(myIndex.isProjectExcludeRoot(excluded));
- assertFalse(myIndex.isProjectExcludeRoot(projectOutput));
- assertFalse(myIndex.isProjectExcludeRoot(module2Output));
- assertFalse(myIndex.isProjectExcludeRoot(module2TestOutput));
}
public void testExcludesShouldBeRecognizedRightOnRefresh() throws Exception {
@@ -607,9 +591,9 @@ public class DirectoryIndexTest extends IdeaTestCase {
assertEquals("dir", e.getFileName());
VirtualFile file = e.getFile();
- checkInfoNotNull(file);
- checkInfoNull(file.findFileByRelativePath("excluded"));
- checkInfoNull(file.findFileByRelativePath("excluded/foo"));
+ assertInProject(file);
+ assertExcluded(file.findFileByRelativePath("excluded"), myModule);
+ assertExcluded(file.findFileByRelativePath("excluded/foo"), myModule);
}
};
@@ -638,8 +622,8 @@ public class DirectoryIndexTest extends IdeaTestCase {
});
- checkInfoNull(LocalFileSystem.getInstance().findFileByIoFile(f.getParentFile().getParentFile()));
- checkInfoNotNull(LocalFileSystem.getInstance().findFileByIoFile(f));
+ assertExcluded(LocalFileSystem.getInstance().findFileByIoFile(f.getParentFile().getParentFile()), myModule);
+ assertInProject(LocalFileSystem.getInstance().findFileByIoFile(f));
}
public void testLibraryDirInContent() throws Exception {
@@ -661,7 +645,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
checkInfo(myLibSrcDir, myModule, true, true, "", null, myModule, myModule3);
checkInfo(myResDir, myModule, true, false, "", JavaResourceRootType.RESOURCE, myModule);
- assertInstanceOf(assertOneElement(checkInfoNotNull(myResDir).getOrderEntries()), ModuleSourceOrderEntry.class);
+ assertInstanceOf(assertOneElement(assertInProject(myResDir).getOrderEntries()), ModuleSourceOrderEntry.class);
checkInfo(myExcludedLibSrcDir, null, true, false, "lib.src.exc", null, myModule3, myModule);
checkInfo(myExcludedLibClsDir, null, true, false, "lib.cls.exc", null, myModule3);
@@ -678,11 +662,11 @@ public class DirectoryIndexTest extends IdeaTestCase {
public void testExcludeCompilerOutputOutsideOfContentRoot() throws Exception {
final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
- assertTrue(fileIndex.isIgnored(myOutputDir));
- assertTrue(fileIndex.isIgnored(myModule1OutputDir));
- assertFalse(fileIndex.isIgnored(myOutputDir.getParent()));
- assertTrue(myIndex.isProjectExcludeRoot(myOutputDir));
- assertFalse(myIndex.isProjectExcludeRoot(myModule1OutputDir));
+ assertTrue(fileIndex.isExcluded(myOutputDir));
+ assertTrue(fileIndex.isExcluded(myModule1OutputDir));
+ assertFalse(fileIndex.isExcluded(myOutputDir.getParent()));
+ assertExcludedFromProject(myOutputDir);
+ assertExcludedFromProject(myModule1OutputDir);
String moduleOutputUrl = myModule1OutputDir.getUrl();
myOutputDir.delete(this);
@@ -691,9 +675,9 @@ public class DirectoryIndexTest extends IdeaTestCase {
myOutputDir = myRootVFile.createChildDirectory(this, "out");
myModule1OutputDir = myOutputDir.createChildDirectory(this, "module1");
- assertTrue(myIndex.isProjectExcludeRoot(myOutputDir));
- assertTrue(myIndex.isProjectExcludeRoot(myModule1OutputDir));
- assertTrue(fileIndex.isIgnored(myModule1OutputDir));
+ assertExcludedFromProject(myOutputDir);
+ assertExcludedFromProject(myModule1OutputDir);
+ assertTrue(fileIndex.isExcluded(myModule1OutputDir));
PsiTestUtil.setCompilerOutputPath(myModule, moduleOutputUrl, true);
PsiTestUtil.setCompilerOutputPath(myModule2, moduleOutputUrl, false);
@@ -702,20 +686,20 @@ public class DirectoryIndexTest extends IdeaTestCase {
PsiTestUtil.setCompilerOutputPath(myModule3, moduleOutputUrl, true);
// now no module inherits project output dir, but it still should be project-excluded
- assertTrue(myIndex.isProjectExcludeRoot(myOutputDir));
+ assertExcludedFromProject(myOutputDir);
// project output inside module content shouldn't be projectExcludeRoot
VirtualFile projectOutputUnderContent = myModule1Dir.createChildDirectory(this, "projectOutputUnderContent");
getCompilerProjectExtension().setCompilerOutputUrl(projectOutputUnderContent.getUrl());
fireRootsChanged();
- assertFalse(myIndex.isProjectExcludeRoot(myOutputDir));
- assertFalse(myIndex.isProjectExcludeRoot(projectOutputUnderContent));
-
+ assertNotExcluded(myOutputDir);
+ assertExcluded(projectOutputUnderContent, myModule);
+
projectOutputUnderContent.delete(this);
projectOutputUnderContent = myModule1Dir.createChildDirectory(this, "projectOutputUnderContent");
- assertFalse(myIndex.isProjectExcludeRoot(myOutputDir));
- assertFalse(myIndex.isProjectExcludeRoot(projectOutputUnderContent));
+ assertNotExcluded(myOutputDir);
+ assertExcluded(projectOutputUnderContent, myModule);
}
public void testFileContentAndSourceRoots() throws IOException {
@@ -725,7 +709,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
VirtualFile fileSourceRoot = myRootVFile.createChildData(this, "fileSourceRoot.txt");
VirtualFile fileTestSourceRoot = myRootVFile.createChildData(this, "fileTestSourceRoot.txt");
- checkInfoNull(fileRoot);
+ assertNotInProject(fileRoot);
assertFalse(fileIndex.isInContent(fileRoot));
assertIteratedContent(fileIndex, null, Arrays.asList(fileRoot, fileSourceRoot, fileTestSourceRoot));
@@ -758,7 +742,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
// removing file content root
PsiTestUtil.removeContentEntry(myModule, contentEntry);
- checkInfoNull(fileRoot);
+ assertNotInProject(fileRoot);
assertFalse(fileIndex.isInContent(fileRoot));
assertFalse(fileIndex.isInSource(fileRoot));
assertIteratedContent(fileIndex, Arrays.asList(fileSourceRoot, fileTestSourceRoot), Arrays.asList(fileRoot));
@@ -785,7 +769,6 @@ public class DirectoryIndexTest extends IdeaTestCase {
VirtualFile fileSourceRoot = myModule1Dir.createChildData(this, "fileSourceRoot.txt");
assertTrue(fileIndex.isInContent(fileSourceRoot));
assertFalse(fileIndex.isInSource(fileSourceRoot));
- checkInfoNull(fileSourceRoot);
PsiTestUtil.addSourceRoot(myModule, fileSourceRoot);
assertTrue(fileIndex.isInContent(fileSourceRoot));
@@ -796,7 +779,6 @@ public class DirectoryIndexTest extends IdeaTestCase {
PsiTestUtil.removeSourceRoot(myModule, fileSourceRoot);
assertTrue(fileIndex.isInContent(fileSourceRoot));
assertFalse(fileIndex.isInSource(fileSourceRoot));
- checkInfoNull(fileSourceRoot);
}
public void testFileModuleExcludeRootUnderDirectoryRoot() throws IOException {
@@ -805,20 +787,18 @@ public class DirectoryIndexTest extends IdeaTestCase {
VirtualFile fileExcludeRoot = mySrcDir1.createChildData(this, "fileExcludeRoot.txt");
assertTrue(fileIndex.isInContent(fileExcludeRoot));
assertTrue(fileIndex.isInSource(fileExcludeRoot));
- checkInfoNull(fileExcludeRoot);
assertIteratedContent(fileIndex, Arrays.asList(fileExcludeRoot), null);
PsiTestUtil.addExcludedRoot(myModule, fileExcludeRoot);
assertFalse(fileIndex.isInContent(fileExcludeRoot));
assertFalse(fileIndex.isInSource(fileExcludeRoot));
- checkInfoNull(fileExcludeRoot);
+ assertExcluded(fileExcludeRoot, myModule);
assertIteratedContent(fileIndex, null, Arrays.asList(fileExcludeRoot));
// removing file exclude root
PsiTestUtil.removeExcludedRoot(myModule, fileExcludeRoot);
assertTrue(fileIndex.isInContent(fileExcludeRoot));
assertTrue(fileIndex.isInSource(fileExcludeRoot));
- checkInfoNull(fileExcludeRoot);
assertIteratedContent(fileIndex, Arrays.asList(fileExcludeRoot), null);
}
@@ -833,7 +813,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
PsiTestUtil.addExcludedRoot(myModule, fileRoot);
assertFalse(fileIndex.isInContent(fileRoot));
- checkInfoNull(fileRoot);
+ assertExcluded(fileRoot, myModule);
assertIteratedContent(fileIndex, null, Arrays.asList(fileRoot));
// removing file exclude root
@@ -860,7 +840,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
VirtualFile temp = myRootVFile.createChildDirectory(this, "temp");
VirtualFile fileSourceRoot = myRootVFile.createChildData(this, "fileSourceRoot.txt");
- checkInfoNull(fileSourceRoot);
+ assertNotInProject(fileSourceRoot);
PsiTestUtil.addContentRoot(myModule, fileSourceRoot);
PsiTestUtil.addSourceRoot(myModule, fileSourceRoot);
@@ -870,7 +850,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
// delete and recreate
fileSourceRoot.delete(this);
- checkInfoNull(fileSourceRoot);
+ assertNotInProject(fileSourceRoot);
assertFalse(fileIndex.isInContent(fileSourceRoot));
assertFalse(fileIndex.isInSource(fileSourceRoot));
fileSourceRoot = myRootVFile.createChildData(this, "fileSourceRoot.txt");
@@ -880,11 +860,11 @@ public class DirectoryIndexTest extends IdeaTestCase {
// delete and move from another dir
fileSourceRoot.delete(this);
- checkInfoNull(fileSourceRoot);
+ assertNotInProject(fileSourceRoot);
assertFalse(fileIndex.isInContent(fileSourceRoot));
assertFalse(fileIndex.isInSource(fileSourceRoot));
fileSourceRoot = temp.createChildData(this, "fileSourceRoot.txt");
- checkInfoNull(fileSourceRoot);
+ assertNotInProject(fileSourceRoot);
fileSourceRoot.move(this, myRootVFile);
checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule);
assertTrue(fileIndex.isInContent(fileSourceRoot));
@@ -892,11 +872,11 @@ public class DirectoryIndexTest extends IdeaTestCase {
// delete and copy from another dir
fileSourceRoot.delete(this);
- checkInfoNull(fileSourceRoot);
+ assertNotInProject(fileSourceRoot);
assertFalse(fileIndex.isInContent(fileSourceRoot));
assertFalse(fileIndex.isInSource(fileSourceRoot));
fileSourceRoot = temp.createChildData(this, "fileSourceRoot.txt");
- checkInfoNull(fileSourceRoot);
+ assertNotInProject(fileSourceRoot);
fileSourceRoot = fileSourceRoot.copy(this, myRootVFile, "fileSourceRoot.txt");
checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule);
assertTrue(fileIndex.isInContent(fileSourceRoot));
@@ -904,25 +884,25 @@ public class DirectoryIndexTest extends IdeaTestCase {
// delete and rename from another file
fileSourceRoot.delete(this);
- checkInfoNull(fileSourceRoot);
+ assertNotInProject(fileSourceRoot);
assertFalse(fileIndex.isInContent(fileSourceRoot));
assertFalse(fileIndex.isInSource(fileSourceRoot));
fileSourceRoot = myRootVFile.createChildData(this, "temp_file.txt");
- checkInfoNull(fileSourceRoot);
+ assertNotInProject(fileSourceRoot);
fileSourceRoot.rename(this, "fileSourceRoot.txt");
checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule);
assertTrue(fileIndex.isInContent(fileSourceRoot));
assertTrue(fileIndex.isInSource(fileSourceRoot));
}
- private void checkInfo(VirtualFile dir,
+ private void checkInfo(VirtualFile file,
@Nullable Module module,
boolean isInLibrary,
boolean isInLibrarySource,
@Nullable String packageName,
@Nullable final JpsModuleSourceRootType<?> moduleSourceRootType,
Module... modulesOfOrderEntries) {
- DirectoryInfo info = checkInfoNotNull(dir);
+ DirectoryInfo info = assertInProject(file);
assertEquals(module, info.getModule());
if (moduleSourceRootType != null) {
assertTrue("isInModuleSource", info.isInModuleSource());
@@ -935,8 +915,8 @@ public class DirectoryIndexTest extends IdeaTestCase {
assertEquals(isInLibrarySource, info.isInLibrarySource());
final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
- if (dir.isDirectory()) {
- assertEquals(packageName, fileIndex.getPackageNameByDirectory(dir));
+ if (file.isDirectory()) {
+ assertEquals(packageName, fileIndex.getPackageNameByDirectory(file));
}
assertEquals(Arrays.toString(info.getOrderEntries()), modulesOfOrderEntries.length, info.getOrderEntries().length);
@@ -946,16 +926,33 @@ public class DirectoryIndexTest extends IdeaTestCase {
}
}
- private void checkInfoNull(VirtualFile dir) {
- assertNull(myIndex.getInfoForDirectory(dir));
+ private void assertNotInProject(VirtualFile file) {
+ DirectoryInfo info = myIndex.getInfoForFile(file);
+ assertFalse(info.toString(), info.isInProject());
+ assertFalse(info.toString(), info.isExcluded());
+ }
+
+ private void assertExcluded(VirtualFile file, Module module) {
+ DirectoryInfo info = myIndex.getInfoForFile(file);
+ assertTrue(info.toString(), info.isExcluded());
+ assertEquals(module, info.getModule());
}
- private DirectoryInfo checkInfoNotNull(VirtualFile output2) {
- DirectoryInfo info = myIndex.getInfoForDirectory(output2);
- assertNotNull(output2.toString(), info);
+
+ private DirectoryInfo assertInProject(VirtualFile file) {
+ DirectoryInfo info = myIndex.getInfoForFile(file);
+ assertTrue(file.toString(), info.isInProject());
info.assertConsistency();
return info;
}
+ private void assertNotExcluded(VirtualFile file) {
+ assertFalse(myIndex.getInfoForFile(file).isExcluded());
+ }
+
+ private void assertExcludedFromProject(VirtualFile file) {
+ assertExcluded(file, null);
+ }
+
private void checkPackage(String packageName, boolean includeLibrarySources, VirtualFile... expectedDirs) {
VirtualFile[] actualDirs = myIndex.getDirectoriesByPackageName(packageName, includeLibrarySources).toArray(VirtualFile.EMPTY_ARRAY);
assertNotNull(actualDirs);
diff --git a/java/java-tests/testSrc/com/intellij/psi/CodeFragmentsTest.java b/java/java-tests/testSrc/com/intellij/psi/CodeFragmentsTest.java
index 8f6956808dea..dd0611f53175 100644
--- a/java/java-tests/testSrc/com/intellij/psi/CodeFragmentsTest.java
+++ b/java/java-tests/testSrc/com/intellij/psi/CodeFragmentsTest.java
@@ -1,6 +1,10 @@
package com.intellij.psi;
import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.roots.ex.ProjectRootManagerEx;
+import com.intellij.openapi.util.EmptyRunnable;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.testFramework.LightVirtualFile;
import com.intellij.testFramework.PlatformTestCase;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.PsiTestCase;
@@ -30,4 +34,15 @@ public class CodeFragmentsTest extends PsiTestCase{
PlatformTestUtil.tryGcSoftlyReachableObjects();
assertEquals("ab", PsiDocumentManager.getInstance(myProject).getDocument(fragment).getText());
}
+
+ public void testDontRecreateFragmentPsi() {
+ PsiExpressionCodeFragment fragment = JavaCodeFragmentFactory.getInstance(myProject).createExpressionCodeFragment("a", null, null, true);
+ VirtualFile file = fragment.getViewProvider().getVirtualFile();
+ assertInstanceOf(file, LightVirtualFile.class);
+
+ ProjectRootManagerEx.getInstanceEx(getProject()).makeRootsChange(EmptyRunnable.getInstance(), false, true);
+
+ assertSame(fragment, PsiManager.getInstance(myProject).findFile(file));
+ assertTrue(fragment.isValid());
+ }
}
diff --git a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterBlankLinesTest.java b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterBlankLinesTest.java
index bf11a587f2c3..fe005a84db3f 100644
--- a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterBlankLinesTest.java
+++ b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterBlankLinesTest.java
@@ -400,4 +400,36 @@ public class JavaFormatterBlankLinesTest extends AbstractJavaFormatterTest {
"}"
);
}
+
+ public void testIDEA126836() {
+ doTextTest(
+ "public class JavaClass { // comment\n" +
+ " public void doSomething() {\n" +
+ " int a = 3;\n" +
+ " }\n" +
+ "}",
+ "public class JavaClass { // comment\n" +
+ " public void doSomething() {\n" +
+ " int a = 3;\n" +
+ " }\n" +
+ "}"
+ );
+ }
+
+ public void testBlankLinesAfterClassHeaderWithComment() {
+ getSettings().BLANK_LINES_AFTER_CLASS_HEADER = 5;
+ doTextTest(
+ "public class JavaClass { // comment\n" +
+ " public void doSomething() {\n" +
+ " int a = 3;\n" +
+ " }\n" +
+ "}",
+ "public class JavaClass { // comment\n" +
+ "\n\n\n\n\n" +
+ " public void doSomething() {\n" +
+ " int a = 3;\n" +
+ " }\n" +
+ "}"
+ );
+ }
}
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java
index f0d4e771ed1a..665afec47ec9 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java
@@ -163,6 +163,9 @@ public class PullUpTest extends LightRefactoringTestCase {
public void testPreserveOverride() {
doTest(false, new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class));
}
+ public void testAsDefaultMethodOverAbstract() {
+ doTest(false, "Class <b><code>Test.Printer</code></b> already contains a method <b><code>foo()</code></b>", new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class));
+ }
public void testPublicMethodFromPrivateClassConflict() {
doTest(false, new RefactoringTestUtil.MemberDescriptor("HM", PsiClass.class), new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class));
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java
index 99de5eb68dc4..922d5e04c3bc 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java
@@ -268,6 +268,10 @@ public class InlineMethodTest extends LightRefactoringTestCase {
doTest();
}
+ public void testThisNameConflict() throws Exception {
+ doTest();
+ }
+
private void doTestInlineThisOnly() {
@NonNls String fileName = "/refactoring/inlineMethod/" + getTestName(false) + ".java";
configureByFile(fileName);
diff --git a/java/jdkAnnotations/java/text/annotations.xml b/java/jdkAnnotations/java/text/annotations.xml
index 96eb67c3add7..32b437d85aa3 100644
--- a/java/jdkAnnotations/java/text/annotations.xml
+++ b/java/jdkAnnotations/java/text/annotations.xml
@@ -93,5 +93,17 @@
<item name='java.text.SimpleDateFormat void setDateFormatSymbols(java.text.DateFormatSymbols) 0'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
+ <item name='java.text.StringCharacterIterator StringCharacterIterator(java.lang.String) 0'>
+ <annotation name='org.jetbrains.annotations.NotNull'/>
+ </item>
+ <item name='java.text.StringCharacterIterator StringCharacterIterator(java.lang.String, int) 0'>
+ <annotation name='org.jetbrains.annotations.NotNull'/>
+ </item>
+ <item name='java.text.StringCharacterIterator StringCharacterIterator(java.lang.String, int, int, int) 0'>
+ <annotation name='org.jetbrains.annotations.NotNull'/>
+ </item>
+ <item name='java.text.StringCharacterIterator void setText(java.lang.String) 0'>
+ <annotation name='org.jetbrains.annotations.NotNull'/>
+ </item>
</root>
diff --git a/java/mockJDK-1.7/jre/lib/annotations.jar b/java/mockJDK-1.7/jre/lib/annotations.jar
index 22b47ab9bcbc..d96bb1d6bed4 100644
--- a/java/mockJDK-1.7/jre/lib/annotations.jar
+++ b/java/mockJDK-1.7/jre/lib/annotations.jar
Binary files differ
diff --git a/java/openapi/src/com/intellij/ui/classFilter/ClassFilter.java b/java/openapi/src/com/intellij/ui/classFilter/ClassFilter.java
index 7521d3bd7c13..05500e31ebd3 100644
--- a/java/openapi/src/com/intellij/ui/classFilter/ClassFilter.java
+++ b/java/openapi/src/com/intellij/ui/classFilter/ClassFilter.java
@@ -17,20 +17,15 @@
package com.intellij.ui.classFilter;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.util.DefaultJDOMExternalizer;
-import com.intellij.openapi.util.InvalidDataException;
-import com.intellij.openapi.util.JDOMExternalizable;
-import com.intellij.openapi.util.WriteExternalException;
import com.intellij.util.xmlb.annotations.Attribute;
import com.intellij.util.xmlb.annotations.Tag;
import com.intellij.util.xmlb.annotations.Transient;
-import org.jdom.Element;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Tag("class-filter")
-public class ClassFilter implements JDOMExternalizable, Cloneable{
+public class ClassFilter implements Cloneable {
private static final Logger LOG = Logger.getInstance("#com.intellij.ui.classFilter.ClassFilter");
public static final ClassFilter[] EMPTY_ARRAY = new ClassFilter[0];
@@ -72,14 +67,6 @@ public class ClassFilter implements JDOMExternalizable, Cloneable{
return getPattern();
}
- public void readExternal(Element element) throws InvalidDataException {
- DefaultJDOMExternalizer.readExternal(this, element);
- }
-
- public void writeExternal(Element element) throws WriteExternalException {
- DefaultJDOMExternalizer.writeExternal(this, element);
- }
-
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof ClassFilter)) return false;
@@ -99,6 +86,7 @@ public class ClassFilter implements JDOMExternalizable, Cloneable{
return result;
}
+ @Override
public ClassFilter clone() {
try {
return (ClassFilter) super.clone();
diff --git a/java/openapi/src/com/intellij/ui/classFilter/ClassFilterEditor.java b/java/openapi/src/com/intellij/ui/classFilter/ClassFilterEditor.java
index b4b654d423b5..6d924a380974 100644
--- a/java/openapi/src/com/intellij/ui/classFilter/ClassFilterEditor.java
+++ b/java/openapi/src/com/intellij/ui/classFilter/ClassFilterEditor.java
@@ -113,7 +113,7 @@ public class ClassFilterEditor extends JPanel implements ComponentWithEmptyText
myTable.setTableHeader(null);
myTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
myTable.setColumnSelectionAllowed(false);
- myTable.setPreferredScrollableViewportSize(new Dimension(200, 100));
+ myTable.setPreferredScrollableViewportSize(new Dimension(200, myTable.getRowHeight() * JBTable.PREFERRED_SCROLLABLE_VIEWPORT_HEIGHT_IN_ROWS));
TableColumnModel columnModel = myTable.getColumnModel();
TableColumn column = columnModel.getColumn(FilterTableModel.CHECK_MARK);
diff --git a/java/remote-servers/impl/remote-servers-java-impl.iml b/java/remote-servers/impl/remote-servers-java-impl.iml
index b0228d7f4075..6999e2deac71 100644
--- a/java/remote-servers/impl/remote-servers-java-impl.iml
+++ b/java/remote-servers/impl/remote-servers-java-impl.iml
@@ -13,6 +13,8 @@
<orderEntry type="module" module-name="execution-openapi" />
<orderEntry type="module" module-name="lang-impl" />
<orderEntry type="module" module-name="remote-servers-impl" />
+ <orderEntry type="module" module-name="java-impl" />
+ <orderEntry type="module" module-name="openapi" />
</component>
</module>
diff --git a/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml b/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml
index cec87d9643f2..24a0776ccd29 100644
--- a/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml
+++ b/java/remote-servers/impl/src/META-INF/RemoteServersJava.xml
@@ -1,7 +1,14 @@
<idea-plugin>
+
+ <extensionPoints>
+ <extensionPoint qualifiedName="com.intellij.remoteServer.moduleBuilderContribution"
+ interface="com.intellij.remoteServer.impl.module.CloudModuleBuilderContribution"/>
+ </extensionPoints>
+
<extensions defaultExtensionNs="com.intellij">
<applicationService serviceInterface="com.intellij.remoteServer.configuration.deployment.JavaDeploymentSourceUtil"
serviceImplementation="com.intellij.remoteServer.impl.configuration.deployment.JavaDeploymentSourceUtilImpl"/>
<remoteServer.deploymentSource.type implementation="com.intellij.remoteServer.impl.configuration.deployment.ArtifactDeploymentSourceType"/>
+ <moduleBuilder builderClass="com.intellij.remoteServer.impl.module.CloudModuleBuilder"/>
</extensions>
</idea-plugin> \ No newline at end of file
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java
new file mode 100644
index 000000000000..14bd043a7f23
--- /dev/null
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfigurable.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.remoteServer.impl.module;
+
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.options.ConfigurationException;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Disposer;
+import com.intellij.remoteServer.configuration.RemoteServer;
+import com.intellij.remoteServer.runtime.Deployment;
+import com.intellij.remoteServer.runtime.ServerConnection;
+import com.intellij.remoteServer.runtime.ServerConnector;
+import com.intellij.remoteServer.runtime.deployment.ServerRuntimeInstance;
+import com.intellij.remoteServer.util.*;
+import com.intellij.util.concurrency.Semaphore;
+import com.intellij.util.ui.UIUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import java.util.Collection;
+import java.util.concurrent.atomic.AtomicReference;
+
+
+public abstract class CloudApplicationConfigurable<
+ SC extends CloudConfigurationBase,
+ DC extends CloudDeploymentNameConfiguration,
+ SR extends CloudMultiSourceServerRuntimeInstance<DC, ?, ?, ?>,
+ AC extends CloudApplicationConfiguration> {
+
+ private final Project myProject;
+ private final Disposable myParentDisposable;
+
+ private DelayedRunner myRunner;
+
+ private RemoteServer<?> myAccount;
+
+ public CloudApplicationConfigurable(@Nullable Project project, Disposable parentDisposable) {
+ myProject = project;
+ myParentDisposable = parentDisposable;
+ }
+
+ public void setAccount(RemoteServer<?> account) {
+ myAccount = account;
+ clearCloudData();
+ }
+
+ protected RemoteServer<SC> getAccount() {
+ return (RemoteServer<SC>)myAccount;
+ }
+
+ public JComponent getComponent() {
+ JComponent result = getMainPanel();
+ if (myRunner == null) {
+ myRunner = new DelayedRunner(result) {
+
+ private RemoteServer<?> myPreviousAccount;
+
+ @Override
+ protected boolean wasChanged() {
+ boolean result = myPreviousAccount != myAccount;
+ if (result) {
+ myPreviousAccount = myAccount;
+ }
+ return result;
+ }
+
+ @Override
+ protected void run() {
+ loadCloudData();
+ }
+ };
+ Disposer.register(myParentDisposable, myRunner);
+ }
+ return result;
+ }
+
+ protected void clearCloudData() {
+ getExistingComboBox().removeAllItems();
+ }
+
+ protected void loadCloudData() {
+ new ConnectionTask<Collection<Deployment>>("Loading existing applications list") {
+
+ @Override
+ protected void run(final ServerConnection<DC> connection,
+ final Semaphore semaphore,
+ final AtomicReference<Collection<Deployment>> result) {
+ connection.connectIfNeeded(new ServerConnector.ConnectionCallback<DC>() {
+
+ @Override
+ public void connected(@NotNull ServerRuntimeInstance<DC> serverRuntimeInstance) {
+ connection.computeDeployments(new Runnable() {
+
+ @Override
+ public void run() {
+ result.set(connection.getDeployments());
+ semaphore.up();
+ UIUtil.invokeLaterIfNeeded(new Runnable() {
+ @Override
+ public void run() {
+ if (!Disposer.isDisposed(myParentDisposable)) {
+ setupExistingApplications(result.get());
+ }
+ }
+ });
+ }
+ });
+ }
+
+ @Override
+ public void errorOccurred(@NotNull String errorMessage) {
+ runtimeErrorOccurred(errorMessage);
+ semaphore.up();
+ }
+ });
+ }
+
+ @Override
+ protected Collection<Deployment> run(SR serverRuntimeInstance) throws ServerRuntimeException {
+ return null;
+ }
+ }.performAsync();
+ }
+
+ private void setupExistingApplications(Collection<Deployment> deployments) {
+ JComboBox existingComboBox = getExistingComboBox();
+ existingComboBox.removeAllItems();
+ for (Deployment deployment : deployments) {
+ existingComboBox.addItem(deployment.getName());
+ }
+ }
+
+ protected Project getProject() {
+ return myProject;
+ }
+
+ protected abstract JComboBox getExistingComboBox();
+
+ protected abstract JComponent getMainPanel();
+
+ public abstract AC createConfiguration();
+
+ public abstract void validate() throws ConfigurationException;
+
+ protected abstract class ConnectionTask<T> extends CloudConnectionTask<T, SC, DC, SR> {
+
+ public ConnectionTask(String title) {
+ super(myProject, title, CloudApplicationConfigurable.this.getAccount());
+ }
+ }
+}
+
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java
new file mode 100644
index 000000000000..9af0f1ad472b
--- /dev/null
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudApplicationConfiguration.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.remoteServer.impl.module;
+
+
+public abstract class CloudApplicationConfiguration {
+
+ private boolean myExisting;
+ private final String myExistingAppName;
+
+ protected CloudApplicationConfiguration(boolean existing, String existingAppName) {
+ myExisting = existing;
+ myExistingAppName = existingAppName;
+ }
+
+ public boolean isExisting() {
+ return myExisting;
+ }
+
+ public String getExistingAppName() {
+ return myExistingAppName;
+ }
+}
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java
new file mode 100644
index 000000000000..4aa8d60bcea4
--- /dev/null
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilder.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.remoteServer.impl.module;
+
+import com.intellij.icons.AllIcons;
+import com.intellij.ide.util.projectWizard.JavaModuleBuilder;
+import com.intellij.ide.util.projectWizard.ModuleBuilderListener;
+import com.intellij.ide.util.projectWizard.ModuleWizardStep;
+import com.intellij.ide.util.projectWizard.WizardContext;
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.module.JavaModuleType;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
+import com.intellij.remoteServer.configuration.RemoteServer;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+
+
+public class CloudModuleBuilder extends JavaModuleBuilder {
+
+ private RemoteServer<?> myAccount;
+ private CloudApplicationConfiguration myApplicationConfiguration;
+
+ public CloudModuleBuilder() {
+ addListener(new ModuleBuilderListener() {
+
+ @Override
+ public void moduleCreated(@NotNull Module module) {
+ configureModule(module);
+ }
+ });
+ }
+
+ public String getBuilderId() {
+ return getClass().getName();
+ }
+
+ @Override
+ public Icon getBigIcon() {
+ return AllIcons.General.Balloon;
+ }
+
+ @Override
+ public Icon getNodeIcon() {
+ return AllIcons.General.Balloon;
+ }
+
+ @Override
+ public String getDescription() {
+ return "Java module of PAAS cloud application";
+ }
+
+ @Override
+ public String getPresentableName() {
+ return "Clouds";
+ }
+
+ @Override
+ public String getGroupName() {
+ return "Clouds";
+ }
+
+ @Override
+ public String getParentGroup() {
+ return JavaModuleType.JAVA_GROUP;
+ }
+
+ @Override
+ public int getWeight() {
+ return 30;
+ }
+
+ @Override
+ public ModuleWizardStep[] createWizardSteps(@NotNull WizardContext wizardContext, @NotNull ModulesProvider modulesProvider) {
+ return ModuleWizardStep.EMPTY_ARRAY;
+ }
+
+ @Nullable
+ @Override
+ public ModuleWizardStep getCustomOptionsStep(WizardContext context, Disposable parentDisposable) {
+ return new CloudModuleWizardStep(this, context.getProject(), parentDisposable);
+ }
+
+ public void setAccount(RemoteServer<?> account) {
+ myAccount = account;
+ }
+
+ public RemoteServer<?> getAccount() {
+ return myAccount;
+ }
+
+ public void setApplicationConfiguration(CloudApplicationConfiguration applicationConfiguration) {
+ myApplicationConfiguration = applicationConfiguration;
+ }
+
+ private void configureModule(final Module module) {
+ CloudModuleBuilderContribution.getInstanceByType(myAccount.getType()).configureModule(module, myAccount, myApplicationConfiguration);
+ }
+}
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java
new file mode 100644
index 000000000000..6643c89cc1c4
--- /dev/null
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContribution.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.remoteServer.impl.module;
+
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.extensions.ExtensionPointName;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.remoteServer.ServerType;
+import com.intellij.remoteServer.configuration.RemoteServer;
+import org.jetbrains.annotations.Nullable;
+
+
+public abstract class CloudModuleBuilderContribution {
+
+ public static final ExtensionPointName<CloudModuleBuilderContribution> EP_NAME
+ = ExtensionPointName.create("com.intellij.remoteServer.moduleBuilderContribution");
+
+ public abstract ServerType<?> getCloudType();
+
+ public abstract CloudApplicationConfigurable createApplicationConfigurable(@Nullable Project project, Disposable parentDisposable);
+
+ public abstract void configureModule(Module module,
+ RemoteServer<?> account,
+ CloudApplicationConfiguration configuration);
+
+ public static CloudModuleBuilderContribution getInstanceByType(ServerType<?> cloudType) {
+ for (CloudModuleBuilderContribution contribution : EP_NAME.getExtensions()) {
+ if (contribution.getCloudType() == cloudType) {
+ return contribution;
+ }
+ }
+ return null;
+ }
+}
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionBase.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionBase.java
new file mode 100644
index 000000000000..6a927d97bb93
--- /dev/null
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleBuilderContributionBase.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.remoteServer.impl.module;
+
+import com.intellij.execution.RunManagerEx;
+import com.intellij.execution.RunnerAndConfigurationSettings;
+import com.intellij.execution.configurations.ConfigurationType;
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModulePointer;
+import com.intellij.openapi.module.ModulePointerManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.MessageType;
+import com.intellij.remoteServer.ServerType;
+import com.intellij.remoteServer.configuration.RemoteServer;
+import com.intellij.remoteServer.impl.configuration.deployment.DeployToServerConfigurationType;
+import com.intellij.remoteServer.impl.configuration.deployment.DeployToServerRunConfiguration;
+import com.intellij.remoteServer.impl.configuration.deployment.ModuleDeploymentSourceImpl;
+import com.intellij.remoteServer.util.*;
+import com.intellij.remoteServer.util.ssh.SshKeyChecker;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+
+public abstract class CloudModuleBuilderContributionBase<
+ SC extends CloudConfigurationBase,
+ DC extends CloudDeploymentNameConfiguration,
+ AC extends CloudApplicationConfiguration,
+ SR extends CloudMultiSourceServerRuntimeInstance<DC, ?, ?, ?>>
+ extends CloudModuleBuilderContribution {
+
+ @Override
+ public void configureModule(Module module,
+ RemoteServer<?> account,
+ CloudApplicationConfiguration applicationConfiguration) {
+ RemoteServer<SC> castedAccount = (RemoteServer<SC>)account;
+ final AC castedApplicationConfiguration = (AC)applicationConfiguration;
+
+ DC deploymentConfiguration = createDeploymentConfiguration();
+
+ if (applicationConfiguration.isExisting()) {
+ deploymentConfiguration.setDefaultDeploymentName(false);
+ deploymentConfiguration.setDeploymentName(applicationConfiguration.getExistingAppName());
+ }
+
+ final DeployToServerRunConfiguration<SC, DC> runConfiguration = createRunConfiguration(module, castedAccount, deploymentConfiguration);
+
+ final String cloudName = account.getType().getPresentableName();
+ final Project project = module.getProject();
+ new CloudConnectionTask<Object, SC, DC, SR>(project, CloudBundle.getText("cloud.support", cloudName), castedAccount) {
+
+ CloudNotifier myNotifier = new CloudNotifier(cloudName);
+
+ boolean myFirstAttempt = true;
+
+ @Override
+ protected Object run(SR serverRuntime) throws ServerRuntimeException {
+ doConfigureModule(castedApplicationConfiguration, runConfiguration, myFirstAttempt, serverRuntime);
+ myNotifier.showMessage(CloudBundle.getText("cloud.support.added", cloudName), MessageType.INFO);
+ return null;
+ }
+
+ @Override
+ protected void runtimeErrorOccurred(@NotNull String errorMessage) {
+ myFirstAttempt = false;
+ new SshKeyChecker().checkServerError(errorMessage, myNotifier, project, this);
+ }
+ }.performAsync();
+ }
+
+ private DeployToServerRunConfiguration<SC, DC> createRunConfiguration(Module module,
+ RemoteServer<SC> server,
+ DC deploymentConfiguration) {
+ Project project = module.getProject();
+
+ String serverName = server.getName();
+
+ String name = generateRunConfigurationName(serverName, module.getName());
+
+ final RunManagerEx runManager = RunManagerEx.getInstanceEx(project);
+ final RunnerAndConfigurationSettings runSettings
+ = runManager.createRunConfiguration(name, getRunConfigurationType().getConfigurationFactories()[0]);
+
+ final DeployToServerRunConfiguration<SC, DC> result = (DeployToServerRunConfiguration<SC, DC>)runSettings.getConfiguration();
+
+ result.setServerName(serverName);
+
+ final ModulePointer modulePointer = ModulePointerManager.getInstance(project).create(module);
+ result.setDeploymentSource(new ModuleDeploymentSourceImpl(modulePointer));
+
+ result.setDeploymentConfiguration(deploymentConfiguration);
+
+ runManager.addConfiguration(runSettings, false);
+ runManager.setSelectedConfiguration(runSettings);
+
+ return result;
+ }
+
+ private static String generateRunConfigurationName(String serverName, String moduleName) {
+ return CloudBundle.getText("run.configuration.name", serverName, moduleName);
+ }
+
+ private DeployToServerConfigurationType getRunConfigurationType() {
+ String id = DeployToServerConfigurationType.getId(getCloudType());
+ for (ConfigurationType configurationType : ConfigurationType.CONFIGURATION_TYPE_EP.getExtensions()) {
+ if (configurationType instanceof DeployToServerConfigurationType) {
+ DeployToServerConfigurationType deployConfigurationType = (DeployToServerConfigurationType)configurationType;
+ if (deployConfigurationType.getId().equals(id)) {
+ return deployConfigurationType;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public abstract ServerType<SC> getCloudType();
+
+ @Override
+ public abstract CloudApplicationConfigurable<SC, DC, SR, AC> createApplicationConfigurable(@Nullable Project project,
+ Disposable parentDisposable);
+
+ protected abstract DC createDeploymentConfiguration();
+
+ protected abstract void doConfigureModule(AC applicationConfiguration,
+ DeployToServerRunConfiguration<SC, DC> runConfiguration,
+ boolean firstAttempt,
+ SR serverRuntime) throws ServerRuntimeException;
+}
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.form b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.form
new file mode 100644
index 000000000000..19cbaa7f2a5f
--- /dev/null
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.form
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.remoteServer.impl.module.CloudModuleWizardStep">
+ <grid id="27dc6" binding="myMainPanel" layout-manager="GridLayoutManager" row-count="5" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <margin top="0" left="0" bottom="0" right="0"/>
+ <constraints>
+ <xy x="20" y="20" width="415" height="400"/>
+ </constraints>
+ <properties/>
+ <border type="none"/>
+ <children>
+ <grid id="b29a2" binding="myAccountPanelPlaceHolder" layout-manager="BorderLayout" hgap="0" vgap="0">
+ <constraints>
+ <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties/>
+ <border type="none"/>
+ <children/>
+ </grid>
+ <vspacer id="276c3">
+ <constraints>
+ <grid row="4" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+ </constraints>
+ </vspacer>
+ <component id="dd5e7" class="com.intellij.ui.TitledSeparator">
+ <constraints>
+ <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <text value="Account"/>
+ </properties>
+ </component>
+ <component id="61d9c" class="com.intellij.ui.TitledSeparator">
+ <constraints>
+ <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <text value="Application"/>
+ </properties>
+ </component>
+ <grid id="582a2" binding="myApplicationPanelPlaceHolder" layout-manager="CardLayout" hgap="0" vgap="0">
+ <constraints>
+ <grid row="3" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties/>
+ <border type="none"/>
+ <children/>
+ </grid>
+ </children>
+ </grid>
+</form>
diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.java
new file mode 100644
index 000000000000..cf0e283616b2
--- /dev/null
+++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/module/CloudModuleWizardStep.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.remoteServer.impl.module;
+
+import com.intellij.ide.util.projectWizard.ModuleWizardStep;
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.options.ConfigurationException;
+import com.intellij.openapi.project.Project;
+import com.intellij.remoteServer.ServerType;
+import com.intellij.remoteServer.configuration.RemoteServer;
+import com.intellij.remoteServer.util.CloudAccountSelectionEditor;
+import com.intellij.util.containers.hash.HashMap;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+public class CloudModuleWizardStep extends ModuleWizardStep {
+
+ private JPanel myMainPanel;
+ private JPanel myAccountPanelPlaceHolder;
+ private JPanel myApplicationPanelPlaceHolder;
+
+ private final CloudModuleBuilder myModuleBuilder;
+ private final Project myProject;
+ private final Disposable myParentDisposable;
+
+ private CloudAccountSelectionEditor myAccountSelectionPanel;
+
+ private Map<ServerType<?>, CloudApplicationConfigurable> myCloudType2ApplicationConfigurable;
+
+ public CloudModuleWizardStep(CloudModuleBuilder moduleBuilder, Project project, Disposable parentDisposable) {
+ myModuleBuilder = moduleBuilder;
+ myProject = project;
+ myParentDisposable = parentDisposable;
+
+ myCloudType2ApplicationConfigurable = new HashMap<ServerType<?>, CloudApplicationConfigurable>();
+
+ List<ServerType<?>> cloudTypes = new ArrayList<ServerType<?>>();
+ for (CloudModuleBuilderContribution contribution : CloudModuleBuilderContribution.EP_NAME.getExtensions()) {
+ cloudTypes.add(contribution.getCloudType());
+ }
+
+ myAccountSelectionPanel = new CloudAccountSelectionEditor(cloudTypes);
+ myAccountPanelPlaceHolder.add(myAccountSelectionPanel.getMainPanel());
+
+ myAccountSelectionPanel.setAccountSelectionListener(new Runnable() {
+
+ @Override
+ public void run() {
+ onAccountSelectionChanged();
+ }
+ });
+ onAccountSelectionChanged();
+ }
+
+ private RemoteServer<?> getSelectedAccount() {
+ return myAccountSelectionPanel.getSelectedAccount();
+ }
+
+ private void onAccountSelectionChanged() {
+ CardLayout applicationPlaceHolderLayout = (CardLayout)myApplicationPanelPlaceHolder.getLayout();
+
+ RemoteServer<?> account = getSelectedAccount();
+ boolean haveAccount = account != null;
+ myApplicationPanelPlaceHolder.setVisible(haveAccount);
+ if (!haveAccount) {
+ return;
+ }
+
+ ServerType<?> cloudType = account.getType();
+ String cardName = cloudType.getId();
+ CloudApplicationConfigurable<?, ?, ?, ?> applicationConfigurable = getApplicationConfigurable();
+ if (applicationConfigurable == null) {
+ applicationConfigurable
+ = CloudModuleBuilderContribution.getInstanceByType(cloudType).createApplicationConfigurable(myProject, myParentDisposable);
+ myCloudType2ApplicationConfigurable.put(cloudType, applicationConfigurable);
+ myApplicationPanelPlaceHolder.add(applicationConfigurable.getComponent(), cardName);
+ }
+ applicationPlaceHolderLayout.show(myApplicationPanelPlaceHolder, cardName);
+
+ applicationConfigurable.setAccount(account);
+ }
+
+ @Override
+ public JComponent getComponent() {
+ return myMainPanel;
+ }
+
+ private CloudApplicationConfigurable<?, ?, ?, ?> getApplicationConfigurable() {
+ RemoteServer<?> account = getSelectedAccount();
+ if (account == null) {
+ return null;
+ }
+ return myCloudType2ApplicationConfigurable.get(account.getType());
+ }
+
+ @Override
+ public void updateDataModel() {
+ myModuleBuilder.setAccount(myAccountSelectionPanel.getSelectedAccount());
+ CloudApplicationConfigurable<?, ?, ?, ?> configurable = getApplicationConfigurable();
+ myModuleBuilder.setApplicationConfiguration(configurable == null ? null : configurable.createConfiguration());
+ }
+
+ @Override
+ public boolean validate() throws ConfigurationException {
+ myAccountSelectionPanel.validate();
+ CloudApplicationConfigurable<?, ?, ?, ?> configurable = getApplicationConfigurable();
+ if (configurable != null) {
+ configurable.validate();
+ }
+ return super.validate();
+ }
+}
diff --git a/java/structuralsearch-java/src/META-INF/structuralsearch-java.xml b/java/structuralsearch-java/src/META-INF/structuralsearch-java.xml
new file mode 100644
index 000000000000..765a70d281bd
--- /dev/null
+++ b/java/structuralsearch-java/src/META-INF/structuralsearch-java.xml
@@ -0,0 +1,6 @@
+<idea-plugin>
+ <extensions defaultExtensionNs="com.intellij">
+ <structuralsearch.profile implementation="com.intellij.structuralsearch.JavaStructuralSearchProfile"/>
+ <structuralsearch.matchPredicateProvider implementation="com.intellij.structuralsearch.impl.matcher.JavaMatchPredicateProvider"/>
+ </extensions>
+</idea-plugin>
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java
new file mode 100644
index 000000000000..a82c941c0fa2
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java
@@ -0,0 +1,296 @@
+package com.intellij.structuralsearch;
+
+import com.intellij.structuralsearch.plugin.ui.Configuration;
+
+import static com.intellij.structuralsearch.PredefinedConfigurationUtil.createSearchTemplateInfo;
+import static com.intellij.structuralsearch.PredefinedConfigurationUtil.createSearchTemplateInfoSimple;
+
+/**
+* @author Bas Leijdekkers
+*/
+class JavaPredefinedConfigurations {
+
+ private static final String EXPRESSION_TYPE = SSRBundle.message("expressions.category");
+ private static final String INTERESTING_TYPE = SSRBundle.message("interesting.category");
+ private static final String J2EE_TYPE = SSRBundle.message("j2ee.category");
+ private static final String OPERATOR_TYPE = SSRBundle.message("operators.category");
+ private static final String CLASS_TYPE = SSRBundle.message("class.category");
+ private static final String METADATA_TYPE = SSRBundle.message("metadata.category");
+ private static final String MISC_TYPE = SSRBundle.message("misc.category");
+ private static final String GENERICS_TYPE = SSRBundle.message("generics.category");
+
+ public static Configuration[] createPredefinedTemplates() {
+ return new Configuration[] {
+ // Expression patterns
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.method.calls"), "'_Instance?.'MethodCall('_Parameter*)", EXPRESSION_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.new.expressions"), "new 'Constructor('_Argument*)", EXPRESSION_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.lambdas"), "('_Parameter) -> ", EXPRESSION_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.field.selections"),"'_Instance?.'Field",EXPRESSION_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.array.access"),"'_Field['_Index]",EXPRESSION_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.assignments"),"'_Inst = '_Expr",EXPRESSION_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.casts"),"('_Type)'_Expr",EXPRESSION_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.instanceof"),"'_Expr instanceof '_Type",EXPRESSION_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.string.literals"),"\"'_String\"",EXPRESSION_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.all.expressions.of.some.type"),"'_Expression:[exprtype( SomeType )]",EXPRESSION_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.sample.method.invokation.with.constant.argument"),"Integer.parseInt('_a:[script( \"com.intellij.psi.util.PsiUtil.isConstantExpression(__context__)\" )])",EXPRESSION_TYPE),
+
+ // Operators
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.block.dcls"),"{\n '_Type+ 'Var+ = '_Init*;\n '_BlockStatements*;\n}",OPERATOR_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.trys"),"try {\n '_TryStatement+;\n} catch('_ExceptionType '_ExceptionDcl) {\n '_CatchStatement*;\n}",OPERATOR_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.ifs"),"if ('_Condition) {\n '_ThenStatement*;\n} else {\n '_ElseStatement*;\n}",OPERATOR_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.switches"),"switch('_Condition) {\n '_Statement*;\n}",OPERATOR_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.foreaches"), "for ('_Type '_Variable : '_Expression) {\n '_Statement*;\n}", OPERATOR_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.logging.without.if"),"LOG.debug('_params*:[!within( \"if('_a) { '_st*; }\" )]);",OPERATOR_TYPE),
+
+ // Class based
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.methods.of.the.class"),
+ "class '_Class { \n '_ReturnType+ 'MethodName+('_ParameterType* '_Parameter*);\n}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.fields.of.the.class"),
+ "class '_Class { \n '_FieldType+ 'FieldName+ = '_Init*;\n}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.all.methods.of.the.class.within.hierarchy"),
+ "class '_ { \n '_ReturnType+ 'MethodName+:* ('_ParameterType* '_Parameter*);\n}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.all.fields.of.the.class"),
+ "class '_Class { \n '_FieldType+ 'FieldName+:* = '_Init*;\n}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.instance.fields.of.the.class"),
+ "class '_Class { \n @Modifier(\"Instance\") '_FieldType+ 'FieldName+ = '_Init*;\n}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.packagelocal.fields.of.the.class"),
+ "class '_Class { \n @Modifier(\"packageLocal\") '_FieldType+ 'FieldName+ = '_Init*;\n}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.constructors.of.the.class"),
+ "class 'Class {\n 'Class+('_ParameterType* '_ParameterName*) {\n '_Statement*;\n }\n}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.classes"),
+ "class 'Class {}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.direct.subclasses"),
+ "class 'Class extends '_Parent {}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.implementors.of.interface.within.hierarchy"),
+ "class 'Class implements 'Interface:* {}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.interfaces"),
+ "interface 'Interface {}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.inner.classes"),
+ "class '_ {\n class 'InnerClass+ {}\n}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.all.inner.classes.within.hierarchy"),
+ "class '_Class {\n class 'InnerClass+:* {}\n}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.anonymous.classes"),
+ "new 'AnonymousClass() {}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.class.implements.two.interfaces"),
+ "class 'A implements '_Interface1:[regex( *java\\.lang\\.Cloneable )], '_Interface2:*java\\.io\\.Serializable {\n" +"}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.class.static.blocks"),
+ "class '_A {\n static {\n 'Statement*;\n }\n}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.class.instance.initialization.blocks"),
+ "class '_A {\n @Modifier(\"Instance\") {\n 'Statement*;\n }\n}",
+ CLASS_TYPE
+ ),
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.class.any.initialization.blocks"),
+ "class '_A {\n {\n 'Statement*;\n }\n}",
+ CLASS_TYPE
+ ),
+
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.enums"),
+ "enum 'Enum {}",
+ CLASS_TYPE
+ ),
+
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.class.with.parameterless.constructors"),
+ "class 'Class {\n '_Method{0,0}:[ script( \"__context__.constructor\" ) ]('_ParamType+ '_ParameterName+);\n}",
+ CLASS_TYPE
+ ),
+
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.static.fields.without.final"),
+ "class '_Class {\n static '_Type 'Variable+:[ script( \"!__context__.hasModifierProperty(\"final\")\" ) ] = '_Init?;\n}",
+ CLASS_TYPE
+ ),
+
+ createSearchTemplateInfo(
+ SSRBundle.message("predefined.configuration.interfaces.having.no.descendants"),
+ "interface 'A:[script( \"com.intellij.psi.search.searches.ClassInheritorsSearch.search(__context__).findFirst() == null\" )] {}",
+ CLASS_TYPE
+ ),
+
+ // Generics
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.generic.classes"),"class 'GenericClass<'_TypeParameter+> {} ", GENERICS_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.generic.methods"),"class '_Class {\n <'_TypeParameter+> '_Type+ 'Method+('_ParameterType* '_ParameterDcl*);\n}", GENERICS_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.typed.symbol"),"'Symbol <'_GenericArgument+>", GENERICS_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.generic.casts"),"( '_Type <'_GenericArgument+> ) '_Expr", GENERICS_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.type.var.substitutions.in.intanceof.with.generic.types"),"'_Expr instanceof '_Type <'Substitutions+> ", GENERICS_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.variables.of.generic.types"),"'_Type <'_GenericArgument+> 'Var = 'Init?;", GENERICS_TYPE),
+
+ // Add comments and metadata
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.comments"),"/* 'CommentContent */", METADATA_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.javadoc.annotated.class"),"/** @'_Tag+ '_TagValue* */\nclass '_Class {\n}", METADATA_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.javadoc.annotated.methods"),"class '_Class {\n /** @'_Tag+ '_TagValue* */\n '_Type+ 'Method+('_ParameterType* '_ParameterDcl*);\n}", METADATA_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.javadoc.annotated.fields"),"class '_Class {\n /** @'_Tag+ '_TagValue* */\n '_Type+ 'Field+ = '_Init*;\n}", METADATA_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.javadoc.tags"),"/** @'Tag+ '_TagValue* */", METADATA_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.xdoclet.metadata"),"/** @'Tag \n '_Property+\n*/", METADATA_TYPE),
+
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.annotated.class"),
+ "@'_Annotation( )\n" +
+ "class 'Class {}", METADATA_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.annotated.fields"),
+ "class '_Class {\n" +
+ " @'_Annotation+( )\n" +
+ " '_FieldType+ 'FieldName+ = '_FieldInitial*;\n" +
+ "}", METADATA_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.annotated.methods"),
+ "class '_Class {\n" +
+ " @'_Annotation+( )\n" +
+ " '_MethodType+ 'MethodName+('_ParameterType* '_ParameterName*);\n" +
+ "}", METADATA_TYPE),
+
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.not.annotated.methods"),
+ "class '_Class {\n" +
+ " @'_Annotation{0,0}\n" +
+ " '_MethodType+ 'MethodName+('_ParameterType* '_ParameterName*);\n" +
+ "}", METADATA_TYPE),
+
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.annotation.declarations"),
+ "@interface 'Interface {}", METADATA_TYPE),
+
+ // J2EE templates
+ createSearchTemplateInfoSimple(SSRBundle.message("predefined.configuration.struts.1.1.actions"),"public class 'StrutsActionClass extends '_ParentClass*:Action {\n" +
+ " public ActionForward 'AnActionMethod:*execute (ActionMapping '_action,\n" +
+ " ActionForm '_form,\n" +
+ " HttpServletRequest '_request,\n" +
+ " HttpServletResponse '_response);\n" +
+ "}",J2EE_TYPE),
+ createSearchTemplateInfoSimple(SSRBundle.message("predefined.configuration.entity.ejb"),"class 'EntityBean implements EntityBean {\n" +
+ " EntityContext '_Context?;\n\n" +
+ " public void setEntityContext(EntityContext '_Context2);\n\n" +
+ " public '_RetType ejbCreate('_CreateType* '_CreateDcl*);\n" +
+ " public void ejbActivate();\n\n" +
+ " public void ejbLoad();\n\n" +
+ " public void ejbPassivate();\n\n" +
+ " public void ejbRemove();\n\n" +
+ " public void ejbStore();\n" +
+ "}", J2EE_TYPE),
+ createSearchTemplateInfoSimple(SSRBundle.message("predefined.configuration.session.ejb"),"class 'SessionBean implements SessionBean {\n" +
+ " SessionContext '_Context?;\n\n" +
+ " public void '_setSessionContext(SessionContext '_Context2);\n\n" +
+ " public '_RetType ejbCreate('_CreateParameterType* '_CreateParameterDcl*);\n" +
+ " public void ejbActivate();\n\n" +
+ " public void ejbPassivate();\n\n" +
+ " public void ejbRemove();\n" +
+ "}", J2EE_TYPE),
+ createSearchTemplateInfoSimple(SSRBundle.message("predefined.configuration.ejb.interface"),"interface 'EjbInterface extends EJBObject {\n" +
+ " 'Type+ 'Method+('ParamType* 'ParamName*);\n" +
+ "}", J2EE_TYPE),
+ createSearchTemplateInfoSimple(SSRBundle.message("predefined.configuration.servlets"),"public class 'Servlet extends '_ParentClass:*HttpServlet {\n" +
+ " public void '_InitServletMethod?:init ();\n" +
+ " public void '_DestroyServletMethod?:destroy ();\n" +
+ " void '_ServiceMethod?:*service (HttpServletRequest '_request, HttpServletResponse '_response);\n" +
+ " void '_SpecificServiceMethod*:do.* (HttpServletRequest '_request2, HttpServletResponse '_response2); \n" +
+ "}", J2EE_TYPE),
+ createSearchTemplateInfoSimple(SSRBundle.message("predefined.configuration.filters"),"public class 'Filter implements Filter {\n" +
+ " public void '_DestroyFilterMethod?:*destroy ();\n" +
+ " public void '_InitFilterMethod?:*init ();\n" +
+ " public void '_FilteringMethod:*doFilter (ServletRequest '_request,\n" +
+ " ServletResponse '_response,FilterChain '_chain);\n" +
+ "}", J2EE_TYPE),
+
+ // Misc types
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.serializable.classes.and.their.serialization.implementation"),
+ "class '_Class implements '_Serializable:*Serializable {\n" +
+ " static final long 'VersionField?:serialVersionUID = '_VersionFieldInit?;\n" +
+ " private static final ObjectStreamField[] '_persistentFields?:serialPersistentFields = '_persistentFieldInitial?; \n" +
+ " private void 'SerializationWriteHandler?:writeObject (ObjectOutputStream '_stream) throws IOException;\n" +
+ " private void 'SerializationReadHandler?:readObject (ObjectInputStream '_stream2) throws IOException, ClassNotFoundException;\n" +
+ " Object 'SpecialSerializationReadHandler?:readResolve () throws ObjectStreamException;\n" +
+ " Object 'SpecialSerializationWriteHandler?:writeReplace () throws ObjectStreamException;\n" +
+ "}",MISC_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.cloneable.implementations"),
+ "class '_Class implements '_Interface:*Cloneable {\n" +
+ " Object 'CloningMethod:*clone ();\n" +
+ "}",MISC_TYPE),
+ createSearchTemplateInfoSimple(SSRBundle.message("predefined.configuration.]junit.test.cases"),"public class 'TestCase extends 'TestCaseClazz:*TestCase {\n" +
+ " public void '_testMethod+:test.* ();\n" +
+ "}", MISC_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.singletons"),"class 'Class {\n" +
+ " private 'Class('_ParameterType* '_ParameterDcl*) {\n" +
+ " '_ConstructorStatement*;\n" +
+ " }\n"+
+ " private static '_Class:* '_Instance;\n" +
+ " static '_Class:* '_GetInstance() {\n" +
+ " '_SomeStatement*;\n" +
+ " return '_Instance;\n" +
+ " }\n"+
+ "}",MISC_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.similar.methods.structure"),"class '_Class {\n" +
+ " '_RetType 'Method+('_ParameterType* '_Parameter) throws 'ExceptionType {\n" +
+ " try {\n" +
+ " '_OtherStatements+;\n" +
+ " } catch('_SomeException '_ExceptionDcl) {\n" +
+ " '_CatchStatement*;\n" +
+ " throw new 'ExceptionType('_ExceptionConstructorArgs*);\n" +
+ " }\n" +
+ " }\n" +
+ "}",MISC_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.bean.info.classes"),"class 'A implements '_:*java\\.beans\\.BeanInfo {\n" +
+ "}",MISC_TYPE),
+
+ // interesting types
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.symbol"),"'Symbol",INTERESTING_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.fields.variables.read"),"'Symbol:[read]",INTERESTING_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.fields_variables.with.given.name.pattern.updated"),"'Symbol:[regex( name ) && write]",INTERESTING_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.usage.of.derived.type.in.cast"),"('CastType:*Base ) 'Expr",INTERESTING_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.boxing.in.declarations"),"'_Type:Integer|Boolean|Long|Character|Short|Byte 'Var = '_Value:[formal( int|boolean|long|char|short|byte )]",INTERESTING_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.unboxing.in.declarations"),"'_Type:int|boolean|long|char|short|byte 'Var = '_Value:[formal( Integer|Boolean|Long|Character|Short|Byte )]",INTERESTING_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.boxing.in.method.calls"),"'_Instance?.'Call('_BeforeParam*,'_Param:[ exprtype( int|boolean|long|char|short|byte ) && formal( Integer|Boolean|Long|Character|Short|Byte )],'_AfterParam*)",INTERESTING_TYPE),
+ createSearchTemplateInfo(SSRBundle.message("predefined.configuration.unboxing.in.method.calls"), "'_Instance?.'Call('_BeforeParam*,'_Param:[ formal( int|boolean|long|char|short|byte ) && exprtype( Integer|Boolean|Long|Character|Short|Byte )],'_AfterParam*)",INTERESTING_TYPE),
+ //createSearchTemplateInfo("methods called","'_?.'_:[ref('Method)] ('_*)", INTERESTING_TYPE),
+ //createSearchTemplateInfo("fields selected","'_?.'_:[ref('Field)] ", INTERESTING_TYPE),
+ //createSearchTemplateInfo("symbols used","'_:[ref('Symbol)] ", INTERESTING_TYPE),
+ //createSearchTemplateInfo("types used","'_:[ref('Type)] '_;", INTERESTING_TYPE),
+ };
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java
new file mode 100644
index 000000000000..562c8aee753c
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java
@@ -0,0 +1,557 @@
+package com.intellij.structuralsearch;
+
+import com.intellij.openapi.fileTypes.StdFileTypes;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.*;
+import com.intellij.psi.codeStyle.JavaCodeStyleManager;
+import com.intellij.psi.javadoc.PsiDocComment;
+import com.intellij.psi.xml.XmlText;
+import com.intellij.structuralsearch.impl.matcher.JavaMatchingVisitor;
+import com.intellij.structuralsearch.impl.matcher.MatcherImplUtil;
+import com.intellij.structuralsearch.impl.matcher.PatternTreeContext;
+import com.intellij.structuralsearch.plugin.replace.ReplaceOptions;
+import com.intellij.structuralsearch.plugin.replace.ReplacementInfo;
+import com.intellij.structuralsearch.plugin.replace.impl.ReplacementContext;
+import com.intellij.structuralsearch.plugin.replace.impl.Replacer;
+import com.intellij.structuralsearch.plugin.replace.impl.ReplacerUtil;
+import com.intellij.util.IncorrectOperationException;
+import com.siyeh.ig.psiutils.ImportUtils;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Eugene.Kudelevsky
+ */
+public class JavaReplaceHandler extends StructuralReplaceHandler {
+ private final ReplacementContext myContext;
+ private PsiCodeBlock codeBlock;
+
+ public JavaReplaceHandler(ReplacementContext context) {
+ this.myContext = context;
+ }
+
+ private PsiCodeBlock getCodeBlock() throws IncorrectOperationException {
+ if (codeBlock == null) {
+ codeBlock = (PsiCodeBlock)MatcherImplUtil.createTreeFromText(
+ myContext.getOptions().getMatchOptions().getSearchPattern(),
+ PatternTreeContext.Block,
+ myContext.getOptions().getMatchOptions().getFileType(),
+ myContext.getProject()
+ )[0].getParent();
+ }
+ return codeBlock;
+ }
+
+ private static PsiElement findRealSubstitutionElement(PsiElement el) {
+ if (el instanceof PsiIdentifier) {
+ // matches are tokens, identifiers, etc
+ el = el.getParent();
+ }
+
+ if (el instanceof PsiReferenceExpression &&
+ el.getParent() instanceof PsiMethodCallExpression
+ ) {
+ // method
+ el = el.getParent();
+ }
+
+ if (el instanceof PsiDeclarationStatement && ((PsiDeclarationStatement)el).getDeclaredElements()[0] instanceof PsiClass) {
+ el = ((PsiDeclarationStatement)el).getDeclaredElements()[0];
+ }
+ return el;
+ }
+
+ private static boolean isListContext(PsiElement el) {
+ boolean listContext = false;
+ final PsiElement parent = el.getParent();
+
+ if (parent instanceof PsiParameterList ||
+ parent instanceof PsiExpressionList ||
+ parent instanceof PsiCodeBlock ||
+ parent instanceof PsiClass ||
+ parent instanceof XmlText ||
+ (parent instanceof PsiIfStatement &&
+ (((PsiIfStatement)parent).getThenBranch() == el ||
+ ((PsiIfStatement)parent).getElseBranch() == el
+ )
+ ) ||
+ (parent instanceof PsiLoopStatement &&
+ ((PsiLoopStatement)parent).getBody() == el
+ )
+ ) {
+ listContext = true;
+ }
+
+ return listContext;
+ }
+
+ @Nullable
+ private PsiNamedElement getSymbolReplacementTarget(final PsiElement el)
+ throws IncorrectOperationException {
+ if (myContext.getOptions().getMatchOptions().getFileType() != StdFileTypes.JAVA) return null; //?
+ final PsiStatement[] searchStatements = getCodeBlock().getStatements();
+ if (searchStatements.length > 0 &&
+ searchStatements[0] instanceof PsiExpressionStatement) {
+ final PsiExpression expression = ((PsiExpressionStatement)searchStatements[0]).getExpression();
+
+ if (expression instanceof PsiReferenceExpression &&
+ ((PsiReferenceExpression)expression).getQualifierExpression() == null
+ ) {
+ // looks like symbol replacements, namely replace AAA by BBB, so lets do the best
+ if (el instanceof PsiNamedElement) {
+ return (PsiNamedElement)el;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private static PsiElement getMatchExpr(PsiElement replacement, PsiElement elementToReplace) {
+ if (replacement instanceof PsiExpressionStatement &&
+ !(replacement.getLastChild() instanceof PsiJavaToken) &&
+ !(replacement.getLastChild() instanceof PsiComment)
+ ) {
+ // replacement is expression (and pattern should be so)
+ // assert ...
+ replacement = ((PsiExpressionStatement)replacement).getExpression();
+ }
+ else if (replacement instanceof PsiDeclarationStatement &&
+ ((PsiDeclarationStatement)replacement).getDeclaredElements().length == 1
+ ) {
+ return ((PsiDeclarationStatement)replacement).getDeclaredElements()[0];
+ }
+ else if (replacement instanceof PsiBlockStatement &&
+ elementToReplace instanceof PsiCodeBlock
+ ) {
+ return ((PsiBlockStatement)replacement).getCodeBlock();
+ }
+
+ return replacement;
+ }
+
+ private boolean isSymbolReplacement(final PsiElement el) throws IncorrectOperationException {
+ return getSymbolReplacementTarget(el) != null;
+ }
+
+ @SuppressWarnings({"unchecked", "ConstantConditions"})
+ private void handleModifierList(final PsiElement el, final PsiElement replacement) throws IncorrectOperationException {
+ // We want to copy all comments, including doc comments and modifier lists
+ // that are present in matched nodes but not present in search/replace
+
+ Map<String, String> newNameToSearchPatternNameMap = myContext.getNewName2PatternNameMap();
+
+ ModifierListOwnerCollector collector = new ModifierListOwnerCollector();
+ el.accept(collector);
+ Map<String, PsiNamedElement> originalNamedElements = (Map<String, PsiNamedElement>)collector.namedElements.clone();
+ collector.namedElements.clear();
+
+ replacement.accept(collector);
+ Map<String, PsiNamedElement> replacedNamedElements = (Map<String, PsiNamedElement>)collector.namedElements.clone();
+ collector.namedElements.clear();
+
+ if (originalNamedElements.size() == 0 && replacedNamedElements.size() == 0) {
+ Replacer.handleComments(el, replacement, myContext);
+ return;
+ }
+
+ final PsiStatement[] statements = getCodeBlock().getStatements();
+ if (statements.length > 0) {
+ statements[0].getParent().accept(collector);
+ }
+
+ Map<String, PsiNamedElement> searchedNamedElements = (Map<String, PsiNamedElement>)collector.namedElements.clone();
+ collector.namedElements.clear();
+
+ for (String name : originalNamedElements.keySet()) {
+ PsiNamedElement originalNamedElement = originalNamedElements.get(name);
+ PsiNamedElement replacementNamedElement = replacedNamedElements.get(name);
+ String key = newNameToSearchPatternNameMap.get(name);
+ if (key == null) key = name;
+ PsiNamedElement searchNamedElement = searchedNamedElements.get(key);
+
+ if (replacementNamedElement == null && originalNamedElements.size() == 1 && replacedNamedElements.size() == 1) {
+ replacementNamedElement = replacedNamedElements.entrySet().iterator().next().getValue();
+ }
+
+ PsiElement comment = null;
+
+ if (originalNamedElement instanceof PsiDocCommentOwner) {
+ comment = ((PsiDocCommentOwner)originalNamedElement).getDocComment();
+ if (comment == null) {
+ PsiElement prevElement = originalNamedElement.getPrevSibling();
+ if (prevElement instanceof PsiWhiteSpace) {
+ prevElement = prevElement.getPrevSibling();
+ }
+ if (prevElement instanceof PsiComment) {
+ comment = prevElement;
+ }
+ }
+ }
+
+ if (replacementNamedElement != null && searchNamedElement != null) {
+ Replacer.handleComments(originalNamedElement, replacementNamedElement, myContext);
+ }
+
+ if (comment != null && replacementNamedElement instanceof PsiDocCommentOwner &&
+ !(replacementNamedElement.getFirstChild() instanceof PsiDocComment)
+ ) {
+ final PsiElement nextSibling = comment.getNextSibling();
+ PsiElement prevSibling = comment.getPrevSibling();
+ replacementNamedElement.addRangeBefore(
+ prevSibling instanceof PsiWhiteSpace ? prevSibling : comment,
+ nextSibling instanceof PsiWhiteSpace ? nextSibling : comment,
+ replacementNamedElement.getFirstChild()
+ );
+ }
+
+ if (originalNamedElement instanceof PsiModifierListOwner &&
+ replacementNamedElement instanceof PsiModifierListOwner
+ ) {
+ PsiModifierList modifierList = ((PsiModifierListOwner)originalNamedElements.get(name)).getModifierList();
+
+ if (searchNamedElement instanceof PsiModifierListOwner) {
+ PsiModifierList modifierListOfSearchedElement = ((PsiModifierListOwner)searchNamedElement).getModifierList();
+ final PsiModifierListOwner modifierListOwner = ((PsiModifierListOwner)replacementNamedElement);
+ PsiModifierList modifierListOfReplacement = modifierListOwner.getModifierList();
+
+ if (modifierListOfSearchedElement.getTextLength() == 0 &&
+ modifierListOfReplacement.getTextLength() == 0 &&
+ modifierList.getTextLength() > 0
+ ) {
+ PsiElement space = modifierList.getNextSibling();
+ if (!(space instanceof PsiWhiteSpace)) {
+ space = createWhiteSpace(space);
+ }
+
+ modifierListOfReplacement.replace(modifierList);
+ // copy space after modifier list
+ if (space instanceof PsiWhiteSpace) {
+ modifierListOwner.addRangeAfter(space, space, modifierListOwner.getModifierList());
+ }
+ } else if (modifierListOfSearchedElement.getTextLength() == 0 && modifierList.getTextLength() > 0) {
+ modifierListOfReplacement.addRange(modifierList.getFirstChild(), modifierList.getLastChild());
+ }
+ }
+ }
+ }
+ }
+
+ private PsiElement handleSymbolReplacement(PsiElement replacement, final PsiElement el) throws IncorrectOperationException {
+ PsiNamedElement nameElement = getSymbolReplacementTarget(el);
+ if (nameElement != null) {
+ PsiElement oldReplacement = replacement;
+ replacement = el.copy();
+ ((PsiNamedElement)replacement).setName(oldReplacement.getText());
+ }
+
+ return replacement;
+ }
+
+ public void replace(final ReplacementInfo info, ReplaceOptions options) {
+ PsiElement elementToReplace = info.getMatch(0);
+ PsiElement elementParent = elementToReplace.getParent();
+ String replacementToMake = info.getReplacement();
+ Project project = myContext.getProject();
+ PsiElement el = findRealSubstitutionElement(elementToReplace);
+ boolean listContext = isListContext(el);
+
+ if (el instanceof PsiAnnotation && !StringUtil.startsWithChar(replacementToMake, '@')) {
+ replacementToMake = "@" + replacementToMake;
+ }
+
+ PsiElement[] statements = ReplacerUtil
+ .createTreeForReplacement(replacementToMake, el instanceof PsiMember && !isSymbolReplacement(el) ?
+ PatternTreeContext.Class :
+ PatternTreeContext.Block, myContext);
+
+ if (listContext) {
+ if (statements.length > 1) {
+ elementParent.addRangeBefore(statements[0], statements[statements.length - 1], elementToReplace);
+ }
+ else if (statements.length == 1) {
+ PsiElement replacement = getMatchExpr(statements[0], elementToReplace);
+
+ handleModifierList(el, replacement);
+ replacement = handleSymbolReplacement(replacement, el);
+
+ if (replacement instanceof PsiTryStatement) {
+ final List<PsiCatchSection> unmatchedCatchSections = el.getUserData(JavaMatchingVisitor.UNMATCHED_CATCH_SECTION_CONTENT_VAR_KEY);
+ final PsiCatchSection[] catches = ((PsiTryStatement)replacement).getCatchSections();
+
+ if (unmatchedCatchSections != null) {
+ for (int i = unmatchedCatchSections.size() - 1; i >= 0; --i) {
+ final PsiParameter parameter = unmatchedCatchSections.get(i).getParameter();
+ final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory();
+ final PsiCatchSection catchSection = elementFactory.createCatchSection(parameter.getType(), parameter.getName(), null);
+
+ catchSection.getCatchBlock().replace(
+ unmatchedCatchSections.get(i).getCatchBlock()
+ );
+ replacement.addAfter(
+ catchSection, catches[catches.length - 1]
+ );
+ replacement.addBefore(createWhiteSpace(replacement), replacement.getLastChild());
+ }
+ }
+ }
+
+ try {
+ final PsiElement inserted = elementParent.addBefore(replacement, elementToReplace);
+
+ if (replacement instanceof PsiComment &&
+ (elementParent instanceof PsiIfStatement ||
+ elementParent instanceof PsiLoopStatement
+ )
+ ) {
+ elementParent.addAfter(createSemicolon(replacement), inserted);
+ }
+ }
+ catch (IncorrectOperationException e) {
+ elementToReplace.replace(replacement);
+ }
+ }
+ }
+ else if (statements.length > 0) {
+ PsiElement replacement = ReplacerUtil.copySpacesAndCommentsBefore(elementToReplace, statements, replacementToMake, elementParent);
+
+ replacement = getMatchExpr(replacement, elementToReplace);
+
+ if (replacement instanceof PsiStatement &&
+ !(replacement.getLastChild() instanceof PsiJavaToken) &&
+ !(replacement.getLastChild() instanceof PsiComment)
+ ) {
+ // assert w/o ;
+ final PsiElement prevLastChildInParent = replacement.getLastChild().getPrevSibling();
+
+ if (prevLastChildInParent != null) {
+ elementParent.addRangeBefore(replacement.getFirstChild(), prevLastChildInParent, el);
+ }
+ else {
+ elementParent.addBefore(replacement.getFirstChild(), el);
+ }
+
+ el.getNode().getTreeParent().removeChild(el.getNode());
+ }
+ else {
+ // preserve comments
+ handleModifierList(el, replacement);
+
+ if (replacement instanceof PsiClass) {
+ // modifier list
+ final PsiStatement[] searchStatements = getCodeBlock().getStatements();
+ if (searchStatements.length > 0 &&
+ searchStatements[0] instanceof PsiDeclarationStatement &&
+ ((PsiDeclarationStatement)searchStatements[0]).getDeclaredElements()[0] instanceof PsiClass
+ ) {
+ final PsiClass replaceClazz = (PsiClass)replacement;
+ final PsiClass queryClazz = (PsiClass)((PsiDeclarationStatement)searchStatements[0]).getDeclaredElements()[0];
+ final PsiClass clazz = (PsiClass)el;
+
+ if (replaceClazz.getExtendsList().getTextLength() == 0 &&
+ queryClazz.getExtendsList().getTextLength() == 0 &&
+ clazz.getExtendsList().getTextLength() != 0
+ ) {
+ replaceClazz.addBefore(clazz.getExtendsList().getPrevSibling(), replaceClazz.getExtendsList()); // whitespace
+ replaceClazz.getExtendsList().addRange(
+ clazz.getExtendsList().getFirstChild(), clazz.getExtendsList().getLastChild()
+ );
+ }
+
+ if (replaceClazz.getImplementsList().getTextLength() == 0 &&
+ queryClazz.getImplementsList().getTextLength() == 0 &&
+ clazz.getImplementsList().getTextLength() != 0
+ ) {
+ replaceClazz.addBefore(clazz.getImplementsList().getPrevSibling(), replaceClazz.getImplementsList()); // whitespace
+ replaceClazz.getImplementsList().addRange(
+ clazz.getImplementsList().getFirstChild(),
+ clazz.getImplementsList().getLastChild()
+ );
+ }
+
+ if (replaceClazz.getTypeParameterList().getTextLength() == 0 &&
+ queryClazz.getTypeParameterList().getTextLength() == 0 &&
+ clazz.getTypeParameterList().getTextLength() != 0
+ ) {
+ // skip < and >
+ replaceClazz.getTypeParameterList().replace(
+ clazz.getTypeParameterList()
+ );
+ }
+ }
+ }
+
+ replacement = handleSymbolReplacement(replacement, el);
+
+ el.replace(replacement);
+ }
+ }
+ else {
+ final PsiElement nextSibling = el.getNextSibling();
+ el.delete();
+ if (nextSibling instanceof PsiWhiteSpace && nextSibling.isValid()) {
+ nextSibling.delete();
+ }
+ }
+
+ if (listContext) {
+ final int matchSize = info.getMatchesCount();
+
+ for (int i = 0; i < matchSize; ++i) {
+ PsiElement matchElement = info.getMatch(i);
+ PsiElement element = findRealSubstitutionElement(matchElement);
+
+ if (element == null) continue;
+ PsiElement firstToDelete = element;
+ PsiElement lastToDelete = element;
+ PsiElement prevSibling = element.getPrevSibling();
+ PsiElement nextSibling = element.getNextSibling();
+
+ if (prevSibling instanceof PsiWhiteSpace) {
+ firstToDelete = prevSibling;
+ prevSibling = prevSibling != null ? prevSibling.getPrevSibling() : null;
+ }
+ else if (prevSibling == null && nextSibling instanceof PsiWhiteSpace) {
+ lastToDelete = nextSibling;
+ }
+
+ if (nextSibling instanceof XmlText && i + 1 < matchSize) {
+ final PsiElement next = info.getMatch(i + 1);
+ if (next != null && next == nextSibling.getNextSibling()) {
+ lastToDelete = nextSibling;
+ }
+ }
+
+ if (element instanceof PsiExpression) {
+ final PsiElement parent = element.getParent().getParent();
+ if ((parent instanceof PsiCall ||
+ parent instanceof PsiAnonymousClass
+ ) &&
+ prevSibling instanceof PsiJavaToken &&
+ ((PsiJavaToken)prevSibling).getTokenType() == JavaTokenType.COMMA
+ ) {
+ firstToDelete = prevSibling;
+ }
+ }
+ else if (element instanceof PsiParameter &&
+ prevSibling instanceof PsiJavaToken &&
+ ((PsiJavaToken)prevSibling).getTokenType() == JavaTokenType.COMMA
+ ) {
+ firstToDelete = prevSibling;
+ }
+
+ element.getParent().deleteChildRange(firstToDelete, lastToDelete);
+ }
+ }
+ }
+
+ @Override
+ public void postProcess(PsiElement affectedElement, ReplaceOptions options) {
+ if (!affectedElement.isValid()) {
+ return;
+ }
+ if (options.isToUseStaticImport()) {
+ shortenWithStaticImports(affectedElement, 0, affectedElement.getTextLength());
+ }
+ if (options.isToShortenFQN()) {
+ final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(affectedElement.getProject());
+ codeStyleManager.shortenClassReferences(affectedElement, 0, affectedElement.getTextLength());
+ }
+ }
+
+ private static void shortenWithStaticImports(PsiElement affectedElement, int startOffset, int endOffset) {
+ final int elementOffset = affectedElement.getTextOffset();
+ final int finalStartOffset = startOffset + elementOffset;
+ final int finalEndOffset = endOffset + elementOffset;
+ final List<PsiReferenceExpression> references = new ArrayList<PsiReferenceExpression>();
+ final JavaRecursiveElementVisitor collector = new JavaRecursiveElementVisitor() {
+ @Override
+ public void visitReferenceExpression(PsiReferenceExpression expression) {
+ final int offset = expression.getTextOffset();
+ if (offset > finalEndOffset) {
+ return;
+ }
+ super.visitReferenceExpression(expression);
+ if (offset + expression.getTextLength() < finalStartOffset)
+ if (expression.getQualifierExpression() == null) {
+ return;
+ }
+ references.add(expression);
+ }
+ };
+ affectedElement.accept(collector);
+ for (PsiReferenceExpression expression : references) {
+ final PsiElement target = expression.resolve();
+ if (!(target instanceof PsiMember)) {
+ continue;
+ }
+ final PsiMember member = (PsiMember)target;
+ final PsiClass containingClass = member.getContainingClass();
+ if (containingClass == null) {
+ continue;
+ }
+ final String className = containingClass.getQualifiedName();
+ if (className == null) {
+ continue;
+ }
+ final String name = member.getName();
+ if (name == null) {
+ continue;
+ }
+ if (ImportUtils.addStaticImport(className, name, expression)) {
+ final PsiExpression qualifierExpression = expression.getQualifierExpression();
+ if (qualifierExpression != null) {
+ qualifierExpression.delete();
+ }
+ }
+ }
+ }
+
+ @Nullable
+ private static PsiElement createSemicolon(final PsiElement space) throws IncorrectOperationException {
+ final PsiStatement text = JavaPsiFacade.getInstance(space.getProject()).getElementFactory().createStatementFromText(";", null);
+ return text.getFirstChild();
+ }
+
+ private static PsiElement createWhiteSpace(final PsiElement space) throws IncorrectOperationException {
+ return PsiParserFacade.SERVICE.getInstance(space.getProject()).createWhiteSpaceFromText(" ");
+ }
+
+ private static class ModifierListOwnerCollector extends JavaRecursiveElementWalkingVisitor {
+ HashMap<String, PsiNamedElement> namedElements = new HashMap<String, PsiNamedElement>(1);
+
+ @Override
+ public void visitClass(PsiClass aClass) {
+ if (aClass instanceof PsiAnonymousClass) return;
+ handleNamedElement(aClass);
+ }
+
+ private void handleNamedElement(final PsiNamedElement named) {
+ String name = named.getName();
+
+ assert name != null;
+
+ if (StructuralSearchUtil.isTypedVariable(name)) {
+ name = name.substring(1, name.length() - 1);
+ }
+
+ if (!namedElements.containsKey(name)) namedElements.put(name, named);
+ named.acceptChildren(this);
+ }
+
+ @Override
+ public void visitVariable(PsiVariable var) {
+ handleNamedElement(var);
+ }
+
+ @Override
+ public void visitMethod(PsiMethod method) {
+ handleNamedElement(method);
+ }
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java
new file mode 100644
index 000000000000..869f01cc7394
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java
@@ -0,0 +1,661 @@
+package com.intellij.structuralsearch;
+
+import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
+import com.intellij.codeInsight.template.JavaCodeContextType;
+import com.intellij.codeInsight.template.TemplateContextType;
+import com.intellij.codeInsight.template.TemplateManager;
+import com.intellij.dupLocator.iterators.NodeIterator;
+import com.intellij.lang.Language;
+import com.intellij.lang.StdLanguages;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.fileEditor.FileEditorManager;
+import com.intellij.openapi.fileTypes.FileType;
+import com.intellij.openapi.fileTypes.LanguageFileType;
+import com.intellij.openapi.fileTypes.StdFileTypes;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.*;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.PsiUtilCore;
+import com.intellij.structuralsearch.impl.matcher.*;
+import com.intellij.structuralsearch.impl.matcher.compiler.GlobalCompilingVisitor;
+import com.intellij.structuralsearch.impl.matcher.compiler.JavaCompilingVisitor;
+import com.intellij.structuralsearch.impl.matcher.compiler.PatternCompiler;
+import com.intellij.structuralsearch.impl.matcher.filters.JavaLexicalNodesFilter;
+import com.intellij.structuralsearch.impl.matcher.filters.LexicalNodesFilter;
+import com.intellij.structuralsearch.plugin.replace.ReplaceOptions;
+import com.intellij.structuralsearch.plugin.replace.impl.ParameterInfo;
+import com.intellij.structuralsearch.plugin.replace.impl.ReplacementBuilder;
+import com.intellij.structuralsearch.plugin.replace.impl.ReplacementContext;
+import com.intellij.structuralsearch.plugin.replace.impl.Replacer;
+import com.intellij.structuralsearch.plugin.ui.Configuration;
+import com.intellij.structuralsearch.plugin.ui.SearchContext;
+import com.intellij.structuralsearch.plugin.ui.UIUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.*;
+
+/**
+ * @author Eugene.Kudelevsky
+ */
+public class JavaStructuralSearchProfile extends StructuralSearchProfile {
+ private JavaLexicalNodesFilter myJavaLexicalNodesFilter;
+
+ public String getText(PsiElement match, int start,int end) {
+ if (match instanceof PsiIdentifier) {
+ PsiElement parent = match.getParent();
+ if (parent instanceof PsiJavaCodeReferenceElement && !(parent instanceof PsiExpression)) {
+ match = parent; // care about generic
+ }
+ }
+ final String matchText = match.getText();
+ if (start==0 && end==-1) return matchText;
+ return matchText.substring(start,end == -1? matchText.length():end);
+ }
+
+ public Class getElementContextByPsi(PsiElement element) {
+ if (element instanceof PsiIdentifier) {
+ element = element.getParent();
+ }
+
+ if (element instanceof PsiMember) {
+ return PsiMember.class;
+ } else {
+ return PsiExpression.class;
+ }
+ }
+
+ public String getTypedVarString(final PsiElement element) {
+ String text;
+
+ if (element instanceof PsiNamedElement) {
+ text = ((PsiNamedElement)element).getName();
+ }
+ else if (element instanceof PsiAnnotation) {
+ PsiJavaCodeReferenceElement referenceElement = ((PsiAnnotation)element).getNameReferenceElement();
+ text = referenceElement == null ? null : referenceElement.getQualifiedName();
+ }
+ else if (element instanceof PsiNameValuePair) {
+ text = ((PsiNameValuePair)element).getName();
+ }
+ else {
+ text = element.getText();
+ if (StringUtil.startsWithChar(text, '@')) {
+ text = text.substring(1);
+ }
+ if (StringUtil.endsWithChar(text, ';')) text = text.substring(0, text.length() - 1);
+ else if (element instanceof PsiExpressionStatement) {
+ int i = text.indexOf(';');
+ if (i != -1) text = text.substring(0, i);
+ }
+ }
+
+ if (text==null) text = element.getText();
+
+ return text;
+ }
+
+ @Override
+ public String getMeaningfulText(PsiElement element) {
+ if (element instanceof PsiReferenceExpression &&
+ ((PsiReferenceExpression)element).getQualifierExpression() != null) {
+ final PsiElement resolve = ((PsiReferenceExpression)element).resolve();
+ if (resolve instanceof PsiClass) return element.getText();
+
+ final PsiElement referencedElement = ((PsiReferenceExpression)element).getReferenceNameElement();
+ String text = referencedElement != null ? referencedElement.getText() : "";
+
+ if (resolve == null && text.length() > 0 && Character.isUpperCase(text.charAt(0))) {
+ return element.getText();
+ }
+ return text;
+ }
+ return super.getMeaningfulText(element);
+ }
+
+ @Override
+ public PsiElement updateCurrentNode(PsiElement targetNode) {
+ if (targetNode instanceof PsiCodeBlock && ((PsiCodeBlock)targetNode).getStatements().length == 1) {
+ PsiElement targetNodeParent = targetNode.getParent();
+ if (targetNodeParent instanceof PsiBlockStatement) {
+ targetNodeParent = targetNodeParent.getParent();
+ }
+
+ if (targetNodeParent instanceof PsiIfStatement || targetNodeParent instanceof PsiLoopStatement) {
+ targetNode = targetNodeParent;
+ }
+ }
+ return targetNode;
+ }
+
+ @Override
+ public PsiElement extendMatchedByDownUp(PsiElement targetNode) {
+ if (targetNode instanceof PsiIdentifier) {
+ targetNode = targetNode.getParent();
+ final PsiElement parent = targetNode.getParent();
+ if (parent instanceof PsiTypeElement || parent instanceof PsiStatement) targetNode = parent;
+ }
+ return targetNode;
+ }
+
+ @Override
+ public PsiElement extendMatchOnePsiFile(PsiElement file) {
+ if (file instanceof PsiIdentifier) {
+ // Searching in previous results
+ file = file.getParent();
+ }
+ return file;
+ }
+
+ public void compile(PsiElement[] elements, @NotNull GlobalCompilingVisitor globalVisitor) {
+ elements[0].getParent().accept(new JavaCompilingVisitor(globalVisitor));
+ }
+
+ @NotNull
+ public PsiElementVisitor createMatchingVisitor(@NotNull GlobalMatchingVisitor globalVisitor) {
+ return new JavaMatchingVisitor(globalVisitor);
+ }
+
+ @NotNull
+ @Override
+ public PsiElementVisitor getLexicalNodesFilter(@NotNull LexicalNodesFilter filter) {
+ if (myJavaLexicalNodesFilter == null) {
+ myJavaLexicalNodesFilter = new JavaLexicalNodesFilter(filter);
+ }
+ return myJavaLexicalNodesFilter;
+ }
+
+ @NotNull
+ public CompiledPattern createCompiledPattern() {
+ return new JavaCompiledPattern();
+ }
+
+ @Override
+ public boolean canProcess(@NotNull FileType fileType) {
+ return fileType == StdFileTypes.JAVA;
+ }
+
+ public boolean isMyLanguage(@NotNull Language language) {
+ return language == StdLanguages.JAVA;
+ }
+
+ @Override
+ public StructuralReplaceHandler getReplaceHandler(@NotNull ReplacementContext context) {
+ return new JavaReplaceHandler(context);
+ }
+
+ @NotNull
+ @Override
+ public PsiElement[] createPatternTree(@NotNull String text,
+ @NotNull PatternTreeContext context,
+ @NotNull FileType fileType,
+ @Nullable Language language,
+ String contextName, @Nullable String extension,
+ @NotNull Project project,
+ boolean physical) {
+ if (physical) {
+ throw new UnsupportedOperationException(getClass() + " cannot create physical PSI");
+ }
+ PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory();
+ if (context == PatternTreeContext.Block) {
+ PsiElement element = elementFactory.createStatementFromText("{\n" + text + "\n}", null);
+ final PsiElement[] children = ((PsiBlockStatement)element).getCodeBlock().getChildren();
+ final int extraChildCount = 4;
+
+ if (children.length > extraChildCount) {
+ PsiElement[] result = new PsiElement[children.length - extraChildCount];
+ final int extraChildStart = 2;
+ System.arraycopy(children, extraChildStart, result, 0, children.length - extraChildCount);
+ return result;
+ }
+ else {
+ return PsiElement.EMPTY_ARRAY;
+ }
+ }
+ else if (context == PatternTreeContext.Class) {
+ PsiElement element = elementFactory.createStatementFromText("class A {\n" + text + "\n}", null);
+ PsiClass clazz = (PsiClass)((PsiDeclarationStatement)element).getDeclaredElements()[0];
+ PsiElement startChild = clazz.getLBrace();
+ if (startChild != null) startChild = startChild.getNextSibling();
+
+ PsiElement endChild = clazz.getRBrace();
+ if (endChild != null) endChild = endChild.getPrevSibling();
+ if (startChild == endChild) return PsiElement.EMPTY_ARRAY; // nothing produced
+
+ final List<PsiElement> result = new ArrayList<PsiElement>(3);
+ assert startChild != null;
+ for (PsiElement el = startChild.getNextSibling(); el != endChild && el != null; el = el.getNextSibling()) {
+ if (el instanceof PsiErrorElement) continue;
+ result.add(el);
+ }
+
+ return PsiUtilCore.toPsiElementArray(result);
+ }
+ else {
+ return PsiFileFactory.getInstance(project).createFileFromText("__dummy.java", text).getChildren();
+ }
+ }
+
+ @NotNull
+ @Override
+ public Editor createEditor(@NotNull SearchContext searchContext,
+ @NotNull FileType fileType,
+ Language dialect,
+ String text,
+ boolean useLastConfiguration) {
+ // provides autocompletion
+
+ PsiElement element = searchContext.getFile();
+
+ if (element != null && !useLastConfiguration) {
+ final Editor selectedEditor = FileEditorManager.getInstance(searchContext.getProject()).getSelectedTextEditor();
+
+ if (selectedEditor != null) {
+ int caretPosition = selectedEditor.getCaretModel().getOffset();
+ PsiElement positionedElement = searchContext.getFile().findElementAt(caretPosition);
+
+ if (positionedElement == null) {
+ positionedElement = searchContext.getFile().findElementAt(caretPosition + 1);
+ }
+
+ if (positionedElement != null) {
+ element = PsiTreeUtil.getParentOfType(
+ positionedElement,
+ PsiClass.class, PsiCodeBlock.class
+ );
+ }
+ }
+ }
+
+ final PsiManager psimanager = PsiManager.getInstance(searchContext.getProject());
+ final Project project = psimanager.getProject();
+ final PsiCodeFragment file = createCodeFragment(project, text, element);
+ final Document doc = PsiDocumentManager.getInstance(searchContext.getProject()).getDocument(file);
+ DaemonCodeAnalyzer.getInstance(searchContext.getProject()).setHighlightingEnabled(file, false);
+ return UIUtil.createEditor(doc, searchContext.getProject(), true, true, getTemplateContextType());
+ }
+
+ @Override
+ public Class<? extends TemplateContextType> getTemplateContextTypeClass() {
+ return JavaCodeContextType.class;
+ }
+
+ public PsiCodeFragment createCodeFragment(Project project, String text, PsiElement context) {
+ final JavaCodeFragmentFactory factory = JavaCodeFragmentFactory.getInstance(project);
+ return factory.createCodeBlockCodeFragment(text, context, true);
+ }
+
+ @Override
+ public void checkSearchPattern(Project project, MatchOptions options) {
+ class ValidatingVisitor extends JavaRecursiveElementWalkingVisitor {
+ private PsiElement myCurrent;
+
+ @Override public void visitAnnotation(PsiAnnotation annotation) {
+ final PsiJavaCodeReferenceElement nameReferenceElement = annotation.getNameReferenceElement();
+
+ if (nameReferenceElement == null ||
+ !nameReferenceElement.getText().equals(MatchOptions.MODIFIER_ANNOTATION_NAME)) {
+ return;
+ }
+
+ for(PsiNameValuePair pair:annotation.getParameterList().getAttributes()) {
+ final PsiAnnotationMemberValue value = pair.getValue();
+
+ if (value instanceof PsiArrayInitializerMemberValue) {
+ for(PsiAnnotationMemberValue v:((PsiArrayInitializerMemberValue)value).getInitializers()) {
+ final String name = StringUtil.stripQuotesAroundValue(v.getText());
+ checkModifier(name);
+ }
+
+ } else if (value != null) {
+ final String name = StringUtil.stripQuotesAroundValue(value.getText());
+ checkModifier(name);
+ }
+ }
+ }
+
+ private void checkModifier(final String name) {
+ if (!MatchOptions.INSTANCE_MODIFIER_NAME.equals(name) &&
+ !PsiModifier.PACKAGE_LOCAL.equals(name) &&
+ Arrays.binarySearch(JavaMatchingVisitor.MODIFIERS, name) < 0
+ ) {
+ throw new MalformedPatternException(SSRBundle.message("invalid.modifier.type",name));
+ }
+ }
+
+ @Override
+ public void visitErrorElement(PsiErrorElement element) {
+ super.visitErrorElement(element);
+ //final PsiElement parent = element.getParent();
+ //if (parent != myCurrent || !"';' expected".equals(element.getErrorDescription())) {
+ // throw new MalformedPatternException(element.getErrorDescription());
+ //}
+ }
+
+ public void setCurrent(PsiElement current) {
+ myCurrent = current;
+ }
+ }
+ ValidatingVisitor visitor = new ValidatingVisitor();
+ final CompiledPattern compiledPattern = PatternCompiler.compilePattern(project, options);
+ final int nodeCount = compiledPattern.getNodeCount();
+ final NodeIterator nodes = compiledPattern.getNodes();
+ while (nodes.hasNext()) {
+ final PsiElement current = nodes.current();
+ visitor.setCurrent(nodeCount == 1 && current instanceof PsiExpressionStatement ? current : null);
+ current.accept(visitor);
+ nodes.advance();
+ }
+ nodes.reset();
+ }
+
+ @Override
+ public void checkReplacementPattern(Project project, ReplaceOptions options) {
+ MatchOptions matchOptions = options.getMatchOptions();
+ FileType fileType = matchOptions.getFileType();
+ PsiElement[] statements = MatcherImplUtil.createTreeFromText(
+ matchOptions.getSearchPattern(),
+ PatternTreeContext.Block,
+ fileType,
+ project
+ );
+ final boolean searchIsExpression = statements.length == 1 && statements[0].getLastChild() instanceof PsiErrorElement;
+
+ PsiElement[] statements2 = MatcherImplUtil.createTreeFromText(
+ options.getReplacement(),
+ PatternTreeContext.Block,
+ fileType,
+ project
+ );
+ final boolean replaceIsExpression = statements2.length == 1 && statements2[0].getLastChild() instanceof PsiErrorElement;
+
+ if (searchIsExpression != replaceIsExpression) {
+ throw new UnsupportedPatternException(
+ searchIsExpression ? SSRBundle.message("replacement.template.is.not.expression.error.message") :
+ SSRBundle.message("search.template.is.not.expression.error.message")
+ );
+ }
+ }
+
+ @Override
+ public LanguageFileType getDefaultFileType(LanguageFileType currentDefaultFileType) {
+ return StdFileTypes.JAVA;
+ }
+
+ @Override
+ Configuration[] getPredefinedTemplates() {
+ return JavaPredefinedConfigurations.createPredefinedTemplates();
+ }
+
+ @Override
+ public void provideAdditionalReplaceOptions(@NotNull PsiElement node, final ReplaceOptions options, final ReplacementBuilder builder) {
+ final String templateText = TemplateManager.getInstance(node.getProject()).createTemplate("", "", options.getReplacement()).getTemplateText();
+ node.accept(new JavaRecursiveElementWalkingVisitor() {
+ @Override
+ public void visitReferenceExpression(PsiReferenceExpression expression) {
+ visitElement(expression);
+ }
+
+ @Override
+ public void visitVariable(PsiVariable field) {
+ super.visitVariable(field);
+
+ final PsiExpression initializer = field.getInitializer();
+
+ if (initializer != null) {
+ final String initText = initializer.getText();
+
+ if (StructuralSearchUtil.isTypedVariable(initText)) {
+ final ParameterInfo initInfo = builder.findParameterization(Replacer.stripTypedVariableDecoration(initText));
+
+ if (initInfo != null) {
+ initInfo.setVariableInitializerContext(true);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void visitClass(PsiClass aClass) {
+ super.visitClass(aClass);
+
+ MatchVariableConstraint constraint =
+ options.getMatchOptions().getVariableConstraint(CompiledPattern.ALL_CLASS_UNMATCHED_CONTENT_VAR_ARTIFICIAL_NAME);
+ if (constraint != null) {
+ ParameterInfo e = new ParameterInfo();
+ e.setName(CompiledPattern.ALL_CLASS_UNMATCHED_CONTENT_VAR_ARTIFICIAL_NAME);
+ e.setStartIndex(templateText.lastIndexOf('}'));
+ builder.addParametrization(e);
+ }
+ }
+
+ @Override
+ public void visitParameter(PsiParameter parameter) {
+ super.visitParameter(parameter);
+
+ String name = parameter.getName();
+ String type = parameter.getType().getCanonicalText();
+
+ if (StructuralSearchUtil.isTypedVariable(name)) {
+ name = Replacer.stripTypedVariableDecoration(name);
+
+ if (StructuralSearchUtil.isTypedVariable(type)) {
+ type = Replacer.stripTypedVariableDecoration(type);
+ }
+ ParameterInfo nameInfo = builder.findParameterization(name);
+ ParameterInfo typeInfo = builder.findParameterization(type);
+
+ if (nameInfo != null && typeInfo != null && !(parameter.getParent() instanceof PsiCatchSection)) {
+ nameInfo.setArgumentContext(false);
+ typeInfo.setArgumentContext(false);
+ typeInfo.setMethodParameterContext(true);
+ nameInfo.setMethodParameterContext(true);
+ typeInfo.setElement(parameter.getTypeElement());
+ }
+ }
+ }
+ });
+ }
+
+ @Override
+ public int handleSubstitution(final ParameterInfo info,
+ MatchResult match,
+ StringBuilder result,
+ int offset,
+ HashMap<String, MatchResult> matchMap) {
+ if (info.getName().equals(match.getName())) {
+ String replacementString = match.getMatchImage();
+ boolean forceAddingNewLine = false;
+
+ if (info.isMethodParameterContext()) {
+ StringBuilder buf = new StringBuilder();
+ handleMethodParameter(buf, info, matchMap);
+ replacementString = buf.toString();
+ }
+ else if (match.getAllSons().size() > 0 && !match.isScopeMatch()) {
+ // compound matches
+ StringBuilder buf = new StringBuilder();
+ MatchResult r = null;
+
+ for (final MatchResult matchResult : match.getAllSons()) {
+ MatchResult previous = r;
+ r = matchResult;
+
+ final PsiElement currentElement = r.getMatch();
+
+ if (buf.length() > 0) {
+ final PsiElement parent = currentElement.getParent();
+ if (info.isStatementContext()) {
+ final PsiElement previousElement = previous.getMatchRef().getElement();
+
+ if (!(previousElement instanceof PsiComment) &&
+ ( buf.charAt(buf.length() - 1) != '}' ||
+ previousElement instanceof PsiDeclarationStatement
+ )
+ ) {
+ buf.append(';');
+ }
+
+ final PsiElement prevSibling = currentElement.getPrevSibling();
+
+ if (prevSibling instanceof PsiWhiteSpace &&
+ prevSibling.getPrevSibling() == previous.getMatch()
+ ) {
+ // consequent statements matched so preserve whitespacing
+ buf.append(prevSibling.getText());
+ }
+ else {
+ buf.append('\n');
+ }
+ }
+ else if (info.isArgumentContext()) {
+ buf.append(',');
+ }
+ else if (parent instanceof PsiClass) {
+ final PsiElement prevSibling = PsiTreeUtil.skipSiblingsBackward(currentElement, PsiWhiteSpace.class);
+ if (prevSibling instanceof PsiJavaToken && JavaTokenType.COMMA.equals(((PsiJavaToken)prevSibling).getTokenType())) {
+ buf.append(',');
+ }
+ else {
+ buf.append('\n');
+ }
+ }
+ else if (parent instanceof PsiReferenceList) {
+ buf.append(',');
+ }
+ else {
+ buf.append(' ');
+ }
+ }
+
+ buf.append(r.getMatchImage());
+ removeExtraSemicolonForSingleVarInstanceInMultipleMatch(info, r, buf);
+ forceAddingNewLine = currentElement instanceof PsiComment;
+ }
+
+ replacementString = buf.toString();
+ } else {
+ StringBuilder buf = new StringBuilder();
+ if (info.isStatementContext()) {
+ forceAddingNewLine = match.getMatch() instanceof PsiComment;
+ }
+ buf.append(replacementString);
+ removeExtraSemicolonForSingleVarInstanceInMultipleMatch(info, match, buf);
+ replacementString = buf.toString();
+ }
+
+ offset = Replacer.insertSubstitution(result, offset, info, replacementString);
+ offset = removeExtraSemicolon(info, offset, result, match);
+ if (forceAddingNewLine && info.isStatementContext()) {
+ result.insert(info.getStartIndex() + offset + 1, '\n');
+ offset ++;
+ }
+ }
+ return offset;
+ }
+
+ @Override
+ public int processAdditionalOptions(ParameterInfo info, int offset, StringBuilder result, MatchResult r) {
+ if (info.isStatementContext()) {
+ return removeExtraSemicolon(info, offset, result, r);
+ }
+ return offset;
+ }
+
+ @Override
+ public boolean isIdentifier(PsiElement element) {
+ return element instanceof PsiIdentifier;
+ }
+
+ @Override
+ public Collection<String> getReservedWords() {
+ return Collections.singleton(PsiModifier.PACKAGE_LOCAL);
+ }
+
+ @Override
+ public boolean isDocCommentOwner(PsiElement match) {
+ return match instanceof PsiMember;
+ }
+
+ private static void handleMethodParameter(StringBuilder buf, ParameterInfo info, HashMap<String, MatchResult> matchMap) {
+ if(info.getElement() ==null) {
+ // no specific handling for name of method parameter since it is handled with type
+ return;
+ }
+
+ String name = ((PsiParameter)info.getElement().getParent()).getName();
+ name = StructuralSearchUtil.isTypedVariable(name) ? Replacer.stripTypedVariableDecoration(name):name;
+
+ final MatchResult matchResult = matchMap.get(name);
+ if (matchResult == null) return;
+
+ if (matchResult.isMultipleMatch()) {
+ for (MatchResult result : matchResult.getAllSons()) {
+ if (buf.length() > 0) {
+ buf.append(',');
+ }
+
+ appendParameter(buf, result);
+ }
+ } else {
+ appendParameter(buf, matchResult);
+ }
+ }
+
+ private static void appendParameter(final StringBuilder buf, final MatchResult _matchResult) {
+ for(Iterator<MatchResult> j = _matchResult.getAllSons().iterator();j.hasNext();) {
+ buf.append(j.next().getMatchImage()).append(' ').append(j.next().getMatchImage());
+ }
+ }
+
+ private static void removeExtraSemicolonForSingleVarInstanceInMultipleMatch(final ParameterInfo info, MatchResult r, StringBuilder buf) {
+ if (info.isStatementContext()) {
+ final PsiElement element = r.getMatchRef().getElement();
+
+ // remove extra ;
+ if (buf.charAt(buf.length()-1)==';' &&
+ r.getMatchImage().charAt(r.getMatchImage().length()-1)==';' &&
+ ( element instanceof PsiReturnStatement ||
+ element instanceof PsiDeclarationStatement ||
+ element instanceof PsiExpressionStatement ||
+ element instanceof PsiAssertStatement ||
+ element instanceof PsiBreakStatement ||
+ element instanceof PsiContinueStatement ||
+ element instanceof PsiMember ||
+ element instanceof PsiIfStatement && !(((PsiIfStatement)element).getThenBranch() instanceof PsiBlockStatement) ||
+ element instanceof PsiLoopStatement && !(((PsiLoopStatement)element).getBody() instanceof PsiBlockStatement)
+ )
+ ) {
+ // contains extra ;
+ buf.deleteCharAt(buf.length()-1);
+ }
+ }
+ }
+
+ private static int removeExtraSemicolon(ParameterInfo info, int offset, StringBuilder result, MatchResult match) {
+ if (info.isStatementContext()) {
+ int index = offset+ info.getStartIndex();
+ if (result.charAt(index)==';' &&
+ ( match == null ||
+ ( result.charAt(index-1)=='}' &&
+ !(match.getMatch() instanceof PsiDeclarationStatement) && // array init in dcl
+ !(match.getMatch() instanceof PsiNewExpression) // array initializer
+ ) ||
+ ( !match.isMultipleMatch() && // ; in comment
+ match.getMatch() instanceof PsiComment
+ ) ||
+ ( match.isMultipleMatch() && // ; in comment
+ match.getAllSons().get( match.getAllSons().size() - 1 ).getMatch() instanceof PsiComment
+ )
+ )
+ ) {
+ result.deleteCharAt(index);
+ --offset;
+ }
+ }
+
+ return offset;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaCompiledPattern.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaCompiledPattern.java
new file mode 100644
index 000000000000..9a6330bb799b
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaCompiledPattern.java
@@ -0,0 +1,90 @@
+package com.intellij.structuralsearch.impl.matcher;
+
+import com.intellij.openapi.util.Key;
+import com.intellij.psi.*;
+import com.intellij.structuralsearch.impl.matcher.strategies.ExprMatchingStrategy;
+import org.jetbrains.annotations.Nullable;
+
+/**
+* @author Eugene.Kudelevsky
+*/
+public class JavaCompiledPattern extends CompiledPattern {
+ private static final String TYPED_VAR_PREFIX = "__$_";
+
+ private boolean requestsSuperFields;
+ private boolean requestsSuperMethods;
+ private boolean requestsSuperInners;
+
+ public JavaCompiledPattern() {
+ setStrategy(ExprMatchingStrategy.getInstance());
+ }
+
+ public String[] getTypedVarPrefixes() {
+ return new String[] {TYPED_VAR_PREFIX};
+ }
+
+ public boolean isTypedVar(final String str) {
+ if (str.charAt(0)=='@') {
+ return str.regionMatches(1,TYPED_VAR_PREFIX,0,TYPED_VAR_PREFIX.length());
+ } else {
+ return str.startsWith(TYPED_VAR_PREFIX);
+ }
+ }
+
+ @Override
+ public boolean isToResetHandler(PsiElement element) {
+ return !(element instanceof PsiJavaToken) &&
+ !(element instanceof PsiJavaCodeReferenceElement && element.getParent() instanceof PsiAnnotation);
+ }
+
+ @Nullable
+ @Override
+ public String getAlternativeTextToMatch(PsiElement node, String previousText) {
+ // Short class name is matched with fully qualified name
+ if(node instanceof PsiJavaCodeReferenceElement || node instanceof PsiClass) {
+ PsiElement element = (node instanceof PsiJavaCodeReferenceElement)?
+ ((PsiJavaCodeReferenceElement)node).resolve():
+ node;
+
+ if (element instanceof PsiClass) {
+ String text = ((PsiClass)element).getQualifiedName();
+ if (text != null && text.equals(previousText)) {
+ text = ((PsiClass)element).getName();
+ }
+
+ if (text != null) {
+ return text;
+ }
+ }
+ } else if (node instanceof PsiLiteralExpression) {
+ return node.getText();
+ }
+ return null;
+ }
+
+ public static final Key<String> ALL_CLASS_CONTENT_VAR_NAME_KEY = Key.create("AllClassContent");
+
+ public boolean isRequestsSuperFields() {
+ return requestsSuperFields;
+ }
+
+ public void setRequestsSuperFields(boolean requestsSuperFields) {
+ this.requestsSuperFields = requestsSuperFields;
+ }
+
+ public boolean isRequestsSuperInners() {
+ return requestsSuperInners;
+ }
+
+ public void setRequestsSuperInners(boolean requestsSuperInners) {
+ this.requestsSuperInners = requestsSuperInners;
+ }
+
+ public boolean isRequestsSuperMethods() {
+ return requestsSuperMethods;
+ }
+
+ public void setRequestsSuperMethods(boolean requestsSuperMethods) {
+ this.requestsSuperMethods = requestsSuperMethods;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchPredicateProvider.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchPredicateProvider.java
new file mode 100644
index 000000000000..042912e0354c
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchPredicateProvider.java
@@ -0,0 +1,62 @@
+package com.intellij.structuralsearch.impl.matcher;
+
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.structuralsearch.MatchOptions;
+import com.intellij.structuralsearch.MatchVariableConstraint;
+import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate;
+import com.intellij.structuralsearch.impl.matcher.predicates.*;
+
+import java.util.Set;
+
+public class JavaMatchPredicateProvider extends MatchPredicateProvider{
+ @Override
+ public void collectPredicates(MatchVariableConstraint constraint, String name, MatchOptions options, Set<MatchPredicate> predicates) {
+ if (constraint.isReadAccess()) {
+ MatchPredicate predicate = new ReadPredicate();
+
+ if (constraint.isInvertReadAccess()) {
+ predicate = new NotPredicate(predicate);
+ }
+ predicates.add(predicate);
+ }
+
+ if (constraint.isWriteAccess()) {
+ MatchPredicate predicate = new WritePredicate();
+
+ if (constraint.isInvertWriteAccess()) {
+ predicate = new NotPredicate(predicate);
+ }
+ predicates.add(predicate);
+ }
+
+ if (!StringUtil.isEmptyOrSpaces(constraint.getNameOfExprType())) {
+ MatchPredicate predicate = new ExprTypePredicate(
+ constraint.getNameOfExprType(),
+ name,
+ constraint.isExprTypeWithinHierarchy(),
+ options.isCaseSensitiveMatch(),
+ constraint.isPartOfSearchResults()
+ );
+
+ if (constraint.isInvertExprType()) {
+ predicate = new NotPredicate(predicate);
+ }
+ predicates.add(predicate);
+ }
+
+ if (!StringUtil.isEmptyOrSpaces(constraint.getNameOfFormalArgType())) {
+ MatchPredicate predicate = new FormalArgTypePredicate(
+ constraint.getNameOfFormalArgType(),
+ name,
+ constraint.isFormalArgTypeWithinHierarchy(),
+ options.isCaseSensitiveMatch(),
+ constraint.isPartOfSearchResults()
+ );
+ if (constraint.isInvertFormalType()) {
+ predicate = new NotPredicate(predicate);
+ }
+ predicates.add(predicate);
+ }
+
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java
new file mode 100644
index 000000000000..0ea857b16362
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java
@@ -0,0 +1,1637 @@
+package com.intellij.structuralsearch.impl.matcher;
+
+import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.*;
+import com.intellij.psi.javadoc.PsiDocComment;
+import com.intellij.psi.javadoc.PsiDocTag;
+import com.intellij.psi.javadoc.PsiDocTagValue;
+import com.intellij.psi.tree.IElementType;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.structuralsearch.MatchOptions;
+import com.intellij.structuralsearch.MatchResult;
+import com.intellij.structuralsearch.impl.matcher.filters.LexicalNodesFilter;
+import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate;
+import com.intellij.structuralsearch.impl.matcher.handlers.MatchingHandler;
+import com.intellij.structuralsearch.impl.matcher.handlers.SubstitutionHandler;
+import com.intellij.dupLocator.iterators.ArrayBackedNodeIterator;
+import com.intellij.structuralsearch.impl.matcher.iterators.DocValuesIterator;
+import com.intellij.structuralsearch.impl.matcher.iterators.HierarchyNodeIterator;
+import com.intellij.dupLocator.iterators.NodeIterator;
+import com.intellij.structuralsearch.impl.matcher.predicates.NotPredicate;
+import com.intellij.structuralsearch.impl.matcher.predicates.RegExpPredicate;
+import com.intellij.util.containers.ContainerUtil;
+
+import java.util.*;
+
+/**
+ * @author Eugene.Kudelevsky
+ */
+public class JavaMatchingVisitor extends JavaElementVisitor {
+ public static final String[] MODIFIERS = {
+ PsiModifier.PUBLIC, PsiModifier.PROTECTED, PsiModifier.PRIVATE, PsiModifier.STATIC, PsiModifier.ABSTRACT, PsiModifier.FINAL,
+ PsiModifier.NATIVE, PsiModifier.SYNCHRONIZED, PsiModifier.STRICTFP, PsiModifier.TRANSIENT, PsiModifier.VOLATILE, PsiModifier.DEFAULT
+ };
+ public static final Key<List<PsiCatchSection>> UNMATCHED_CATCH_SECTION_CONTENT_VAR_KEY = Key.create("UnmatchedCatchSection");
+ private final GlobalMatchingVisitor myMatchingVisitor;
+ private PsiClass myClazz;
+
+ static {
+ Arrays.sort(MODIFIERS);
+ }
+
+ public JavaMatchingVisitor(GlobalMatchingVisitor matchingVisitor) {
+ this.myMatchingVisitor = matchingVisitor;
+ }
+
+ @Override
+ public void visitComment(PsiComment comment) {
+ PsiElement comment2 = null;
+
+ if (!(myMatchingVisitor.getElement() instanceof PsiComment)) {
+ if (myMatchingVisitor.getElement() instanceof PsiMember) {
+ final PsiElement[] children = myMatchingVisitor.getElement().getChildren();
+ if (children[0] instanceof PsiComment) {
+ comment2 = children[0];
+ }
+ }
+ }
+ else {
+ comment2 = myMatchingVisitor.getElement();
+ }
+
+ if (comment2 == null) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+
+ final Object userData = comment.getUserData(CompiledPattern.HANDLER_KEY);
+
+ if (userData instanceof String) {
+ String str = (String)userData;
+ int end = comment2.getTextLength();
+
+ if (((PsiComment)comment2).getTokenType() == JavaTokenType.C_STYLE_COMMENT) {
+ end -= 2;
+ }
+ myMatchingVisitor.setResult(((SubstitutionHandler)myMatchingVisitor.getMatchContext().getPattern().getHandler(str)).handle(
+ comment2,
+ 2,
+ end,
+ myMatchingVisitor.getMatchContext()
+ ));
+ }
+ else if (userData instanceof MatchingHandler) {
+ myMatchingVisitor.setResult(((MatchingHandler)userData).match(comment, comment2, myMatchingVisitor.getMatchContext()));
+ }
+ else {
+ myMatchingVisitor.setResult(comment.getText().equals(comment2.getText()));
+ }
+ }
+
+ @Override
+ public void visitDocTagValue(final PsiDocTagValue value) {
+ final PsiDocTagValue value2 = (PsiDocTagValue)myMatchingVisitor.getElement();
+ final boolean isTypedVar = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(value);
+
+ if (isTypedVar) {
+ myMatchingVisitor.setResult(myMatchingVisitor.handleTypedElement(value, value2));
+ }
+ else {
+ myMatchingVisitor.setResult(value.textMatches(value2));
+ }
+ }
+
+ private static boolean isNotInstanceModifier(final PsiModifierList list2) {
+ return list2.hasModifierProperty(PsiModifier.STATIC) ||
+ list2.hasModifierProperty(PsiModifier.ABSTRACT);
+ }
+
+ @Override
+ public final void visitModifierList(final PsiModifierList list) {
+ final PsiModifierList list2 = (PsiModifierList)myMatchingVisitor.getElement();
+
+ for (@PsiModifier.ModifierConstant String modifier : MODIFIERS) {
+ if (list.hasModifierProperty(modifier) && !list2.hasModifierProperty(modifier)) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ }
+
+ final PsiAnnotation[] annotations = list.getAnnotations();
+ if (annotations.length > 0) {
+ HashSet<PsiAnnotation> set = new HashSet<PsiAnnotation>(Arrays.asList(annotations));
+
+ for (PsiAnnotation annotation : annotations) {
+ final PsiJavaCodeReferenceElement nameReferenceElement = annotation.getNameReferenceElement();
+
+ if (nameReferenceElement != null && MatchOptions.MODIFIER_ANNOTATION_NAME.equals(nameReferenceElement.getText())) {
+ final PsiAnnotationParameterList parameterList = annotation.getParameterList();
+ final PsiNameValuePair[] attributes = parameterList.getAttributes();
+
+ for (PsiNameValuePair pair : attributes) {
+ final PsiAnnotationMemberValue value = pair.getValue();
+ if (value == null) continue;
+
+ if (value instanceof PsiArrayInitializerMemberValue) {
+ boolean matchedOne = false;
+
+ for (PsiAnnotationMemberValue v : ((PsiArrayInitializerMemberValue)value).getInitializers()) {
+ @PsiModifier.ModifierConstant String name = StringUtil.stripQuotesAroundValue(v.getText());
+ if (MatchOptions.INSTANCE_MODIFIER_NAME.equals(name)) {
+ if (isNotInstanceModifier(list2)) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ else {
+ matchedOne = true;
+ }
+ }
+ else if (list2.hasModifierProperty(name)) {
+ matchedOne = true;
+ break;
+ }
+ }
+
+ if (!matchedOne) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ }
+ else {
+ @PsiModifier.ModifierConstant String name = StringUtil.stripQuotesAroundValue(value.getText());
+ if (MatchOptions.INSTANCE_MODIFIER_NAME.equals(name)) {
+ if (isNotInstanceModifier(list2)) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ }
+ else if (!list2.hasModifierProperty(name)) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ }
+ }
+
+ set.remove(annotation);
+ }
+ }
+
+ myMatchingVisitor.setResult(set.isEmpty() || myMatchingVisitor
+ .matchInAnyOrder(set.toArray(new PsiAnnotation[set.size()]), list2.getAnnotations()));
+ }
+ else {
+ myMatchingVisitor.setResult(true);
+ }
+ }
+
+ @Override
+ public void visitDocTag(final PsiDocTag tag) {
+ final PsiDocTag tag2 = (PsiDocTag)myMatchingVisitor.getElement();
+ final boolean isTypedVar = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(tag.getNameElement());
+
+ myMatchingVisitor.setResult(isTypedVar || tag.getName().equals(tag2.getName()));
+
+ PsiElement psiDocTagValue = tag.getValueElement();
+ boolean isTypedValue = false;
+
+ if (myMatchingVisitor.getResult() && psiDocTagValue != null) {
+ final PsiElement[] children = psiDocTagValue.getChildren();
+ if (children.length == 1) {
+ psiDocTagValue = children[0];
+ }
+ isTypedValue = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(psiDocTagValue);
+
+ if (isTypedValue) {
+ if (tag2.getValueElement() != null) {
+ myMatchingVisitor.setResult(myMatchingVisitor.handleTypedElement(psiDocTagValue, tag2.getValueElement()));
+ }
+ else {
+ myMatchingVisitor.setResult(allowsAbsenceOfMatch(psiDocTagValue));
+ }
+ }
+ }
+
+ if (myMatchingVisitor.getResult() && !isTypedValue) {
+ myMatchingVisitor.setResult(myMatchingVisitor.matchInAnyOrder(
+ new DocValuesIterator(tag.getFirstChild()),
+ new DocValuesIterator(tag2.getFirstChild())
+ ));
+ }
+
+ if (myMatchingVisitor.getResult() && isTypedVar) {
+ myMatchingVisitor.setResult(myMatchingVisitor.handleTypedElement(tag.getNameElement(), tag2.getNameElement()));
+ }
+ }
+
+ private boolean allowsAbsenceOfMatch(final PsiElement element) {
+ MatchingHandler handler = myMatchingVisitor.getMatchContext().getPattern().getHandler(element);
+
+ if (handler instanceof SubstitutionHandler &&
+ ((SubstitutionHandler)handler).getMinOccurs() == 0) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void visitDocComment(final PsiDocComment comment) {
+ PsiDocComment comment2;
+
+ if (myMatchingVisitor.getElement() instanceof PsiDocCommentOwner) {
+ comment2 = ((PsiDocCommentOwner)myMatchingVisitor.getElement()).getDocComment();
+
+ if (comment2 == null) {
+ // doc comment are not collapsed for inner classes!
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ }
+ else {
+ comment2 = (PsiDocComment)myMatchingVisitor.getElement();
+
+ if (myMatchingVisitor.getElement().getParent() instanceof PsiDocCommentOwner) {
+ myMatchingVisitor.setResult(false);
+ return; // we should matched the doc before
+ }
+ }
+
+ if (comment.getTags().length > 0) {
+ myMatchingVisitor.setResult(myMatchingVisitor.matchInAnyOrder(comment.getTags(), comment2.getTags()));
+ }
+ else {
+ visitComment(comment);
+ }
+ }
+
+ @Override
+ public void visitElement(PsiElement el) {
+ myMatchingVisitor.setResult(el.textMatches(myMatchingVisitor.getElement()));
+ }
+
+ @Override
+ public void visitArrayInitializerExpression(PsiArrayInitializerExpression expression) {
+ final PsiArrayInitializerExpression expr2 = (PsiArrayInitializerExpression)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.matchSequentially(
+ new ArrayBackedNodeIterator(expression.getInitializers()),
+ new ArrayBackedNodeIterator(expr2.getInitializers())
+ ));
+ }
+
+ @Override
+ public void visitClassInitializer(PsiClassInitializer initializer) {
+ PsiClassInitializer initializer2 = (PsiClassInitializer)myMatchingVisitor.getElement();
+ myMatchingVisitor.setResult(myMatchingVisitor.match(initializer.getModifierList(), initializer2.getModifierList()) &&
+ myMatchingVisitor.match(initializer.getBody(), initializer2.getBody()));
+ }
+
+ @Override
+ public void visitCodeBlock(PsiCodeBlock block) {
+ myMatchingVisitor.setResult(myMatchingVisitor.matchSons(block, myMatchingVisitor.getElement()));
+ }
+
+ @Override
+ public void visitJavaToken(final PsiJavaToken token) {
+ PsiElement element = myMatchingVisitor.getElement();
+ boolean result;
+
+ if (!(element instanceof PsiJavaToken)) {
+ result = token.textMatches(element);
+ } else {
+ final PsiJavaToken anotherToken = (PsiJavaToken)element;
+
+ result = token.getTokenType() == anotherToken.getTokenType() && token.textMatches(anotherToken);
+ }
+
+ myMatchingVisitor.setResult(result);
+ }
+
+ @Override
+ public void visitAnnotation(PsiAnnotation annotation) {
+ final PsiAnnotation psiAnnotation = (PsiAnnotation)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(annotation.getNameReferenceElement(), psiAnnotation.getNameReferenceElement()) &&
+ myMatchingVisitor
+ .matchInAnyOrder(annotation.getParameterList().getAttributes(),
+ psiAnnotation.getParameterList().getAttributes()));
+ }
+
+ @Override
+ public void visitNameValuePair(PsiNameValuePair pair) {
+ final PsiIdentifier nameIdentifier = pair.getNameIdentifier();
+
+ final PsiNameValuePair elementNameValuePair = (PsiNameValuePair)myMatchingVisitor.getElement();
+ final PsiIdentifier otherIdentifier = elementNameValuePair.getNameIdentifier();
+
+ final PsiAnnotationMemberValue annotationInitializer = pair.getValue();
+ if (annotationInitializer != null) {
+ final boolean isTypedInitializer = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(annotationInitializer) &&
+ annotationInitializer instanceof PsiReferenceExpression;
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(annotationInitializer, elementNameValuePair.getValue()) ||
+ (isTypedInitializer &&
+ elementNameValuePair.getValue() == null &&
+ allowsAbsenceOfMatch(annotationInitializer)
+ ));
+ }
+ if (myMatchingVisitor.getResult()) {
+ final MatchingHandler handler = myMatchingVisitor.getMatchContext().getPattern().getHandler(nameIdentifier);
+
+ if (handler instanceof SubstitutionHandler) {
+ myMatchingVisitor.setResult(((SubstitutionHandler)handler).handle(otherIdentifier, myMatchingVisitor.getMatchContext()));
+ }
+ else if (nameIdentifier != null) {
+ myMatchingVisitor.setResult(myMatchingVisitor.match(nameIdentifier, otherIdentifier));
+ }
+ else {
+ myMatchingVisitor.setResult(otherIdentifier == null || otherIdentifier.getText().equals("value"));
+ }
+ }
+ }
+
+ private boolean checkHierarchy(PsiMember element, PsiMember patternElement) {
+ final MatchingHandler handler = myMatchingVisitor.getMatchContext().getPattern().getHandler(patternElement);
+ if (handler instanceof SubstitutionHandler) {
+ final SubstitutionHandler handler2 = (SubstitutionHandler)handler;
+
+ if (!handler2.isSubtype()) {
+ if (handler2.isStrictSubtype()) {
+ // check if element is declared not in current class (in ancestors)
+ return element.getContainingClass() != myClazz;
+ }
+ }
+ else {
+ return true;
+ }
+ }
+
+ // check if element is declared in current class (not in ancestors)
+ return element.getContainingClass() == myClazz;
+ }
+
+ @Override
+ public void visitField(PsiField psiField) {
+ if (!checkHierarchy((PsiField)myMatchingVisitor.getElement(), psiField)) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ super.visitField(psiField);
+ }
+
+ @Override
+ public void visitAnonymousClass(final PsiAnonymousClass clazz) {
+ final PsiAnonymousClass clazz2 = (PsiAnonymousClass)myMatchingVisitor.getElement();
+ final boolean isTypedVar = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(clazz.getFirstChild());
+
+ myMatchingVisitor.setResult((myMatchingVisitor.match(clazz.getBaseClassReference(), clazz2.getBaseClassReference()) || isTypedVar) &&
+ myMatchingVisitor.matchSons(clazz.getArgumentList(), clazz2.getArgumentList()) &&
+ compareClasses(clazz, clazz2));
+
+ if (myMatchingVisitor.getResult() && isTypedVar) {
+ myMatchingVisitor.setResult(myMatchingVisitor.handleTypedElement(clazz.getFirstChild(), clazz2.getFirstChild()));
+ }
+ }
+
+ @Override
+ public void visitLambdaExpression(PsiLambdaExpression expression) {
+ final PsiLambdaExpression expression2 = (PsiLambdaExpression)myMatchingVisitor.getElement();
+ boolean result = true;
+ final PsiParameterList parameterList1 = expression.getParameterList();
+ if (parameterList1.getParametersCount() != 0) {
+ result = myMatchingVisitor.matchSons(parameterList1, expression2.getParameterList());
+ }
+ final PsiElement body1 = getElementToMatch(expression.getBody());
+ if (body1 != null) {
+ result = myMatchingVisitor.matchSequentially(body1, getElementToMatch(expression2.getBody()));
+ }
+ myMatchingVisitor.setResult(result);
+ }
+
+ private static PsiElement getElementToMatch(PsiElement element) {
+ if (element instanceof PsiCodeBlock) {
+ element = PsiTreeUtil.getChildOfAnyType(element, PsiStatement.class, PsiComment.class);
+ }
+ if (element instanceof PsiExpressionStatement) {
+ element = ((PsiExpressionStatement)element).getExpression();
+ }
+ if (element instanceof PsiReturnStatement) {
+ element = ((PsiReturnStatement)element).getReturnValue();
+ }
+ return element;
+ }
+
+ protected boolean matchInAnyOrder(final PsiReferenceList elements, final PsiReferenceList elements2, GlobalMatchingVisitor visitor) {
+ if ((elements == null && visitor.isLeftLooseMatching()) ||
+ elements == elements2 // null
+ ) {
+ return true;
+ }
+
+ return visitor.matchInAnyOrder(
+ elements.getReferenceElements(),
+ (elements2 != null) ? elements2.getReferenceElements() : PsiElement.EMPTY_ARRAY
+ );
+ }
+
+ private boolean compareClasses(final PsiClass clazz, final PsiClass clazz2) {
+ final PsiClass saveClazz = this.myClazz;
+ final MatchContext.MatchedElementsListener oldListener = myMatchingVisitor.getMatchContext().getMatchedElementsListener();
+
+ this.myClazz = clazz2;
+
+ final CompiledPattern pattern = myMatchingVisitor.getMatchContext().getPattern();
+ assert pattern instanceof JavaCompiledPattern;
+ final JavaCompiledPattern javaPattern = (JavaCompiledPattern)pattern;
+
+ final String unmatchedHandlerName = clazz.getUserData(JavaCompiledPattern.ALL_CLASS_CONTENT_VAR_NAME_KEY);
+ final MatchingHandler allRemainingClassContentElementHandler = unmatchedHandlerName != null ? pattern.getHandler(unmatchedHandlerName) : null;
+ MatchContext.MatchedElementsListener newListener = null;
+
+ assert javaPattern instanceof JavaCompiledPattern;
+ if (allRemainingClassContentElementHandler != null) {
+ myMatchingVisitor.getMatchContext().setMatchedElementsListener(
+ newListener = new MatchContext.MatchedElementsListener() {
+ private Set<PsiElement> myMatchedElements;
+
+ public void matchedElements(Collection<PsiElement> matchedElements) {
+ if (matchedElements == null) return;
+ if (myMatchedElements == null) {
+ myMatchedElements = new HashSet<PsiElement>(matchedElements);
+ }
+ else {
+ myMatchedElements.addAll(matchedElements);
+ }
+ }
+
+ public void commitUnmatched() {
+ final SubstitutionHandler handler = (SubstitutionHandler)allRemainingClassContentElementHandler;
+
+ for (PsiElement el = clazz2.getFirstChild(); el != null; el = el.getNextSibling()) {
+ if (el instanceof PsiMember && (myMatchedElements == null || !myMatchedElements.contains(el))) {
+ handler.handle(el, myMatchingVisitor.getMatchContext());
+ }
+ }
+ }
+ }
+ );
+ }
+
+ boolean result = false;
+ try {
+ final boolean templateIsInterface = clazz.isInterface();
+ if (templateIsInterface != clazz2.isInterface()) return false;
+ if (templateIsInterface && clazz.isAnnotationType() && !clazz2.isAnnotationType()) return false;
+ final boolean templateIsEnum = clazz.isEnum();
+ if (templateIsEnum && !clazz2.isEnum()) return false;
+
+ if (!matchInAnyOrder(clazz.getExtendsList(), clazz2.getExtendsList(), myMatchingVisitor)) {
+ return false;
+ }
+
+ // check if implements is in extended classes implements
+ final PsiReferenceList implementsList = clazz.getImplementsList();
+ if (implementsList != null) {
+ if (!matchInAnyOrder(implementsList, clazz2.getImplementsList(), myMatchingVisitor)) {
+ final PsiReferenceList anotherExtendsList = clazz2.getExtendsList();
+ final PsiJavaCodeReferenceElement[] referenceElements = implementsList.getReferenceElements();
+
+ boolean accepted = false;
+
+ if (referenceElements.length > 0 && anotherExtendsList != null) {
+ final HierarchyNodeIterator iterator = new HierarchyNodeIterator(clazz2, true, true, false);
+
+ accepted = myMatchingVisitor.matchInAnyOrder(new ArrayBackedNodeIterator(referenceElements), iterator);
+ }
+
+ if (!accepted) return false;
+ }
+ }
+
+ final PsiField[] fields = clazz.getFields();
+
+ if (fields.length > 0) {
+ final PsiField[] fields2 = javaPattern.isRequestsSuperFields() ?
+ clazz2.getAllFields() :
+ clazz2.getFields();
+
+ if (!myMatchingVisitor.matchInAnyOrder(fields, fields2)) {
+ return false;
+ }
+ }
+
+ final PsiMethod[] methods = clazz.getMethods();
+
+ if (methods.length > 0) {
+ final PsiMethod[] methods2 = javaPattern.isRequestsSuperMethods() ?
+ clazz2.getAllMethods() :
+ clazz2.getMethods();
+
+ if (!myMatchingVisitor.matchInAnyOrder(methods, methods2)) {
+ return false;
+ }
+ }
+
+ final PsiClass[] nestedClasses = clazz.getInnerClasses();
+
+ if (nestedClasses.length > 0) {
+ final PsiClass[] nestedClasses2 = javaPattern.isRequestsSuperInners() ?
+ clazz2.getAllInnerClasses() :
+ clazz2.getInnerClasses();
+
+ if (!myMatchingVisitor.matchInAnyOrder(nestedClasses, nestedClasses2)) {
+ return false;
+ }
+ }
+
+ final PsiClassInitializer[] initializers = clazz.getInitializers();
+ if (initializers.length > 0) {
+ final PsiClassInitializer[] initializers2 = clazz2.getInitializers();
+
+ if (!myMatchingVisitor.matchInAnyOrder(initializers, initializers2)) {
+ return false;
+ }
+ }
+
+ result = true;
+ return result;
+ }
+ finally {
+ if (result && newListener != null) newListener.commitUnmatched();
+ this.myClazz = saveClazz;
+ myMatchingVisitor.getMatchContext().setMatchedElementsListener(oldListener);
+ }
+ }
+
+ private boolean compareBody(final PsiElement el1, final PsiElement el2) {
+ PsiElement compareElement1 = el1;
+ PsiElement compareElement2 = el2;
+
+ if (myMatchingVisitor.getMatchContext().getOptions().isLooseMatching()) {
+ if (el1 instanceof PsiBlockStatement) {
+ compareElement1 = ((PsiBlockStatement)el1).getCodeBlock().getFirstChild();
+ }
+
+ if (el2 instanceof PsiBlockStatement) {
+ compareElement2 = ((PsiBlockStatement)el2).getCodeBlock().getFirstChild();
+ }
+ }
+
+ return myMatchingVisitor.matchSequentially(compareElement1, compareElement2);
+ }
+
+ @Override
+ public void visitArrayAccessExpression(final PsiArrayAccessExpression slice) {
+ final PsiArrayAccessExpression slice2 = (PsiArrayAccessExpression)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(slice.getArrayExpression(), slice2.getArrayExpression()) &&
+ myMatchingVisitor.match(slice.getIndexExpression(), slice2.getIndexExpression()));
+ }
+
+ @Override
+ public void visitMethodReferenceExpression(PsiMethodReferenceExpression expression) {
+ final PsiElement element = myMatchingVisitor.getElement();
+ if (!(element instanceof PsiMethodReferenceExpression)) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ super.visitMethodReferenceExpression(expression);
+ }
+
+ @Override
+ public void visitReferenceExpression(final PsiReferenceExpression reference) {
+ final PsiExpression qualifier = reference.getQualifierExpression();
+
+ final PsiElement nameElement = reference.getReferenceNameElement();
+ final MatchContext context = myMatchingVisitor.getMatchContext();
+ MatchingHandler _handler = nameElement != null ? context.getPattern().getHandlerSimple(nameElement) : null;
+ if (!(_handler instanceof SubstitutionHandler)) _handler = context.getPattern().getHandlerSimple(reference);
+
+ final PsiElement element = myMatchingVisitor.getElement();
+ PsiElement other = element instanceof PsiExpression && context.getOptions().isLooseMatching() ?
+ PsiUtil.skipParenthesizedExprDown((PsiExpression)element) :
+ element;
+ if (_handler instanceof SubstitutionHandler &&
+ !(context.getPattern().getHandlerSimple(qualifier) instanceof SubstitutionHandler) &&
+ !(qualifier instanceof PsiThisExpression)
+ ) {
+ if (other instanceof PsiReferenceExpression) {
+ final PsiReferenceExpression psiReferenceExpression = (PsiReferenceExpression)other;
+
+ final PsiExpression qualifier2 = psiReferenceExpression.getQualifierExpression();
+ if (qualifier2 == null || (context.getOptions().isLooseMatching() && qualifier2 instanceof PsiThisExpression)) {
+ other = psiReferenceExpression.getReferenceNameElement();
+ }
+ }
+
+ final SubstitutionHandler handler = (SubstitutionHandler)_handler;
+ if (handler.isSubtype() || handler.isStrictSubtype()) {
+ myMatchingVisitor.setResult(checkMatchWithingHierarchy(other, handler, reference));
+ }
+ else {
+ myMatchingVisitor.setResult(handler.handle(other, context));
+ }
+
+ return;
+ }
+
+ if (!(other instanceof PsiReferenceExpression)) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+
+ final PsiReferenceExpression reference2 = (PsiReferenceExpression)other;
+
+ // just variable
+ final PsiExpression reference2Qualifier = reference2.getQualifierExpression();
+ if (qualifier == null && reference2Qualifier == null) {
+ myMatchingVisitor.setResult(reference.getReferenceNameElement().textMatches(reference2.getReferenceNameElement()));
+ return;
+ }
+
+ // handle field selection
+ if (!(other.getParent() instanceof PsiMethodCallExpression) && qualifier != null) {
+ final PsiElement referenceElement = reference.getReferenceNameElement();
+ final PsiElement referenceElement2 = reference2.getReferenceNameElement();
+
+ if (context.getPattern().isTypedVar(referenceElement)) {
+ myMatchingVisitor.setResult(myMatchingVisitor.handleTypedElement(referenceElement, referenceElement2));
+ }
+ else {
+ myMatchingVisitor.setResult(
+ (referenceElement2 != null && referenceElement != null && referenceElement.textMatches(referenceElement2)) ||
+ referenceElement == referenceElement2);
+ }
+
+ if (!myMatchingVisitor.getResult()) {
+ return;
+ }
+ if (reference2Qualifier != null) {
+ myMatchingVisitor.setResult(myMatchingVisitor.match(qualifier, reference2Qualifier));
+ }
+ else {
+ final PsiElement referencedElement = MatchUtils.getReferencedElement(other);
+ if (referencedElement instanceof PsiField) {
+ final PsiField field = (PsiField)referencedElement;
+ if (qualifier instanceof PsiThisExpression) {
+ myMatchingVisitor.setResult(!field.hasModifierProperty(PsiModifier.STATIC));
+ return;
+ }
+ }
+ final MatchingHandler handler = context.getPattern().getHandler(qualifier);
+ matchImplicitQualifier(handler, referencedElement, context);
+ }
+
+ return;
+ }
+
+ myMatchingVisitor.setResult(false);
+ }
+
+ private static int countCStyleArrayDeclarationDims(final PsiElement type2) {
+ if (type2 != null) {
+ final PsiElement parentElement = type2.getParent();
+
+ if (parentElement instanceof PsiVariable) {
+ final PsiIdentifier psiIdentifier = ((PsiVariable)parentElement).getNameIdentifier();
+ if (psiIdentifier == null) return 0;
+
+ int count = 0;
+ for (PsiElement sibling = psiIdentifier.getNextSibling(); sibling != null; sibling = sibling.getNextSibling()) {
+ if (sibling instanceof PsiJavaToken) {
+ final IElementType tokenType = ((PsiJavaToken)sibling).getTokenType();
+ if (tokenType == JavaTokenType.LBRACKET) ++count;
+ else if (tokenType != JavaTokenType.RBRACKET) break;
+ }
+ }
+
+ return count;
+ }
+ }
+ return 0;
+ }
+
+ private void copyResults(final MatchResultImpl ourResult) {
+ if (ourResult.hasSons()) {
+ for (MatchResult son : ourResult.getAllSons()) {
+ myMatchingVisitor.getMatchContext().getResult().addSon((MatchResultImpl)son);
+ }
+ }
+ }
+
+ private boolean matchType(final PsiElement _type, final PsiElement _type2) {
+ PsiElement el = _type;
+ PsiElement el2 = _type2;
+ PsiType type1 = null;
+ PsiType type2 = null;
+
+ // check for generics
+ if (_type instanceof PsiTypeElement &&
+ ((PsiTypeElement)_type).getInnermostComponentReferenceElement() != null
+ ) {
+ el = ((PsiTypeElement)_type).getInnermostComponentReferenceElement();
+ type1 = ((PsiTypeElement)_type).getType();
+ }
+
+ if (_type2 instanceof PsiTypeElement &&
+ ((PsiTypeElement)_type2).getInnermostComponentReferenceElement() != null
+ ) {
+ el2 = ((PsiTypeElement)_type2).getInnermostComponentReferenceElement();
+ type2 = ((PsiTypeElement)_type2).getType();
+ }
+
+ PsiElement[] typeparams = null;
+ if (el2 instanceof PsiJavaCodeReferenceElement) {
+ typeparams = ((PsiJavaCodeReferenceElement)el2).getParameterList().getTypeParameterElements();
+ if (typeparams.length > 0) {
+ el2 = ((PsiJavaCodeReferenceElement)el2).getReferenceNameElement();
+ }
+ }
+ else if (el2 instanceof PsiTypeParameter) {
+ el2 = ((PsiTypeParameter)el2).getNameIdentifier();
+ }
+ else if (el2 instanceof PsiClass && ((PsiClass)el2).hasTypeParameters()
+ ) {
+ typeparams = ((PsiClass)el2).getTypeParameters();
+ el2 = ((PsiClass)el2).getNameIdentifier();
+ }
+ else if (el2 instanceof PsiMethod && ((PsiMethod)el2).hasTypeParameters()
+ ) {
+ typeparams = ((PsiMethod)_type2).getTypeParameters();
+ el2 = ((PsiMethod)_type2).getNameIdentifier();
+ }
+
+ PsiReferenceParameterList list = null;
+ if (el instanceof PsiJavaCodeReferenceElement) {
+ list = ((PsiJavaCodeReferenceElement)el).getParameterList();
+ }
+
+ if (list != null && list.getTypeParameterElements().length > 0) {
+ boolean result = typeparams != null &&
+ myMatchingVisitor.matchInAnyOrder(
+ list.getTypeParameterElements(),
+ typeparams
+ );
+
+ if (!result) return false;
+ el = ((PsiJavaCodeReferenceElement)el).getReferenceNameElement();
+ }
+ else {
+ if (_type2 instanceof PsiTypeElement) {
+ type2 = ((PsiTypeElement)_type2).getType();
+
+ if (typeparams == null || typeparams.length == 0) {
+ final PsiJavaCodeReferenceElement innermostComponentReferenceElement =
+ ((PsiTypeElement)_type2).getInnermostComponentReferenceElement();
+ if (innermostComponentReferenceElement != null) el2 = innermostComponentReferenceElement;
+ }
+ else {
+ el2 = _type2;
+ }
+ }
+ }
+
+ final int array2Dims = (type2 != null ? type2.getArrayDimensions() : 0) + countCStyleArrayDeclarationDims(_type2);
+ final int arrayDims = (type1 != null ? type1.getArrayDimensions() : 0) + countCStyleArrayDeclarationDims(_type);
+
+ if (myMatchingVisitor.getMatchContext().getPattern().isTypedVar(el)) {
+ final SubstitutionHandler handler = (SubstitutionHandler)myMatchingVisitor.getMatchContext().getPattern().getHandler(el);
+
+ RegExpPredicate regExpPredicate = null;
+
+ if (arrayDims != 0) {
+ if (arrayDims != array2Dims) {
+ return false;
+ }
+ }
+ else if (array2Dims != 0) {
+ regExpPredicate = MatchingHandler.getSimpleRegExpPredicate(handler);
+
+ if (regExpPredicate != null) {
+ regExpPredicate.setNodeTextGenerator(new RegExpPredicate.NodeTextGenerator() {
+ public String getText(PsiElement element) {
+ StringBuilder builder = new StringBuilder(RegExpPredicate.getMeaningfulText(element));
+ for (int i = 0; i < array2Dims; ++i) builder.append("[]");
+ return builder.toString();
+ }
+ });
+ }
+ }
+
+ try {
+ if (handler.isSubtype() || handler.isStrictSubtype()) {
+ return checkMatchWithingHierarchy(el2, handler, el);
+ }
+ else {
+ return handler.handle(el2, myMatchingVisitor.getMatchContext());
+ }
+ }
+ finally {
+ if (regExpPredicate != null) regExpPredicate.setNodeTextGenerator(null);
+ }
+ }
+
+ if (array2Dims != arrayDims) {
+ return false;
+ }
+
+ if (el instanceof PsiIdentifier) {
+ final PsiElement parent = el.getParent();
+ if (parent instanceof PsiJavaCodeReferenceElement) {
+ el = parent;
+ }
+ }
+ if (el2 instanceof PsiIdentifier) {
+ final PsiElement parent = el2.getParent();
+ if (parent instanceof PsiJavaCodeReferenceElement) {
+ el2 = parent;
+ }
+ }
+ final String text = stripTypeParameters(el.getText());
+ if (text.indexOf('.') == -1 || !(el2 instanceof PsiJavaReference)) {
+ return MatchUtils.compareWithNoDifferenceToPackage(text, stripTypeParameters(el2.getText()));
+ }
+ else {
+ PsiElement element2 = ((PsiJavaReference)el2).resolve();
+
+ if (element2 != null) {
+ return text.equals(((PsiClass)element2).getQualifiedName());
+ }
+ else {
+ return MatchUtils.compareWithNoDifferenceToPackage(text, el2.getText());
+ }
+ }
+ }
+
+ private static String stripTypeParameters(String string) {
+ final int index = string.indexOf('<');
+ if (index == -1) {
+ return string;
+ }
+ return string.substring(0, index);
+ }
+
+ private boolean checkMatchWithingHierarchy(PsiElement el2, SubstitutionHandler handler, PsiElement context) {
+ boolean includeInterfaces = true;
+ boolean includeClasses = true;
+ final PsiElement contextParent = context.getParent();
+
+ if (contextParent instanceof PsiReferenceList) {
+ final PsiElement grandParentContext = contextParent.getParent();
+
+ if (grandParentContext instanceof PsiClass) {
+ final PsiClass psiClass = (PsiClass)grandParentContext;
+
+ if (contextParent == psiClass.getExtendsList()) {
+ includeInterfaces = psiClass.isInterface();
+ }
+ else if (contextParent == psiClass.getImplementsList()) {
+ includeClasses = false;
+ }
+ }
+ }
+
+ // is type2 is (strict) subtype of type
+ final NodeIterator node = new HierarchyNodeIterator(el2, includeClasses, includeInterfaces);
+
+ if (handler.isStrictSubtype()) {
+ node.advance();
+ }
+
+ final boolean notPredicate = handler.getPredicate() instanceof NotPredicate;
+ while (node.hasNext() && !handler.validate(node.current(), 0, -1, myMatchingVisitor.getMatchContext())) {
+ if (notPredicate) return false;
+ node.advance();
+ }
+
+ if (node.hasNext()) {
+ handler.addResult(el2, 0, -1, myMatchingVisitor.getMatchContext());
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+ @Override
+ public void visitConditionalExpression(final PsiConditionalExpression cond) {
+ final PsiConditionalExpression cond2 = (PsiConditionalExpression)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(cond.getCondition(), cond2.getCondition()) &&
+ myMatchingVisitor.matchSons(cond, cond2));
+ }
+
+ @Override
+ public void visitPolyadicExpression(PsiPolyadicExpression expression) {
+ PsiPolyadicExpression expr2 = (PsiPolyadicExpression)myMatchingVisitor.getElement();
+
+ boolean result = expression.getOperationTokenType().equals(expr2.getOperationTokenType());
+ if (result) {
+ PsiExpression[] operands1 = expression.getOperands();
+ PsiExpression[] operands2 = expr2.getOperands();
+ if (operands1.length != operands2.length) {
+ result = false;
+ }
+ else {
+ for (int i = 0; i < operands1.length; i++) {
+ PsiExpression e1 = operands1[i];
+ PsiExpression e2 = operands2[i];
+ if (!myMatchingVisitor.match(e1, e2)) {
+ result = false;
+ break;
+ }
+ }
+ }
+ }
+
+ myMatchingVisitor.setResult(result);
+ }
+
+ @Override
+ public void visitVariable(final PsiVariable var) {
+ myMatchingVisitor.getMatchContext().pushResult();
+ final PsiIdentifier nameIdentifier = var.getNameIdentifier();
+
+ boolean isTypedVar = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(nameIdentifier);
+ boolean isTypedInitializer = var.getInitializer() != null &&
+ myMatchingVisitor.getMatchContext().getPattern().isTypedVar(var.getInitializer()) &&
+ var.getInitializer() instanceof PsiReferenceExpression;
+ final PsiVariable var2 = (PsiVariable)myMatchingVisitor.getElement();
+
+ try {
+ myMatchingVisitor.setResult((var.getName().equals(var2.getName()) || isTypedVar) &&
+ ((var.getParent() instanceof PsiClass && ((PsiClass)var.getParent()).isInterface()) ||
+ myMatchingVisitor.match(var.getModifierList(), var2.getModifierList())));
+ if (myMatchingVisitor.getResult()) {
+ final PsiTypeElement typeElement1 = var.getTypeElement();
+ if (typeElement1 != null) {
+ PsiTypeElement typeElement2 = var2.getTypeElement();
+ if (typeElement2 == null) {
+ typeElement2 = JavaPsiFacade.getElementFactory(var2.getProject()).createTypeElement(var2.getType());
+ }
+ myMatchingVisitor.setResult(myMatchingVisitor.match(typeElement1, typeElement2));
+ }
+ }
+
+ if (myMatchingVisitor.getResult()) {
+ // Check initializer
+ final PsiExpression var2Initializer = var2.getInitializer();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(var.getInitializer(), var2Initializer) ||
+ (isTypedInitializer &&
+ var2Initializer == null &&
+ allowsAbsenceOfMatch(var.getInitializer())
+ ));
+ }
+
+ if (myMatchingVisitor.getResult() && var instanceof PsiParameter && var.getParent() instanceof PsiCatchSection) {
+ myMatchingVisitor.setResult(myMatchingVisitor.match(
+ ((PsiCatchSection)var.getParent()).getCatchBlock(),
+ ((PsiCatchSection)var2.getParent()).getCatchBlock()
+ ));
+ }
+
+ if (myMatchingVisitor.getResult() && isTypedVar) {
+ myMatchingVisitor.setResult(myMatchingVisitor.handleTypedElement(nameIdentifier, var2.getNameIdentifier()));
+ }
+ }
+ finally {
+ saveOrDropResult(nameIdentifier, isTypedVar, var2.getNameIdentifier());
+ }
+ }
+
+ private void matchArrayDims(final PsiNewExpression new1, final PsiNewExpression new2) {
+ final PsiExpression[] arrayDims = new1.getArrayDimensions();
+ final PsiExpression[] arrayDims2 = new2.getArrayDimensions();
+
+ if (arrayDims.length == arrayDims2.length && arrayDims.length != 0) {
+ for (int i = 0; i < arrayDims.length; ++i) {
+ myMatchingVisitor.setResult(myMatchingVisitor.match(arrayDims[i], arrayDims2[i]));
+ if (!myMatchingVisitor.getResult()) return;
+ }
+ }
+ else {
+ myMatchingVisitor.setResult((arrayDims == arrayDims2) && myMatchingVisitor.matchSons(new1.getArgumentList(), new2.getArgumentList()));
+ }
+ }
+
+ private void saveOrDropResult(final PsiIdentifier methodNameNode, final boolean typedVar, final PsiIdentifier methodNameNode2) {
+ MatchResultImpl ourResult = myMatchingVisitor.getMatchContext().hasResult() ? myMatchingVisitor.getMatchContext().getResult() : null;
+ myMatchingVisitor.getMatchContext().popResult();
+
+ if (myMatchingVisitor.getResult()) {
+ if (typedVar) {
+ final SubstitutionHandler handler =
+ (SubstitutionHandler)myMatchingVisitor.getMatchContext().getPattern().getHandler(methodNameNode);
+ if (ourResult != null) ourResult.setScopeMatch(true);
+ handler.setNestedResult(ourResult);
+ myMatchingVisitor.setResult(handler.handle(methodNameNode2, myMatchingVisitor.getMatchContext()));
+
+ if (handler.getNestedResult() != null) { // some constraint prevent from adding
+ handler.setNestedResult(null);
+ copyResults(ourResult);
+ }
+ }
+ else if (ourResult != null) {
+ copyResults(ourResult);
+ }
+ }
+ }
+
+ private void matchImplicitQualifier(MatchingHandler matchingHandler, PsiElement target, MatchContext context) {
+ if (!(matchingHandler instanceof SubstitutionHandler)) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ final SubstitutionHandler substitutionHandler = (SubstitutionHandler)matchingHandler;
+ final MatchPredicate predicate = substitutionHandler.getPredicate();
+ if (substitutionHandler.getMinOccurs() != 0) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ if (predicate == null) {
+ myMatchingVisitor.setResult(true);
+ return;
+ }
+ if (target == null) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ if (target instanceof PsiModifierListOwner && ((PsiModifierListOwner)target).hasModifierProperty(PsiModifier.STATIC)) {
+ myMatchingVisitor.setResult(predicate.match(null, PsiTreeUtil.getParentOfType(target, PsiClass.class), context));
+ } else {
+ final PsiElementFactory factory = JavaPsiFacade.getElementFactory(target.getProject());
+ final PsiExpression implicitReference = factory.createExpressionFromText("this", target);
+ myMatchingVisitor.setResult(predicate.match(null, implicitReference, context));
+ }
+ }
+
+ @Override
+ public void visitMethodCallExpression(final PsiMethodCallExpression mcall) {
+ final PsiElement element = myMatchingVisitor.getElement();
+ if (!(element instanceof PsiMethodCallExpression)) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ final PsiMethodCallExpression mcall2 = (PsiMethodCallExpression)element;
+ final PsiReferenceExpression mcallRef1 = mcall.getMethodExpression();
+ final PsiReferenceExpression mcallRef2 = mcall2.getMethodExpression();
+
+ final String mcallname1 = mcallRef1.getReferenceName();
+ final String mcallname2 = mcallRef2.getReferenceName();
+ final boolean isTypedVar = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(mcallRef1.getReferenceNameElement());
+
+ if (mcallname1 != null && !mcallname1.equals(mcallname2) && !isTypedVar) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+
+ final PsiExpression qualifier = mcallRef1.getQualifierExpression();
+ final PsiExpression elementQualifier = mcallRef2.getQualifierExpression();
+ if (qualifier != null) {
+
+ if (elementQualifier != null) {
+ myMatchingVisitor.setResult(myMatchingVisitor.match(qualifier, elementQualifier));
+ if (!myMatchingVisitor.getResult()) return;
+ }
+ else {
+ final PsiMethod method = mcall2.resolveMethod();
+ if (method != null) {
+ if (qualifier instanceof PsiThisExpression) {
+ myMatchingVisitor.setResult(!method.hasModifierProperty(PsiModifier.STATIC));
+ return;
+ }
+ }
+ final MatchingHandler handler = myMatchingVisitor.getMatchContext().getPattern().getHandler(qualifier);
+ matchImplicitQualifier(handler, method, myMatchingVisitor.getMatchContext());
+ if (!myMatchingVisitor.getResult()) {
+ return;
+ }
+ }
+ }
+ else if (elementQualifier != null) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+
+ myMatchingVisitor.setResult(myMatchingVisitor.matchSons(mcall.getArgumentList(), mcall2.getArgumentList()));
+
+ if (myMatchingVisitor.getResult() && isTypedVar) {
+ boolean res = myMatchingVisitor.getResult();
+ res &= myMatchingVisitor.handleTypedElement(mcallRef1.getReferenceNameElement(), mcallRef2.getReferenceNameElement());
+ myMatchingVisitor.setResult(res);
+ }
+ }
+
+ @Override
+ public void visitExpressionStatement(final PsiExpressionStatement expr) {
+ final PsiExpressionStatement expr2 = (PsiExpressionStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(expr.getExpression(), expr2.getExpression()));
+ }
+
+ @Override
+ public void visitLiteralExpression(final PsiLiteralExpression const1) {
+ final PsiLiteralExpression const2 = (PsiLiteralExpression)myMatchingVisitor.getElement();
+
+ MatchingHandler handler = (MatchingHandler)const1.getUserData(CompiledPattern.HANDLER_KEY);
+
+ if (handler instanceof SubstitutionHandler) {
+ int offset = 0;
+ int length = const2.getTextLength();
+ final String text = const2.getText();
+
+ if (length > 2 && text.charAt(0) == '"' && text.charAt(length - 1) == '"') {
+ length--;
+ offset++;
+ }
+ myMatchingVisitor.setResult(((SubstitutionHandler)handler).handle(const2, offset, length, myMatchingVisitor.getMatchContext()));
+ }
+ else if (handler != null) {
+ myMatchingVisitor.setResult(handler.match(const1, const2, myMatchingVisitor.getMatchContext()));
+ }
+ else {
+ myMatchingVisitor.setResult(const1.textMatches(const2));
+ }
+ }
+
+ @Override
+ public void visitAssignmentExpression(final PsiAssignmentExpression assign) {
+ final PsiAssignmentExpression assign2 = (PsiAssignmentExpression)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(assign.getOperationTokenType().equals(assign2.getOperationTokenType()) &&
+ myMatchingVisitor.match(assign.getLExpression(), assign2.getLExpression()) &&
+ myMatchingVisitor.match(assign.getRExpression(), assign2.getRExpression()));
+ }
+
+ @Override
+ public void visitIfStatement(final PsiIfStatement if1) {
+ final PsiIfStatement if2 = (PsiIfStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(if1.getCondition(), if2.getCondition()) &&
+ compareBody(if1.getThenBranch(), if2.getThenBranch()) &&
+ compareBody(if1.getElseBranch(), if2.getElseBranch()));
+ }
+
+ @Override
+ public void visitSwitchStatement(final PsiSwitchStatement switch1) {
+ final PsiSwitchStatement switch2 = (PsiSwitchStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(switch1.getExpression(), switch2.getExpression()) &&
+ myMatchingVisitor.matchSons(switch1.getBody(), switch2.getBody()));
+ }
+
+ @Override
+ public void visitForStatement(final PsiForStatement for1) {
+ final PsiForStatement for2 = (PsiForStatement)myMatchingVisitor.getElement();
+
+ final PsiStatement initialization = for1.getInitialization();
+ MatchingHandler handler = myMatchingVisitor.getMatchContext().getPattern().getHandler(initialization);
+
+ myMatchingVisitor.setResult(handler.match(initialization, for2.getInitialization(), myMatchingVisitor.getMatchContext()) &&
+ myMatchingVisitor.match(for1.getCondition(), for2.getCondition()) &&
+ myMatchingVisitor.match(for1.getUpdate(), for2.getUpdate()) &&
+ compareBody(for1.getBody(), for2.getBody()));
+ }
+
+ @Override
+ public void visitForeachStatement(PsiForeachStatement for1) {
+ final PsiForeachStatement for2 = (PsiForeachStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(for1.getIterationParameter(), for2.getIterationParameter()) &&
+ myMatchingVisitor.match(for1.getIteratedValue(), for2.getIteratedValue()) &&
+ compareBody(for1.getBody(), for2.getBody()));
+ }
+
+ @Override
+ public void visitWhileStatement(final PsiWhileStatement while1) {
+ final PsiWhileStatement while2 = (PsiWhileStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(while1.getCondition(), while2.getCondition()) &&
+ compareBody(while1.getBody(), while2.getBody()));
+ }
+
+ @Override
+ public void visitBlockStatement(final PsiBlockStatement block) {
+ if (myMatchingVisitor.getElement() instanceof PsiCodeBlock &&
+ !(myMatchingVisitor.getElement().getParent() instanceof PsiBlockStatement)
+ ) {
+ myMatchingVisitor.setResult(myMatchingVisitor.matchSons(block.getCodeBlock(), myMatchingVisitor.getElement()));
+ }
+ else {
+ final PsiBlockStatement block2 = (PsiBlockStatement)myMatchingVisitor.getElement();
+ myMatchingVisitor.setResult(myMatchingVisitor.matchSons(block, block2));
+ }
+ }
+
+ @Override
+ public void visitDeclarationStatement(final PsiDeclarationStatement dcl) {
+ final PsiDeclarationStatement declaration = (PsiDeclarationStatement)myMatchingVisitor.getElement();
+ myMatchingVisitor.setResult(myMatchingVisitor.matchInAnyOrder(dcl.getDeclaredElements(), declaration.getDeclaredElements()));
+ }
+
+ @Override
+ public void visitDoWhileStatement(final PsiDoWhileStatement while1) {
+ final PsiDoWhileStatement while2 = (PsiDoWhileStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(while1.getCondition(), while2.getCondition()) &&
+ compareBody(while1.getBody(), while2.getBody()));
+ }
+
+ @Override
+ public void visitReturnStatement(final PsiReturnStatement return1) {
+ final PsiReturnStatement return2 = (PsiReturnStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(return1.getReturnValue(), return2.getReturnValue()));
+ }
+
+ @Override
+ public void visitPostfixExpression(final PsiPostfixExpression postfix) {
+ final PsiPostfixExpression postfix2 = (PsiPostfixExpression)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(postfix.getOperationTokenType().equals(postfix2.getOperationTokenType())
+ && myMatchingVisitor.match(postfix.getOperand(), postfix2.getOperand()));
+ }
+
+ @Override
+ public void visitPrefixExpression(final PsiPrefixExpression prefix) {
+ final PsiPrefixExpression prefix2 = (PsiPrefixExpression)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(prefix.getOperationTokenType().equals(prefix2.getOperationTokenType())
+ && myMatchingVisitor.match(prefix.getOperand(), prefix2.getOperand()));
+ }
+
+ @Override
+ public void visitAssertStatement(final PsiAssertStatement assert1) {
+ final PsiAssertStatement assert2 = (PsiAssertStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(assert1.getAssertCondition(), assert2.getAssertCondition()) &&
+ myMatchingVisitor.match(assert1.getAssertDescription(), assert2.getAssertDescription()));
+ }
+
+ @Override
+ public void visitBreakStatement(final PsiBreakStatement break1) {
+ final PsiBreakStatement break2 = (PsiBreakStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(break1.getLabelIdentifier(), break2.getLabelIdentifier()));
+ }
+
+ @Override
+ public void visitContinueStatement(final PsiContinueStatement continue1) {
+ final PsiContinueStatement continue2 = (PsiContinueStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(continue1.getLabelIdentifier(), continue2.getLabelIdentifier()));
+ }
+
+ @Override
+ public void visitSuperExpression(final PsiSuperExpression super1) {
+ myMatchingVisitor.setResult(true);
+ }
+
+ @Override
+ public void visitThisExpression(final PsiThisExpression this1) {
+ myMatchingVisitor.setResult(myMatchingVisitor.getElement() instanceof PsiThisExpression);
+ }
+
+ @Override
+ public void visitSynchronizedStatement(final PsiSynchronizedStatement synchronized1) {
+ final PsiSynchronizedStatement synchronized2 = (PsiSynchronizedStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(synchronized1.getLockExpression(), synchronized2.getLockExpression()) &&
+ myMatchingVisitor.matchSons(synchronized1.getBody(), synchronized2.getBody()));
+ }
+
+ @Override
+ public void visitThrowStatement(final PsiThrowStatement throw1) {
+ final PsiThrowStatement throw2 = (PsiThrowStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(throw1.getException(), throw2.getException()));
+ }
+
+ @Override
+ public void visitParenthesizedExpression(PsiParenthesizedExpression expr) {
+ if (myMatchingVisitor.getElement() instanceof PsiParenthesizedExpression) {
+ myMatchingVisitor.setResult(myMatchingVisitor.matchSons(expr, myMatchingVisitor.getElement()));
+ }
+ else {
+ myMatchingVisitor.setResult(false);
+ }
+ }
+
+ @Override
+ public void visitCatchSection(final PsiCatchSection section) {
+ final PsiCatchSection section2 = (PsiCatchSection)myMatchingVisitor.getElement();
+ final PsiParameter parameter = section.getParameter();
+ if (parameter != null) {
+ myMatchingVisitor.setResult(myMatchingVisitor.match(parameter, section2.getParameter()));
+ }
+ else {
+ myMatchingVisitor.setResult(myMatchingVisitor.match(section.getCatchBlock(), section2.getCatchBlock()));
+ }
+ }
+
+ @Override
+ public void visitTryStatement(final PsiTryStatement try1) {
+ final PsiTryStatement try2 = (PsiTryStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.matchSons(try1.getTryBlock(), try2.getTryBlock()));
+
+ if (!myMatchingVisitor.getResult()) return;
+
+ final PsiResourceList resourceList1 = try1.getResourceList();
+ final PsiCatchSection[] catches1 = try1.getCatchSections();
+ final PsiCodeBlock finally1 = try1.getFinallyBlock();
+
+ final PsiResourceList resourceList2 = try2.getResourceList();
+ final PsiCatchSection[] catches2 = try2.getCatchSections();
+ final PsiCodeBlock finally2 = try2.getFinallyBlock();
+
+ final boolean looseMatching = myMatchingVisitor.getMatchContext().getOptions().isLooseMatching();
+ if (!looseMatching &&
+ ((catches1.length == 0 && catches2.length != 0) ||
+ (finally1 == null && finally2 != null) ||
+ (resourceList1 == null && resourceList2 != null))
+ ) {
+ myMatchingVisitor.setResult(false);
+ }
+ else {
+ if (resourceList1 != null) {
+ if (resourceList2 == null) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ final List<PsiResourceVariable> resourceVariables1 = resourceList1.getResourceVariables();
+ final List<PsiResourceVariable> resourceVariables2 = resourceList2.getResourceVariables();
+ myMatchingVisitor.setResult(myMatchingVisitor.matchInAnyOrder(
+ resourceVariables1.toArray(new PsiResourceVariable[resourceVariables1.size()]),
+ resourceVariables2.toArray(new PsiResourceVariable[resourceVariables2.size()])));
+ if (!myMatchingVisitor.getResult()) return;
+ }
+
+ final List<PsiCatchSection> unmatchedCatchSections = new ArrayList<PsiCatchSection>();
+
+ ContainerUtil.addAll(unmatchedCatchSections, catches2);
+
+ for (int i = 0, j; i < catches1.length; ++i) {
+ MatchingHandler handler = myMatchingVisitor.getMatchContext().getPattern().getHandler(catches1[i]);
+ final PsiElement pinnedNode = handler.getPinnedNode(null);
+
+ if (pinnedNode != null) {
+ myMatchingVisitor.setResult(handler.match(catches1[i], pinnedNode, myMatchingVisitor.getMatchContext()));
+ if (!myMatchingVisitor.getResult()) return;
+ }
+ else {
+ for (j = 0; j < unmatchedCatchSections.size(); ++j) {
+ if (handler.match(catches1[i], unmatchedCatchSections.get(j), myMatchingVisitor.getMatchContext())) {
+ unmatchedCatchSections.remove(j);
+ break;
+ }
+ }
+
+ if (j == catches2.length) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ }
+ }
+
+ if (finally1 != null) {
+ myMatchingVisitor.setResult(myMatchingVisitor.matchSons(finally1, finally2));
+ }
+
+ if (myMatchingVisitor.getResult() && unmatchedCatchSections.size() > 0 && !looseMatching) {
+ try2.putUserData(UNMATCHED_CATCH_SECTION_CONTENT_VAR_KEY, unmatchedCatchSections);
+ }
+ }
+ }
+
+ @Override
+ public void visitSwitchLabelStatement(final PsiSwitchLabelStatement case1) {
+ final PsiSwitchLabelStatement case2 = (PsiSwitchLabelStatement)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(case1.isDefaultCase() == case2.isDefaultCase() &&
+ myMatchingVisitor.match(case1.getCaseValue(), case2.getCaseValue()));
+ }
+
+ @Override
+ public void visitInstanceOfExpression(final PsiInstanceOfExpression instanceOf) {
+ final PsiInstanceOfExpression instanceOf2 = (PsiInstanceOfExpression)myMatchingVisitor.getElement();
+ myMatchingVisitor.setResult(myMatchingVisitor.match(instanceOf.getOperand(), instanceOf2.getOperand()) &&
+ matchType(instanceOf.getCheckType(), instanceOf2.getCheckType()));
+ }
+
+ @Override
+ public void visitNewExpression(final PsiNewExpression new1) {
+ if (myMatchingVisitor.getElement() instanceof PsiArrayInitializerExpression &&
+ myMatchingVisitor.getElement().getParent() instanceof PsiVariable &&
+ new1.getArrayDimensions().length == 0 &&
+ new1.getArrayInitializer() != null
+ ) {
+ myMatchingVisitor.setResult(
+ myMatchingVisitor.match(new1.getClassReference(), ((PsiVariable)myMatchingVisitor.getElement().getParent()).getTypeElement()));
+ myMatchingVisitor.matchSons(new1.getArrayInitializer(), myMatchingVisitor.getElement());
+ return;
+ }
+
+ if (!(myMatchingVisitor.getElement() instanceof PsiNewExpression)) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ final PsiNewExpression new2 = (PsiNewExpression)myMatchingVisitor.getElement();
+
+ if (new1.getClassReference() != null) {
+ if (new2.getClassReference() != null) {
+ myMatchingVisitor.setResult(myMatchingVisitor.match(new1.getClassReference(), new2.getClassReference()) &&
+ myMatchingVisitor.matchSons(new1.getArrayInitializer(), new2.getArrayInitializer()));
+
+ if (myMatchingVisitor.getResult()) {
+ // matching dims
+ matchArrayDims(new1, new2);
+ }
+ return;
+ }
+ else {
+ // match array of primitive by new 'T();
+ final PsiKeyword newKeyword = PsiTreeUtil.getChildOfType(new2, PsiKeyword.class);
+ final PsiElement element = PsiTreeUtil.getNextSiblingOfType(newKeyword, PsiWhiteSpace.class);
+
+ if (element != null && element.getNextSibling() instanceof PsiKeyword) {
+ ((LexicalNodesFilter)LexicalNodesFilter.getInstance()).setCareKeyWords(true);
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(new1.getClassReference(), element.getNextSibling()) &&
+ myMatchingVisitor.matchSons(new1.getArrayInitializer(), new2.getArrayInitializer()));
+
+ ((LexicalNodesFilter)LexicalNodesFilter.getInstance()).setCareKeyWords(false);
+ if (myMatchingVisitor.getResult()) {
+ // matching dims
+ matchArrayDims(new1, new2);
+ }
+
+ return;
+ }
+ }
+ }
+
+ if (new1.getClassReference() == new2.getClassReference()) {
+ // probably anonymous class or array of primitive type
+ ((LexicalNodesFilter)LexicalNodesFilter.getInstance()).setCareKeyWords(true);
+ myMatchingVisitor.setResult(myMatchingVisitor.matchSons(new1, new2));
+ ((LexicalNodesFilter)LexicalNodesFilter.getInstance()).setCareKeyWords(false);
+ }
+ else if (new1.getAnonymousClass() == null &&
+ new1.getClassReference() != null &&
+ new2.getAnonymousClass() != null) {
+ // allow matching anonymous class without pattern
+ myMatchingVisitor.setResult(myMatchingVisitor.match(new1.getClassReference(), new2.getAnonymousClass().getBaseClassReference()) &&
+ myMatchingVisitor.matchSons(new1.getArgumentList(), new2.getArgumentList()));
+ }
+ else {
+ myMatchingVisitor.setResult(false);
+ }
+ }
+
+ @Override
+ public void visitKeyword(PsiKeyword keyword) {
+ myMatchingVisitor.setResult(keyword.textMatches(myMatchingVisitor.getElement()));
+ }
+
+ @Override
+ public void visitTypeCastExpression(final PsiTypeCastExpression cast) {
+ final PsiTypeCastExpression cast2 = (PsiTypeCastExpression)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(cast.getCastType(), cast2.getCastType()) &&
+ myMatchingVisitor.match(cast.getOperand(), cast2.getOperand()));
+ }
+
+ @Override
+ public void visitClassObjectAccessExpression(final PsiClassObjectAccessExpression expr) {
+ final PsiClassObjectAccessExpression expr2 = (PsiClassObjectAccessExpression)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.setResult(myMatchingVisitor.match(expr.getOperand(), expr2.getOperand()));
+ }
+
+ @Override
+ public void visitReferenceElement(final PsiJavaCodeReferenceElement ref) {
+ myMatchingVisitor.setResult(matchType(ref, myMatchingVisitor.getElement()));
+ }
+
+ @Override
+ public void visitTypeElement(final PsiTypeElement typeElement) {
+ myMatchingVisitor.setResult(matchType(typeElement, myMatchingVisitor.getElement()));
+ }
+
+ @Override
+ public void visitTypeParameter(PsiTypeParameter psiTypeParameter) {
+ final PsiTypeParameter parameter = (PsiTypeParameter)myMatchingVisitor.getElement();
+ final PsiElement[] children = psiTypeParameter.getChildren();
+ final PsiElement[] children2 = parameter.getChildren();
+
+ final MatchingHandler handler = myMatchingVisitor.getMatchContext().getPattern().getHandler(children[0]);
+
+ if (handler instanceof SubstitutionHandler) {
+ myMatchingVisitor.setResult(((SubstitutionHandler)handler).handle(children2[0], myMatchingVisitor.getMatchContext()));
+ }
+ else {
+ myMatchingVisitor.setResult(children[0].textMatches(children2[0]));
+ }
+
+ if (myMatchingVisitor.getResult() && children.length > 2) {
+ // constraint present
+ if (children2.length == 2) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+
+ if (!children[2].getFirstChild().textMatches(children2[2].getFirstChild())) {
+ // constraint type (extends)
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ myMatchingVisitor.setResult(myMatchingVisitor.matchInAnyOrder(children[2].getChildren(), children2[2].getChildren()));
+ }
+ }
+
+ @Override
+ public void visitClass(PsiClass clazz) {
+ if (clazz.hasTypeParameters()) {
+ myMatchingVisitor
+ .setResult(
+ myMatchingVisitor.match(clazz.getTypeParameterList(), ((PsiClass)myMatchingVisitor.getElement()).getTypeParameterList()));
+
+ if (!myMatchingVisitor.getResult()) return;
+ }
+
+ PsiClass clazz2;
+
+ if (myMatchingVisitor.getElement() instanceof PsiDeclarationStatement &&
+ myMatchingVisitor.getElement().getFirstChild() instanceof PsiClass
+ ) {
+ clazz2 = (PsiClass)myMatchingVisitor.getElement().getFirstChild();
+ }
+ else {
+ clazz2 = (PsiClass)myMatchingVisitor.getElement();
+ }
+
+ final boolean isTypedVar = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(clazz.getNameIdentifier());
+
+ if (clazz.getModifierList().getTextLength() > 0) {
+ if (!myMatchingVisitor.match(clazz.getModifierList(), clazz2.getModifierList())) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+ }
+
+ myMatchingVisitor.setResult((clazz.getName().equals(clazz2.getName()) || isTypedVar) &&
+ compareClasses(clazz, clazz2));
+
+ if (myMatchingVisitor.getResult() && isTypedVar) {
+ PsiElement id = clazz2.getNameIdentifier();
+ if (id == null) id = clazz2;
+ myMatchingVisitor.setResult(myMatchingVisitor.handleTypedElement(clazz.getNameIdentifier(), id));
+ }
+ }
+
+ @Override
+ public void visitTypeParameterList(PsiTypeParameterList psiTypeParameterList) {
+ myMatchingVisitor.setResult(myMatchingVisitor.matchSequentially(
+ psiTypeParameterList.getFirstChild(),
+ myMatchingVisitor.getElement().getFirstChild()
+ ));
+ }
+
+ @Override
+ public void visitMethod(PsiMethod method) {
+ final PsiIdentifier methodNameNode = method.getNameIdentifier();
+ final boolean isTypedVar = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(methodNameNode);
+ final PsiMethod method2 = (PsiMethod)myMatchingVisitor.getElement();
+
+ myMatchingVisitor.getMatchContext().pushResult();
+
+ try {
+ if (method.hasTypeParameters()) {
+ myMatchingVisitor.setResult(
+ myMatchingVisitor.match(method.getTypeParameterList(), ((PsiMethod)myMatchingVisitor.getElement()).getTypeParameterList()));
+
+ if (!myMatchingVisitor.getResult()) return;
+ }
+
+ if (!checkHierarchy(method2, method)) {
+ myMatchingVisitor.setResult(false);
+ return;
+ }
+
+ myMatchingVisitor.setResult((method.getName().equals(method2.getName()) || isTypedVar) &&
+ myMatchingVisitor.match(method.getModifierList(), method2.getModifierList()) &&
+ myMatchingVisitor.matchSons(method.getParameterList(), method2.getParameterList()) &&
+ myMatchingVisitor.match(method.getReturnTypeElement(), method2.getReturnTypeElement()) &&
+ matchInAnyOrder(method.getThrowsList(), method2.getThrowsList(), myMatchingVisitor) &&
+ myMatchingVisitor.matchSonsOptionally(method.getBody(), method2.getBody()));
+ }
+ finally {
+ final PsiIdentifier methodNameNode2 = method2.getNameIdentifier();
+
+ saveOrDropResult(methodNameNode, isTypedVar, methodNameNode2);
+ }
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/compiler/JavaCompilingVisitor.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/compiler/JavaCompilingVisitor.java
new file mode 100644
index 000000000000..271f1c468b0b
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/compiler/JavaCompilingVisitor.java
@@ -0,0 +1,589 @@
+package com.intellij.structuralsearch.impl.matcher.compiler;
+
+import com.intellij.psi.*;
+import com.intellij.psi.javadoc.PsiDocComment;
+import com.intellij.psi.javadoc.PsiDocTag;
+import com.intellij.psi.search.*;
+import com.intellij.psi.search.searches.ClassInheritorsSearch;
+import com.intellij.structuralsearch.MatchOptions;
+import com.intellij.structuralsearch.MatchVariableConstraint;
+import com.intellij.structuralsearch.SSRBundle;
+import com.intellij.structuralsearch.UnsupportedPatternException;
+import com.intellij.structuralsearch.impl.matcher.CompiledPattern;
+import com.intellij.structuralsearch.impl.matcher.JavaCompiledPattern;
+import com.intellij.structuralsearch.impl.matcher.filters.*;
+import com.intellij.structuralsearch.impl.matcher.handlers.*;
+import com.intellij.structuralsearch.impl.matcher.iterators.DocValuesIterator;
+import com.intellij.dupLocator.iterators.NodeIterator;
+import com.intellij.structuralsearch.impl.matcher.predicates.RegExpPredicate;
+import com.intellij.structuralsearch.impl.matcher.strategies.*;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Eugene.Kudelevsky
+ */
+public class JavaCompilingVisitor extends JavaRecursiveElementWalkingVisitor {
+ private final GlobalCompilingVisitor myCompilingVisitor;
+
+ @NonNls private static final String COMMENT = "\\s*(__\\$_\\w+)\\s*";
+ private static final Pattern ourPattern = Pattern.compile("//" + COMMENT, Pattern.DOTALL);
+ private static final Pattern ourPattern2 = Pattern.compile("/\\*" + COMMENT + "\\*/", Pattern.DOTALL);
+ private static final Pattern ourPattern3 = Pattern.compile("/\\*\\*" + COMMENT + "\\*/", Pattern.DOTALL);
+
+ public JavaCompilingVisitor(GlobalCompilingVisitor compilingVisitor) {
+ this.myCompilingVisitor = compilingVisitor;
+ }
+
+ @Override
+ public void visitDocTag(PsiDocTag psiDocTag) {
+ super.visitDocTag(psiDocTag);
+
+ NodeIterator sons = new DocValuesIterator(psiDocTag.getFirstChild());
+ while (sons.hasNext()) {
+ myCompilingVisitor.setHandler(sons.current(), new DocDataHandler());
+ sons.advance();
+ }
+ }
+
+ @Override
+ public void visitComment(PsiComment comment) {
+ super.visitComment(comment);
+
+ final String text = comment.getText();
+ Matcher matcher = ourPattern.matcher(text);
+ boolean matches = false;
+ if (!matcher.matches()) {
+ matcher = ourPattern2.matcher(text);
+
+ if (!matcher.matches()) {
+ matcher = ourPattern3.matcher(text);
+ }
+ else {
+ matches = true;
+ }
+ }
+ else {
+ matches = true;
+ }
+
+ if (matches || matcher.matches()) {
+ String str = matcher.group(1);
+ comment.putUserData(CompiledPattern.HANDLER_KEY, str);
+
+ GlobalCompilingVisitor.setFilter(
+ myCompilingVisitor.getContext().getPattern().getHandler(comment),
+ CommentFilter.getInstance()
+ );
+
+ SubstitutionHandler handler = (SubstitutionHandler)myCompilingVisitor.getContext().getPattern().getHandler(str);
+
+ if (handler.getPredicate() != null) {
+ ((RegExpPredicate)handler.getPredicate()).setMultiline(true);
+ }
+
+ RegExpPredicate predicate = MatchingHandler.getSimpleRegExpPredicate(handler);
+ if (GlobalCompilingVisitor.isSuitablePredicate(predicate, handler)) {
+ myCompilingVisitor.processTokenizedName(predicate.getRegExp(), true, GlobalCompilingVisitor.OccurenceKind.COMMENT);
+ }
+
+ matches = true;
+ }
+
+ if (!matches) {
+ MatchingHandler handler = myCompilingVisitor.processPatternStringWithFragments(text, GlobalCompilingVisitor.OccurenceKind.COMMENT);
+ if (handler != null) comment.putUserData(CompiledPattern.HANDLER_KEY, handler);
+ }
+ }
+
+ @Override
+ public void visitLiteralExpression(PsiLiteralExpression expression) {
+ String value = expression.getText();
+
+ if (value.length() > 2 && value.charAt(0) == '"' && value.charAt(value.length() - 1) == '"') {
+ @Nullable MatchingHandler handler =
+ myCompilingVisitor.processPatternStringWithFragments(value, GlobalCompilingVisitor.OccurenceKind.LITERAL);
+
+ if (handler != null) {
+ expression.putUserData(CompiledPattern.HANDLER_KEY, handler);
+ }
+ }
+ super.visitLiteralExpression(expression);
+ }
+
+ @Override
+ public void visitClassInitializer(final PsiClassInitializer initializer) {
+ super.visitClassInitializer(initializer);
+ PsiStatement[] psiStatements = initializer.getBody().getStatements();
+ if (psiStatements.length == 1 && psiStatements[0] instanceof PsiExpressionStatement) {
+ MatchingHandler handler = myCompilingVisitor.getContext().getPattern().getHandler(psiStatements[0]);
+
+ if (handler instanceof SubstitutionHandler) {
+ myCompilingVisitor.getContext().getPattern().setHandler(initializer, new SubstitutionHandler((SubstitutionHandler)handler));
+ }
+ }
+ }
+
+ @Override
+ public void visitField(PsiField psiField) {
+ super.visitField(psiField);
+ CompiledPattern pattern = myCompilingVisitor.getContext().getPattern();
+ final MatchingHandler handler = pattern.getHandler(psiField);
+
+ if (needsSupers(psiField, handler)) {
+ assert pattern instanceof JavaCompiledPattern;
+ ((JavaCompiledPattern)pattern).setRequestsSuperFields(true);
+ }
+ }
+
+ @Override
+ public void visitMethod(PsiMethod psiMethod) {
+ super.visitMethod(psiMethod);
+ CompiledPattern pattern = myCompilingVisitor.getContext().getPattern();
+ final MatchingHandler handler = pattern.getHandler(psiMethod);
+
+ if (needsSupers(psiMethod, handler)) {
+ assert pattern instanceof JavaCompiledPattern;
+ ((JavaCompiledPattern)pattern).setRequestsSuperMethods(true);
+ }
+
+ GlobalCompilingVisitor.setFilter(handler, MethodFilter.getInstance());
+ handleReferenceText(psiMethod.getName(), myCompilingVisitor.getContext());
+ }
+
+ @Override
+ public void visitReferenceExpression(PsiReferenceExpression reference) {
+ visitElement(reference);
+
+ boolean typedVarProcessed = false;
+ final PsiElement referenceParent = reference.getParent();
+
+ if ((myCompilingVisitor.getContext().getPattern().isRealTypedVar(reference)) &&
+ reference.getQualifierExpression() == null &&
+ !(referenceParent instanceof PsiExpressionStatement)
+ ) {
+ // typed var for expression (but not top level)
+ MatchingHandler handler = myCompilingVisitor.getContext().getPattern().getHandler(reference);
+ GlobalCompilingVisitor.setFilter(handler, ExpressionFilter.getInstance());
+ typedVarProcessed = true;
+ }
+
+ if (!(referenceParent instanceof PsiMethodCallExpression)) {
+ handleReference(reference);
+ }
+
+ MatchingHandler handler = myCompilingVisitor.getContext().getPattern().getHandler(reference);
+
+ // We want to merge qname related to class to find it in any form
+ final String referencedName = reference.getReferenceName();
+
+ if (!typedVarProcessed &&
+ !(handler instanceof SubstitutionHandler)) {
+ final PsiElement resolve = reference.resolve();
+
+ PsiElement referenceQualifier = reference.getQualifier();
+ if (resolve instanceof PsiClass ||
+ (resolve == null &&
+ ((referencedName != null && Character.isUpperCase(referencedName.charAt(0))) ||
+ referenceQualifier == null
+ )
+ )
+ ) {
+ boolean hasNoNestedSubstitutionHandlers = false;
+ PsiExpression qualifier;
+ PsiReferenceExpression currentReference = reference;
+
+ while ((qualifier = currentReference.getQualifierExpression()) != null) {
+ if (!(qualifier instanceof PsiReferenceExpression) ||
+ myCompilingVisitor.getContext().getPattern().getHandler(qualifier) instanceof SubstitutionHandler
+ ) {
+ hasNoNestedSubstitutionHandlers = true;
+ break;
+ }
+ currentReference = (PsiReferenceExpression)qualifier;
+ }
+ if (!hasNoNestedSubstitutionHandlers) {
+ createAndSetSubstitutionHandlerFromReference(
+ reference,
+ resolve != null ? ((PsiClass)resolve).getQualifiedName() : reference.getText(),
+ referenceParent instanceof PsiExpression
+ );
+ }
+ }
+ else if (referenceQualifier != null && reference.getParent() instanceof PsiExpressionStatement) {
+ //Handler qualifierHandler = context.pattern.getHandler(referenceQualifier);
+ //if (qualifierHandler instanceof SubstitutionHandler &&
+ // !context.pattern.isRealTypedVar(reference)
+ // ) {
+ // createAndSetSubstitutionHandlerFromReference(reference, referencedName);
+ //
+ // SubstitutionHandler substitutionHandler = (SubstitutionHandler)qualifierHandler;
+ // RegExpPredicate expPredicate = Handler.getSimpleRegExpPredicate(substitutionHandler);
+ // //if (expPredicate != null)
+ // // substitutionHandler.setPredicate(new ExprTypePredicate(expPredicate.getRegExp(), null, true, true, false));
+ //}
+ }
+ }
+ }
+
+ @Override
+ public void visitMethodCallExpression(PsiMethodCallExpression expression) {
+ handleReference(expression.getMethodExpression());
+ super.visitMethodCallExpression(expression);
+ }
+
+ @Override
+ public void visitBlockStatement(PsiBlockStatement psiBlockStatement) {
+ super.visitBlockStatement(psiBlockStatement);
+ myCompilingVisitor.getContext().getPattern().getHandler(psiBlockStatement).setFilter(BlockFilter.getInstance());
+ }
+
+ @Override
+ public void visitVariable(PsiVariable psiVariable) {
+ super.visitVariable(psiVariable);
+ myCompilingVisitor.getContext().getPattern().getHandler(psiVariable).setFilter(VariableFilter.getInstance());
+ handleReferenceText(psiVariable.getName(), myCompilingVisitor.getContext());
+ }
+
+ @Override
+ public void visitDeclarationStatement(PsiDeclarationStatement psiDeclarationStatement) {
+ super.visitDeclarationStatement(psiDeclarationStatement);
+
+ if (psiDeclarationStatement.getFirstChild() instanceof PsiTypeElement) {
+ // search for expression or symbol
+ final PsiJavaCodeReferenceElement reference =
+ ((PsiTypeElement)psiDeclarationStatement.getFirstChild()).getInnermostComponentReferenceElement();
+
+ if (reference != null &&
+ (myCompilingVisitor.getContext().getPattern().isRealTypedVar(reference.getReferenceNameElement())) &&
+ reference.getParameterList().getTypeParameterElements().length > 0
+ ) {
+ myCompilingVisitor.setHandler(psiDeclarationStatement, new TypedSymbolHandler());
+ final MatchingHandler handler = myCompilingVisitor.getContext().getPattern().getHandler(psiDeclarationStatement);
+ // typed symbol
+ handler.setFilter(
+ TypedSymbolNodeFilter.getInstance()
+ );
+
+ final PsiTypeElement[] params = reference.getParameterList().getTypeParameterElements();
+ for (PsiTypeElement param : params) {
+ if (param.getInnermostComponentReferenceElement() != null &&
+ (myCompilingVisitor.getContext().getPattern().isRealTypedVar(
+ param.getInnermostComponentReferenceElement().getReferenceNameElement()))
+ ) {
+ myCompilingVisitor.getContext().getPattern().getHandler(param).setFilter(
+ TypeParameterFilter.getInstance()
+ );
+ }
+ }
+
+ return;
+ }
+ }
+
+ final MatchingHandler handler = new DeclarationStatementHandler();
+ myCompilingVisitor.getContext().getPattern().setHandler(psiDeclarationStatement, handler);
+ PsiElement previousNonWhiteSpace = psiDeclarationStatement.getPrevSibling();
+
+ while (previousNonWhiteSpace instanceof PsiWhiteSpace) {
+ previousNonWhiteSpace = previousNonWhiteSpace.getPrevSibling();
+ }
+
+ if (previousNonWhiteSpace instanceof PsiComment) {
+ ((DeclarationStatementHandler)handler)
+ .setCommentHandler(myCompilingVisitor.getContext().getPattern().getHandler(previousNonWhiteSpace));
+
+ myCompilingVisitor.getContext().getPattern().setHandler(
+ previousNonWhiteSpace,
+ handler
+ );
+ }
+
+ // detect typed symbol, it will have no variable
+ handler.setFilter(DeclarationFilter.getInstance());
+ }
+
+ @Override
+ public void visitDocComment(PsiDocComment psiDocComment) {
+ super.visitDocComment(psiDocComment);
+ myCompilingVisitor.getContext().getPattern().getHandler(psiDocComment).setFilter(JavaDocFilter.getInstance());
+ }
+
+ @Override
+ public void visitReferenceElement(PsiJavaCodeReferenceElement reference) {
+ super.visitReferenceElement(reference);
+
+ if (reference.getParent() != null &&
+ reference.getParent().getParent() instanceof PsiClass) {
+ GlobalCompilingVisitor.setFilter(myCompilingVisitor.getContext().getPattern().getHandler(reference), TypeFilter.getInstance());
+ }
+
+ handleReference(reference);
+ }
+
+ @Override
+ public void visitClass(PsiClass psiClass) {
+ super.visitClass(psiClass);
+
+ CompiledPattern pattern = myCompilingVisitor.getContext().getPattern();
+ final MatchingHandler handler = pattern.getHandler(psiClass);
+
+ if (needsSupers(psiClass, handler)) {
+ ((JavaCompiledPattern)pattern).setRequestsSuperInners(true);
+ }
+ handleReferenceText(psiClass.getName(), myCompilingVisitor.getContext());
+
+ GlobalCompilingVisitor.setFilter(handler, ClassFilter.getInstance());
+
+ boolean hasSubstitutionHandler = false;
+ for (PsiElement element = psiClass.getFirstChild(); element != null; element = element.getNextSibling()) {
+ if (element instanceof PsiTypeElement && element.getNextSibling() instanceof PsiErrorElement) {
+ // found match that
+ MatchingHandler unmatchedSubstitutionHandler = pattern.getHandler(element);
+ if (unmatchedSubstitutionHandler != null) {
+ psiClass.putUserData(JavaCompiledPattern.ALL_CLASS_CONTENT_VAR_NAME_KEY, pattern.getTypedVarString(element));
+ hasSubstitutionHandler = true;
+ }
+ }
+ }
+
+ if (!hasSubstitutionHandler) {
+ String name = CompiledPattern.ALL_CLASS_UNMATCHED_CONTENT_VAR_ARTIFICIAL_NAME;
+ psiClass.putUserData(JavaCompiledPattern.ALL_CLASS_CONTENT_VAR_NAME_KEY, name);
+ MatchOptions options = myCompilingVisitor.getContext().getOptions();
+ if (options.getVariableConstraint(name) == null) {
+ pattern.createSubstitutionHandler(name, name, false, 0, Integer.MAX_VALUE, true);
+ MatchVariableConstraint constraint = new MatchVariableConstraint(true);
+ constraint.setName(name);
+ constraint.setMinCount(0);
+ constraint.setMaxCount(Integer.MAX_VALUE);
+ options.addVariableConstraint(constraint);
+ }
+ }
+ }
+
+ private SubstitutionHandler createAndSetSubstitutionHandlerFromReference(final PsiElement expr, final String referenceText,
+ boolean classQualifier) {
+ final SubstitutionHandler substitutionHandler =
+ new SubstitutionHandler("__" + referenceText.replace('.', '_'), false, classQualifier ? 0 : 1, 1, false);
+ substitutionHandler.setPredicate(new RegExpPredicate(referenceText.replaceAll("\\.", "\\\\."), true, null, false, false));
+ myCompilingVisitor.getContext().getPattern().setHandler(expr, substitutionHandler);
+ return substitutionHandler;
+ }
+
+ @Override
+ public void visitExpressionStatement(PsiExpressionStatement expr) {
+ myCompilingVisitor.handle(expr);
+
+ super.visitExpressionStatement(expr);
+
+ final PsiElement child = expr.getLastChild();
+ if (!(child instanceof PsiJavaToken) && !(child instanceof PsiComment)) {
+ // search for expression or symbol
+ final PsiElement reference = expr.getFirstChild();
+ MatchingHandler referenceHandler = myCompilingVisitor.getContext().getPattern().getHandler(reference);
+
+ if (referenceHandler instanceof SubstitutionHandler &&
+ (reference instanceof PsiReferenceExpression)
+ ) {
+ // symbol
+ myCompilingVisitor.getContext().getPattern().setHandler(expr, referenceHandler);
+ referenceHandler.setFilter(
+ SymbolNodeFilter.getInstance()
+ );
+
+ myCompilingVisitor.setHandler(expr, new SymbolHandler((SubstitutionHandler)referenceHandler));
+ }
+ else if (reference instanceof PsiLiteralExpression) {
+ MatchingHandler handler = new ExpressionHandler();
+ myCompilingVisitor.setHandler(expr, handler);
+ handler.setFilter(ConstantFilter.getInstance());
+ }
+ else {
+ // just expression
+ MatchingHandler handler;
+ myCompilingVisitor.setHandler(expr, handler = new ExpressionHandler());
+
+ handler.setFilter(ExpressionFilter.getInstance());
+ }
+ }
+ else if (expr.getExpression() instanceof PsiReferenceExpression &&
+ (myCompilingVisitor.getContext().getPattern().isRealTypedVar(expr.getExpression()))) {
+ // search for statement
+ final MatchingHandler exprHandler = myCompilingVisitor.getContext().getPattern().getHandler(expr);
+ if (exprHandler instanceof SubstitutionHandler) {
+ SubstitutionHandler handler = (SubstitutionHandler)exprHandler;
+ handler.setFilter(new StatementFilter());
+ handler.setMatchHandler(new StatementHandler());
+ }
+ }
+ }
+
+ @Override
+ public void visitElement(PsiElement element) {
+ myCompilingVisitor.handle(element);
+ super.visitElement(element);
+ }
+
+
+ private void handleReference(PsiJavaCodeReferenceElement reference) {
+ handleReferenceText(reference.getReferenceName(), myCompilingVisitor.getContext());
+ }
+
+ private static void handleReferenceText(String refname, CompileContext compileContext) {
+ if (refname == null) return;
+
+ if (compileContext.getPattern().isTypedVar(refname)) {
+ SubstitutionHandler handler = (SubstitutionHandler)compileContext.getPattern().getHandler(refname);
+ RegExpPredicate predicate = MatchingHandler.getSimpleRegExpPredicate(handler);
+ if (!GlobalCompilingVisitor.isSuitablePredicate(predicate, handler)) {
+ return;
+ }
+
+ refname = predicate.getRegExp();
+
+ if (handler.isStrictSubtype() || handler.isSubtype()) {
+ final OptimizingSearchHelper searchHelper = compileContext.getSearchHelper();
+ if (addDescendantsOf(refname, handler.isSubtype(), searchHelper, compileContext)) {
+ searchHelper.endTransaction();
+ }
+
+ return;
+ }
+ }
+
+ GlobalCompilingVisitor.addFilesToSearchForGivenWord(refname, true, GlobalCompilingVisitor.OccurenceKind.CODE, compileContext);
+ }
+
+
+ public static boolean addDescendantsOf(final String refname, final boolean subtype, OptimizingSearchHelper searchHelper, CompileContext context) {
+ final List<PsiClass> classes = buildDescendants(refname, subtype, searchHelper, context);
+
+ for (final PsiClass aClass : classes) {
+ if (aClass instanceof PsiAnonymousClass) {
+ searchHelper.addWordToSearchInCode(((PsiAnonymousClass)aClass).getBaseClassReference().getReferenceName());
+ }
+ else {
+ searchHelper.addWordToSearchInCode(aClass.getName());
+ }
+ }
+
+ return classes.size() > 0;
+ }
+
+ private static List<PsiClass> buildDescendants(String className,
+ boolean includeSelf,
+ OptimizingSearchHelper searchHelper,
+ CompileContext context) {
+ if (!searchHelper.doOptimizing()) return Collections.emptyList();
+ final SearchScope scope = context.getOptions().getScope();
+ if (!(scope instanceof GlobalSearchScope)) return Collections.emptyList();
+
+ final PsiShortNamesCache cache = PsiShortNamesCache.getInstance(context.getProject());
+ final PsiClass[] classes = cache.getClassesByName(className, (GlobalSearchScope)scope);
+ final List<PsiClass> results = new ArrayList<PsiClass>();
+
+ final PsiElementProcessor<PsiClass> processor = new PsiElementProcessor<PsiClass>() {
+ public boolean execute(@NotNull PsiClass element) {
+ results.add(element);
+ return true;
+ }
+
+ };
+
+ for (PsiClass aClass : classes) {
+ ClassInheritorsSearch.search(aClass, scope, true).forEach(new PsiElementProcessorAdapter<PsiClass>(processor));
+ }
+
+ if (includeSelf) {
+ Collections.addAll(results, classes);
+ }
+
+ return results;
+ }
+
+
+ @Override
+ public void visitCodeBlock(PsiCodeBlock block) {
+ myCompilingVisitor.setCodeBlockLevel(myCompilingVisitor.getCodeBlockLevel() + 1);
+ MatchingStrategy strategy = null;
+
+ for (PsiElement el = block.getFirstChild(); el != null; el = el.getNextSibling()) {
+ if (GlobalCompilingVisitor.getFilter().accepts(el)) {
+ if (el instanceof PsiWhiteSpace) {
+ myCompilingVisitor.addLexicalNode(el);
+ }
+ }
+ else {
+ el.accept(this);
+ if (myCompilingVisitor.getCodeBlockLevel() == 1) {
+ MatchingStrategy newstrategy = findStrategy(el);
+ final MatchingHandler matchingHandler = myCompilingVisitor.getContext().getPattern().getHandler(el);
+ myCompilingVisitor.getContext().getPattern().setHandler(el, new TopLevelMatchingHandler(matchingHandler));
+
+ if (strategy == null || (strategy instanceof JavaDocMatchingStrategy)) {
+ strategy = newstrategy;
+ }
+ else {
+ if (strategy.getClass() != newstrategy.getClass()) {
+ if (!(strategy instanceof CommentMatchingStrategy)) {
+ throw new UnsupportedPatternException(SSRBundle.message("different.strategies.for.top.level.nodes.error.message"));
+ }
+ strategy = newstrategy;
+ }
+ }
+ }
+ }
+ }
+
+ if (myCompilingVisitor.getCodeBlockLevel() == 1) {
+ if (strategy == null) {
+ // this should happen only for error patterns
+ strategy = ExprMatchingStrategy.getInstance();
+ }
+ myCompilingVisitor.getContext().getPattern().setStrategy(strategy);
+ }
+ myCompilingVisitor.setCodeBlockLevel(myCompilingVisitor.getCodeBlockLevel() - 1);
+ }
+
+ private MatchingStrategy findStrategy(PsiElement el) {
+ // identify matching strategy
+ final MatchingHandler handler = myCompilingVisitor.getContext().getPattern().getHandler(el);
+
+ //if (handler instanceof SubstitutionHandler) {
+ // final SubstitutionHandler shandler = (SubstitutionHandler) handler;
+ if (handler.getFilter() instanceof SymbolNodeFilter ||
+ handler.getFilter() instanceof TypedSymbolNodeFilter
+ ) {
+ return SymbolMatchingStrategy.getInstance();
+ }
+ //}
+
+ if (el instanceof PsiDocComment) {
+ return JavaDocMatchingStrategy.getInstance();
+ }
+ else if (el instanceof PsiComment) {
+ return CommentMatchingStrategy.getInstance();
+ }
+
+ return ExprMatchingStrategy.getInstance();
+ }
+
+ private static boolean needsSupers(final PsiElement element, final MatchingHandler handler) {
+ if (element.getParent() instanceof PsiClass &&
+ handler instanceof SubstitutionHandler
+ ) {
+ final SubstitutionHandler handler2 = (SubstitutionHandler)handler;
+
+ return (handler2.isStrictSubtype() || handler2.isSubtype());
+ }
+ return false;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/BlockFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/BlockFilter.java
new file mode 100644
index 000000000000..5cef7ffaf3c8
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/BlockFilter.java
@@ -0,0 +1,42 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.JavaElementVisitor;
+import com.intellij.psi.PsiBlockStatement;
+import com.intellij.psi.PsiCodeBlock;
+import com.intellij.psi.PsiElement;
+
+/**
+ * Filters block related nodes
+ */
+public class BlockFilter extends JavaElementVisitor implements NodeFilter {
+ protected boolean result;
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+
+ @Override
+ public void visitBlockStatement(PsiBlockStatement psiBlockStatement) {
+ result = true;
+ }
+
+ @Override
+ public void visitCodeBlock(PsiCodeBlock psiCodeBlock) {
+ result = true;
+ }
+
+ private BlockFilter() {
+ }
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new BlockFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ClassFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ClassFilter.java
new file mode 100644
index 000000000000..6e68b08d70da
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ClassFilter.java
@@ -0,0 +1,43 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.JavaElementVisitor;
+import com.intellij.psi.PsiAnonymousClass;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiElement;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: maxim
+ * Date: 26.12.2003
+ * Time: 19:37:13
+ * To change this template use Options | File Templates.
+ */
+public class ClassFilter extends JavaElementVisitor implements NodeFilter {
+ protected boolean result;
+
+ @Override public void visitAnonymousClass(PsiAnonymousClass psiAnonymousClass) {
+ result = true;
+ }
+
+ @Override public void visitClass(PsiClass psiClass) {
+ result = true;
+ }
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new ClassFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ private ClassFilter() {
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/CommentFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/CommentFilter.java
new file mode 100644
index 000000000000..c2d974c9754e
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/CommentFilter.java
@@ -0,0 +1,48 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Maxim.Mossienko
+ * Date: Apr 22, 2004
+ * Time: 9:13:12 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class CommentFilter extends JavaElementVisitor implements NodeFilter {
+ protected boolean result;
+
+ @Override public void visitComment(PsiComment comment) {
+ result = true;
+ }
+
+ @Override public void visitField(PsiField field) {
+ result = true;
+ }
+
+ @Override public void visitMethod(PsiMethod method) {
+ result = true;
+ }
+
+ @Override public void visitClass(PsiClass clazz) {
+ result = true;
+ }
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new CommentFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ private CommentFilter() {
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ConstantFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ConstantFilter.java
new file mode 100644
index 000000000000..401e3c15e365
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ConstantFilter.java
@@ -0,0 +1,38 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.JavaElementVisitor;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiLiteralExpression;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Maxim.Mossienko
+ * Date: Apr 27, 2004
+ * Time: 7:55:40 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class ConstantFilter extends JavaElementVisitor implements NodeFilter {
+ protected boolean result;
+
+ @Override public void visitLiteralExpression(PsiLiteralExpression psiLiteral) {
+ result = true;
+ }
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new ConstantFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ private ConstantFilter() {
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/DeclarationFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/DeclarationFilter.java
new file mode 100644
index 000000000000..d5f5ef5bf36e
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/DeclarationFilter.java
@@ -0,0 +1,44 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: maxim
+ * Date: 26.12.2003
+ * Time: 19:23:24
+ * To change this template use Options | File Templates.
+ */
+public class DeclarationFilter extends JavaElementVisitor implements NodeFilter {
+ protected boolean result;
+
+ @Override public void visitDeclarationStatement(PsiDeclarationStatement dcl) {
+ result = true;
+ }
+
+ @Override public void visitVariable(PsiVariable psiVar) {
+ result = true;
+ }
+
+ @Override public void visitClass(PsiClass psiClass) {
+ result = true;
+ }
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new DeclarationFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ private DeclarationFilter() {
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ExpressionFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ExpressionFilter.java
new file mode 100644
index 000000000000..632cc403eabb
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/ExpressionFilter.java
@@ -0,0 +1,39 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.JavaElementVisitor;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiExpression;
+import com.intellij.psi.PsiReferenceExpression;
+
+/**
+ * Filters expression nodes
+ */
+public class ExpressionFilter extends JavaElementVisitor implements NodeFilter {
+ protected boolean result;
+
+ @Override public void visitReferenceExpression(PsiReferenceExpression psiReferenceExpression) {
+ result = true;
+ }
+
+ @Override public void visitExpression(PsiExpression psiExpression) {
+ result = true;
+ }
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new ExpressionFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ private ExpressionFilter() {
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/JavaDocFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/JavaDocFilter.java
new file mode 100644
index 000000000000..d12e9cbd0440
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/JavaDocFilter.java
@@ -0,0 +1,33 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.PsiDocCommentOwner;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.javadoc.PsiDocComment;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: maxim
+ * Date: 26.12.2003
+ * Time: 19:08:26
+ * To change this template use Options | File Templates.
+ */
+public class JavaDocFilter implements NodeFilter {
+ protected boolean result;
+
+ public boolean accepts(PsiElement element) {
+ return element instanceof PsiDocCommentOwner ||
+ element instanceof PsiDocComment;
+ }
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new JavaDocFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ private JavaDocFilter() {
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/JavaLexicalNodesFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/JavaLexicalNodesFilter.java
new file mode 100644
index 000000000000..1c86acda3e83
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/JavaLexicalNodesFilter.java
@@ -0,0 +1,37 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.psi.*;
+import com.intellij.psi.javadoc.PsiDocComment;
+
+/**
+* @author Eugene.Kudelevsky
+*/
+public class JavaLexicalNodesFilter extends JavaElementVisitor {
+ private final LexicalNodesFilter myLexicalNodesFilter;
+
+ public JavaLexicalNodesFilter(LexicalNodesFilter lexicalNodesFilter) {
+ this.myLexicalNodesFilter = lexicalNodesFilter;
+ }
+
+ @Override public void visitJavaToken(final PsiJavaToken t) {
+ myLexicalNodesFilter.setResult(true);
+ }
+
+ @Override public void visitComment(final PsiComment comment) {
+ }
+
+ @Override public void visitDocComment(final PsiDocComment comment) {
+ }
+
+ @Override public void visitKeyword(PsiKeyword keyword) {
+ myLexicalNodesFilter.setResult(!myLexicalNodesFilter.isCareKeyWords());
+ }
+
+ @Override public void visitWhiteSpace(final PsiWhiteSpace space) {
+ myLexicalNodesFilter.setResult(true);
+ }
+
+ @Override public void visitErrorElement(final PsiErrorElement element) {
+ myLexicalNodesFilter.setResult(true);
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/MethodFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/MethodFilter.java
new file mode 100644
index 000000000000..00888bb86c5a
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/MethodFilter.java
@@ -0,0 +1,33 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.JavaElementVisitor;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiMethod;
+
+/**
+ * Filters method nodes
+ */
+public class MethodFilter extends JavaElementVisitor implements NodeFilter {
+ protected boolean result;
+
+ @Override public void visitMethod(PsiMethod psiMethod) {
+ result = true;
+ }
+
+ private MethodFilter() {}
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new MethodFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/StatementFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/StatementFilter.java
new file mode 100644
index 000000000000..91abc96139e1
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/StatementFilter.java
@@ -0,0 +1,33 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: maxim
+ * Date: 26.12.2003
+ * Time: 17:46:10
+ * To change this template use Options | File Templates.
+ */
+public class StatementFilter extends JavaElementVisitor implements NodeFilter {
+ protected boolean result;
+
+ @Override public void visitReferenceExpression(PsiReferenceExpression psiReferenceExpression) {
+ result = false;
+ }
+
+ @Override public void visitStatement(PsiStatement psiStatement) {
+ result = true;
+ }
+
+ @Override public void visitComment(PsiComment comment) {
+ result = true;
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/SymbolNodeFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/SymbolNodeFilter.java
new file mode 100644
index 000000000000..3e461b6738b6
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/SymbolNodeFilter.java
@@ -0,0 +1,72 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.*;
+
+/**
+ * Tree filter for searching symbols ('T)
+ */
+public class SymbolNodeFilter extends JavaElementVisitor implements NodeFilter {
+ private boolean result;
+
+ @Override public void visitExpression(PsiExpression expr) {
+ result = true;
+ }
+
+ @Override public void visitLiteralExpression(PsiLiteralExpression psiLiteralExpression) {
+ result = true;
+ }
+
+ @Override public void visitReferenceExpression(PsiReferenceExpression psiReferenceExpression) {
+ result = true;
+ }
+
+ @Override public void visitAnnotation(final PsiAnnotation annotation) {
+ result = true;
+ }
+
+ @Override public void visitAnnotationMethod(final PsiAnnotationMethod method) {
+ result = true;
+ }
+
+ @Override public void visitNameValuePair(final PsiNameValuePair pair) {
+ result = true;
+ }
+
+ @Override public void visitMethod(PsiMethod psiMethod) {
+ result = true;
+ }
+
+ @Override public void visitClass(PsiClass psiClass) {
+ result = true;
+ }
+
+ @Override public void visitReferenceElement(PsiJavaCodeReferenceElement psiJavaCodeReferenceElement) {
+ result = true;
+ }
+
+ @Override public void visitVariable(PsiVariable psiVar) {
+ result = true;
+ }
+
+ @Override public void visitTypeParameter(PsiTypeParameter psiTypeParameter) {
+ result = true;
+ }
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new SymbolNodeFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ private SymbolNodeFilter() {
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypeFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypeFilter.java
new file mode 100644
index 000000000000..14dd452b0b7a
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypeFilter.java
@@ -0,0 +1,42 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.JavaElementVisitor;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiJavaCodeReferenceElement;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: maxim
+ * Date: 23.01.2004
+ * Time: 1:07:09
+ * To change this template use File | Settings | File Templates.
+ */
+public class TypeFilter extends JavaElementVisitor implements NodeFilter {
+ protected boolean result;
+
+ @Override public void visitClass(PsiClass aClass) {
+ result = true;
+ }
+
+ @Override public void visitReferenceElement(PsiJavaCodeReferenceElement psiMethod) {
+ result = true;
+ }
+
+ private TypeFilter() {}
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new TypeFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypeParameterFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypeParameterFilter.java
new file mode 100644
index 000000000000..2f81c8b3980f
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypeParameterFilter.java
@@ -0,0 +1,43 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: maxim
+ * Date: 03.01.2004
+ * Time: 1:06:23
+ * To change this template use Options | File Templates.
+ */
+public class TypeParameterFilter extends JavaElementVisitor implements NodeFilter {
+ protected boolean result;
+
+ @Override public void visitTypeElement(PsiTypeElement psiTypeElement) {
+ result = true;
+ }
+
+ @Override public void visitTypeParameter(PsiTypeParameter psiTypeParameter) {
+ result = true;
+ }
+
+ @Override public void visitReferenceElement(PsiJavaCodeReferenceElement psiJavaCodeReferenceElement) {
+ result = true;
+ }
+
+ private TypeParameterFilter() {}
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new TypeParameterFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypedSymbolNodeFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypedSymbolNodeFilter.java
new file mode 100644
index 000000000000..4416b8b7db24
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/TypedSymbolNodeFilter.java
@@ -0,0 +1,44 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.*;
+
+/**
+ * Filter for typed symbols
+ */
+public class TypedSymbolNodeFilter extends JavaElementVisitor implements NodeFilter {
+ private boolean result;
+
+ @Override public void visitMethod(PsiMethod psiMethod) {
+ result = psiMethod.hasTypeParameters();
+ }
+
+ @Override public void visitClass(PsiClass psiClass) {
+ result = psiClass.hasTypeParameters();
+ }
+
+ @Override public void visitReferenceElement(PsiJavaCodeReferenceElement psiJavaCodeReferenceElement) {
+ result = psiJavaCodeReferenceElement.getParameterList().getTypeParameterElements().length > 0;
+ }
+
+ @Override public void visitTypeParameter(PsiTypeParameter parameter) {
+ // we need this since TypeParameter instanceof PsiClass (?)
+ }
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new TypedSymbolNodeFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ private TypedSymbolNodeFilter() {
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/VariableFilter.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/VariableFilter.java
new file mode 100644
index 000000000000..e1907ecaf556
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/filters/VariableFilter.java
@@ -0,0 +1,41 @@
+package com.intellij.structuralsearch.impl.matcher.filters;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.JavaElementVisitor;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiReferenceExpression;
+import com.intellij.psi.PsiVariable;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: maxim
+ * Date: 26.12.2003
+ * Time: 19:52:57
+ * To change this template use Options | File Templates.
+ */
+public class VariableFilter extends JavaElementVisitor implements NodeFilter {
+ protected boolean result;
+
+ public void visitReferenceExpression(final PsiReferenceExpression expression) {
+ }
+
+ @Override public void visitVariable(PsiVariable psiVariable) {
+ result = true;
+ }
+
+ private VariableFilter() {}
+
+ private static class NodeFilterHolder {
+ private static final NodeFilter instance = new VariableFilter();
+ }
+
+ public static NodeFilter getInstance() {
+ return NodeFilterHolder.instance;
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DeclarationStatementHandler.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DeclarationStatementHandler.java
new file mode 100644
index 000000000000..7342e96758f0
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DeclarationStatementHandler.java
@@ -0,0 +1,96 @@
+package com.intellij.structuralsearch.impl.matcher.handlers;
+
+import com.intellij.dupLocator.iterators.ArrayBackedNodeIterator;
+import com.intellij.dupLocator.iterators.CountingNodeIterator;
+import com.intellij.psi.*;
+import com.intellij.structuralsearch.impl.matcher.GlobalMatchingVisitor;
+import com.intellij.structuralsearch.impl.matcher.MatchContext;
+import com.intellij.structuralsearch.impl.matcher.iterators.SsrFilteringNodeIterator;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: maxim
+ * Date: 31.12.2004
+ * Time: 12:01:29
+ * To change this template use File | Settings | File Templates.
+ */
+public class DeclarationStatementHandler extends MatchingHandler {
+ private MatchingHandler myCommentHandler;
+
+ public boolean match(PsiElement patternNode,PsiElement matchedNode, MatchContext context) {
+ if (patternNode instanceof PsiComment) {
+ //if (matchedNode instanceof PsiComment || matchedNode instanceof PsiClass || matchedNode instanceof PsiField)
+ return myCommentHandler.match(patternNode, matchedNode, context);
+ //return false;
+ }
+
+ if (!super.match(patternNode,matchedNode,context)) return false;
+ boolean result;
+ PsiDeclarationStatement dcl = (PsiDeclarationStatement)patternNode;
+
+ if (matchedNode instanceof PsiDeclarationStatement) {
+ result = GlobalMatchingVisitor.continueMatchingSequentially(
+ new SsrFilteringNodeIterator(patternNode.getFirstChild()),
+ new SsrFilteringNodeIterator(matchedNode.getFirstChild()),
+ context
+ );
+ } else {
+ final PsiElement[] declared = dcl.getDeclaredElements();
+
+ // declaration statement could wrap class or dcl
+ if (declared.length >0 &&
+ ( ( declared[0] instanceof PsiVariable && matchedNode instanceof PsiVariable) ||
+ ( declared[0] instanceof PsiClass && matchedNode instanceof PsiClass)
+ ) &&
+ !(matchedNode.getParent() instanceof PsiDeclarationStatement) // skip twice matching for child
+ ) {
+ result = GlobalMatchingVisitor.continueMatchingSequentially(
+ new ArrayBackedNodeIterator(declared),
+ new CountingNodeIterator(
+ declared.length,
+ new SsrFilteringNodeIterator(matchedNode)
+ ),
+ context
+ );
+
+ if (result &&
+ declared[0] instanceof PsiVariable && matchedNode instanceof PsiField
+ ) {
+ // we may have comments behind to match!
+ final PsiElement[] children = dcl.getChildren();
+
+ final PsiElement lastChild = children[children.length - 1];
+ if (lastChild instanceof PsiComment) {
+ final PsiElement[] fieldChildren = matchedNode.getChildren();
+
+ result = context.getPattern().getHandler(lastChild).match(
+ lastChild,
+ fieldChildren[fieldChildren.length-1],
+ context
+ );
+ }
+ }
+ } else {
+ result = false;
+ }
+ }
+
+ return result;
+ }
+
+ public boolean shouldAdvanceTheMatchFor(PsiElement patternElement, PsiElement matchedElement) {
+ if (patternElement instanceof PsiComment &&
+ ( matchedElement instanceof PsiField ||
+ matchedElement instanceof PsiClass
+ )
+ ) {
+ return false;
+ }
+
+ return super.shouldAdvanceTheMatchFor(patternElement,matchedElement);
+ }
+
+ public void setCommentHandler(final MatchingHandler commentHandler) {
+ myCommentHandler = commentHandler;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DocDataHandler.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DocDataHandler.java
new file mode 100644
index 000000000000..dbc97ce67f75
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DocDataHandler.java
@@ -0,0 +1,70 @@
+package com.intellij.structuralsearch.impl.matcher.handlers;
+
+import com.intellij.psi.JavaDocTokenType;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.javadoc.PsiDocTagValue;
+import com.intellij.psi.javadoc.PsiDocToken;
+import com.intellij.structuralsearch.impl.matcher.MatchContext;
+import org.jetbrains.annotations.NonNls;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Handler for doc nodes
+ */
+public class DocDataHandler extends MatchingHandler {
+ @NonNls private static final String P_STR = "^\\s*((?:\\w|_|\\-|\\$)+)\\s*(?:=\\s*\"(.*)\"\\s*)?$";
+ private static final Pattern p = Pattern.compile(
+ P_STR,
+ Pattern.CASE_INSENSITIVE
+ );
+
+ public boolean match(PsiElement node, PsiElement match, MatchContext context) {
+ String text1 = node.getText();
+
+ text1 = getTextFromNode(node, text1);
+
+ Matcher m1 = p.matcher(text1);
+
+ String text2 = match.getText();
+ text2 = getTextFromNode(match, text2);
+
+ Matcher m2 = p.matcher(text2);
+
+ if (m1.matches() && m2.matches()) {
+ String name = m1.group(1);
+ String name2 = m2.group(1);
+ boolean isTypedName = context.getPattern().isTypedVar(name);
+
+ if (name.equals(name2) || isTypedName) {
+ String value = m1.group(2);
+ String value2 = m2.group(2);
+
+ if (value!=null) {
+ if (value2 == null || !value2.matches(value)) return false;
+ }
+ if (isTypedName) {
+ SubstitutionHandler handler = (SubstitutionHandler) context.getPattern().getHandler(name);
+ return handler.handle(match,context);
+ }
+ return true;
+ }
+ }
+ return text1.equals(text2);
+ }
+
+ // since doctag value may be inside doc comment we specially build text including skipped nodes
+ private static String getTextFromNode(final PsiElement node, String text1) {
+ PsiElement nextSibling = node.getNextSibling();
+ if (nextSibling instanceof PsiDocTagValue) {
+ text1 += nextSibling.getText();
+
+ nextSibling = nextSibling.getNextSibling();
+ if (nextSibling instanceof PsiDocToken && ((PsiDocToken)nextSibling).getTokenType() == JavaDocTokenType.DOC_COMMENT_DATA) {
+ text1 += nextSibling.getText();
+ }
+ }
+ return text1;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/ExpressionHandler.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/ExpressionHandler.java
new file mode 100644
index 000000000000..6437c148dd0d
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/ExpressionHandler.java
@@ -0,0 +1,21 @@
+package com.intellij.structuralsearch.impl.matcher.handlers;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiExpressionStatement;
+import com.intellij.structuralsearch.impl.matcher.MatchContext;
+
+/**
+ * Handler for substitution expression search
+ */
+public class ExpressionHandler extends MatchingHandler {
+ public boolean match(PsiElement patternNode, PsiElement matchedNode, MatchContext context) {
+ if (!super.match(patternNode,matchedNode,context)) {
+ return false;
+ }
+
+ return context.getMatcher().match(
+ ((PsiExpressionStatement)patternNode).getExpression(),
+ matchedNode
+ );
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/StatementHandler.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/StatementHandler.java
new file mode 100644
index 000000000000..c6361e2ad4e7
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/StatementHandler.java
@@ -0,0 +1,32 @@
+package com.intellij.structuralsearch.impl.matcher.handlers;
+
+import com.intellij.psi.*;
+import com.intellij.structuralsearch.impl.matcher.MatchContext;
+
+/**
+ * Handler for statement search
+ */
+public class StatementHandler extends MatchingHandler {
+
+ public boolean match(PsiElement patternNode, PsiElement matchedNode, MatchContext context) {
+ // filtering is done on SubstituionHandler level
+ if (patternNode==null) return false;
+ patternNode = ((PsiExpressionStatement)patternNode).getExpression();
+
+ /*if (matchedNode instanceof PsiExpressionStatement) {
+ //matchedNode = ((PsiExpressionStatement)matchedNode).getExpression();
+ } else*/ if (( !(matchedNode instanceof PsiStatement) &&
+ !(matchedNode instanceof PsiComment) // comments to be matched as statements
+ ) ||
+ ( matchedNode instanceof PsiBlockStatement &&
+ !(matchedNode.getParent() instanceof PsiBlockStatement) &&
+ !(matchedNode.getParent().getParent() instanceof PsiSwitchStatement)
+ )) {
+ // typed statement does not match this things
+ // (BlockStatement could be nontop level in if, etc)
+ return false;
+ }
+
+ return context.getMatcher().match(patternNode,matchedNode);
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/DocValuesIterator.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/DocValuesIterator.java
new file mode 100644
index 000000000000..c1323abd0951
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/DocValuesIterator.java
@@ -0,0 +1,64 @@
+package com.intellij.structuralsearch.impl.matcher.iterators;
+
+import com.intellij.dupLocator.iterators.NodeIterator;
+import com.intellij.psi.JavaDocTokenType;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.tree.IElementType;
+import com.intellij.psi.javadoc.PsiDocToken;
+import com.intellij.psi.javadoc.PsiDocTagValue;
+
+import java.util.ArrayList;
+
+/**
+ * Iterates over java doc values tag
+ */
+public class DocValuesIterator extends NodeIterator {
+ private int index;
+ private final ArrayList<PsiElement> tokens = new ArrayList<PsiElement>(2);
+ private static final IElementType tokenType = JavaDocTokenType.DOC_COMMENT_DATA;
+
+ public DocValuesIterator(PsiElement start) {
+ for(PsiElement e = start; e != null; e = e.getNextSibling()) {
+ if (e instanceof PsiDocTagValue) tokens.add(e);
+ else if (e instanceof PsiDocToken && ((PsiDocToken)e).getTokenType() == tokenType) {
+ tokens.add(e);
+ e = advanceToNext(e);
+ }
+ }
+ }
+
+ // since doctag value may be inside doc comment we specially skip that nodes from list
+ static PsiElement advanceToNext(PsiElement e) {
+ PsiElement nextSibling = e.getNextSibling();
+ if (nextSibling instanceof PsiDocTagValue) e = nextSibling;
+
+ nextSibling = e.getNextSibling();
+
+ if (nextSibling instanceof PsiDocToken &&
+ ((PsiDocToken)nextSibling).getTokenType() == tokenType
+ ) {
+ e = nextSibling;
+ }
+ return e;
+ }
+
+ public boolean hasNext() {
+ return index >=0 && index < tokens.size();
+ }
+
+ public PsiElement current() {
+ return hasNext() ? tokens.get(index) : null;
+ }
+
+ public void advance() {
+ if (index < tokens.size()) ++ index;
+ }
+
+ public void rewind() {
+ if (index >= 0) --index;
+ }
+
+ public void reset() {
+ index = 0;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/HierarchyNodeIterator.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/HierarchyNodeIterator.java
new file mode 100644
index 000000000000..324528435cb6
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/HierarchyNodeIterator.java
@@ -0,0 +1,128 @@
+package com.intellij.structuralsearch.impl.matcher.iterators;
+
+import com.intellij.dupLocator.iterators.NodeIterator;
+import com.intellij.psi.*;
+import com.intellij.psi.impl.PsiClassImplUtil;
+import com.intellij.structuralsearch.impl.matcher.MatchUtils;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Passes the hierarchy
+ */
+public class HierarchyNodeIterator extends NodeIterator {
+ private int index;
+ private ArrayList<PsiElement> remaining;
+ private boolean objectTaken;
+ private boolean firstElementTaken;
+ private final boolean acceptClasses;
+ private final boolean acceptInterfaces;
+ private final boolean acceptFirstElement;
+
+ private void build(PsiElement current, Set<PsiElement> visited) {
+
+ if (current!=null) {
+ final String str = current instanceof PsiClass ? ((PsiClass)current).getName():current.getText();
+
+ if (MatchUtils.compareWithNoDifferenceToPackage(str,"Object")) {
+ if(objectTaken) return;
+ objectTaken = true;
+ }
+
+ PsiElement element = MatchUtils.getReferencedElement(current);
+
+ if (element instanceof PsiClass) {
+ if (visited.contains(element)) return;
+ final PsiClass clazz = (PsiClass)element;
+
+ if (acceptInterfaces || !clazz.isInterface() ) visited.add(element);
+
+ if (!firstElementTaken && acceptFirstElement || firstElementTaken) remaining.add(clazz);
+ firstElementTaken = true;
+
+ if (clazz instanceof PsiAnonymousClass) {
+ build(((PsiAnonymousClass)clazz).getBaseClassReference(),visited);
+ return;
+ }
+
+ if (acceptClasses) {
+ processClasses(clazz, visited);
+
+ if (!objectTaken) {
+ build(PsiClassImplUtil.getSuperClass(clazz), visited);
+ }
+ }
+
+ if (acceptInterfaces) {
+ final PsiReferenceList implementsList = clazz.getImplementsList();
+
+ if (implementsList != null) {
+ final PsiElement[] implementsListElements = implementsList.getReferenceElements();
+
+ for (PsiElement anImplementsList : implementsListElements) {
+ build(anImplementsList,visited);
+ }
+ }
+
+ if (!acceptClasses) processClasses(clazz, visited);
+ }
+ } else {
+ remaining.add(current);
+ }
+ }
+ }
+
+ private void processClasses(final PsiClass clazz, final Set<PsiElement> visited) {
+ final PsiReferenceList clazzExtendsList = clazz.getExtendsList();
+ final PsiElement[] extendsList = (clazzExtendsList != null)?clazzExtendsList.getReferenceElements():null;
+
+ if (extendsList != null) {
+ for (PsiElement anExtendsList : extendsList) {
+ build(anExtendsList,visited);
+ }
+ }
+ }
+
+ public HierarchyNodeIterator(PsiElement reference, boolean acceptClasses, boolean acceptInterfaces) {
+ this(reference, acceptClasses, acceptInterfaces, true);
+ }
+
+ public HierarchyNodeIterator(PsiElement reference, boolean acceptClasses, boolean acceptInterfaces, boolean acceptFirstElement) {
+ remaining = new ArrayList<PsiElement>();
+ this.acceptClasses = acceptClasses;
+ this.acceptInterfaces = acceptInterfaces;
+ this.acceptFirstElement = acceptFirstElement;
+
+ if (reference instanceof PsiIdentifier) {
+ reference = reference.getParent();
+ }
+
+ build(reference,new HashSet<PsiElement>());
+ }
+
+ public boolean hasNext() {
+ return index < remaining.size();
+ }
+
+ public PsiElement current() {
+ return remaining.get(index);
+ }
+
+ public void advance() {
+ if (index!=remaining.size()) {
+ ++index;
+ }
+ }
+
+ public void rewind() {
+ if (index > 0) {
+ --index;
+ }
+ }
+
+ public void reset() {
+ index = 0;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ExprTypePredicate.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ExprTypePredicate.java
new file mode 100644
index 000000000000..d66db76c272d
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ExprTypePredicate.java
@@ -0,0 +1,95 @@
+package com.intellij.structuralsearch.impl.matcher.predicates;
+
+import com.intellij.psi.*;
+import com.intellij.structuralsearch.impl.matcher.MatchContext;
+import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate;
+import com.intellij.structuralsearch.impl.matcher.iterators.HierarchyNodeIterator;
+import com.intellij.dupLocator.iterators.NodeIterator;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Maxim.Mossienko
+ * Date: Mar 23, 2004
+ * Time: 6:37:15 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class ExprTypePredicate extends MatchPredicate {
+ private final RegExpPredicate delegate;
+ private final boolean withinHierarchy;
+
+ public ExprTypePredicate(String type, String baseName, boolean _withinHierarchy, boolean caseSensitiveMatch,boolean target) {
+ delegate = new RegExpPredicate(type,caseSensitiveMatch,baseName,false,target);
+ withinHierarchy = _withinHierarchy;
+ }
+
+ public boolean match(PsiElement patternNode, PsiElement matchedNode, MatchContext context) {
+ return match(patternNode, matchedNode, 0, -1, context);
+ }
+
+ public boolean match(PsiElement node, PsiElement match, int start, int end, MatchContext context) {
+ if (match instanceof PsiIdentifier) {
+ // since we pickup tokens
+ match = match.getParent();
+ }
+
+ if (match instanceof PsiExpression) {
+ final PsiType type = evalType((PsiExpression)match,context);
+ if (type==null) return false;
+
+ return doMatchWithTheType(type, context, match);
+ } else {
+ return false;
+ }
+ }
+
+ protected PsiType evalType(PsiExpression match, MatchContext context) {
+ PsiType type = null;
+
+ if (match instanceof PsiReferenceExpression &&
+ match.getParent() instanceof PsiMethodCallExpression) {
+ PsiMethod method = ((PsiMethodCallExpression)match.getParent()).resolveMethod();
+ if (method!=null) type = method.getReturnType();
+ }
+
+ if (type==null) type = match.getType();
+ return type;
+ }
+
+ private boolean doMatchWithTheType(final PsiType type, MatchContext context, PsiElement matchedNode) {
+ if (type instanceof PsiClassType) {
+ PsiClass clazz = ((PsiClassType)type).resolve();
+
+ if (clazz!=null) return checkClass(clazz, context);
+ }
+
+ if (type!=null) {
+ final String presentableText = type.getPresentableText();
+ boolean result = delegate.doMatch(presentableText,context, matchedNode);
+
+ if (!result && type instanceof PsiArrayType && ((PsiArrayType)type).getComponentType() instanceof PsiClassType) {
+ PsiClass clazz = ((PsiClassType)((PsiArrayType)type).getComponentType()).resolve();
+
+ if (clazz!=null) { // presentable text for array is not qualified!
+ result = delegate.doMatch(clazz.getQualifiedName()+"[]",context, matchedNode);
+ }
+ }
+ return result;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean checkClass(PsiClass clazz, MatchContext context) {
+ if (withinHierarchy) {
+ final NodeIterator parents = new HierarchyNodeIterator(clazz,true,true);
+
+ while(parents.hasNext() && !delegate.match(null,parents.current(),context)) {
+ parents.advance();
+ }
+
+ return parents.hasNext();
+ } else {
+ return delegate.match(null,clazz,context);
+ }
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java
new file mode 100644
index 000000000000..02f1ee7d08e0
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java
@@ -0,0 +1,38 @@
+package com.intellij.structuralsearch.impl.matcher.predicates;
+
+import com.intellij.structuralsearch.impl.matcher.MatchContext;
+import com.intellij.psi.*;
+import com.intellij.psi.util.PsiTreeUtil;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Maxim.Mossienko
+ * Date: Mar 23, 2004
+ * Time: 6:37:15 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class FormalArgTypePredicate extends ExprTypePredicate {
+
+ public FormalArgTypePredicate(String type, String baseName, boolean _withinHierarchy, boolean caseSensitiveMatch,boolean target) {
+ super(type, baseName, _withinHierarchy, caseSensitiveMatch, target);
+ }
+
+ protected PsiType evalType(PsiExpression match, MatchContext context) {
+ final PsiMethodCallExpression expr = PsiTreeUtil.getParentOfType(match,PsiMethodCallExpression.class);
+ if (expr == null) return null;
+
+ // find our parent in parameters of the method
+ final PsiMethod psiMethod = expr.resolveMethod();
+ if (psiMethod == null) return null;
+ final PsiParameter[] methodParameters = psiMethod.getParameterList().getParameters();
+ final PsiExpression[] expressions = expr.getArgumentList().getExpressions();
+
+ for(int i = 0;i < methodParameters.length; ++i) {
+ if (expressions[i] == match) {
+ if (i < methodParameters.length) return methodParameters[i].getType();
+ break;
+ }
+ }
+ return null;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ReadPredicate.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ReadPredicate.java
new file mode 100644
index 000000000000..ce25b998ba9b
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ReadPredicate.java
@@ -0,0 +1,28 @@
+package com.intellij.structuralsearch.impl.matcher.predicates;
+
+import com.intellij.psi.*;
+import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate;
+import com.intellij.structuralsearch.impl.matcher.MatchContext;
+import com.intellij.structuralsearch.impl.matcher.MatchUtils;
+
+/**
+ * Handler for value read
+ */
+public final class ReadPredicate extends MatchPredicate {
+ public boolean match(PsiElement patternNode, PsiElement matchedNode, MatchContext context) {
+ if (matchedNode instanceof PsiIdentifier) {
+ matchedNode = matchedNode.getParent();
+ }
+ if (matchedNode instanceof PsiReferenceExpression &&
+ ( !(matchedNode.getParent() instanceof PsiMethodCallExpression) &&
+ ( !(matchedNode.getParent() instanceof PsiAssignmentExpression) ||
+ ((PsiAssignmentExpression)matchedNode.getParent()).getLExpression() != matchedNode
+ )
+ ) &&
+ MatchUtils.getReferencedElement(matchedNode) instanceof PsiVariable
+ ) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/WritePredicate.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/WritePredicate.java
new file mode 100644
index 000000000000..e0d86824a920
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/WritePredicate.java
@@ -0,0 +1,33 @@
+package com.intellij.structuralsearch.impl.matcher.predicates;
+
+import com.intellij.psi.*;
+import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate;
+import com.intellij.structuralsearch.impl.matcher.MatchContext;
+import com.intellij.structuralsearch.impl.matcher.MatchUtils;
+
+/**
+ * Handler for reading
+ */
+public final class WritePredicate extends MatchPredicate {
+ public boolean match(PsiElement patternNode, PsiElement matchedNode, MatchContext context) {
+ if (matchedNode instanceof PsiIdentifier) {
+ matchedNode = matchedNode.getParent();
+ }
+ if (( matchedNode instanceof PsiReferenceExpression &&
+ matchedNode.getParent() instanceof PsiAssignmentExpression &&
+ ((PsiAssignmentExpression)matchedNode.getParent()).getLExpression() == matchedNode &&
+ MatchUtils.getReferencedElement(matchedNode) instanceof PsiVariable
+ ) ||
+ (
+ matchedNode instanceof PsiVariable &&
+ ((PsiVariable)matchedNode).getInitializer()!=null
+ ) ||
+ matchedNode.getParent() instanceof PsiPostfixExpression ||
+ matchedNode.getParent() instanceof PsiPrefixExpression
+ ) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/CommentMatchingStrategy.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/CommentMatchingStrategy.java
new file mode 100644
index 000000000000..7bba3250b768
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/CommentMatchingStrategy.java
@@ -0,0 +1,37 @@
+package com.intellij.structuralsearch.impl.matcher.strategies;
+
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiClassInitializer;
+import com.intellij.psi.PsiComment;
+import com.intellij.psi.PsiMethod;
+
+/**
+ * Java doc matching strategy
+ */
+public final class CommentMatchingStrategy extends MatchingStrategyBase {
+ @Override public void visitClass(final PsiClass clazz) {
+ result = true;
+ }
+
+ @Override public void visitClassInitializer(final PsiClassInitializer clazzInit) {
+ result = true;
+ }
+
+ @Override public void visitMethod(final PsiMethod method) {
+ result = true;
+ }
+
+ @Override public void visitComment(final PsiComment comment) {
+ result = true;
+ }
+
+ private CommentMatchingStrategy() {}
+
+ private static class CommentMatchingStrategyHolder {
+ private static final CommentMatchingStrategy instance = new CommentMatchingStrategy();
+ }
+
+ public static MatchingStrategy getInstance() {
+ return CommentMatchingStrategyHolder.instance;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/ExprMatchingStrategy.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/ExprMatchingStrategy.java
new file mode 100644
index 000000000000..c892badb85be
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/ExprMatchingStrategy.java
@@ -0,0 +1,51 @@
+package com.intellij.structuralsearch.impl.matcher.strategies;
+
+import com.intellij.psi.*;
+
+/**
+ * Expression matching strategy
+ */
+public class ExprMatchingStrategy extends MatchingStrategyBase {
+ @Override public void visitExpression(final PsiExpression expr) {
+ result = true;
+ }
+
+ @Override public void visitVariable(final PsiVariable field) {
+ result = true;
+ }
+
+ @Override public void visitClass(final PsiClass clazz) {
+ result = true;
+ }
+
+ @Override public void visitClassInitializer(final PsiClassInitializer clazzInit) {
+ result = true;
+ }
+
+ @Override public void visitMethod(final PsiMethod method) {
+ result = true;
+ }
+
+ @Override public void visitExpressionList(final PsiExpressionList list) {
+ result = true;
+ }
+
+ @Override public void visitJavaFile(final PsiJavaFile file) {
+ result = true;
+ }
+
+ // finding parameters
+ @Override public void visitParameterList(final PsiParameterList list) {
+ result = true;
+ }
+
+ protected ExprMatchingStrategy() {}
+
+ private static class ExprMatchingStrategyHolder {
+ private static final ExprMatchingStrategy instance = new ExprMatchingStrategy();
+ }
+
+ public static MatchingStrategy getInstance() {
+ return ExprMatchingStrategyHolder.instance;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/JavaDocMatchingStrategy.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/JavaDocMatchingStrategy.java
new file mode 100644
index 000000000000..b65180eff650
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/JavaDocMatchingStrategy.java
@@ -0,0 +1,32 @@
+package com.intellij.structuralsearch.impl.matcher.strategies;
+
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiClassInitializer;
+import com.intellij.psi.PsiMethod;
+
+/**
+ * Java doc matching strategy
+ */
+public final class JavaDocMatchingStrategy extends MatchingStrategyBase {
+ @Override public void visitClass(final PsiClass clazz) {
+ result = true;
+ }
+
+ @Override public void visitClassInitializer(final PsiClassInitializer clazzInit) {
+ result = true;
+ }
+
+ @Override public void visitMethod(final PsiMethod method) {
+ result = true;
+ }
+
+ private JavaDocMatchingStrategy() {}
+
+ private static class JavaDocMatchingStrategyHolder {
+ private static final JavaDocMatchingStrategy instance = new JavaDocMatchingStrategy();
+ }
+
+ public static MatchingStrategy getInstance() {
+ return JavaDocMatchingStrategyHolder.instance;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/MatchingStrategyBase.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/MatchingStrategyBase.java
new file mode 100644
index 000000000000..df6e0fd46832
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/MatchingStrategyBase.java
@@ -0,0 +1,42 @@
+package com.intellij.structuralsearch.impl.matcher.strategies;
+
+import com.intellij.dupLocator.util.NodeFilter;
+import com.intellij.psi.*;
+
+/**
+ * Base filtering strategy to find statements
+ */
+public class MatchingStrategyBase extends JavaElementVisitor implements MatchingStrategy, NodeFilter {
+ protected boolean result;
+
+ @Override public void visitReferenceExpression(final PsiReferenceExpression psiReferenceExpression) {
+ visitExpression(psiReferenceExpression);
+ }
+
+ @Override public void visitCodeBlock(final PsiCodeBlock block) {
+ result = true;
+ }
+
+ @Override public void visitCatchSection(final PsiCatchSection section) {
+ result = true;
+ }
+
+ @Override public void visitStatement(final PsiStatement statement) {
+ result = true;
+ }
+
+ public boolean continueMatching(final PsiElement start) {
+ return accepts(start);
+ }
+
+ @Override
+ public boolean shouldSkip(PsiElement element, PsiElement elementToMatchWith) {
+ return false;
+ }
+
+ public boolean accepts(PsiElement element) {
+ result = false;
+ if (element!=null) element.accept(this);
+ return result;
+ }
+}
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/SymbolMatchingStrategy.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/SymbolMatchingStrategy.java
new file mode 100644
index 000000000000..f31ee37e8aed
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/strategies/SymbolMatchingStrategy.java
@@ -0,0 +1,54 @@
+package com.intellij.structuralsearch.impl.matcher.strategies;
+
+import com.intellij.psi.*;
+
+/**
+ * CommonStrategy to match symbols
+ */
+public class SymbolMatchingStrategy extends ExprMatchingStrategy {
+ @Override public void visitReferenceList(final PsiReferenceList list) {
+ result = true;
+ }
+
+ @Override public void visitAnnotation(final PsiAnnotation annotation) {
+ result = true;
+ }
+
+ @Override public void visitAnnotationParameterList(final PsiAnnotationParameterList list) {
+ result = true;
+ }
+
+ @Override public void visitModifierList(final PsiModifierList list) {
+ result = true;
+ }
+
+ @Override public void visitNameValuePair(final PsiNameValuePair pair) {
+ result = true;
+ }
+
+ @Override public void visitTypeParameterList(PsiTypeParameterList psiTypeParameterList) {
+ result = true;
+ }
+
+ @Override public void visitTypeElement(PsiTypeElement psiTypeElement) {
+ result = true;
+ }
+
+ @Override public void visitReferenceElement(PsiJavaCodeReferenceElement psiJavaCodeReferenceElement) {
+ result = true;
+ }
+
+ @Override public void visitReferenceParameterList(PsiReferenceParameterList psiReferenceParameterList) {
+ result = true;
+ }
+
+ private SymbolMatchingStrategy() {}
+
+ private static class SymbolMatchingStrategyHolder {
+ private static final SymbolMatchingStrategy instance = new SymbolMatchingStrategy();
+ }
+
+ public static MatchingStrategy getInstance() {
+ return SymbolMatchingStrategyHolder.instance;
+ }
+}
diff --git a/java/structuralsearch-java/structuralsearch-java.iml b/java/structuralsearch-java/structuralsearch-java.iml
new file mode 100644
index 000000000000..4b2ec18c28e6
--- /dev/null
+++ b/java/structuralsearch-java/structuralsearch-java.iml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="structuralsearch" />
+ <orderEntry type="module" module-name="lang-impl" />
+ <orderEntry type="module" module-name="openapi" />
+ <orderEntry type="module" module-name="java-impl" />
+ <orderEntry type="module" module-name="duplicates-analysis" />
+ </component>
+</module>
+
diff --git a/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCaseUtil.java b/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCaseUtil.java
index aa77a1e03473..df90bbb727f7 100644
--- a/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCaseUtil.java
+++ b/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCaseUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,13 +15,13 @@
*/
package com.intellij.codeInsight;
-import com.intellij.codeInsight.actions.CodeInsightAction;
import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.ActionManager;
+import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
public class CodeInsightTestCaseUtil {
- public static void doAction(CodeInsightTestCase testCase, CodeInsightAction action, String testName, String ext) throws Exception {
+ public static void doAction(CodeInsightTestCase testCase, AnAction action, String testName, String ext) throws Exception {
testCase.configureByFile(testName + "." + ext);
action.actionPerformed(new AnActionEvent(
diff --git a/java/typeMigration/src/META-INF/TypeMigration.xml b/java/typeMigration/src/META-INF/TypeMigration.xml
new file mode 100644
index 000000000000..b460dad4165a
--- /dev/null
+++ b/java/typeMigration/src/META-INF/TypeMigration.xml
@@ -0,0 +1,23 @@
+<idea-plugin>
+ <extensions defaultExtensionNs="com.intellij">
+ <codeInsight.changeVariableTypeQuickFixProvider
+ implementation="com.intellij.refactoring.typeMigration.TypeMigrationVariableTypeFixProvider"/>
+ <conversion.rule implementation="com.intellij.refactoring.typeMigration.rules.ListArrayConversionRule"/>
+ <conversion.rule implementation="com.intellij.refactoring.typeMigration.rules.AtomicConversionRule"/>
+ <conversion.rule implementation="com.intellij.refactoring.typeMigration.rules.BoxingTypeConversionRule"/>
+ <conversion.rule implementation="com.intellij.refactoring.typeMigration.rules.ElementToArrayConversionRule"/>
+ <conversion.rule implementation="com.intellij.refactoring.typeMigration.rules.ThreadLocalConversionRule"/>
+ <intentionAction>
+ <className>com.intellij.refactoring.typeMigration.intentions.ConvertFieldToAtomicIntention</className>
+ <category>Concurrency</category>
+ </intentionAction>
+ <intentionAction>
+ <className>com.intellij.refactoring.typeMigration.intentions.ConvertFieldToThreadLocalIntention</className>
+ <category>Concurrency</category>
+ </intentionAction>
+ <intentionAction>
+ <className>com.intellij.refactoring.typeMigration.intentions.ChangeClassParametersIntention</className>
+ <category>Declaration</category>
+ </intentionAction>
+ </extensions>
+</idea-plugin>
diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeConversionDescriptor.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeConversionDescriptor.java
new file mode 100644
index 000000000000..d116c3ce30fe
--- /dev/null
+++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeConversionDescriptor.java
@@ -0,0 +1,101 @@
+package com.intellij.refactoring.typeMigration;
+
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.JavaPsiFacade;
+import com.intellij.psi.PsiExpression;
+import com.intellij.psi.codeStyle.JavaCodeStyleManager;
+import com.intellij.structuralsearch.MatchOptions;
+import com.intellij.structuralsearch.plugin.replace.ReplaceOptions;
+import com.intellij.structuralsearch.plugin.replace.impl.Replacer;
+import com.intellij.util.IncorrectOperationException;
+import org.jetbrains.annotations.NonNls;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Sep 28, 2004
+ * Time: 7:13:53 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class TypeConversionDescriptor extends TypeConversionDescriptorBase {
+ private static final Logger LOG = Logger.getInstance("#" + TypeConversionDescriptor.class.getName());
+
+ private String myStringToReplace = null;
+ private String myReplaceByString = "$";
+ private PsiExpression myExpression;
+
+ public TypeConversionDescriptor(@NonNls final String stringToReplace, @NonNls final String replaceByString) {
+ myStringToReplace = stringToReplace;
+ myReplaceByString = replaceByString;
+ }
+
+ public TypeConversionDescriptor(@NonNls final String stringToReplace, @NonNls final String replaceByString, final PsiExpression expression) {
+ myStringToReplace = stringToReplace;
+ myReplaceByString = replaceByString;
+ myExpression = expression;
+ }
+
+ public void setStringToReplace(String stringToReplace) {
+ myStringToReplace = stringToReplace;
+ }
+
+ public void setReplaceByString(String replaceByString) {
+ myReplaceByString = replaceByString;
+ }
+
+ public String getStringToReplace() {
+ return myStringToReplace;
+ }
+
+ public String getReplaceByString() {
+ return myReplaceByString;
+ }
+
+ public PsiExpression getExpression() {
+ return myExpression;
+ }
+
+ public void setExpression(final PsiExpression expression) {
+ myExpression = expression;
+ }
+
+ @Override
+ public void replace(PsiExpression expression) {
+ if (getExpression() != null) expression = getExpression();
+ final Project project = expression.getProject();
+ final ReplaceOptions options = new ReplaceOptions();
+ options.setMatchOptions(new MatchOptions());
+ final Replacer replacer = new Replacer(project, null);
+ try {
+ final String replacement = replacer.testReplace(expression.getText(), getStringToReplace(), getReplaceByString(), options);
+ try {
+ JavaCodeStyleManager.getInstance(project).shortenClassReferences(expression.replace(
+ JavaPsiFacade.getInstance(project).getElementFactory().createExpressionFromText(replacement, expression)));
+ }
+ catch (IncorrectOperationException e) {
+ LOG.error(e);
+ }
+ }
+ catch (IncorrectOperationException e) {
+ LOG.error(e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer buf = new StringBuffer();
+ if (myReplaceByString != null) {
+ buf.append(myReplaceByString);
+ }
+ if (myStringToReplace != null) {
+ if (buf.length() > 0) buf.append(" ");
+ buf.append(myStringToReplace);
+ }
+ if (myExpression != null) {
+ if (buf.length() > 0) buf.append(" ");
+ buf.append(myExpression.getText());
+ }
+ return buf.toString();
+ }
+}
diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeMigrationVariableTypeFixProvider.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeMigrationVariableTypeFixProvider.java
new file mode 100644
index 000000000000..d84320e4cd08
--- /dev/null
+++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeMigrationVariableTypeFixProvider.java
@@ -0,0 +1,61 @@
+/*
+ * User: anna
+ * Date: 27-Aug-2009
+ */
+package com.intellij.refactoring.typeMigration;
+
+import com.intellij.codeInsight.FileModificationService;
+import com.intellij.codeInsight.daemon.impl.quickfix.VariableTypeFix;
+import com.intellij.codeInsight.intention.IntentionAction;
+import com.intellij.codeInsight.quickfix.ChangeVariableTypeQuickFixProvider;
+import com.intellij.openapi.command.undo.UndoUtil;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiType;
+import com.intellij.psi.PsiVariable;
+import com.intellij.psi.codeStyle.JavaCodeStyleManager;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.util.IncorrectOperationException;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class TypeMigrationVariableTypeFixProvider implements ChangeVariableTypeQuickFixProvider {
+ private static final Logger LOG1 = Logger.getInstance("#" + TypeMigrationVariableTypeFixProvider.class.getName());
+
+ @NotNull
+ public IntentionAction[] getFixes(@NotNull PsiVariable variable, @NotNull PsiType toReturn) {
+ return new IntentionAction[]{new VariableTypeFix(variable, toReturn) {
+ @NotNull
+ @Override
+ public String getText() {
+ return "Migrate \'" + myName + "\' type to \'" + getReturnType().getCanonicalText() + "\'";
+ }
+
+ @Override
+ public void invoke(@NotNull Project project,
+ @NotNull PsiFile file,
+ @Nullable("is null when called from inspection") Editor editor,
+ @NotNull PsiElement startElement,
+ @NotNull PsiElement endElement) {
+ final PsiVariable myVariable = (PsiVariable)startElement;
+
+ if (!FileModificationService.getInstance().prepareFileForWrite(myVariable.getContainingFile())) return;
+ try {
+ myVariable.normalizeDeclaration();
+ final TypeMigrationRules rules = new TypeMigrationRules(TypeMigrationLabeler.getElementType(myVariable));
+ rules.setMigrationRootType(getReturnType());
+ rules.setBoundScope(GlobalSearchScope.projectScope(project));
+ TypeMigrationProcessor.runHighlightingTypeMigration(project, editor, rules, myVariable);
+ JavaCodeStyleManager.getInstance(project).shortenClassReferences(myVariable);
+ UndoUtil.markPsiFileForUndo(file);
+ }
+ catch (IncorrectOperationException e) {
+ LOG1.error(e);
+ }
+ }
+ }};
+ }
+}
diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ChangeClassParametersIntention.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ChangeClassParametersIntention.java
new file mode 100644
index 000000000000..9571807cd229
--- /dev/null
+++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ChangeClassParametersIntention.java
@@ -0,0 +1,124 @@
+package com.intellij.refactoring.typeMigration.intentions;
+
+import com.intellij.codeInsight.FileModificationService;
+import com.intellij.codeInsight.hint.HintManager;
+import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction;
+import com.intellij.codeInsight.intention.impl.TypeExpression;
+import com.intellij.codeInsight.template.*;
+import com.intellij.codeInsight.template.impl.TemplateState;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.psi.*;
+import com.intellij.psi.search.LocalSearchScope;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.refactoring.typeMigration.TypeMigrationProcessor;
+import com.intellij.refactoring.typeMigration.TypeMigrationRules;
+import com.intellij.util.ArrayUtil;
+import com.intellij.util.IncorrectOperationException;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author anna
+ */
+public class ChangeClassParametersIntention extends PsiElementBaseIntentionAction {
+
+ private static final Logger LOG = Logger.getInstance("#" + ChangeClassParametersIntention.class);
+
+ @NotNull
+ @Override
+ public String getText() {
+ return getFamilyName();
+ }
+
+ @NotNull
+ @Override
+ public String getFamilyName() {
+ return "Change class type parameter";
+ }
+
+ @Override
+ public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement element) {
+ final PsiTypeElement typeElement = PsiTreeUtil.getTopmostParentOfType(element, PsiTypeElement.class);
+ final PsiElement parent = typeElement != null ? typeElement.getParent() : null;
+ final PsiReferenceParameterList parameterList = parent instanceof PsiReferenceParameterList ? (PsiReferenceParameterList)parent : null;
+ if (parameterList != null && parameterList.getTypeArguments().length > 0) {
+ final PsiMember member = PsiTreeUtil.getParentOfType(parameterList, PsiMember.class);
+ if (member instanceof PsiAnonymousClass) {
+ final PsiClassType.ClassResolveResult result = ((PsiAnonymousClass)member).getBaseClassType().resolveGenerics();
+ return result.getElement() != null && ((PsiAnonymousClass)member).getBaseClassReference().getParameterList() == parameterList;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void invoke(@NotNull final Project project, final Editor editor, @NotNull final PsiElement element) throws IncorrectOperationException {
+ if (!FileModificationService.getInstance().preparePsiElementsForWrite(element)) return;
+
+ final PsiTypeElement typeElement = PsiTreeUtil.getTopmostParentOfType(element, PsiTypeElement.class);
+ final PsiReferenceParameterList parameterList = PsiTreeUtil.getParentOfType(element, PsiReferenceParameterList.class);
+ if (parameterList != null && typeElement != null) {
+ final PsiClass aClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);
+ if (aClass instanceof PsiAnonymousClass) {
+ editor.getCaretModel().moveToOffset(aClass.getTextOffset());
+ final PsiTypeElement[] typeElements = parameterList.getTypeParameterElements();
+ final int changeIdx = ArrayUtil.find(typeElements, typeElement);
+
+ final PsiClassType.ClassResolveResult result = ((PsiAnonymousClass)aClass).getBaseClassType().resolveGenerics();
+ final PsiClass baseClass = result.getElement();
+ LOG.assertTrue(baseClass != null);
+ final PsiTypeParameter typeParameter = baseClass.getTypeParameters()[changeIdx];
+
+ final TemplateBuilderImpl templateBuilder = (TemplateBuilderImpl)TemplateBuilderFactory.getInstance().createTemplateBuilder(aClass);
+
+ final String oldTypeText = typeElement.getText();
+ final String varName = "param";
+ templateBuilder.replaceElement(typeElement, varName, new TypeExpression(project, new PsiType[]{typeElement.getType()}), true);
+
+ final Template template = templateBuilder.buildInlineTemplate();
+ TemplateManager.getInstance(project).startTemplate(editor, template, false, null, new TemplateEditingAdapter() {
+ private String myNewType;
+
+ @Override
+ public void beforeTemplateFinished(TemplateState state, Template template) {
+ final TextResult value = state.getVariableValue(varName);
+ myNewType = value != null ? value.getText() : "";
+ final int segmentsCount = state.getSegmentsCount();
+ final Document document = state.getEditor().getDocument();
+ for (int i = 0; i < segmentsCount; i++) {
+ final TextRange segmentRange = state.getSegmentRange(i);
+ document.replaceString(segmentRange.getStartOffset(), segmentRange.getEndOffset(), oldTypeText);
+ }
+ }
+
+ @Override
+ public void templateFinished(Template template, boolean brokenOff) {
+ if (!brokenOff) {
+ final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project);
+ try {
+ final PsiType targetParam = elementFactory.createTypeFromText(myNewType, aClass);
+ final TypeMigrationRules myRules = new TypeMigrationRules(((PsiAnonymousClass)aClass).getBaseClassType());
+ final PsiSubstitutor substitutor = result.getSubstitutor().put(typeParameter, targetParam);
+ final PsiType targetClassType = elementFactory.createType(baseClass, substitutor);
+ myRules.setMigrationRootType(targetClassType);
+ myRules.setBoundScope(new LocalSearchScope(aClass));
+ new TypeMigrationProcessor(project, ((PsiAnonymousClass)aClass).getBaseClassReference().getParameterList(), myRules).run();
+ }
+ catch (IncorrectOperationException e) {
+ HintManager.getInstance().showErrorHint(editor, "Incorrect type");
+ }
+ }
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ public boolean startInWriteAction() {
+ return true;
+ }
+}
diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToAtomicIntention.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToAtomicIntention.java
new file mode 100644
index 000000000000..d794d59f9943
--- /dev/null
+++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToAtomicIntention.java
@@ -0,0 +1,218 @@
+package com.intellij.refactoring.typeMigration.intentions;
+
+import com.intellij.codeInsight.FileModificationService;
+import com.intellij.codeInsight.intention.LowPriorityAction;
+import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction;
+import com.intellij.lang.java.JavaLanguage;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.*;
+import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
+import com.intellij.psi.codeStyle.JavaCodeStyleManager;
+import com.intellij.psi.impl.AllowedApiFilterExtension;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.search.searches.ReferencesSearch;
+import com.intellij.psi.tree.IElementType;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.TypeConversionUtil;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptor;
+import com.intellij.refactoring.typeMigration.TypeMigrationReplacementUtil;
+import com.intellij.refactoring.typeMigration.rules.AtomicConversionRule;
+import com.intellij.util.IncorrectOperationException;
+import com.intellij.util.Query;
+import com.intellij.util.containers.ContainerUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.*;
+
+import static com.intellij.psi.util.TypeConversionUtil.isBinaryOperatorApplicable;
+import static com.intellij.util.ObjectUtils.assertNotNull;
+
+/**
+ * @author anna
+ * @since 26-Aug-2009
+ */
+public class ConvertFieldToAtomicIntention extends PsiElementBaseIntentionAction implements LowPriorityAction {
+ private static final Logger LOG = Logger.getInstance("#" + ConvertFieldToAtomicIntention.class.getName());
+
+ private final Map<PsiType, String> myFromToMap = ContainerUtil.newHashMap();
+ {
+ myFromToMap.put(PsiType.INT, AtomicInteger.class.getName());
+ myFromToMap.put(PsiType.LONG, AtomicLong.class.getName());
+ myFromToMap.put(PsiType.BOOLEAN, AtomicBoolean.class.getName());
+ myFromToMap.put(PsiType.INT.createArrayType(), AtomicIntegerArray.class.getName());
+ myFromToMap.put(PsiType.LONG.createArrayType(), AtomicLongArray.class.getName());
+ }
+
+ @NotNull
+ @Override
+ public String getText() {
+ return "Convert to atomic";
+ }
+
+ @NotNull
+ @Override
+ public String getFamilyName() {
+ return getText();
+ }
+
+ @Override
+ public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement element) {
+ PsiVariable psiVariable = getVariable(element);
+ if (psiVariable == null || psiVariable instanceof PsiResourceVariable) return false;
+ if (psiVariable.getLanguage() != JavaLanguage.INSTANCE) return false;
+ if (psiVariable.getTypeElement() == null) return false;
+ if (!PsiUtil.isLanguageLevel5OrHigher(psiVariable)) return false;
+ final PsiType psiType = psiVariable.getType();
+ final PsiClass psiTypeClass = PsiUtil.resolveClassInType(psiType);
+ if (psiTypeClass != null) {
+ final String qualifiedName = psiTypeClass.getQualifiedName();
+ if (qualifiedName != null) { //is already atomic
+ if (myFromToMap.values().contains(qualifiedName) ||
+ qualifiedName.equals(AtomicReference.class.getName()) ||
+ qualifiedName.equals(AtomicReferenceArray.class.getName())) {
+ return false;
+ }
+ }
+ }
+ else if (!myFromToMap.containsKey(psiType)) {
+ return false;
+ }
+ return AllowedApiFilterExtension.isClassAllowed(AtomicReference.class.getName(), element);
+ }
+
+ private static PsiVariable getVariable(PsiElement element) {
+ if (element instanceof PsiIdentifier) {
+ final PsiElement parent = element.getParent();
+ if (parent instanceof PsiLocalVariable || parent instanceof PsiField) {
+ return (PsiVariable)parent;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException {
+ final PsiVariable psiVariable = getVariable(element);
+ LOG.assertTrue(psiVariable != null);
+
+ final Query<PsiReference> refs = ReferencesSearch.search(psiVariable);
+
+ final Set<PsiElement> elements = new HashSet<PsiElement>();
+ elements.add(element);
+ for (PsiReference reference : refs) {
+ elements.add(reference.getElement());
+ }
+ if (!FileModificationService.getInstance().preparePsiElementsForWrite(elements)) return;
+
+ final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project);
+ final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
+ final PsiType fromType = psiVariable.getType();
+ PsiClassType toType;
+ final String atomicQualifiedName = myFromToMap.get(fromType);
+ if (atomicQualifiedName != null) {
+ final PsiClass atomicClass = psiFacade.findClass(atomicQualifiedName, GlobalSearchScope.allScope(project));
+ if (atomicClass == null) {//show warning
+ return;
+ }
+ toType = factory.createType(atomicClass);
+ }
+ else if (fromType instanceof PsiArrayType) {
+ final PsiClass atomicReferenceArrayClass =
+ psiFacade.findClass(AtomicReferenceArray.class.getName(), GlobalSearchScope.allScope(project));
+ if (atomicReferenceArrayClass == null) {//show warning
+ return;
+ }
+ final Map<PsiTypeParameter, PsiType> substitutor = ContainerUtil.newHashMap();
+ final PsiTypeParameter[] typeParameters = atomicReferenceArrayClass.getTypeParameters();
+ if (typeParameters.length == 1) {
+ PsiType componentType = ((PsiArrayType)fromType).getComponentType();
+ if (componentType instanceof PsiPrimitiveType) componentType = ((PsiPrimitiveType)componentType).getBoxedType(element);
+ substitutor.put(typeParameters[0], componentType);
+ }
+ toType = factory.createType(atomicReferenceArrayClass, factory.createSubstitutor(substitutor));
+ }
+ else {
+ final PsiClass atomicReferenceClass = psiFacade.findClass(AtomicReference.class.getName(), GlobalSearchScope.allScope(project));
+ if (atomicReferenceClass == null) {//show warning
+ return;
+ }
+ final Map<PsiTypeParameter, PsiType> substitutor = ContainerUtil.newHashMap();
+ final PsiTypeParameter[] typeParameters = atomicReferenceClass.getTypeParameters();
+ if (typeParameters.length == 1) {
+ PsiType type = fromType;
+ if (type instanceof PsiPrimitiveType) type = ((PsiPrimitiveType)fromType).getBoxedType(element);
+ substitutor.put(typeParameters[0], type);
+ }
+ toType = factory.createType(atomicReferenceClass, factory.createSubstitutor(substitutor));
+ }
+
+ try {
+ for (PsiReference reference : refs) {
+ PsiElement psiElement = reference.getElement();
+ if (psiElement instanceof PsiExpression) {
+ final PsiElement parent = psiElement.getParent();
+ if (parent instanceof PsiExpression && !(parent instanceof PsiReferenceExpression || parent instanceof PsiPolyadicExpression)) {
+ psiElement = parent;
+ }
+ if (psiElement instanceof PsiBinaryExpression) {
+ PsiBinaryExpression binary = (PsiBinaryExpression)psiElement;
+ if (isBinaryOperatorApplicable(binary.getOperationTokenType(), binary.getLOperand(), binary.getROperand(), true)) {
+ continue;
+ }
+ }
+ else if (psiElement instanceof PsiAssignmentExpression) {
+ final PsiAssignmentExpression assignment = (PsiAssignmentExpression)psiElement;
+ final IElementType opSign = TypeConversionUtil.convertEQtoOperation(assignment.getOperationTokenType());
+ if (opSign != null && isBinaryOperatorApplicable(opSign, assignment.getLExpression(), assignment.getRExpression(), true)) {
+ continue;
+ }
+ }
+ final TypeConversionDescriptor directConversion = AtomicConversionRule.findDirectConversion(psiElement, toType, fromType);
+ if (directConversion != null) {
+ TypeMigrationReplacementUtil.replaceExpression((PsiExpression)psiElement, project, directConversion);
+ }
+ }
+ }
+
+ final PsiExpression initializer = psiVariable.getInitializer();
+ if (initializer != null) {
+ final TypeConversionDescriptor directConversion = AtomicConversionRule.wrapWithNewExpression(toType, fromType, null, element);
+ if (directConversion != null) {
+ TypeMigrationReplacementUtil.replaceExpression(initializer, project, directConversion);
+ }
+ }
+ else if (!assertNotNull(psiVariable.getModifierList()).hasModifierProperty(PsiModifier.FINAL)) {
+ final PsiExpression newInitializer = factory.createExpressionFromText("new " + toType.getCanonicalText() + "()", psiVariable);
+ if (psiVariable instanceof PsiLocalVariable) {
+ ((PsiLocalVariable)psiVariable).setInitializer(newInitializer);
+ }
+ else if (psiVariable instanceof PsiField) {
+ ((PsiField)psiVariable).setInitializer(newInitializer);
+ }
+ JavaCodeStyleManager.getInstance(project).shortenClassReferences(psiVariable.getInitializer());
+ }
+
+ PsiElement replaced = assertNotNull(psiVariable.getTypeElement()).replace(factory.createTypeElement(toType));
+ JavaCodeStyleManager.getInstance(project).shortenClassReferences(replaced);
+
+ if (psiVariable instanceof PsiField || CodeStyleSettingsManager.getSettings(project).GENERATE_FINAL_LOCALS) {
+ final PsiModifierList modifierList = assertNotNull(psiVariable.getModifierList());
+ modifierList.setModifierProperty(PsiModifier.FINAL, true);
+ modifierList.setModifierProperty(PsiModifier.VOLATILE, false);
+ }
+ }
+ catch (IncorrectOperationException e) {
+ LOG.error(e);
+ }
+ }
+
+ @Override
+ public boolean startInWriteAction() {
+ return true;
+ }
+}
diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToThreadLocalIntention.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToThreadLocalIntention.java
new file mode 100644
index 000000000000..e01aaadae7d8
--- /dev/null
+++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToThreadLocalIntention.java
@@ -0,0 +1,145 @@
+/*
+ * User: anna
+ * Date: 26-Aug-2009
+ */
+package com.intellij.refactoring.typeMigration.intentions;
+
+import com.intellij.codeInsight.FileModificationService;
+import com.intellij.codeInsight.intention.LowPriorityAction;
+import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction;
+import com.intellij.lang.java.JavaLanguage;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Comparing;
+import com.intellij.psi.*;
+import com.intellij.psi.codeStyle.CodeStyleManager;
+import com.intellij.psi.impl.AllowedApiFilterExtension;
+import com.intellij.psi.impl.PsiDiamondTypeUtil;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.search.searches.ReferencesSearch;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptor;
+import com.intellij.refactoring.typeMigration.TypeMigrationLabeler;
+import com.intellij.refactoring.typeMigration.TypeMigrationReplacementUtil;
+import com.intellij.refactoring.typeMigration.TypeMigrationRules;
+import com.intellij.refactoring.typeMigration.rules.ThreadLocalConversionRule;
+import com.intellij.util.IncorrectOperationException;
+import com.intellij.util.Query;
+import com.intellij.util.containers.ContainerUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static com.intellij.util.ObjectUtils.assertNotNull;
+
+public class ConvertFieldToThreadLocalIntention extends PsiElementBaseIntentionAction implements LowPriorityAction {
+ private static final Logger LOG = Logger.getInstance("#" + ConvertFieldToThreadLocalIntention.class.getName());
+
+ @NotNull
+ @Override
+ public String getText() {
+ return "Convert to ThreadLocal";
+ }
+
+ @NotNull
+ @Override
+ public String getFamilyName() {
+ return getText();
+ }
+
+ @Override
+ public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement element) {
+ if (!(element instanceof PsiIdentifier)) return false;
+ final PsiField psiField = PsiTreeUtil.getParentOfType(element, PsiField.class);
+ if (psiField == null) return false;
+ if (psiField.getLanguage() != JavaLanguage.INSTANCE) return false;
+ if (psiField.getTypeElement() == null) return false;
+ final PsiType fieldType = psiField.getType();
+ final PsiClass fieldTypeClass = PsiUtil.resolveClassInType(fieldType);
+ if (fieldType instanceof PsiPrimitiveType || fieldType instanceof PsiArrayType) return true;
+ return fieldTypeClass != null && !Comparing.strEqual(fieldTypeClass.getQualifiedName(), ThreadLocal.class.getName())
+ && AllowedApiFilterExtension.isClassAllowed(ThreadLocal.class.getName(), element);
+ }
+
+ @Override
+ public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException {
+ final PsiField psiField = PsiTreeUtil.getParentOfType(element, PsiField.class);
+ LOG.assertTrue(psiField != null);
+ final Query<PsiReference> refs = ReferencesSearch.search(psiField);
+
+ final Set<PsiElement> elements = new HashSet<PsiElement>();
+ elements.add(element);
+ for (PsiReference reference : refs) {
+ elements.add(reference.getElement());
+ }
+ if (!FileModificationService.getInstance().preparePsiElementsForWrite(elements)) return;
+
+ final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project);
+ final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
+ final PsiType fromType = psiField.getType();
+
+ final PsiClass threadLocalClass = psiFacade.findClass(ThreadLocal.class.getName(), GlobalSearchScope.allScope(project));
+ if (threadLocalClass == null) {//show warning
+ return;
+ }
+ final Map<PsiTypeParameter, PsiType> substitutor = ContainerUtil.newHashMap();
+ final PsiTypeParameter[] typeParameters = threadLocalClass.getTypeParameters();
+ if (typeParameters.length == 1) {
+ PsiType type = fromType;
+ if (fromType instanceof PsiPrimitiveType) type = ((PsiPrimitiveType)fromType).getBoxedType(element);
+ substitutor.put(typeParameters[0], type);
+ }
+ final PsiClassType toType = factory.createType(threadLocalClass, factory.createSubstitutor(substitutor));
+
+ try {
+ final TypeMigrationRules rules = new TypeMigrationRules(fromType);
+ rules.setMigrationRootType(toType);
+ rules.setBoundScope(GlobalSearchScope.fileScope(element.getContainingFile()));
+ final TypeMigrationLabeler labeler = new TypeMigrationLabeler(rules);
+ labeler.getMigratedUsages(false, psiField);
+ for (PsiReference reference : refs) {
+ PsiElement psiElement = reference.getElement();
+ if (psiElement instanceof PsiExpression) {
+ final PsiElement parent = psiElement.getParent();
+ if (parent instanceof PsiExpression && !(parent instanceof PsiReferenceExpression || parent instanceof PsiPolyadicExpression)) {
+ psiElement = parent;
+ }
+ final TypeConversionDescriptor conversion = ThreadLocalConversionRule.findDirectConversion(psiElement, toType, fromType, labeler);
+ if (conversion != null) {
+ TypeMigrationReplacementUtil.replaceExpression((PsiExpression)psiElement, project, conversion);
+ }
+ }
+ }
+
+ final PsiExpression initializer = psiField.getInitializer();
+ if (initializer != null) {
+ final TypeConversionDescriptor conversion = ThreadLocalConversionRule.wrapWithNewExpression(toType, fromType, initializer);
+ TypeMigrationReplacementUtil.replaceExpression(initializer, project, conversion);
+ CodeStyleManager.getInstance(project).reformat(psiField);
+ }
+ else if (!assertNotNull(psiField.getModifierList()).hasModifierProperty(PsiModifier.FINAL)) {
+ final String text = "new " + PsiDiamondTypeUtil.getCollapsedType(toType, psiField) + "()";
+ final PsiExpression newInitializer = factory.createExpressionFromText(text, psiField);
+ psiField.setInitializer(newInitializer);
+ }
+
+ assertNotNull(psiField.getTypeElement()).replace(factory.createTypeElement(toType));
+
+ final PsiModifierList modifierList = assertNotNull(psiField.getModifierList());
+ modifierList.setModifierProperty(PsiModifier.FINAL, true);
+ modifierList.setModifierProperty(PsiModifier.VOLATILE, false);
+ }
+ catch (IncorrectOperationException e) {
+ LOG.error(e);
+ }
+ }
+
+ @Override
+ public boolean startInWriteAction() {
+ return true;
+ }
+}
diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/AtomicConversionRule.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/AtomicConversionRule.java
new file mode 100644
index 000000000000..a4ec46e44838
--- /dev/null
+++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/AtomicConversionRule.java
@@ -0,0 +1,420 @@
+/*
+ * User: anna
+ * Date: 18-Aug-2009
+ */
+package com.intellij.refactoring.typeMigration.rules;
+
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.util.Comparing;
+import com.intellij.psi.*;
+import com.intellij.psi.impl.PsiDiamondTypeUtil;
+import com.intellij.psi.tree.IElementType;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.TypeConversionUtil;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptor;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptorBase;
+import com.intellij.refactoring.typeMigration.TypeMigrationLabeler;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.concurrent.atomic.*;
+
+public class AtomicConversionRule extends TypeConversionRule {
+ private static final Logger LOG = Logger.getInstance("#" + AtomicConversionRule.class.getName());
+
+
+ @Override
+ public TypeConversionDescriptorBase findConversion(PsiType from,
+ PsiType to,
+ PsiMember member,
+ PsiExpression context,
+ TypeMigrationLabeler labeler) {
+ if (to instanceof PsiClassType && isAtomicTypeMigration(from, (PsiClassType)to, context)) {
+ return findDirectConversion(context, to, from);
+ }
+ else if (from instanceof PsiClassType && isAtomicTypeMigration(to, (PsiClassType)from, context)) {
+ return findReverseConversion(context);
+ }
+ return null;
+ }
+
+ private static boolean isAtomicTypeMigration(PsiType from, PsiClassType to, PsiExpression context) {
+ if (from == PsiType.INT && to.getCanonicalText().equals(AtomicInteger.class.getName())) {
+ return true;
+ }
+ if (from.equals(PsiType.INT.createArrayType()) && to.getCanonicalText().equals(AtomicIntegerArray.class.getName())) {
+ return true;
+ }
+ if (from == PsiType.LONG && to.getCanonicalText().equals(AtomicLong.class.getName())) {
+ return true;
+ }
+ if (from.equals(PsiType.LONG.createArrayType()) && to.getCanonicalText().equals(AtomicLongArray.class.getName())) {
+ return true;
+ }
+ if (from == PsiType.BOOLEAN && to.getCanonicalText().equals(AtomicBoolean.class.getName())) {
+ return true;
+ }
+ final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(to);
+ final PsiClass atomicClass = resolveResult.getElement();
+
+ if (atomicClass != null) {
+ final String typeQualifiedName = atomicClass.getQualifiedName();
+ if (!Comparing.strEqual(typeQualifiedName, AtomicReference.class.getName()) &&
+ !Comparing.strEqual(typeQualifiedName, AtomicReferenceArray.class.getName())) {
+ return false;
+ }
+ final PsiTypeParameter[] typeParameters = atomicClass.getTypeParameters();
+ if (typeParameters.length != 1) return false;
+ final PsiType toTypeParameterValue = resolveResult.getSubstitutor().substitute(typeParameters[0]);
+ if (toTypeParameterValue != null) {
+ if (from.getDeepComponentType() instanceof PsiPrimitiveType) {
+ final PsiPrimitiveType unboxedInitialType = PsiPrimitiveType.getUnboxedType(toTypeParameterValue);
+ if (unboxedInitialType != null) {
+ return TypeConversionUtil.areTypesConvertible(from.getDeepComponentType(), unboxedInitialType);
+ }
+ }
+ else {
+ return TypeConversionUtil.isAssignable(from.getDeepComponentType(), PsiUtil.captureToplevelWildcards(toTypeParameterValue, context));
+ }
+ }
+ }
+ return false;
+ }
+
+ @Nullable
+ public static TypeConversionDescriptor findDirectConversion(PsiElement context, PsiType to, PsiType from) {
+ final PsiClass toTypeClass = PsiUtil.resolveClassInType(to);
+ LOG.assertTrue(toTypeClass != null);
+ final String qualifiedName = toTypeClass.getQualifiedName();
+ if (qualifiedName != null) {
+ if (qualifiedName.equals(AtomicInteger.class.getName()) || qualifiedName.equals(AtomicLong.class.getName())) {
+
+ if (context instanceof PsiPostfixExpression) {
+ final IElementType operationSign = ((PsiPostfixExpression)context).getOperationTokenType();
+ if (operationSign == JavaTokenType.MINUSMINUS) {
+ return new TypeConversionDescriptor("$qualifier$--", "$qualifier$.getAndDecrement()");
+ }
+ if (operationSign == JavaTokenType.PLUSPLUS) {
+ return new TypeConversionDescriptor("$qualifier$++", "$qualifier$.getAndIncrement()");
+ }
+
+ }
+ else if (context instanceof PsiPrefixExpression) {
+ final IElementType operationSign = ((PsiPrefixExpression)context).getOperationTokenType();
+ if (operationSign == JavaTokenType.MINUSMINUS) {
+ return new TypeConversionDescriptor("--$qualifier$", "$qualifier$.decrementAndGet()");
+ }
+ if (operationSign == JavaTokenType.PLUSPLUS) {
+ return new TypeConversionDescriptor("++$qualifier$", "$qualifier$.incrementAndGet()");
+ }
+
+ }
+ else if (context instanceof PsiAssignmentExpression) {
+ final PsiJavaToken signToken = ((PsiAssignmentExpression)context).getOperationSign();
+ final IElementType operationSign = signToken.getTokenType();
+ final String sign = signToken.getText();
+ if (operationSign == JavaTokenType.PLUSEQ || operationSign == JavaTokenType.MINUSEQ) {
+ return new TypeConversionDescriptor("$qualifier$ " + sign + " $val$", "$qualifier$.getAndAdd(" +
+ (operationSign == JavaTokenType.MINUSEQ ? "-" : "") +
+ "($val$))");
+ }
+ }
+ }
+ else if (qualifiedName.equals(AtomicIntegerArray.class.getName()) || qualifiedName.equals(AtomicLongArray.class.getName())) {
+ PsiElement parentExpression = context.getParent();
+ if (parentExpression instanceof PsiPostfixExpression) {
+ final IElementType operationSign = ((PsiPostfixExpression)parentExpression).getOperationTokenType();
+ if (operationSign == JavaTokenType.MINUSMINUS) {
+ return new TypeConversionDescriptor("$qualifier$[$idx$]--", "$qualifier$.getAndDecrement($idx$)",
+ (PsiExpression)parentExpression);
+ }
+ if (operationSign == JavaTokenType.PLUSPLUS) {
+ return new TypeConversionDescriptor("$qualifier$[$idx$]++", "$qualifier$.getAndIncrement($idx$)",
+ (PsiExpression)parentExpression);
+ }
+
+ }
+ else if (parentExpression instanceof PsiPrefixExpression) {
+ final IElementType operationSign = ((PsiPrefixExpression)parentExpression).getOperationTokenType();
+ if (operationSign == JavaTokenType.MINUSMINUS) {
+ return new TypeConversionDescriptor("--$qualifier$[$idx$]", "$qualifier$.decrementAndGet($idx$)",
+ (PsiExpression)parentExpression);
+ }
+ if (operationSign == JavaTokenType.PLUSPLUS) {
+ return new TypeConversionDescriptor("++$qualifier$[$idx$]", "$qualifier$.incrementAndGet($idx$)",
+ (PsiExpression)parentExpression);
+ }
+
+ }
+ else if (parentExpression instanceof PsiAssignmentExpression) {
+ final PsiJavaToken signToken = ((PsiAssignmentExpression)parentExpression).getOperationSign();
+ final IElementType operationSign = signToken.getTokenType();
+ final String sign = signToken.getText();
+ if (operationSign == JavaTokenType.PLUSEQ || operationSign == JavaTokenType.MINUSEQ) {
+ return new TypeConversionDescriptor("$qualifier$[$idx$] " + sign + " $val$", "$qualifier$.getAndAdd($idx$, " +
+ (operationSign == JavaTokenType.MINUSEQ
+ ? "-"
+ : "") +
+ "($val$))", (PsiExpression)parentExpression);
+ }
+ }
+ }
+ }
+ return from instanceof PsiArrayType
+ ? findDirectConversionForAtomicReferenceArray(context, to, from)
+ : findDirectConversionForAtomicReference(context, to, from);
+ }
+
+ @Nullable
+ private static TypeConversionDescriptor findDirectConversionForAtomicReference(PsiElement context, PsiType to, PsiType from) {
+ final PsiElement parent = context.getParent();
+ if (parent instanceof PsiAssignmentExpression) {
+ final IElementType operationSign = ((PsiAssignmentExpression)parent).getOperationTokenType();
+ if (operationSign == JavaTokenType.EQ) {
+ return new TypeConversionDescriptor("$qualifier$ = $val$", "$qualifier$.set($val$)", (PsiAssignmentExpression)parent);
+ }
+ }
+
+ if (context instanceof PsiReferenceExpression) {
+ final PsiExpression qualifierExpression = ((PsiReferenceExpression)context).getQualifierExpression();
+ final PsiExpression expression = context.getParent() instanceof PsiMethodCallExpression && qualifierExpression != null
+ ? qualifierExpression
+ : (PsiExpression)context;
+ return new TypeConversionDescriptor("$qualifier$", "$qualifier$.get()", expression);
+ }
+ else if (context instanceof PsiAssignmentExpression) {
+ final PsiJavaToken signToken = ((PsiAssignmentExpression)context).getOperationSign();
+ final IElementType operationSign = signToken.getTokenType();
+ final String sign = signToken.getText();
+ if (parent instanceof PsiExpressionStatement) {
+ if (operationSign == JavaTokenType.EQ) {
+ final PsiExpression lExpression = ((PsiAssignmentExpression)context).getLExpression();
+ if (lExpression instanceof PsiReferenceExpression) {
+ final PsiElement element = ((PsiReferenceExpression)lExpression).resolve();
+ if (element instanceof PsiVariable && ((PsiVariable)element).hasModifierProperty(PsiModifier.FINAL)) {
+ return wrapWithNewExpression(to, from, ((PsiAssignmentExpression)context).getRExpression(), element);
+ }
+ }
+ return new TypeConversionDescriptor("$qualifier$ = $val$", "$qualifier$.set($val$)");
+ }
+ else {
+ return new TypeConversionDescriptor("$qualifier$" + sign + "$val$", "$qualifier$.set(" +
+ getBoxedWrapper(from, to, "$qualifier$.get() " +
+ sign.charAt(0) +
+ " $val$") +
+ ")");
+ }
+ } //else should be a conflict
+ }
+ else if (context instanceof PsiPostfixExpression) {
+ final String sign = ((PsiPostfixExpression)context).getOperationSign().getText();
+ return new TypeConversionDescriptor("$qualifier$" + sign, "$qualifier$.getAndSet(" +
+ getBoxedWrapper(from, to, "$qualifier$.get() " + sign.charAt(0) + " 1") +
+ ")");
+ }
+ else if (context instanceof PsiPrefixExpression) {
+ final PsiJavaToken operationSign = ((PsiPrefixExpression)context).getOperationSign();
+ if (operationSign.getTokenType() == JavaTokenType.EXCL) {
+ return new TypeConversionDescriptor("!$qualifier$", "!$qualifier$.get()");
+ }
+ final String sign = operationSign.getText();
+ return new TypeConversionDescriptor(sign + "$qualifier$", "$qualifier$.set(" + //todo reject?
+ getBoxedWrapper(from, to, "$qualifier$.get() " + sign.charAt(0) + " 1") +
+ ")");
+ } else if (context instanceof PsiBinaryExpression) {
+ final String sign = ((PsiBinaryExpression)context).getOperationSign().getText();
+ return new TypeConversionDescriptor("$qualifier$" + sign + "$val$", "$qualifier$.get() " + sign + " $val$");
+ }
+
+ if (parent instanceof PsiVariable) {
+ return wrapWithNewExpression(to, from, null, parent);
+ }
+ return null;
+ }
+
+ public static TypeConversionDescriptor wrapWithNewExpression(PsiType to, PsiType from, @Nullable PsiExpression expression, PsiElement context) {
+ final String typeText = PsiDiamondTypeUtil.getCollapsedType(to, context);
+ final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(to);
+ final PsiClass atomicClass = resolveResult.getElement();
+ LOG.assertTrue(atomicClass != null);
+ final PsiTypeParameter[] typeParameters = atomicClass.getTypeParameters();
+ if (typeParameters.length == 1) {
+ final PsiType initial = resolveResult.getSubstitutor().substitute(typeParameters[0]);
+ final PsiPrimitiveType unboxedInitialType = PsiPrimitiveType.getUnboxedType(initial);
+ if (unboxedInitialType != null) {
+ LOG.assertTrue(initial != null);
+ if (from instanceof PsiPrimitiveType) {
+ final PsiClassType boxedFromType = ((PsiPrimitiveType)from).getBoxedType(atomicClass);
+ LOG.assertTrue(boxedFromType != null);
+ if (!TypeConversionUtil.isAssignable(initial, boxedFromType)) {
+ return new TypeConversionDescriptor("$val$", "new " + typeText + "((" + unboxedInitialType.getCanonicalText() + ")$val$)", expression);
+ }
+ }
+ }
+ }
+ return new TypeConversionDescriptor("$val$", "new " + typeText + "($val$)", expression);
+ }
+
+ @Nullable
+ private static TypeConversionDescriptor findDirectConversionForAtomicReferenceArray(PsiElement context, PsiType to, PsiType from) {
+ LOG.assertTrue(from instanceof PsiArrayType);
+ from = ((PsiArrayType)from).getComponentType();
+ final PsiElement parent = context.getParent();
+ final PsiElement parentParent = parent.getParent();
+
+ if (parent instanceof PsiAssignmentExpression) {
+ final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)parent;
+ final IElementType operationSign = assignmentExpression.getOperationTokenType();
+ final String sign = assignmentExpression.getOperationSign().getText();
+ if (context instanceof PsiArrayAccessExpression) {
+ if (parentParent instanceof PsiExpressionStatement) {
+ if (assignmentExpression.getLExpression() == context) {
+ if (operationSign == JavaTokenType.EQ) {
+ return new TypeConversionDescriptor("$qualifier$[$idx$] = $val$", "$qualifier$.set($idx$, $val$)", assignmentExpression);
+ }
+ else {
+ return new TypeConversionDescriptor("$qualifier$[$idx$]" + sign + "$val$",
+ "$qualifier$.set($idx$, " + getBoxedWrapper(from, to, "$qualifier$.get($idx$) " + sign.charAt(0) + " $val$") + ")",
+ assignmentExpression);
+ }
+ }
+ } //else should be a conflict
+ }
+ else {
+ final PsiExpression rExpression = assignmentExpression.getRExpression();
+ if (rExpression == context && operationSign == JavaTokenType.EQ) { //array = new T[l];
+ return wrapWithNewExpression(to, from, rExpression, context);
+ }
+ }
+ } else if (parent instanceof PsiVariable) {
+ if (((PsiVariable)parent).getInitializer() == context) {
+ return wrapWithNewExpression(to, from, (PsiExpression)context, context);
+ }
+ }
+
+ if (parentParent instanceof PsiExpressionStatement) {
+ if (parent instanceof PsiPostfixExpression) {
+ final String sign = ((PsiPostfixExpression)parent).getOperationSign().getText();
+ return new TypeConversionDescriptor("$qualifier$[$idx$]" + sign, "$qualifier$.getAndSet($idx$, " +
+ getBoxedWrapper(from, to,
+ "$qualifier$.get($idx$) " + sign.charAt(0) + " 1") +
+ ")", (PsiExpression)parent);
+ }
+ else if (parent instanceof PsiPrefixExpression) {
+ final String sign = ((PsiPrefixExpression)parent).getOperationSign().getText();
+ return new TypeConversionDescriptor(sign + "$qualifier$[$idx$]", "$qualifier$.set($idx$, " +
+ getBoxedWrapper(from, to,
+ "$qualifier$.get($idx$) " + sign.charAt(0) + " 1") +
+ ")", (PsiExpression)parent);
+ }
+ else if (parent instanceof PsiBinaryExpression) {
+ final String sign = ((PsiBinaryExpression)parent).getOperationSign().getText();
+ return new TypeConversionDescriptor("$qualifier$[$idx$]" + sign + "$val$", "$qualifier$.set($idx$, " +
+ getBoxedWrapper(from, to, "$qualifier$.get($idx$) " +
+ sign +
+ " $val$)") +
+ ")", (PsiExpression)parent);
+ }
+ }
+
+ if (context instanceof PsiArrayAccessExpression) {
+ return new TypeConversionDescriptor("$qualifier$[$idx$]", "$qualifier$.get($idx$)", (PsiExpression)context);
+ }
+ return null;
+ }
+
+ private static String getBoxedWrapper(final PsiType from, final PsiType to, @NotNull String arg) {
+ final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(to);
+ final PsiClass atomicClass = resolveResult.getElement();
+ LOG.assertTrue(atomicClass != null);
+ final PsiTypeParameter[] typeParameters = atomicClass.getTypeParameters();
+ if (typeParameters.length == 1) {
+ final PsiSubstitutor substitutor = resolveResult.getSubstitutor();
+ LOG.assertTrue(substitutor.isValid());
+ final PsiType initial = substitutor.substitute(typeParameters[0]);
+ final PsiPrimitiveType unboxedInitialType = PsiPrimitiveType.getUnboxedType(initial);
+ if (unboxedInitialType != null) {
+ LOG.assertTrue(initial != null);
+ if (from instanceof PsiPrimitiveType) {
+ final PsiClassType boxedFromType = ((PsiPrimitiveType)from).getBoxedType(atomicClass);
+ LOG.assertTrue(boxedFromType != null);
+ return "new " + initial.getPresentableText() + "((" + unboxedInitialType.getCanonicalText() + ")(" + arg + "))";
+ }
+ }
+ }
+ return arg;
+ }
+
+ @Nullable
+ private static TypeConversionDescriptor findReverseConversion(PsiElement context) {
+ if (context instanceof PsiReferenceExpression) {
+ if (context.getParent() instanceof PsiMethodCallExpression) {
+ return findReverseConversionForMethodCall(context);
+ }
+ }
+ else if (context instanceof PsiNewExpression) {
+ return new TypeConversionDescriptor("new $type$($qualifier$)", "$qualifier$");
+ }
+ else if (context instanceof PsiMethodCallExpression) {
+ return findReverseConversionForMethodCall(((PsiMethodCallExpression)context).getMethodExpression());
+ }
+ return null;
+ }
+
+ @Nullable
+ private static TypeConversionDescriptor findReverseConversionForMethodCall(PsiElement context) {
+ final PsiElement resolved = ((PsiReferenceExpression)context).resolve();
+ if (resolved instanceof PsiMethod) {
+ final PsiMethod method = (PsiMethod)resolved;
+ final int parametersCount = method.getParameterList().getParametersCount();
+ final String resolvedName = method.getName();
+ if (Comparing.strEqual(resolvedName, "get")) {
+ return parametersCount == 0 ?
+ new TypeConversionDescriptor("$qualifier$.get()", "$qualifier$") :
+ new TypeConversionDescriptor("$qualifier$.get($idx$)", "$qualifier$[$idx$]");
+ }
+ else if (Comparing.strEqual(resolvedName, "set")) {
+ return parametersCount == 1 ?
+ new TypeConversionDescriptor("$qualifier$.set($val$)", "$qualifier$ = $val$") :
+ new TypeConversionDescriptor("$qualifier$.set($idx$, $val$)", "$qualifier$[$idx$] = $val$");
+ }
+ else if (Comparing.strEqual(resolvedName, "addAndGet")) {
+ return parametersCount == 1 ?
+ new TypeConversionDescriptor("$qualifier$.addAndGet($delta$)", "$qualifier$ + $delta$") :
+ new TypeConversionDescriptor("$qualifier$.addAndGet($idx$, $delta$)", "$qualifier$[$idx$] + $delta$");
+ }
+ else if (Comparing.strEqual(resolvedName, "incrementAndGet")) {
+ return parametersCount == 0 ?
+ new TypeConversionDescriptor("$qualifier$.incrementAndGet()", "++$qualifier$") :
+ new TypeConversionDescriptor("$qualifier$.incrementAndGet($idx$)", "++$qualifier$[$idx$]");
+ }
+ else if (Comparing.strEqual(resolvedName, "decrementAndGet")) {
+ return parametersCount == 0 ?
+ new TypeConversionDescriptor("$qualifier$.decrementAndGet()", "--$qualifier$") :
+ new TypeConversionDescriptor("$qualifier$.decrementAndGet($idx$)", "--$qualifier$[$idx$]");
+ }
+ else if (Comparing.strEqual(resolvedName, "getAndIncrement")) {
+ return parametersCount == 0 ?
+ new TypeConversionDescriptor("$qualifier$.getAndIncrement()", "$qualifier$++") :
+ new TypeConversionDescriptor("$qualifier$.getAndIncrement($idx$)", "$qualifier$[$idx$]++");
+ }
+ else if (Comparing.strEqual(resolvedName, "getAndDecrement")) {
+ return parametersCount == 0 ?
+ new TypeConversionDescriptor("$qualifier$.getAndDecrement()", "$qualifier$--") :
+ new TypeConversionDescriptor("$qualifier$.getAndDecrement($idx$)", "$qualifier$[$idx$]--");
+ }
+ else if (Comparing.strEqual(resolvedName, "getAndAdd")) {
+ return parametersCount == 1?
+ new TypeConversionDescriptor("$qualifier$.getAndAdd($val$)", "$qualifier$ += $val$") :
+ new TypeConversionDescriptor("$qualifier$.getAndAdd($idx$, $val$)", "$qualifier$[$idx$] += $val$");
+ }
+ else if (Comparing.strEqual(resolvedName, "getAndSet")) {
+ return parametersCount == 1 ?
+ new TypeConversionDescriptor("$qualifier$.getAndSet($val$)", "$qualifier$ = $val$") :
+ new TypeConversionDescriptor("$qualifier$.getAndSet($idx$, $val$)", "$qualifier$[$idx$] = $val$");
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/BoxingTypeConversionRule.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/BoxingTypeConversionRule.java
new file mode 100644
index 000000000000..4353bf602e04
--- /dev/null
+++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/BoxingTypeConversionRule.java
@@ -0,0 +1,36 @@
+/*
+ * User: anna
+ * Date: 08-Aug-2008
+ */
+package com.intellij.refactoring.typeMigration.rules;
+
+import com.intellij.openapi.util.Comparing;
+import com.intellij.psi.*;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptor;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptorBase;
+import com.intellij.refactoring.typeMigration.TypeMigrationLabeler;
+
+public class BoxingTypeConversionRule extends TypeConversionRule {
+
+ public TypeConversionDescriptorBase findConversion(final PsiType from, final PsiType to, final PsiMember member, final PsiExpression context,
+ final TypeMigrationLabeler labeler) {
+ if (to instanceof PsiClassType && from instanceof PsiPrimitiveType) {
+ if (!PsiUtil.isLanguageLevel5OrHigher(context)) {
+ final String boxedTypeName = ((PsiPrimitiveType)from).getBoxedTypeName();
+ if (Comparing.strEqual(boxedTypeName, to.getCanonicalText())) {
+ return new TypeConversionDescriptor("$qualifier$", boxedTypeName + ".valueOf($qualifier$)");
+ }
+ }
+ }
+ else if (from instanceof PsiClassType && to instanceof PsiPrimitiveType) {
+ if (!PsiUtil.isLanguageLevel5OrHigher(context)) {
+ final String boxedTypeName = ((PsiPrimitiveType)to).getBoxedTypeName();
+ if (Comparing.strEqual(boxedTypeName, from.getCanonicalText())) {
+ return new TypeConversionDescriptor("$qualifier$", "($qualifier$)." + to.getCanonicalText() + "Value()");
+ }
+ }
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ElementToArrayConversionRule.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ElementToArrayConversionRule.java
new file mode 100644
index 000000000000..0d25df778bcc
--- /dev/null
+++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ElementToArrayConversionRule.java
@@ -0,0 +1,36 @@
+/*
+ * User: anna
+ * Date: 25-Aug-2008
+ */
+package com.intellij.refactoring.typeMigration.rules;
+
+import com.intellij.psi.*;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.TypeConversionUtil;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptor;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptorBase;
+import com.intellij.refactoring.typeMigration.TypeMigrationLabeler;
+
+public class ElementToArrayConversionRule extends TypeConversionRule{
+ public TypeConversionDescriptorBase findConversion(final PsiType from, final PsiType to, final PsiMember member, final PsiExpression context,
+ final TypeMigrationLabeler labeler) {
+ if (member == null && to instanceof PsiArrayType && TypeConversionUtil.isAssignable(((PsiArrayType)to).getComponentType(), from)) {
+ TypeConversionDescriptor wrapDescription =
+ new TypeConversionDescriptor("$qualifier$", "new " + from.getCanonicalText() + "[]{$qualifier$}", context);
+ if (((PsiArrayType)to).getComponentType() instanceof PsiClassType && from instanceof PsiPrimitiveType) {
+ final String boxedTypeName = ((PsiPrimitiveType)from).getBoxedTypeName();
+ final String normalizedArrayInitializer =
+ PsiUtil.isLanguageLevel5OrHigher(context) ? "$qualifier$" : boxedTypeName + ".valueOf($qualifier$)";
+ wrapDescription = new TypeConversionDescriptor("$qualifier$", "new " + boxedTypeName + "[]{" + normalizedArrayInitializer + "}", context);
+ }
+ final PsiElement parent = context.getParent();
+ if ((context instanceof PsiLiteralExpression || context instanceof PsiReferenceExpression) && parent instanceof PsiStatement) {
+ return wrapDescription;
+ }
+ if (parent instanceof PsiAssignmentExpression && ((PsiAssignmentExpression)parent).getRExpression() == context) {
+ return wrapDescription;
+ }
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ListArrayConversionRule.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ListArrayConversionRule.java
new file mode 100644
index 000000000000..0aa639ba28cb
--- /dev/null
+++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ListArrayConversionRule.java
@@ -0,0 +1,177 @@
+/*
+ * User: anna
+ * Date: 08-Aug-2008
+ */
+package com.intellij.refactoring.typeMigration.rules;
+
+import com.intellij.openapi.util.Pair;
+import com.intellij.psi.*;
+import com.intellij.psi.impl.PsiImplUtil;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.util.InheritanceUtil;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.TypeConversionUtil;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptor;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptorBase;
+import com.intellij.refactoring.typeMigration.TypeMigrationLabeler;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.Nullable;
+
+public class ListArrayConversionRule extends TypeConversionRule {
+ public TypeConversionDescriptorBase findConversion(final PsiType from,
+ final PsiType to,
+ PsiMember member,
+ final PsiExpression context,
+ final TypeMigrationLabeler labeler) {
+ PsiExpression expression = context;
+ PsiClassType classType = from instanceof PsiClassType ? (PsiClassType)from : to instanceof PsiClassType ? (PsiClassType)to : null;
+ PsiArrayType arrayType = from instanceof PsiArrayType ? (PsiArrayType)from : to instanceof PsiArrayType ? (PsiArrayType)to : null;
+
+ if (classType == null || arrayType == null) return null;
+ final PsiType collectionType = evaluateCollectionsType(classType, expression);
+ if (collectionType == null) return null;
+
+ if (member == null) {
+ final PsiMethodCallExpression callExpression = PsiTreeUtil.getParentOfType(context, PsiMethodCallExpression.class);
+ if (callExpression != null) {
+ member = callExpression.resolveMethod();
+ expression = callExpression;
+ }
+ }
+ if (member instanceof PsiMethod) {
+ TypeConversionDescriptor descriptor = changeCollectionCallsToArray((PsiMethod)member, context, collectionType, arrayType);
+ if (descriptor != null) return descriptor;
+
+ @NonNls final String memberName = member.getName();
+ assert memberName != null;
+ if (memberName.equals("sort")) {
+ if (((PsiMethod)member).getParameterList().getParametersCount() == 1) {
+ descriptor = new TypeConversionDescriptor("Arrays.sort($qualifier$)", "Collections.sort($qualifier$)", expression);
+ }
+ else {
+ descriptor =
+ new TypeConversionDescriptor("Arrays.sort($qualifier$, $expr$)", "Collections.sort($qualifier$, $expr$)", expression);
+ }
+ }
+ else if (memberName.equals("binarySearch")) {
+ if (((PsiMethod)member).getParameterList().getParametersCount() == 2) {
+ descriptor =
+ new TypeConversionDescriptor("Arrays.binarySearch($qualifier$, $key$)", "Collections.binarySearch($qualifier$, $key$)",
+ expression);
+ }
+ else {
+ descriptor = new TypeConversionDescriptor("Arrays.binarySearch($qualifier$, $key$, $comparator$)",
+ "Collections.binarySearch($qualifier$, $key$, $comparator$)", expression);
+ }
+ }
+ else if (memberName.equals("asList")) {
+ if (((PsiMethod)member).getParameterList().getParametersCount() == 1) {
+ descriptor =
+ new TypeConversionDescriptor("Arrays.asList($qualifier$)", "$qualifier$", expression);
+ }
+ }
+ else if (memberName.equals("fill")) {
+ descriptor = new TypeConversionDescriptor("Arrays.fill($qualifier$, $filler$)", "Collections.fill($qualifier$, $filler$)", expression);
+ }
+ if (descriptor != null) {
+ return from instanceof PsiClassType
+ ? new TypeConversionDescriptor(descriptor.getReplaceByString(), descriptor.getStringToReplace(), descriptor.getExpression())
+ : descriptor;
+ }
+ }
+
+ if (member instanceof PsiField && member.getName().equals("length")) {
+ return new TypeConversionDescriptor("$qualifier$.length", "$qualifier$.size()");
+ }
+
+ final PsiElement parent = context.getParent();
+ if (parent instanceof PsiAssignmentExpression && ((PsiAssignmentExpression)parent).getLExpression() == context) {
+ if (TypeConversionUtil.isAssignable(collectionType, arrayType.getComponentType())) {
+ return new TypeConversionDescriptor("$qualifier$[$idx$] = $expr$", "$qualifier$.set($idx$, $expr$)",
+ (PsiExpression)parent);
+ }
+ }
+ else if (context instanceof PsiArrayAccessExpression && TypeConversionUtil.isAssignable(arrayType.getComponentType(), collectionType)) {
+ return new TypeConversionDescriptor("$qualifier$[$idx$]", "$qualifier$.get($idx$)");
+ }
+
+ return null;
+ }
+
+ @Nullable
+ public static PsiType evaluateCollectionsType(PsiClassType classType, PsiExpression expression) {
+ final PsiClassType.ClassResolveResult classResolveResult = PsiUtil.resolveGenericsClassInType(classType);
+ if (classResolveResult != null) {
+ final PsiClass psiClass = classResolveResult.getElement();
+ if (psiClass != null) {
+ final GlobalSearchScope allScope = GlobalSearchScope.allScope(psiClass.getProject());
+ final PsiClass collectionClass =
+ JavaPsiFacade.getInstance(psiClass.getProject()).findClass(CommonClassNames.JAVA_UTIL_LIST, allScope);
+ if (collectionClass != null && InheritanceUtil.isInheritorOrSelf(psiClass, collectionClass, true)) {
+ final PsiSubstitutor derivedSubstitutor = classResolveResult.getSubstitutor();
+ if (PsiUtil.isRawSubstitutor(psiClass, derivedSubstitutor)) return null;
+ final PsiSubstitutor substitutor =
+ TypeConversionUtil.getClassSubstitutor(collectionClass, psiClass, derivedSubstitutor);
+ assert substitutor != null;
+ final PsiType type = substitutor.substitute(collectionClass.getTypeParameters()[0]);
+ assert type != null;
+ return PsiImplUtil.normalizeWildcardTypeByPosition(type, expression);
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Pair<PsiType, PsiType> bindTypeParameters(final PsiType from,
+ final PsiType to,
+ final PsiMethod method,
+ final PsiExpression context,
+ final TypeMigrationLabeler labeler) {
+ if (findConversion(from, to, method, context, labeler) == null) return null;
+ if (from instanceof PsiArrayType && to instanceof PsiClassType) {
+ final PsiType collectionType = evaluateCollectionsType((PsiClassType)to, context);
+ if (collectionType != null) {
+ return Pair.create(((PsiArrayType)from).getComponentType(), collectionType);
+ }
+ }
+ if (to instanceof PsiArrayType && from instanceof PsiClassType) {
+ final PsiType collectionType = evaluateCollectionsType((PsiClassType)from, context);
+ if (collectionType != null) {
+ return Pair.create(collectionType, ((PsiArrayType)to).getComponentType());
+
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ private static TypeConversionDescriptor changeCollectionCallsToArray(final PsiMethod method,
+ final PsiElement context,
+ PsiType collectionType,
+ PsiArrayType arrayType) {
+ @NonNls final String methodName = method.getName();
+ if (methodName.equals("toArray")) {
+ if (method.getParameterList().getParameters().length == 0) {
+ return new TypeConversionDescriptor("$qualifier$.toArray()", "$qualifier$");
+ }
+ return new TypeConversionDescriptor("$qualifier$.toArray($expr$)", "$qualifier$");
+ }
+ else if (methodName.equals("size")) {
+ return new TypeConversionDescriptor("$qualifier$.size()", "$qualifier$.length");
+ }
+ else if (methodName.equals("get")) {
+ if (TypeConversionUtil.isAssignable(collectionType, arrayType.getComponentType())) {
+ return new TypeConversionDescriptor("$qualifier$.get($i$)", "$qualifier$[$i$]", PsiTreeUtil.getParentOfType(context, PsiMethodCallExpression.class));
+ }
+ }
+ else if (methodName.equals("set")) {
+ if (TypeConversionUtil.isAssignable(arrayType.getComponentType(), collectionType)) {
+ return new TypeConversionDescriptor("$qualifier$.set($i$, $val$)", "$qualifier$[$i$] = $val$");
+ }
+ }
+ return null;
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java
new file mode 100644
index 000000000000..2fb305147d02
--- /dev/null
+++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java
@@ -0,0 +1,231 @@
+/*
+ * User: anna
+ * Date: 18-Aug-2009
+ */
+package com.intellij.refactoring.typeMigration.rules;
+
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.util.Comparing;
+import com.intellij.psi.*;
+import com.intellij.psi.impl.PsiDiamondTypeUtil;
+import com.intellij.psi.tree.IElementType;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.TypeConversionUtil;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptor;
+import com.intellij.refactoring.typeMigration.TypeConversionDescriptorBase;
+import com.intellij.refactoring.typeMigration.TypeMigrationLabeler;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class ThreadLocalConversionRule extends TypeConversionRule {
+ private static final Logger LOG = Logger.getInstance("#" + ThreadLocalConversionRule.class.getName());
+
+
+ @Override
+ public TypeConversionDescriptorBase findConversion(PsiType from,
+ PsiType to,
+ PsiMember member,
+ PsiExpression context,
+ TypeMigrationLabeler labeler) {
+ if (to instanceof PsiClassType && isThreadLocalTypeMigration(from, (PsiClassType)to, context)) {
+ return findDirectConversion(context, to, from, labeler);
+ }
+ return null;
+ }
+
+ private static boolean isThreadLocalTypeMigration(PsiType from, PsiClassType to, PsiExpression context) {
+ final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(to);
+ final PsiClass threadLocalClass = resolveResult.getElement();
+
+ if (threadLocalClass != null) {
+ final String typeQualifiedName = threadLocalClass.getQualifiedName();
+ if (!Comparing.strEqual(typeQualifiedName, ThreadLocal.class.getName())) {
+ return false;
+ }
+ final PsiTypeParameter[] typeParameters = threadLocalClass.getTypeParameters();
+ if (typeParameters.length != 1) return !PsiUtil.isLanguageLevel5OrHigher(context);
+ final PsiType toTypeParameterValue = resolveResult.getSubstitutor().substitute(typeParameters[0]);
+ if (toTypeParameterValue != null) {
+ if (from instanceof PsiPrimitiveType) {
+ final PsiPrimitiveType unboxedInitialType = PsiPrimitiveType.getUnboxedType(toTypeParameterValue);
+ if (unboxedInitialType != null) {
+ return TypeConversionUtil.areTypesConvertible(from, unboxedInitialType);
+ }
+ }
+ else {
+ return TypeConversionUtil.isAssignable(from, PsiUtil.captureToplevelWildcards(toTypeParameterValue, context));
+ }
+ }
+ return !PsiUtil.isLanguageLevel5OrHigher(context);
+ }
+ return false;
+ }
+
+ @Nullable
+ public static TypeConversionDescriptor findDirectConversion(PsiElement context, PsiType to, PsiType from, TypeMigrationLabeler labeler) {
+ final PsiClass toTypeClass = PsiUtil.resolveClassInType(to);
+ LOG.assertTrue(toTypeClass != null);
+
+ if (context instanceof PsiArrayAccessExpression) {
+ return new TypeConversionDescriptor("$qualifier$[$val$]", "$qualifier$.get()[$val$]");
+ }
+ final PsiElement parent = context.getParent();
+ if (parent instanceof PsiAssignmentExpression) {
+ final IElementType operationSign = ((PsiAssignmentExpression)parent).getOperationTokenType();
+ if (operationSign == JavaTokenType.EQ) {
+ return new TypeConversionDescriptor("$qualifier$ = $val$", "$qualifier$.set(" + toBoxed("$val$", from, context)+")", (PsiAssignmentExpression)parent);
+ }
+ }
+
+ if (context instanceof PsiReferenceExpression) {
+ final PsiExpression qualifierExpression = ((PsiReferenceExpression)context).getQualifierExpression();
+ final PsiExpression expression = context.getParent() instanceof PsiMethodCallExpression && qualifierExpression != null
+ ? qualifierExpression
+ : (PsiExpression)context;
+ return new TypeConversionDescriptor("$qualifier$", toPrimitive("$qualifier$.get()", from, context), expression);
+ }
+ else if (context instanceof PsiBinaryExpression) {
+ final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)context;
+ final String sign = binaryExpression.getOperationSign().getText();
+ return new TypeConversionDescriptor("$qualifier$" + sign + "$val$", toPrimitive("$qualifier$.get()", from, context) + " " + sign + " $val$");
+ }
+
+ if (parent instanceof PsiExpressionStatement) {
+ if (context instanceof PsiPostfixExpression) {
+ final PsiPostfixExpression postfixExpression = (PsiPostfixExpression)context;
+ final String sign = postfixExpression.getOperationSign().getText();
+
+ return new TypeConversionDescriptor("$qualifier$" + sign, "$qualifier$.set(" +
+ getBoxedWrapper(from, to, toPrimitive("$qualifier$.get()", from, context) + " " + sign.charAt(0) + " 1",
+ labeler, context, postfixExpression.getOperand().getText() +
+ sign.charAt(0) +
+ " 1") +
+ ")");
+ }
+ else if (context instanceof PsiPrefixExpression) {
+ final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)context;
+ final PsiJavaToken operationSign = ((PsiPrefixExpression)context).getOperationSign();
+ if (operationSign.getTokenType() == JavaTokenType.EXCL) {
+ return new TypeConversionDescriptor("!$qualifier$", "!$qualifier$.get()");
+ }
+ final String sign = operationSign.getText();
+ final PsiExpression operand = prefixExpression.getOperand();
+ return new TypeConversionDescriptor(sign + "$qualifier$", "$qualifier$.set(" +
+ getBoxedWrapper(from, to, toPrimitive("$qualifier$.get()", from, context) + " " + sign.charAt(0) + " 1",
+ labeler, context, operand != null ? operand.getText() +
+ sign.charAt(0) +
+ " 1" : null) +
+ ")");
+ }
+ else if (context instanceof PsiAssignmentExpression) {
+ final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)context;
+ final PsiJavaToken signToken = assignmentExpression.getOperationSign();
+ final IElementType operationSign = signToken.getTokenType();
+ final String sign = signToken.getText();
+ final PsiExpression lExpression = assignmentExpression.getLExpression();
+ if (operationSign == JavaTokenType.EQ) {
+ if (lExpression instanceof PsiReferenceExpression) {
+ final PsiElement element = ((PsiReferenceExpression)lExpression).resolve();
+ if (element instanceof PsiVariable && ((PsiVariable)element).hasModifierProperty(PsiModifier.FINAL)) {
+ return wrapWithNewExpression(to, from, ((PsiAssignmentExpression)context).getRExpression());
+ }
+ }
+ return new TypeConversionDescriptor("$qualifier$ = $val$", "$qualifier$.set(" +
+ toBoxed("$val$", from, context) +
+ ")");
+ }
+ else {
+ final PsiExpression rExpression = assignmentExpression.getRExpression();
+ return new TypeConversionDescriptor("$qualifier$" + sign + "$val$", "$qualifier$.set(" +
+ getBoxedWrapper(from, to, toPrimitive("$qualifier$.get()", from, context) +
+ " " + sign.charAt(0) +
+ " $val$", labeler, context,
+ rExpression != null
+ ? lExpression
+ .getText() +
+ sign.charAt(0) +
+ rExpression.getText()
+ : null) +
+ ")");
+ }
+ }
+ }
+ return null;
+ }
+
+ public static TypeConversionDescriptor wrapWithNewExpression(PsiType to, PsiType from, PsiExpression initializer) {
+ final String boxedTypeName = from instanceof PsiPrimitiveType ? ((PsiPrimitiveType)from).getBoxedTypeName() : from.getCanonicalText();
+ return new TypeConversionDescriptor("$qualifier$", "new " +
+ to.getCanonicalText() +
+ "() {\n" +
+ "@Override \n" +
+ "protected " +
+ boxedTypeName +
+ " initialValue() {\n" +
+ " return " +
+ (PsiUtil.isLanguageLevel5OrHigher(initializer)
+ ? initializer.getText()
+ : (from instanceof PsiPrimitiveType ? "new " +
+ ((PsiPrimitiveType)from).getBoxedTypeName() +
+ "(" +
+ initializer.getText() +
+ ")" : initializer.getText())) +
+ ";\n" +
+ "}\n" +
+ "}", initializer);
+ }
+
+ private static String toPrimitive(String replaceByArg, PsiType from, PsiElement context) {
+ return PsiUtil.isLanguageLevel5OrHigher(context)
+ ? replaceByArg
+ : from instanceof PsiPrimitiveType ? "((" +
+ ((PsiPrimitiveType)from).getBoxedTypeName() +
+ ")" +
+ replaceByArg +
+ ")." +
+ from.getCanonicalText() +
+ "Value()" : "((" + from.getCanonicalText() + ")" + replaceByArg + ")";
+ }
+
+ private static String toBoxed(String replaceByArg, PsiType from, PsiElement context) {
+ return PsiUtil.isLanguageLevel5OrHigher(context)
+ ? replaceByArg
+ : from instanceof PsiPrimitiveType ? "new " + ((PsiPrimitiveType)from).getBoxedTypeName() +
+ "(" +
+ replaceByArg +
+ ")"
+ : replaceByArg;
+ }
+
+ private static String getBoxedWrapper(final PsiType from,
+ final PsiType to,
+ @NotNull String arg,
+ TypeMigrationLabeler labeler,
+ PsiElement context,
+ @Nullable String tryType) {
+ if (from instanceof PsiPrimitiveType) {
+ final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(to);
+ final PsiClass threadLocalClass = resolveResult.getElement();
+ LOG.assertTrue(threadLocalClass != null);
+ final PsiTypeParameter[] typeParameters = threadLocalClass.getTypeParameters();
+ if (typeParameters.length == 1) {
+ final PsiType initial = resolveResult.getSubstitutor().substitute(typeParameters[0]);
+ final PsiPrimitiveType unboxedInitialType = PsiPrimitiveType.getUnboxedType(initial);
+ if (unboxedInitialType != null) {
+ LOG.assertTrue(initial != null);
+ if (tryType != null) {
+ final PsiType exprType = labeler.getTypeEvaluator().evaluateType(
+ JavaPsiFacade.getElementFactory(threadLocalClass.getProject()).createExpressionFromText(tryType, context));
+ if (exprType != null && unboxedInitialType.isAssignableFrom(exprType)) {
+ return toBoxed(arg, from, context);
+ }
+ }
+ return "new " + initial.getCanonicalText() + "((" + unboxedInitialType.getCanonicalText() + ")(" + arg + "))";
+ }
+ }
+ }
+ return toBoxed(arg, from, context);
+ }
+
+
+} \ No newline at end of file
diff --git a/java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/after.java.template b/java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/after.java.template
new file mode 100644
index 000000000000..413db792c422
--- /dev/null
+++ b/java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/after.java.template
@@ -0,0 +1,10 @@
+public class X {
+ {
+ new Comparable<String>() {
+ @Override
+ public int compareTo(String o) {
+ return 0;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/before.java.template b/java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/before.java.template
new file mode 100644
index 000000000000..96eb1b46dbd2
--- /dev/null
+++ b/java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/before.java.template
@@ -0,0 +1,10 @@
+public class X {
+ {
+ new Comparable<<spam>Object</spam>>() {
+ @Override
+ public int compareTo(Object o) {
+ return 0;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/description.html b/java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/description.html
new file mode 100644
index 000000000000..d4dc0a283bf8
--- /dev/null
+++ b/java/typeMigration/src/intentionDescriptions/ChangeClassParametersIntention/description.html
@@ -0,0 +1,5 @@
+<html>
+<body>
+Changes anonymous class type parameters in live template.
+</body>
+</html> \ No newline at end of file
diff --git a/java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/after.java.template b/java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/after.java.template
new file mode 100644
index 000000000000..53cfaf5be80c
--- /dev/null
+++ b/java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/after.java.template
@@ -0,0 +1,4 @@
+import java.util.concurrent.atomic.*;
+public class X {
+ AtomicInteger count = new AtomicInteger(0);
+}
diff --git a/java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/before.java.template b/java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/before.java.template
new file mode 100644
index 000000000000..9e6048be8324
--- /dev/null
+++ b/java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/before.java.template
@@ -0,0 +1,3 @@
+public class X {
+ <spot>int count = 0;</spot>
+} \ No newline at end of file
diff --git a/java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/description.html b/java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/description.html
new file mode 100644
index 000000000000..0f799f7b36a8
--- /dev/null
+++ b/java/typeMigration/src/intentionDescriptions/ConvertFieldToAtomicIntention/description.html
@@ -0,0 +1,5 @@
+<html>
+<body>
+This intention replaces variable type with corresponding atomic type.
+</body>
+</html>
diff --git a/java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/after.java.template b/java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/after.java.template
new file mode 100644
index 000000000000..377017bd41c6
--- /dev/null
+++ b/java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/after.java.template
@@ -0,0 +1,15 @@
+import java.text.*;
+import java.util.Date;
+
+class X {
+ private static final ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
+ @Override
+ protected DateFormat initialValue() {
+ return new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
+ }
+ };
+
+ public String getDateString() {
+ return dateFormat.get().format(new Date());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/before.java.template b/java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/before.java.template
new file mode 100644
index 000000000000..14fae704762b
--- /dev/null
+++ b/java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/before.java.template
@@ -0,0 +1,10 @@
+import java.text.*;
+import java.util.Date;
+
+public class X {
+ private static DateFormat <spot>dateFormat</spot> = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
+
+ public String getDateString() {
+ return dateFormat.format(new Date());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/description.html b/java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/description.html
new file mode 100644
index 000000000000..930467e5df1b
--- /dev/null
+++ b/java/typeMigration/src/intentionDescriptions/ConvertFieldToThreadLocalIntention/description.html
@@ -0,0 +1,5 @@
+<html>
+<body>
+This intention replaces field type with corresponding thread local.
+</body>
+</html>
diff --git a/java/typeMigration/test/com/intellij/codeInsight/ConvertToAtomicIntentionTest.java b/java/typeMigration/test/com/intellij/codeInsight/ConvertToAtomicIntentionTest.java
new file mode 100644
index 000000000000..d4de1aa249ac
--- /dev/null
+++ b/java/typeMigration/test/com/intellij/codeInsight/ConvertToAtomicIntentionTest.java
@@ -0,0 +1,30 @@
+package com.intellij.codeInsight;
+
+import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase;
+import com.intellij.testFramework.PlatformTestUtil;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author anna
+ */
+public class ConvertToAtomicIntentionTest extends LightQuickFixParameterizedTestCase {
+ @Override
+ protected boolean shouldBeAvailableAfterExecution() {
+ return true;
+ }
+
+ @Override
+ protected String getBasePath() {
+ return "/intentions/atomic";
+ }
+
+ @NotNull
+ @Override
+ protected String getTestDataPath() {
+ return PlatformTestUtil.getCommunityPath() + "/java/typeMigration/testData";
+ }
+
+ public void test() throws Exception {
+ doAllTests();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/test/com/intellij/codeInsight/ConvertToThreadLocalIntentionTest.java b/java/typeMigration/test/com/intellij/codeInsight/ConvertToThreadLocalIntentionTest.java
new file mode 100644
index 000000000000..e45b26ba77c8
--- /dev/null
+++ b/java/typeMigration/test/com/intellij/codeInsight/ConvertToThreadLocalIntentionTest.java
@@ -0,0 +1,30 @@
+package com.intellij.codeInsight;
+
+import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase;
+import com.intellij.testFramework.PlatformTestUtil;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author anna
+ */
+public class ConvertToThreadLocalIntentionTest extends LightQuickFixParameterizedTestCase {
+ @Override
+ protected boolean shouldBeAvailableAfterExecution() {
+ return true;
+ }
+
+ @Override
+ protected String getBasePath() {
+ return "/intentions/threadLocal";
+ }
+
+ @NotNull
+ @Override
+ protected String getTestDataPath() {
+ return PlatformTestUtil.getCommunityPath() + "/java/typeMigration/testData";
+ }
+
+ public void test() throws Exception {
+ doAllTests();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/test/com/intellij/refactoring/AllTypeMigrationTests.java b/java/typeMigration/test/com/intellij/refactoring/AllTypeMigrationTests.java
new file mode 100644
index 000000000000..2fb8d9054628
--- /dev/null
+++ b/java/typeMigration/test/com/intellij/refactoring/AllTypeMigrationTests.java
@@ -0,0 +1,26 @@
+/*
+ * User: anna
+ * Date: 04-Aug-2008
+ */
+package com.intellij.refactoring;
+
+import com.intellij.codeInsight.ConvertToAtomicIntentionTest;
+import com.intellij.codeInsight.ConvertToThreadLocalIntentionTest;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class AllTypeMigrationTests {
+ @SuppressWarnings({"UnusedDeclaration"})
+ public static Test suite() {
+ final TestSuite suite = new TestSuite();
+ suite.addTestSuite(TypeMigrationTest.class);
+ suite.addTestSuite(TypeMigrationByAtomicRuleTest.class);
+ suite.addTestSuite(TypeMigrationByThreadLocalRuleTest.class);
+ suite.addTestSuite(MigrateTypeSignatureTest.class);
+ suite.addTestSuite(ChangeTypeSignatureTest.class);
+ suite.addTestSuite(WildcardTypeMigrationTest.class);
+ suite.addTestSuite(ConvertToAtomicIntentionTest.class);
+ suite.addTestSuite(ConvertToThreadLocalIntentionTest.class);
+ return suite;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/test/com/intellij/refactoring/ChangeTypeSignatureTest.java b/java/typeMigration/test/com/intellij/refactoring/ChangeTypeSignatureTest.java
new file mode 100644
index 000000000000..8feae694f7b6
--- /dev/null
+++ b/java/typeMigration/test/com/intellij/refactoring/ChangeTypeSignatureTest.java
@@ -0,0 +1,148 @@
+/*
+ * User: anna
+ * Date: 18-Mar-2008
+ */
+package com.intellij.refactoring;
+
+import com.intellij.psi.*;
+import com.intellij.psi.impl.source.PsiImmediateClassType;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.refactoring.typeMigration.TypeMigrationLabeler;
+import com.intellij.refactoring.typeMigration.TypeMigrationProcessor;
+import com.intellij.refactoring.typeMigration.TypeMigrationRules;
+import com.intellij.testFramework.LightCodeInsightTestCase;
+import com.intellij.testFramework.PlatformTestUtil;
+import org.jetbrains.annotations.NotNull;
+
+public class ChangeTypeSignatureTest extends LightCodeInsightTestCase {
+ @NotNull
+ @Override
+ protected String getTestDataPath() {
+ return PlatformTestUtil.getCommunityPath() + "/java/typeMigration/testData";
+ }
+
+ private void doTest(boolean success, String migrationTypeText) throws Exception {
+ String dataPath = "/refactoring/changeTypeSignature/";
+ configureByFile(dataPath + getTestName(false) + ".java");
+ final PsiFile file = getFile();
+ final PsiElement element = file.findElementAt(getEditor().getCaretModel().getOffset());
+ final PsiReferenceParameterList parameterList = PsiTreeUtil.getParentOfType(element, PsiReferenceParameterList.class);
+ assert parameterList != null;
+ final PsiClass superClass = (PsiClass)((PsiJavaCodeReferenceElement)parameterList.getParent()).resolve();
+ assert superClass != null;
+
+ PsiType migrationType = getJavaFacade().getElementFactory().createTypeFromText(migrationTypeText, null);
+
+ try {
+ final TypeMigrationRules rules = new TypeMigrationRules(TypeMigrationLabeler.getElementType(parameterList));
+ rules.setMigrationRootType(PsiSubstitutor.EMPTY.put(superClass.getTypeParameters()[0], migrationType).substitute(new PsiImmediateClassType(superClass, PsiSubstitutor.EMPTY)));
+ rules.setBoundScope(GlobalSearchScope.projectScope(getProject()));
+ new TypeMigrationProcessor(getProject(), parameterList, rules).run();
+ if (success) {
+ checkResultByFile(dataPath + getTestName(false) + ".java.after");
+ } else {
+ fail("Conflicts should be detected");
+ }
+ }
+ catch (RuntimeException e) {
+ if (success) {
+ e.printStackTrace();
+ fail("Conflicts should not appear");
+ }
+ }
+ }
+
+ private void doTest(boolean success) throws Exception {
+ doTest(success, CommonClassNames.JAVA_LANG_OBJECT);
+ }
+
+ public void testListTypeArguments() throws Exception {
+ doTest(true);
+ }
+
+ public void testFieldUsage() throws Exception {
+ doTest(true);
+ }
+
+ public void testFieldUsage1() throws Exception {
+ doTest(true);
+ }
+
+ public void testReturnType() throws Exception {
+ doTest(true);
+ }
+
+ public void testReturnType1() throws Exception {
+ doTest(true);
+ }
+
+ public void testReturnType2() throws Exception {
+ doTest(true);
+ }
+
+ public void testPassedParameter() throws Exception {
+ doTest(true);
+ }
+
+ public void testPassedParameter1() throws Exception {
+ doTest(true, "java.lang.Integer");
+ }
+
+ public void testPassedParameter2() throws Exception {
+ doTest(true);
+ }
+
+ public void testUsedInSuper() throws Exception {
+ doTest(true);
+ }
+
+ public void testCompositeReturnType() throws Exception {
+ doTest(true);
+ }
+
+ public void testTypeHierarchy() throws Exception {
+ doTest(true);
+ }
+
+ public void testTypeHierarchy1() throws Exception {
+ doTest(true);
+ }
+
+ public void testTypeHierarchy2() throws Exception {
+ doTest(true);
+ }
+
+ public void testTypeHierarchyFieldUsage() throws Exception {
+ doTest(true);
+ }
+
+ public void testTypeHierarchyFieldUsageConflict() throws Exception {
+ doTest(true);
+ }
+
+ public void testParameterMigration() throws Exception {
+ doTest(true);
+ }
+
+ public void testParameterMigration1() throws Exception {
+ doTest(true, "java.lang.Integer");
+ }
+
+ public void testParameterMigration2() throws Exception {
+ doTest(true, "java.lang.Integer");
+ }
+
+ public void testFieldTypeMigration() throws Exception {
+ doTest(true, "java.lang.String");
+ }
+
+ public void testMethodReturnTypeMigration() throws Exception {
+ doTest(true, "java.lang.Integer");
+ }
+
+ @Override
+ protected boolean isRunInWriteAction() {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/test/com/intellij/refactoring/MigrateTypeSignatureTest.java b/java/typeMigration/test/com/intellij/refactoring/MigrateTypeSignatureTest.java
new file mode 100644
index 000000000000..7889306ed6f0
--- /dev/null
+++ b/java/typeMigration/test/com/intellij/refactoring/MigrateTypeSignatureTest.java
@@ -0,0 +1,561 @@
+/*
+ * User: anna
+ * Date: 30-Apr-2008
+ */
+package com.intellij.refactoring;
+
+import com.intellij.psi.CommonClassNames;
+import com.intellij.psi.PsiEllipsisType;
+import com.intellij.psi.PsiType;
+import org.jetbrains.annotations.NotNull;
+
+public class MigrateTypeSignatureTest extends TypeMigrationTestBase {
+ @NotNull
+ @Override
+ public String getTestRoot() {
+ return "/refactoring/migrateTypeSignature/";
+ }
+
+ public void testExprAccess2Lvalue() throws Exception {
+ doTestFieldType("myForAccess", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText("ClassChild", null),
+ myJavaFacade.getElementFactory().createTypeFromText("ClassParent", null));
+ }
+
+ public void testExprAccess2Rvalue() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText("ClassChild", null),
+ myJavaFacade.getElementFactory().createTypeFromText("ClassGrandChild", null));
+ }
+
+ public void testExprAccessParent2Lvalue() throws Exception {
+ doTestFieldType("myForSuperAccess", "Ession",
+ myJavaFacade.getElementFactory().createTypeFromText("ClassChild", null),
+ myJavaFacade.getElementFactory().createTypeFromText("ClassParent", null));
+ }
+
+ public void testExprAccessParent2Rvalue() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText("ClassChild", null),
+ myJavaFacade.getElementFactory().createTypeFromText("ClassGrandChild", null));
+ }
+
+ public void testExprArrayAccessNegative() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.INT, PsiType.DOUBLE);
+ }
+
+ public void testExprArrayAccessPositive() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.INT, PsiType.CHAR);
+ }
+
+ public void testExprCalcBooleanBoolean() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.BOOLEAN, PsiType.INT);
+ }
+
+ public void testExprCalcBooleanNumeric() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.INT,
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null));
+ }
+
+ public void testExprCalcBooleanReference() throws Exception {
+ doTestFirstParamType("meth", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null),
+ PsiType.DOUBLE);
+ }
+
+ public void testExprCalcNumeric2Boolean() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.INT, PsiType.BOOLEAN);
+ }
+
+ public void testExprCalcNumeric2Floating() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.INT, PsiType.FLOAT);
+ }
+
+ public void testExprCalcNumeric2Int() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.INT, PsiType.LONG);
+ }
+
+ public void testExprCalcNumeric2String() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.INT,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null));
+ }
+
+ public void testExprCast2LvalueNeg() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.BYTE,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null));
+ }
+
+ public void testExprCast2LvaluePos() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.BYTE, PsiType.INT);
+ }
+
+ public void testExprConcatNumeric2Reference() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.INT,
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null));
+ }
+
+ public void testExprConcatNumeric2String() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.INT,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null));
+ }
+
+ public void testExprConcatString2Numeric() throws Exception {
+ doTestFirstParamType("meth", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null),
+ PsiType.INT);
+ }
+
+ public void testExprConcatString2Reference() throws Exception {
+ doTestFirstParamType("meth", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null),
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null));
+ }
+
+ public void testExprInstanceofNeg() throws Exception {
+ doTestFirstParamType("meth", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_UTIL_SET, null),
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_UTIL_LIST, null));
+ }
+
+ public void testExprInstanceofPos() throws Exception {
+ doTestFirstParamType("meth", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_UTIL_MAP, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.AbstractMap", null));
+ }
+
+ public void testExprLiteralBoolean() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ PsiType.BOOLEAN);
+ }
+
+ public void testExprLiteralByte() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ PsiType.BYTE);
+ }
+
+ public void testExprLiteralChar() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ PsiType.CHAR);
+ }
+
+ public void testExprLiteralClassExtends() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Class<? extends java.util.Collection[]>", null));
+ }
+
+ public void testExprLiteralClassPrimitive() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Class<Integer>", null));
+ }
+
+ public void testExprLiteralClassPrimitiveArray() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Class<int[]>", null));
+ }
+
+ public void testExprLiteralClassRaw() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Class", null));
+ }
+
+ public void testExprLiteralClassReference() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Class<java.util.Set>", null));
+ }
+
+ public void testExprLiteralClassReferenceArray() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Class<java.util.Set[]>", null));
+ }
+
+ public void testExprLiteralClassSuper() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Class<? super java.util.AbstractSet[]>", null));
+ }
+
+ public void testExprLiteralDouble() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ PsiType.DOUBLE);
+ }
+
+ public void testExprLiteralFloat() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ PsiType.FLOAT);
+ }
+
+ public void testExprLiteralInt() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ PsiType.INT);
+ }
+
+ public void testExprLiteralLong() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ PsiType.LONG);
+ }
+
+ public void testExprLiteralShort() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ PsiType.SHORT);
+ }
+
+ public void testExprLiteralString() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null));
+ }
+
+ public void testExprNewArrayArray2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText("FaceChild", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("FaceParent", null).createArrayType());
+ }
+
+ public void testExprNewArrayArray2Rvalue() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText("FaceChild", null).createArrayType().createArrayType().createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("ClassParent", null).createArrayType().createArrayType().createArrayType());
+ }
+
+ public void testExprNewArrayGen2Rvalue() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_UTIL_SET, null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<java.lang.Integer>", null).createArrayType());
+ }
+
+ public void testExprNewArrayPrimitive2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.BOOLEAN, PsiType.INT);
+ }
+
+ public void testExprNewArrayPrimitive2Rvalue() throws Exception {
+ doTestFieldType("myField", "Expr",
+ PsiType.BOOLEAN.createArrayType().createArrayType(),
+ PsiType.INT.createArrayType().createArrayType());
+ }
+
+ public void testExprNewArrayReftype2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText("FaceChild", null),
+ myJavaFacade.getElementFactory().createTypeFromText("FaceParent", null));
+ }
+
+ public void testExprNewArrayReftype2Rvalue() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText("FaceChild", null).createArrayType().createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("ClassParent", null).createArrayType().createArrayType());
+ }
+
+ public void testExprNewGen() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<Subject>", null));
+ }
+
+ public void testExprNewGenExtends() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<? extends Subject>", null));
+ }
+
+ public void testExprNewGenSuper() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<? super Subject>", null));
+ }
+
+ public void testExprNewReference() throws Exception {
+ doTestFieldType("myField", "Expr",
+ myJavaFacade.getElementFactory().createTypeFromText("Expr.Ancestor", null),
+ myJavaFacade.getElementFactory().createTypeFromText("Expr.Subject", null));
+ }
+
+ public void testExprReturn2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.INT,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null));
+ }
+
+ public void testExprReturn2Rvalue() throws Exception {
+ doTestMethodType("meth", "Expr", PsiType.INT,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null));
+ }
+
+ public void testExprTernary() throws Exception {
+ doTestFirstParamType("meth", "Expr", PsiType.DOUBLE,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null));
+ }
+
+ public void testOverridingDown() throws Exception {
+ doTestMethodType("getInt", "Parent", PsiType.INT, PsiType.BYTE);
+ }
+
+ public void testOverridingUp() throws Exception {
+ doTestMethodType("getInt", "Child", PsiType.INT, PsiType.BYTE);
+ }
+
+ public void testSpecJavadoc() throws Exception {
+ doTestFirstParamType("meth", "Spec", PsiType.DOUBLE,
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_UTIL_SET, null));
+ }
+
+ public void testSpecNotUsed() throws Exception {
+ doTestFieldType("myField", "Spec", PsiType.INT, PsiType.BOOLEAN);
+ }
+
+ public void testTypeArrayReftype2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("Descendant", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("Subject", null).createArrayType());
+ }
+
+ public void testTypeArrayReftype2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("Ancestor", null).createArrayType().createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("Subject", null).createArrayType().createArrayType());
+ }
+
+ public void testTypeArrayRoots2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("Holder", null),
+ myJavaFacade.getElementFactory().createTypeFromText("Holder", null).createArrayType());
+ }
+
+ public void testTypeArrayVararg2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("Descendant", null).createArrayType(),
+ new PsiEllipsisType(myJavaFacade.getElementFactory().createTypeFromText("Subject", null)));
+ }
+
+ public void testTypeArrayVararg2RvalueNeg() throws Exception {
+ doTestFieldType("myField", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("Ancestor", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("Descendant", null).createArrayType());
+ }
+
+ public void testTypeArrayVararg2RvaluePos() throws Exception {
+ doTestFieldType("myField", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("Ancestor", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("Subject", null).createArrayType());
+ }
+
+ public void testTypeAutoboxBoolean2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.BOOLEAN,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Boolean", null));
+ }
+
+ public void testTypeAutoboxBoolean2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", myJavaFacade.getElementFactory().createTypeFromText("java.lang.Boolean", null),
+ PsiType.BOOLEAN);
+ }
+
+ public void testTypeAutoboxByte2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.BYTE,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Byte", null));
+ }
+
+ public void testTypeAutoboxByte2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", myJavaFacade.getElementFactory().createTypeFromText("java.lang.Byte", null),
+ PsiType.BYTE);
+ }
+
+ public void testTypeAutoboxChar2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.CHAR,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Character", null));
+ }
+
+ public void testTypeAutoboxChar2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", myJavaFacade.getElementFactory().createTypeFromText("java.lang.Character", null),
+ PsiType.CHAR);
+ }
+
+ public void testTypeAutoboxDouble2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.DOUBLE,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Double", null));
+ }
+
+ public void testTypeAutoboxDouble2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", myJavaFacade.getElementFactory().createTypeFromText("java.lang.Double", null),
+ PsiType.DOUBLE);
+ }
+
+ public void testTypeAutoboxFloat2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.FLOAT,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Float", null));
+ }
+
+ public void testTypeAutoboxFloat2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", myJavaFacade.getElementFactory().createTypeFromText("java.lang.Float", null),
+ PsiType.FLOAT);
+ }
+
+ public void testTypeAutoboxInt2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.INT,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Integer", null));
+ }
+
+ public void testTypeAutoboxInt2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", myJavaFacade.getElementFactory().createTypeFromText("java.lang.Integer", null),
+ PsiType.INT);
+ }
+
+ public void testTypeAutoboxLong2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.LONG,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Long", null));
+ }
+
+ public void testTypeAutoboxLong2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", myJavaFacade.getElementFactory().createTypeFromText("java.lang.Long", null),
+ PsiType.LONG);
+ }
+
+ public void testTypeAutoboxShort2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.SHORT,
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Short", null));
+ }
+
+ public void testTypeAutoboxShort2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", myJavaFacade.getElementFactory().createTypeFromText("java.lang.Short", null),
+ PsiType.SHORT);
+ }
+
+ public void testTypeGenAncestor2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_UTIL_SET, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<Subject>", null));
+ }
+
+ public void testTypeGenAncestorWildcard2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_UTIL_SET, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<? extends Subject>", null));
+ }
+
+ public void testTypeGenDescendant2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_UTIL_SET, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<Subject>", null));
+ }
+
+ public void testTypeGenDescendantWildcard2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_UTIL_SET, null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<? super Subject>", null));
+ }
+
+ public void testTypeGenRaw2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<Any>", null),
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_UTIL_SET, null));
+ }
+
+ public void testTypeGenRaw2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<Any>", null),
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_UTIL_SET, null));
+ }
+
+ public void testTypePrimsubBoolean2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.INT, PsiType.BOOLEAN);
+ }
+
+ public void testTypePrimsubBoolean2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", PsiType.INT, PsiType.BOOLEAN);
+ }
+
+ public void testTypePrimsubByte2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", PsiType.DOUBLE, PsiType.BYTE);
+ }
+
+ public void testTypePrimsubChar2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.BYTE, PsiType.CHAR);
+ }
+
+ public void testTypePrimsubChar2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", PsiType.DOUBLE, PsiType.CHAR);
+ }
+
+ public void testTypePrimsubDouble2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.BYTE, PsiType.DOUBLE);
+ }
+
+ public void testTypePrimsubFloat2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.BYTE, PsiType.FLOAT);
+ }
+
+ public void testTypePrimsubFloat2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", PsiType.DOUBLE, PsiType.FLOAT);
+ }
+
+ public void testTypePrimsubInt2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.BYTE, PsiType.INT);
+ }
+
+ public void testTypePrimsubInt2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", PsiType.DOUBLE, PsiType.INT);
+ }
+
+ public void testTypePrimsubLong2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.BYTE, PsiType.LONG);
+ }
+
+ public void testTypePrimsubLong2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", PsiType.DOUBLE, PsiType.LONG);
+ }
+
+ public void testTypePrimsubShort2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type", PsiType.BYTE, PsiType.SHORT);
+ }
+
+ public void testTypePrimsubShort2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type", PsiType.DOUBLE, PsiType.SHORT);
+ }
+
+ public void testTypeRefClassChild2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("FaceParent", null),
+ myJavaFacade.getElementFactory().createTypeFromText("ClassChild", null));
+ }
+
+ public void testTypeRefClassParent2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("ClassChild", null),
+ myJavaFacade.getElementFactory().createTypeFromText("ClassParent", null));
+ }
+
+ public void testTypeRefClassParent2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("FaceParent", null),
+ myJavaFacade.getElementFactory().createTypeFromText("ClassParent", null));
+ }
+
+ public void testTypeRefFaceChild2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("ClassChild", null),
+ myJavaFacade.getElementFactory().createTypeFromText("FaceChild", null));
+ }
+
+ public void testTypeRefFaceChild2Rvalue() throws Exception {
+ doTestFieldType("myField", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("FaceParent", null),
+ myJavaFacade.getElementFactory().createTypeFromText("FaceChild", null));
+ }
+
+ public void testTypeRefFaceParent2Lvalue() throws Exception {
+ doTestFirstParamType("meth", "Type",
+ myJavaFacade.getElementFactory().createTypeFromText("ClassChild", null),
+ myJavaFacade.getElementFactory().createTypeFromText("FaceParent", null));
+ }
+}
diff --git a/java/typeMigration/test/com/intellij/refactoring/TypeMigrationByAtomicRuleTest.java b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationByAtomicRuleTest.java
new file mode 100644
index 000000000000..80658077e986
--- /dev/null
+++ b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationByAtomicRuleTest.java
@@ -0,0 +1,100 @@
+/*
+ * User: anna
+ * Date: 19-Aug-2009
+ */
+package com.intellij.refactoring;
+
+import com.intellij.psi.PsiType;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.concurrent.atomic.AtomicReferenceArray;
+import java.util.concurrent.atomic.AtomicIntegerArray;
+
+public class TypeMigrationByAtomicRuleTest extends TypeMigrationTestBase{
+ @NotNull
+ @Override
+ protected String getTestRoot() {
+ return "/refactoring/typeMigrationByAtomic/";
+ }
+
+ private void doTestDirectMigration() throws Exception {
+ doTestFieldType("i", PsiType.INT, myJavaFacade.getElementFactory().createTypeFromText("java.util.concurrent.atomic.AtomicInteger", null));
+ }
+
+
+ public void testDirectIncrementDecrement() throws Exception {
+ doTestDirectMigration();
+ }
+
+ public void testDirectAssignments() throws Exception {
+ doTestDirectMigration();
+ }
+
+ public void testDirectConditions() throws Exception {
+ doTestFieldType("b", PsiType.BOOLEAN, myJavaFacade.getElementFactory().createTypeFromText("java.util.concurrent.atomic.AtomicBoolean", null));
+ }
+
+
+ public void testDirectByte() throws Exception {
+ doTestFieldType("b", PsiType.BYTE, myJavaFacade.getElementFactory().createTypeFromText("java.util.concurrent.atomic.AtomicReference<java.lang.Byte>", null));
+ }
+
+ public void testDirectString() throws Exception {
+ doTestFieldType("s", myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.concurrent.atomic.AtomicReference<java.lang.String>", null));
+ }
+
+ public void testDirectForeach() throws Exception {
+ doTestFieldType("lst", myJavaFacade.getElementFactory().createTypeFromText("java.util.List<java.lang.String>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.concurrent.atomic.AtomicReference<java.util.List<java.lang.String>>", null));
+ }
+
+ public void testDirectStringArray() throws Exception {
+ doTestFieldType("s", myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText(AtomicReferenceArray.class.getName() + "<java.lang.String>", null));
+ }
+
+ public void testDirectIntArray() throws Exception {
+ doTestFieldType("a", PsiType.INT.createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText(AtomicIntegerArray.class.getName(), null));
+ }
+
+ private void doTestReverseMigration() throws Exception {
+ doTestFieldType("i", myJavaFacade.getElementFactory().createTypeFromText("java.util.concurrent.atomic.AtomicInteger", null), PsiType.INT);
+ }
+
+
+ public void testReverseIncrementDecrement() throws Exception {
+ doTestReverseMigration();
+ }
+
+ public void testReverseAssignments() throws Exception {
+ doTestReverseMigration();
+ }
+
+ public void testReverseConditions() throws Exception {
+ doTestFieldType("b", myJavaFacade.getElementFactory().createTypeFromText("java.util.concurrent.atomic.AtomicBoolean", null), PsiType.BOOLEAN);
+ }
+
+ public void testReverseByte() throws Exception {
+ doTestFieldType("b", myJavaFacade.getElementFactory().createTypeFromText("java.util.concurrent.atomic.AtomicReference<java.lang.Byte>", null), PsiType.BYTE);
+ }
+
+ public void testReverseString() throws Exception {
+ doTestFieldType("s",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.concurrent.atomic.AtomicReference<java.lang.String>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null));
+ }
+
+ public void testReverseStringArray() throws Exception {
+ doTestFieldType("s",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.concurrent.atomic.AtomicReferenceArray<java.lang.String>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null).createArrayType());
+ }
+
+ public void testReverseIntArray() throws Exception {
+ doTestFieldType("a",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.concurrent.atomic.AtomicIntegerArray", null),
+ PsiType.INT.createArrayType());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/test/com/intellij/refactoring/TypeMigrationByThreadLocalRuleTest.java b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationByThreadLocalRuleTest.java
new file mode 100644
index 000000000000..5d002d3fcced
--- /dev/null
+++ b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationByThreadLocalRuleTest.java
@@ -0,0 +1,44 @@
+/*
+ * User: anna
+ * Date: 19-Aug-2009
+ */
+package com.intellij.refactoring;
+
+import com.intellij.psi.PsiType;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.openapi.roots.LanguageLevelProjectExtension;
+import com.intellij.pom.java.LanguageLevel;
+import org.jetbrains.annotations.NotNull;
+
+public class TypeMigrationByThreadLocalRuleTest extends TypeMigrationTestBase{
+ @NotNull
+ @Override
+ protected String getTestRoot() {
+ return "/refactoring/typeMigrationByThreadLocal/";
+ }
+
+
+ public void testDirectInt() throws Exception {
+ doTestFieldType("i", PsiType.INT, myJavaFacade.getElementFactory().createTypeFromText("java.lang.ThreadLocal<java.lang.Integer>", null));
+ }
+
+ public void testDirectByte() throws Exception {
+ doTestFieldType("i", PsiType.BYTE, myJavaFacade.getElementFactory().createTypeFromText("java.lang.ThreadLocal<java.lang.Byte>", null));
+ }
+
+ public void testDirectString() throws Exception {
+ doTestFieldType("myS", PsiType.getJavaLangString(myPsiManager, GlobalSearchScope.allScope(myProject)), myJavaFacade.getElementFactory().createTypeFromText("java.lang.ThreadLocal<java.lang.String>", null));
+ }
+
+ public void testLanguageLevel() throws Exception {
+ final LanguageLevelProjectExtension extension = LanguageLevelProjectExtension.getInstance(getProject());
+ final LanguageLevel languageLevel = extension.getLanguageLevel();
+ try {
+ extension.setLanguageLevel(LanguageLevel.JDK_1_3);
+ doTestFieldType("i", PsiType.INT, myJavaFacade.getElementFactory().createTypeFromText("java.lang.ThreadLocal", null));
+ }
+ finally {
+ extension.setLanguageLevel(languageLevel);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTest.java b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTest.java
new file mode 100644
index 000000000000..b3c36dca19f2
--- /dev/null
+++ b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTest.java
@@ -0,0 +1,883 @@
+package com.intellij.refactoring;
+
+import com.intellij.openapi.roots.LanguageLevelProjectExtension;
+import com.intellij.pom.java.LanguageLevel;
+import com.intellij.psi.*;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.refactoring.typeMigration.TypeMigrationRules;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author db
+ * @since 22.07.2003
+ */
+public class TypeMigrationTest extends TypeMigrationTestBase {
+ private PsiElementFactory myFactory;
+
+ @NotNull
+ @Override
+ public String getTestRoot() {
+ return "/refactoring/typeMigration/";
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.HIGHEST);
+ myFactory = myJavaFacade.getElementFactory();
+ }
+
+ public void testT07() {
+ doTestFieldType("f",
+ PsiType.INT.createArrayType(),
+ myFactory.createTypeFromText("java.lang.Integer", null).createArrayType());
+ }
+
+ public void testT08() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.lang.Integer", null).createArrayType(),
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType());
+ }
+
+ public void testT09() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.lang.Integer", null).createArrayType(),
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType());
+ }
+
+ public void testT10() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.List<java.lang.Integer>", null),
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null));
+ }
+
+ public void testT11() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.Map<java.lang.Integer, java.lang.Integer>", null),
+ myFactory.createTypeFromText("java.util.Map<java.lang.String, java.lang.Integer>", null));
+ }
+
+ public void testT12() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.List<java.lang.Integer>", null),
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null));
+ }
+
+ public void testT13() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null),
+ myFactory.createTypeFromText("java.util.List<java.lang.Integer>", null));
+ }
+
+ public void testT14() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("B", null),
+ myFactory.createTypeFromText("A", null));
+ }
+
+ //do not touch javadoc refs etc
+ public void testT15() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("B", null),
+ myFactory.createTypeFromText("A", null));
+ }
+
+ //do not touch signature with method type parameters
+ public void testT16() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("A", null),
+ myFactory.createTypeFromText("B", null));
+ }
+
+ //change method signature inspired by call on parameters
+ public void testT17() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("A", null),
+ myFactory.createTypeFromText("B", null));
+ }
+
+ //extending iterable -> used in foreach statement
+ public void testT18() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("A", null),
+ myFactory.createTypeFromText("B", null));
+ }
+
+ public void testT19() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.Map<java.lang.String, java.lang.String>", null),
+ myFactory.createTypeFromText("java.util.HashMap<java.lang.Integer, java.lang.Integer>", null));
+ }
+
+ public void testT20() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.HashMap<java.lang.Integer, java.lang.Integer>", null),
+ myFactory.createTypeFromText("java.util.Map<java.lang.String, java.lang.String>", null));
+ }
+
+ public void testT21() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.Map<java.lang.String, java.util.List<java.lang.String>>",
+ null),
+ myFactory.createTypeFromText("java.util.Map<java.lang.String, java.util.Set<java.lang.String>>",
+ null)
+ );
+ }
+
+ //varargs : removed after migration?!
+ public void testT22() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.lang.String", null),
+ myFactory.createTypeFromText("java.lang.Integer", null));
+ }
+
+ //substitution from super class: type params substitution needed
+ public void testT23() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("HashMap<java.lang.String, java.util.Set<java.lang.String>>", null),
+ myFactory.createTypeFromText("HashMap<java.lang.String, java.util.List<java.lang.String>>", null));
+ }
+
+ //check return type unchanged when it is possible
+ public void testT24() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("C", null),
+ myFactory.createTypeFromText("D", null));
+ }
+
+ public void testT25() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("C", null),
+ myFactory.createTypeFromText("D", null));
+ }
+
+ //check param type change
+ public void testT26() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("C", null),
+ myFactory.createTypeFromText("D", null));
+ }
+
+ public void testT27() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("C", null),
+ myFactory.createTypeFromText("D", null));
+ }
+
+ //list --> array
+ public void testT28() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null),
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType());
+ }
+
+ public void testT29() {
+ doTestMethodType("get",
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType(),
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null));
+ }
+
+ public void testT30() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null),
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType());
+ }
+
+
+ public void testT31() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("Test", null),
+ myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null));
+ }
+
+ //non code usages
+ public void testT32() {
+ doTestFirstParamType("bar",
+ myFactory.createTypeFromText("long", null),
+ myFactory.createTypeFromText("int", null));
+ }
+
+ //change type arguments for new expressions: l = new ArrayList<String>() -> l = new ArrayList<Integer>()
+ public void testT33() {
+ doTestFieldType("l",
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null),
+ myFactory.createTypeFromText("java.util.List<java.lang.Integer>", null));
+ }
+
+ //new expression new ArrayList<String>() should be left without modifications
+ public void testT34() {
+ doTestFieldType("l",
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null),
+ myFactory.createTypeFromText("java.util.AbstractList<java.lang.String>", null));
+ }
+
+ public void testT35() {
+ doTestFieldType("myParent",
+ myFactory.createTypeFromText("Test", null),
+ myFactory.createTypeFromText("TestImpl", null));
+ }
+
+ //co-variant/contra-variant positions for primitive types 36-39
+ public void testT36() {
+ doTestFirstParamType("foo", PsiType.INT, PsiType.BYTE);
+ }
+
+ public void testT37() {
+ doTestFirstParamType("foo", PsiType.SHORT, PsiType.INT);
+ }
+
+ public void testT38() {
+ doTestFirstParamType("foo", PsiType.SHORT, PsiType.LONG);
+ }
+
+ public void testT39() {
+ doTestFirstParamType("foo", PsiType.SHORT, PsiType.BYTE);
+ }
+
+ //Set s = new HashSet() -> HashSet s = new HashSet();
+ public void testT40() {
+ doTestFieldType("l",
+ myFactory.createTypeFromText(CommonClassNames.JAVA_UTIL_LIST, null),
+ myFactory.createTypeFromText("java.util.ArrayList", null));
+ }
+
+ //Set s = new HashSet<String>() -> HashSet s = new HashSet<String>();
+ public void testT41() {
+ doTestFieldType("l",
+ myFactory.createTypeFromText(CommonClassNames.JAVA_UTIL_LIST, null),
+ myFactory.createTypeFromText("java.util.ArrayList", null));
+ }
+
+ //Set s = new HashSet() -> HashSet<String> s = new HashSet();
+ public void testT42() {
+ doTestFieldType("l",
+ myFactory.createTypeFromText(CommonClassNames.JAVA_UTIL_LIST, null),
+ myFactory.createTypeFromText("java.util.ArrayList<java.lang.String>", null));
+ }
+
+ //long l; Object o = l -> long l; Long o = l;
+ public void testT43() {
+ doTestFieldType("o",
+ myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myFactory.createTypeFromText("java.lang.Long", null));
+ }
+
+ //long l; int i; l = i; -> long l; byte i; l = i;
+ public void testT44() {
+ doTestFieldType("i", PsiType.INT, PsiType.BYTE);
+ }
+
+ //long l; int i; l = i; -> byte l; -> byte i; l = i;
+ public void testT45() {
+ doTestFieldType("l", PsiType.LONG, PsiType.BYTE);
+ }
+
+ //byte i; long j = i; -> byte i; int j = i;
+ public void testT46() {
+ doTestFieldType("j", PsiType.LONG, PsiType.INT);
+ }
+
+ //o = null -? int o = null
+ public void testT47() {
+ doTestFieldType("o", myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null), PsiType.INT);
+ }
+
+ //co-variant/contra-variant assignments: leave types if possible change generics signature only 48-49
+ // foo(AbstractSet<String> s){Set<String> ss = s} -> foo(AbstractSet<Integer> s){Set<Integer> ss = s}
+ public void testT48() {
+ doTestFirstParamType("foo",
+ myFactory.createTypeFromText("java.util.AbstractSet<A>", null),
+ myFactory.createTypeFromText("java.util.AbstractSet<B>", null));
+ }
+
+ // Set<String> f; foo(AbstractSet<String> s){f = s} -> Set<Integer>f; foo(AbstractSet<Integer> s){f = s}
+ public void testT49() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.Set<A>", null),
+ myFactory.createTypeFromText("java.util.Set<B>", null));
+ }
+
+ //captured wildcard: Set<? extends JComponent> s; Set<? extends JComponent> c1 = s; ->
+ // Set<? extends JButton> s; Set<? extends JButton> c1 = s;
+ public void testT50() {
+ doTestFieldType("c1",
+ myFactory.createTypeFromText("java.util.Set<? extends JComponent>", null),
+ myFactory.createTypeFromText("java.util.Set<? extends JButton>", null));
+ }
+
+ //array initialization: 51-52
+ public void testT51() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType(),
+ myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null).createArrayType());
+ }
+
+ public void testT52() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText(CommonClassNames.JAVA_UTIL_SET, null).createArrayType(),
+ myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null).createArrayType());
+ }
+
+ //generic type promotion to array initializer
+ public void testT53() {
+ doTestFieldType("f",
+ PsiType.DOUBLE.createArrayType(),
+ myFactory.createTypeFromText("java.util.Set<java.lang.String>", null).createArrayType());
+ }
+
+ //wildcard type promotion to expressions 54-55
+ public void testT54() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.Set<java.lang.Object>", null),
+ myFactory.createTypeFromText("java.util.Set<? extends java.lang.Integer>", null));
+ }
+
+ public void testT55() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.Set<java.lang.Object>", null),
+ myFactory.createTypeFromText("java.util.Set<?>", null));
+ }
+
+ //array index should be integer 56-57
+ public void testT56() {
+ doTestFirstParamType("foo", PsiType.INT, PsiType.DOUBLE);
+ }
+
+ public void testT57() {
+ doTestFirstParamType("foo", PsiType.INT, PsiType.BYTE);
+ }
+
+ //Arrays can be assignable to Object/Serializable/Cloneable 58-59; ~ 60 varargs
+ public void testT58() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType(),
+ myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null));
+ }
+
+ public void testT59() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType(),
+ myFactory.createTypeFromText("java.lang.Cloneable", null));
+ }
+
+ public void testT60() {
+ doTestFieldType("p",
+ PsiType.INT.createArrayType(),
+ myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null));
+ }
+
+ //change parameter type -> vararg; assignment changed to array
+ public void testT61() {
+ doTestFirstParamType("foo", PsiType.INT, new PsiEllipsisType(PsiType.INT));
+ }
+
+ //change field type -> change vararg parameter type due to assignment: 62-63
+ public void testT62() {
+ doTestFieldType("p", PsiType.INT.createArrayType(), myFactory.createTypeFromText(
+ CommonClassNames.JAVA_LANG_OBJECT, null));
+ }
+
+ public void testT63() {
+ doTestFieldType("p", PsiType.INT.createArrayType(), PsiType.DOUBLE.createArrayType());
+ }
+
+ //remove vararg type: 64-66
+ public void testT64() {
+ doTestFirstParamType("foo", new PsiEllipsisType(PsiType.INT), PsiType.INT);
+ }
+
+ public void testT65() {
+ doTestFirstParamType("foo",
+ new PsiEllipsisType(PsiType.INT),
+ myFactory.createTypeFromText("java.lang.String", null));
+ }
+
+ public void testT115() {
+ doTestFirstParamType("foo",
+ new PsiEllipsisType(myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null)),
+ new PsiEllipsisType(myFactory.createTypeFromText("java.lang.String", null)));
+ }
+
+ public void testT66() {
+ doTestFirstParamType("foo", new PsiEllipsisType(PsiType.INT), PsiType.INT);
+ }
+
+ public void testT67() {
+ doTestFirstParamType("methMemAcc",
+ myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myFactory.createTypeFromText("java.lang.String", null));
+ }
+
+ public void testT68() {
+ doTestFirstParamType("foo", PsiType.INT, PsiType.DOUBLE);
+ }
+
+ public void testT69() {
+ doTestFirstParamType("foo", PsiType.INT, PsiType.BYTE);
+ }
+
+ public void testT70() {
+ doTestFieldType("a", PsiType.INT.createArrayType().createArrayType(), PsiType.FLOAT.createArrayType().createArrayType());
+ }
+
+ public void testT71() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_CLASS, null),
+ myFactory.createTypeFromText("java.lang.Class<? extends java.lang.Number>", null));
+ }
+
+ public void testT72() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_CLASS, null),
+ myFactory.createTypeFromText("java.lang.Class<java.lang.Integer>", null));
+ }
+
+ public void testT73() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.Set<javax.swing.JComponent>", null).createArrayType().createArrayType(),
+ myFactory.createTypeFromText("java.util.Set<java.awt.Component>", null).createArrayType().createArrayType());
+ }
+
+ //prefix/postfix expression; binary expressions 74-76
+ public void testT74() {
+ doTestFirstParamType("meth", PsiType.INT, PsiType.FLOAT);
+ }
+
+ public void testT75() {
+ doTestFirstParamType("meth", PsiType.INT, myFactory.createTypeFromText("java.lang.String", null));
+ }
+
+ public void testT76() {
+ doTestFirstParamType("meth", PsiType.BYTE, PsiType.FLOAT);
+ }
+
+ //+= , etc 77-78
+ public void testT77() {
+ doTestFirstParamType("meth", PsiType.INT, myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null));
+ }
+
+ public void testT78() {
+ doTestFirstParamType("meth", PsiType.INT, myFactory.createTypeFromText("java.lang.String", null));
+ }
+
+ //casts 79-80,83
+ public void testT79() {
+ doTestFirstParamType("meth", PsiType.INT, PsiType.BYTE);
+ }
+
+ public void testT80() {
+ doTestFirstParamType("meth", PsiType.INT, PsiType.DOUBLE);
+ }
+
+ public void testT83() {
+ doTestFirstParamType("meth", PsiType.INT, myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null));
+ }
+
+ //instanceofs 81-82
+ public void testT81() {
+ doTestFirstParamType("foo",
+ myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myFactory.createTypeFromText("A", null));
+ }
+
+ public void testT82() {
+ doTestFirstParamType("foo",
+ myFactory.createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null),
+ myFactory.createTypeFromText("C", null));
+ }
+
+ public void testT84() {
+ doTestFirstParamType("meth",
+ myFactory.createTypeFromText(CommonClassNames.JAVA_UTIL_SET, null),
+ myFactory.createTypeFromText("java.util.Set<? extends java.util.Set>", null));
+ }
+
+ public void testT85() {
+ doTestFieldType("str",
+ myFactory.createTypeFromText("java.lang.String", null),
+ myFactory.createTypeFromText("java.lang.Integer", null));
+ }
+
+ //array <-> list 86-89;94;95
+ public void testT86() {
+ doTestMethodType("getArray",
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType(),
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null));
+ }
+
+ public void testT87() {
+ doTestMethodType("getArray",
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null),
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType());
+ }
+
+ public void testT88() {
+ doTestMethodType("getArray",
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType(),
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null));
+ }
+
+ public void testT89() {
+ doTestMethodType("getArray",
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null),
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType());
+ }
+
+ public void testT94() {
+ doTestMethodType("getArray",
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null),
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType());
+ }
+
+ public void testT95() {
+ doTestMethodType("getArray",
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType(),
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null));
+ }
+
+
+ public void testT90() {
+ doTestFieldType("l",
+ myFactory.createTypeFromText("java.util.List<B>", null),
+ myFactory.createTypeFromText("java.util.List<A>", null));
+ }
+
+ //element type -> element type array
+ public void testT91() {
+ doTestMethodType("foo",
+ myFactory.createTypeFromText("java.lang.String", null),
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType());
+ }
+
+ //List<S>=new ArrayList<S>{}; -> List<I>=new ArrayList<I>{}; anonymous
+ public void testT92() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null),
+ myFactory.createTypeFromText("java.util.List<java.lang.Integer>", null));
+ }
+
+ //generics signature do not support primitives: Map<Boolean, String> - Map<boolean, String>
+ public void testT93() {
+ doTestFirstParamType("foo", myFactory.createTypeFromText("java.lang.Boolean", null), PsiType.BOOLEAN);
+ }
+
+ //field initializers procession
+ public void testT96() {
+ doTestFieldType("f1",
+ myFactory.createTypeFromText("java.lang.Integer", null),
+ myFactory.createTypeFromText("java.lang.String", null));
+ }
+
+ public void testT97() {
+ doTestFieldType("f1", myFactory.createTypeFromText("java.lang.Integer", null).createArrayType(), PsiType.INT);
+ }
+
+ //list <-> array conversion in assignment statements
+ public void testT98() {
+ doTestMethodType("getArray",
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType(),
+ myFactory.createTypeFromText("java.util.List<java.lang.String>", null));
+ }
+
+ //escape pattern from []
+ public void testT99() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.Set<java.util.List<char[]>>", null),
+ myFactory.createTypeFromText("java.util.Set<java.util.List<int[]>>", null));
+ }
+
+ //non formatted type
+ public void testT100() {
+ doTestFieldType("f",
+ myFactory.createTypeFromText("java.util.Map<java.lang.String,java.lang.String>", null),
+ myFactory.createTypeFromText("java.util.Map<java.lang.String,java.lang.Integer>", null));
+ }
+
+ //param List -> Array[]
+ public void testT101() {
+ doTestFirstParamType("meth",
+ myFactory.createTypeFromText("java.util.List<java.util.ArrayList<java.lang.Integer>>", null),
+ myFactory.createTypeFromText("java.util.ArrayList<java.lang.Integer>[]", null));
+ }
+
+ //param Set.add() -> Array[] with conflict
+ public void testT102() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.util.Set<? extends java.lang.Object>", null),
+ myFactory.createTypeFromText("java.lang.Object[]", null));
+ }
+
+ //set(1, "") should be assignment-checked over String
+ public void testT103() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.util.ArrayList<java.lang.String>", null),
+ myFactory.createTypeFromText("java.lang.Integer", null).createArrayType());
+ }
+
+ //raw list type now should not be changed
+ public void testT104() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.util.ArrayList", null),
+ myFactory.createTypeFromText("java.lang.String", null).createArrayType());
+ }
+
+ //implicit type parameter change 105-107
+ public void testT105() {
+ doTestFieldType("t",
+ myFactory.createTypeFromText("T", null),
+ myFactory.createTypeFromText("java.lang.String", null));
+ }
+
+
+ public void testT106() {
+ doTestFieldType("t",
+ myFactory.createTypeFromText("T", null),
+ myFactory.createTypeFromText("java.lang.String", null));
+ }
+
+ public void testT107() {
+ doTestFieldType("t",
+ myFactory.createTypeFromText("T", null),
+ myFactory.createTypeFromText("java.lang.Integer", null));
+ }
+
+ //foreach && wildcards: 108-110
+ public void testT108() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.util.List<java.lang.Integer>", null),
+ myFactory.createTypeFromText("java.util.List<? extends java.lang.Number>", null));
+ }
+
+ public void testT109() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.util.List<java.lang.Integer>", null),
+ myFactory.createTypeFromText("java.util.List<? super java.lang.Number>", null));
+ }
+
+ public void testT110() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.util.List<java.lang.Integer>", null),
+ myFactory.createTypeFromText("java.util.List<? extends java.lang.String>", null));
+ }
+
+ //wrap with array creation only literals and refs outside of binary/unary expressions
+ public void testT111() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.lang.Integer", null),
+ myFactory.createTypeFromText("java.lang.Integer", null).createArrayType());
+ }
+
+ public void testT112() {
+ doTestMethodType("method",
+ myFactory.createTypeFromText("java.lang.Integer", null),
+ myFactory.createTypeFromText("java.lang.Integer", null).createArrayType());
+ }
+
+ //varargs
+ public void testT113() {
+ doTestFirstParamType("method",
+ new PsiEllipsisType(myFactory.createTypeFromText("java.lang.Integer", null)),
+ new PsiEllipsisType(myFactory.createTypeFromText("java.lang.Number", null)));
+ }
+
+ public void testT114() {
+ doTestFirstParamType("method",
+ new PsiEllipsisType(myFactory.createTypeFromText("java.lang.Integer", null)),
+ new PsiEllipsisType(myFactory.createTypeFromText("java.lang.String", null)));
+ }
+
+ //varargs && ArrayList
+ public void testT118() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.lang.Integer", null),
+ new PsiEllipsisType(myFactory.createTypeFromText("java.lang.Integer", null)));
+ }
+
+ //varargs && arrays
+ public void testT119() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.lang.Integer", null),
+ new PsiEllipsisType(myFactory.createTypeFromText("java.lang.Integer", null)));
+ }
+
+ public void testT120() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.lang.Integer", null),
+ new PsiEllipsisType(myFactory.createTypeFromText("java.lang.String", null)));
+ }
+
+ //change parameter type in foreach statement: 116 - array, 117 - list
+ public void testT116() {
+ doTestFieldType("str",
+ myFactory.createTypeFromText("java.lang.Number", null),
+ myFactory.createTypeFromText("java.lang.String", null));
+ }
+
+ public void testT117() {
+ doTestFieldType("str",
+ myFactory.createTypeFromText("java.lang.Number", null),
+ myFactory.createTypeFromText("java.lang.String", null));
+ }
+
+
+ public void testT121() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.util.ArrayList<java.lang.Number>", null),
+ myFactory.createTypeFromText("java.util.ArrayList<java.lang.Float>", null));
+ }
+
+ public void testT122() {
+ doTestFirstParamType("method",
+ myFactory.createTypeFromText("java.util.List<java.util.ArrayList<java.lang.Integer>>", null),
+ myFactory.createTypeFromText("java.util.List<java.lang.Integer>", null).createArrayType());
+ }
+
+ public void testT123() {
+ doTestFieldType("n",
+ myFactory.createTypeFromText("java.lang.Number", null),
+ myFactory.createTypeFromText("java.lang.Integer", null));
+ }
+
+ //124,125 - do not change formal method return type
+ public void testT124() {
+ doTestFirstParamType("meth",
+ myFactory.createTypeFromText("T", null),
+ myFactory.createTypeFromText("java.lang.Integer", null));
+ }
+
+ public void testT125() {
+ doTestFirstParamType("meth",
+ myFactory.createTypeFromText("T", null),
+ myFactory.createTypeFromText("java.lang.Integer", null));
+ }
+
+ public void testT126() {
+ doTestMethodType("meth",
+ myFactory.createTypeFromText("java.lang.String", null),
+ myFactory.createTypeFromText("T", null));
+ }
+
+ // Checking preserving method parameters alignment
+ public void testT127() {
+ getCurrentCodeStyleSettings().ALIGN_MULTILINE_PARAMETERS = true;
+ getCurrentCodeStyleSettings().ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true;
+ doTestMethodType("test234",
+ myFactory.createTypeFromText("int", null),
+ myFactory.createTypeFromText("long", null));
+ }
+
+ // test type migration from disjunction type
+ public void testT128() {
+ doTestCatchParameter(myFactory.createTypeFromText("Test.E1 | Test.E2", null),
+ myFactory.createTypeFromText("Test.E", null));
+ }
+
+ // test type migration to disjunction type
+ public void testT129() {
+ doTestCatchParameter(myFactory.createTypeFromText("Test.E", null),
+ myFactory.createTypeFromText("Test.E1 | Test.E2", null));
+ }
+
+ // test type migration from disjunction type with interfaces
+ public void testT130() {
+ doTestCatchParameter(myFactory.createTypeFromText("Test.E1 | Test.E2", null),
+ myFactory.createTypeFromText("Test.E", null));
+ }
+
+ // test type migration between disjunction types
+ public void testT131() {
+ doTestCatchParameter(myFactory.createTypeFromText("Test.E1 | Test.E2", null),
+ myFactory.createTypeFromText("Test.E2 | Test.E1", null));
+ }
+
+ private void doTestCatchParameter(final PsiType rootType, final PsiType migrationType) {
+ start(new RulesProvider() {
+ @Override
+ public TypeMigrationRules provide() {
+ final TypeMigrationRules rules = new TypeMigrationRules(rootType);
+ rules.setMigrationRootType(migrationType);
+ return rules;
+ }
+
+ @Override
+ public PsiElement victims(final PsiClass aClass) {
+ final PsiCatchSection catchSection = PsiTreeUtil.findChildOfType(aClass, PsiCatchSection.class);
+ assert catchSection != null : aClass.getText();
+ final PsiParameter parameter = catchSection.getParameter();
+ assert parameter != null : catchSection.getText();
+ return parameter;
+ }
+ });
+ }
+
+ // IDEA-72420
+ public void testT132() {
+ doTestFirstParamType("h", "Test",
+ myFactory.createTypeFromText("J", null),
+ myFactory.createTypeFromText("I", null));
+ }
+
+ public void testT133() {
+ doTestFirstParamType("h", "Test",
+ myFactory.createTypeFromText("J", null),
+ myFactory.createTypeFromText("I", null));
+ }
+
+ public void testT134() {
+ doTestFirstParamType("buzz", "Test",
+ PsiType.INT,
+ myFactory.createTypeFromText("java.lang.String", null));
+ }
+
+ public void testT135() {
+ doTestFieldType("foo", "Test", PsiType.LONG, PsiType.INT);
+ }
+
+ public void testT136() {
+ final GlobalSearchScope scope = GlobalSearchScope.allScope(myProject);
+ doTestFirstParamType("foo", "Test",
+ myFactory.createTypeByFQClassName(CommonClassNames.JAVA_LANG_INTEGER, scope),
+ PsiType.getJavaLangString(myPsiManager, scope));
+ }
+
+ public void testT137() {
+ doTestFirstParamType("foo", "Test", PsiType.INT, myFactory.createTypeFromText("java.lang.String", null));
+ }
+
+ public void testT138() {
+ doTestFirstParamType("foo", "Test",
+ myFactory.createTypeFromText("java.util.Set<java.lang.String>", null),
+ myFactory.createTypeFromText("java.util.Collection<java.lang.String>", null));
+ }
+
+ public void testT139() {
+ doTestForeachParameter(myFactory.createTypeFromText("java.lang.String", null),
+ myFactory.createTypeFromText("java.lang.Integer", null));
+ }
+
+ private void doTestForeachParameter(final PsiType rootType, final PsiType migrationType) {
+ start(new RulesProvider() {
+ @Override
+ public TypeMigrationRules provide() {
+ final TypeMigrationRules rules = new TypeMigrationRules(rootType);
+ rules.setMigrationRootType(migrationType);
+ return rules;
+ }
+
+ @Override
+ public PsiElement victims(final PsiClass aClass) {
+ final PsiForeachStatement foreachStatement = PsiTreeUtil.findChildOfType(aClass, PsiForeachStatement.class);
+ assert foreachStatement != null : aClass.getText();
+ return foreachStatement.getIterationParameter();
+ }
+ });
+ }
+
+
+ public void testTypeAnno() {
+ doTestFieldType("list", "Test",
+ myFactory.createTypeFromText("java.util.ArrayList<java.lang.@TA Integer>", null),
+ myFactory.createTypeFromText("java.util.Collection<java.lang.@TA Integer>", null));
+ }
+}
diff --git a/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTestBase.java b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTestBase.java
new file mode 100644
index 000000000000..2d4c2118c040
--- /dev/null
+++ b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTestBase.java
@@ -0,0 +1,193 @@
+package com.intellij.refactoring;
+
+import com.intellij.openapi.command.WriteCommandAction;
+import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiField;
+import com.intellij.psi.PsiType;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.search.LocalSearchScope;
+import com.intellij.refactoring.typeMigration.TypeMigrationProcessor;
+import com.intellij.refactoring.typeMigration.TypeMigrationRules;
+import com.intellij.testFramework.PlatformTestUtil;
+import com.intellij.usageView.UsageInfo;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+
+/**
+ * @author anna
+ * Date: 30-Apr-2008
+ */
+public abstract class TypeMigrationTestBase extends MultiFileTestCase {
+ @Override
+ protected String getTestDataPath() {
+ return PlatformTestUtil.getCommunityPath() + "/java/typeMigration/testData";
+ }
+
+ protected void doTestFieldType(@NonNls String fieldName, PsiType fromType, PsiType toType) {
+ doTestFieldType(fieldName, "Test", fromType, toType);
+ }
+
+ protected void doTestFieldType(@NonNls final String fieldName, String className, final PsiType rootType, final PsiType migrationType) {
+ final RulesProvider provider = new RulesProvider() {
+ @Override
+ public TypeMigrationRules provide() throws Exception {
+ final TypeMigrationRules rules = new TypeMigrationRules(rootType);
+ rules.setMigrationRootType(migrationType);
+ return rules;
+ }
+
+ @Override
+ public PsiElement victims(PsiClass aClass) {
+ final PsiField field = aClass.findFieldByName(fieldName, false);
+ assert field != null : fieldName + " not found in " + aClass;
+ return field;
+ }
+ };
+
+ start(provider, className);
+ }
+
+ protected void doTestMethodType(@NonNls final String methodName, final PsiType rootType, final PsiType migrationType) {
+ doTestMethodType(methodName, "Test", rootType, migrationType);
+ }
+
+ protected void doTestMethodType(@NonNls final String methodName, @NonNls String className, final PsiType rootType, final PsiType migrationType) {
+ final RulesProvider provider = new RulesProvider() {
+ @Override
+ public TypeMigrationRules provide() throws Exception {
+ final TypeMigrationRules rules = new TypeMigrationRules(rootType);
+ rules.setMigrationRootType(migrationType);
+ return rules;
+ }
+
+ @Override
+ public PsiElement victims(PsiClass aClass) {
+ return aClass.findMethodsByName(methodName, false)[0];
+ }
+ };
+
+ start(provider, className);
+ }
+
+ protected void doTestFirstParamType(@NonNls final String methodName, final PsiType rootType, final PsiType migrationType) {
+ doTestFirstParamType(methodName, "Test", rootType, migrationType);
+ }
+
+ protected void doTestFirstParamType(@NonNls final String methodName, String className, final PsiType rootType, final PsiType migrationType) {
+ final RulesProvider provider = new RulesProvider() {
+ @Override
+ public TypeMigrationRules provide() throws Exception {
+ final TypeMigrationRules rules = new TypeMigrationRules(rootType);
+ rules.setMigrationRootType(migrationType);
+ return rules;
+ }
+
+ @Override
+ public PsiElement victims(PsiClass aClass) {
+ return aClass.findMethodsByName(methodName, false)[0].getParameterList().getParameters()[0];
+ }
+ };
+
+ start(provider, className);
+ }
+
+ public void start(final RulesProvider provider) {
+ start(provider, "Test");
+ }
+
+ public void start(final RulesProvider provider, final String className) {
+ doTest(new PerformAction() {
+ @Override
+ public void performAction(VirtualFile rootDir, VirtualFile rootAfter) throws Exception {
+ TypeMigrationTestBase.this.performAction(className, rootDir.getName(), provider);
+ }
+ });
+ }
+
+ private void performAction(String className, String rootDir, RulesProvider provider) throws Exception {
+ PsiClass aClass = myJavaFacade.findClass(className, GlobalSearchScope.allScope(getProject()));
+
+ assertNotNull("Class " + className + " not found", aClass);
+
+ final TypeMigrationRules rules = provider.provide();
+ rules.setBoundScope(new LocalSearchScope(aClass.getContainingFile()));
+ final TestTypeMigrationProcessor pr = new TestTypeMigrationProcessor(getProject(), provider.victims(aClass), rules);
+
+ final UsageInfo[] usages = pr.findUsages();
+ final String report = pr.getLabeler().getMigrationReport();
+
+ WriteCommandAction.runWriteCommandAction(null, new Runnable() {
+ public void run() {
+ pr.performRefactoring(usages);
+ }
+ });
+
+
+ String itemName = className + ".items";
+ String patternName = getTestDataPath() + getTestRoot() + getTestName(true) + "/after/" + itemName;
+
+ File patternFile = new File(patternName);
+
+ if (!patternFile.exists()) {
+ PrintWriter writer = new PrintWriter(new FileOutputStream(patternFile));
+ try {
+ writer.print(report);
+ writer.close();
+ }
+ finally {
+ writer.close();
+ }
+
+ System.out.println("Pattern not found, file " + patternName + " created.");
+
+ LocalFileSystem.getInstance().refreshAndFindFileByIoFile(patternFile);
+ }
+
+ File graFile = new File(FileUtil.getTempDirectory() + File.separator + rootDir + File.separator + itemName);
+
+ PrintWriter writer = new PrintWriter(new FileOutputStream(graFile));
+ try {
+ writer.print(report);
+ writer.close();
+ }
+ finally {
+ writer.close();
+ }
+
+ LocalFileSystem.getInstance().refreshAndFindFileByIoFile(graFile);
+ FileDocumentManager.getInstance().saveAllDocuments();
+ }
+
+ interface RulesProvider {
+ TypeMigrationRules provide() throws Exception;
+
+ PsiElement victims(PsiClass aClass);
+ }
+
+ private static class TestTypeMigrationProcessor extends TypeMigrationProcessor {
+ public TestTypeMigrationProcessor(final Project project, final PsiElement root, final TypeMigrationRules rules) {
+ super(project, root, rules);
+ }
+
+ @NotNull
+ @Override
+ public UsageInfo[] findUsages() {
+ return super.findUsages();
+ }
+
+ @Override
+ public void performRefactoring(final UsageInfo[] usages) {
+ super.performRefactoring(usages);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/test/com/intellij/refactoring/WildcardTypeMigrationTest.java b/java/typeMigration/test/com/intellij/refactoring/WildcardTypeMigrationTest.java
new file mode 100644
index 000000000000..d66320623f83
--- /dev/null
+++ b/java/typeMigration/test/com/intellij/refactoring/WildcardTypeMigrationTest.java
@@ -0,0 +1,170 @@
+/*
+ * User: anna
+ * Date: 19-Aug-2009
+ */
+package com.intellij.refactoring;
+
+import com.intellij.psi.CommonClassNames;
+import org.jetbrains.annotations.NotNull;
+
+public class WildcardTypeMigrationTest extends TypeMigrationTestBase{
+ @NotNull
+ @Override
+ protected String getTestRoot() {
+ return "/refactoring/wildcard/";
+ }
+
+ public void testProducerExtends() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? super java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? extends java.lang.Number>", null));
+ }
+
+ public void testProducerSuper() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? super java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? super java.lang.Integer>", null));
+ }
+
+ public void testProducerUnbounded() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? super java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<?>", null));
+ }
+
+ public void testProducerCollectionChanged() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? super java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<? super java.lang.Integer>", null));
+ }
+
+ public void testProducerExtendsCollectionChanged() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? super java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.Set<? extends java.lang.Object>", null));
+ }
+
+ public void testProducerStopAtWildcard() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.List<java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.List<? super java.lang.Number>", null));
+ }
+
+ public void testProducerFailToStopAtWildcard() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.List<? super java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.List<? super java.lang.Integer>", null));
+ }
+
+ public void testProducerExtendsFailToStopAtWildcard() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.List<? super java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.List<? extends java.lang.Number>", null));
+ }
+
+
+ public void testConsumerExtends() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? extends java.lang.Number>", null));
+ }
+
+ public void testConsumerSuper() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? super java.lang.Number>", null));
+ }
+
+ public void testConsumerUnbounded() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<?>", null));
+ }
+
+ // array -> list
+ public void testAssignmentExtends() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Integer", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? extends java.lang.Integer>", null));
+ }
+
+ public void testAssignmentSuper() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Integer", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? super java.lang.Integer>", null));
+ }
+
+ public void testAssignmentUnbounded() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Integer", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<?>", null));
+ }
+
+ public void testGetExtends() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Integer", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? extends java.lang.Integer>", null));
+ }
+
+ public void testGetSuper() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Integer", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? super java.lang.Integer>", null));
+ }
+
+ public void testGetUnbounded() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Integer", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<?>", null));
+
+ }
+
+ public void testLengthSize() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Integer", null).createArrayType(),
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<?>", null));
+
+ }
+
+ //list -> array
+ public void testGetAssignmentExtendsToType() throws Exception {
+ doTestFirstParamType("method", myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? extends java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Number", null).createArrayType());
+ }
+
+ public void testGetAssignmentExtendsToSuperType() throws Exception {
+ doTestFirstParamType("method", myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? extends java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText(CommonClassNames.JAVA_LANG_OBJECT, null).createArrayType());
+ }
+
+ public void testGetAssignmentExtendsToChildType() throws Exception {
+ doTestFirstParamType("method", myJavaFacade.getElementFactory().createTypeFromText("java.util.ArrayList<? extends java.lang.Number>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.Integer", null).createArrayType());
+ }
+
+ // -> threadlocal with wildcard
+ public void testThreadLocalProducerExtends() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.List<java.lang.String>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.ThreadLocal<java.util.List<? extends String>>", null));
+ }
+
+ //List<? super String> is not assignable to List<String> though it is possible to pass string where ? super String was
+ public void _testThreadLocalProducerSuper() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.util.List<java.lang.String>", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.ThreadLocal<java.util.List<? super String>>", null));
+ }
+
+ public void testThreadLocalConsumerSuper() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.ThreadLocal<? super String>", null));
+ }
+
+ public void testThreadLocalConsumerExtends() throws Exception {
+ doTestFirstParamType("method",
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.String", null),
+ myJavaFacade.getElementFactory().createTypeFromText("java.lang.ThreadLocal<? extends String>", null));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after1.java b/java/typeMigration/testData/intentions/atomic/after1.java
new file mode 100644
index 000000000000..853f715fd8c4
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after1.java
@@ -0,0 +1,9 @@
+import java.util.concurrent.atomic.AtomicIntegerArray;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicIntegerArray field= new AtomicIntegerArray(foo());
+ int[] foo() {
+ return null;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after10.java b/java/typeMigration/testData/intentions/atomic/after10.java
new file mode 100644
index 000000000000..685e3fb710e2
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after10.java
@@ -0,0 +1,10 @@
+import java.util.concurrent.atomic.AtomicInteger;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicInteger o = new AtomicInteger(0);
+
+ void foo() {
+ boolean b = this.o.get() == 1;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after12.java b/java/typeMigration/testData/intentions/atomic/after12.java
new file mode 100644
index 000000000000..8accafd9fa10
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after12.java
@@ -0,0 +1,12 @@
+import java.util.concurrent.atomic.AtomicInteger;
+
+// "Convert to atomic" "true"
+class Test {
+
+ {
+ AtomicInteger i = new AtomicInteger(0);
+ Integer j = 0;
+
+ assert j == i.get();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after13.java b/java/typeMigration/testData/intentions/atomic/after13.java
new file mode 100644
index 000000000000..dea58d02e88c
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after13.java
@@ -0,0 +1,6 @@
+import java.util.concurrent.atomic.AtomicInteger;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicInteger i = new AtomicInteger(0);
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after14.java b/java/typeMigration/testData/intentions/atomic/after14.java
new file mode 100644
index 000000000000..6109d4106e9b
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after14.java
@@ -0,0 +1,10 @@
+import java.util.concurrent.atomic.AtomicLong;
+
+// "Convert to atomic" "true"
+class T {
+ private final AtomicLong l = new AtomicLong(10L);
+
+ public synchronized void update(long m) {
+ l.set(m);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after2.java b/java/typeMigration/testData/intentions/atomic/after2.java
new file mode 100644
index 000000000000..2c2ad94beeb0
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after2.java
@@ -0,0 +1,9 @@
+import java.util.concurrent.atomic.AtomicReferenceArray;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicReferenceArray<Object> field= new AtomicReferenceArray<>(foo());
+ Object[] foo() {
+ return null;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after3.java b/java/typeMigration/testData/intentions/atomic/after3.java
new file mode 100644
index 000000000000..505349d5dc36
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after3.java
@@ -0,0 +1,7 @@
+import java.util.concurrent.atomic.AtomicIntegerArray;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicIntegerArray field= new AtomicIntegerArray(new int[]{1});
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after4.java b/java/typeMigration/testData/intentions/atomic/after4.java
new file mode 100644
index 000000000000..e268b2604404
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after4.java
@@ -0,0 +1,9 @@
+import java.util.concurrent.atomic.AtomicInteger;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicInteger i = new AtomicInteger(0);
+
+ int j = i.get() + 5;
+ String s = "i = " + i.get();
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after5.java b/java/typeMigration/testData/intentions/atomic/after5.java
new file mode 100644
index 000000000000..82ff84c68e75
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after5.java
@@ -0,0 +1,9 @@
+import java.util.concurrent.atomic.AtomicInteger;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicInteger i = new AtomicInteger(0 + 8);
+
+ int j = i.get() + 5;
+ String s = "i = " + i.get();
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after6.java b/java/typeMigration/testData/intentions/atomic/after6.java
new file mode 100644
index 000000000000..f0120300e0f9
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after6.java
@@ -0,0 +1,6 @@
+import java.util.concurrent.atomic.AtomicIntegerArray;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicIntegerArray i = new AtomicIntegerArray(new int[0]);
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after7.java b/java/typeMigration/testData/intentions/atomic/after7.java
new file mode 100644
index 000000000000..19336f0bc61b
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after7.java
@@ -0,0 +1,11 @@
+import java.util.concurrent.atomic.AtomicInteger;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicInteger o = new AtomicInteger(0);
+ int j = o.get();
+
+ void foo() {
+ while ((o = j) != 0) {}
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after8.java b/java/typeMigration/testData/intentions/atomic/after8.java
new file mode 100644
index 000000000000..bdfbd5b03a4d
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after8.java
@@ -0,0 +1,11 @@
+import java.util.concurrent.atomic.AtomicInteger;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicInteger o = new AtomicInteger();
+ int j = o.get();
+
+ void foo() {
+ while ((o = j) != 0) {}
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/after9.java b/java/typeMigration/testData/intentions/atomic/after9.java
new file mode 100644
index 000000000000..c462a10961d4
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/after9.java
@@ -0,0 +1,15 @@
+import java.util.concurrent.atomic.AtomicInteger;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicInteger o;
+ int j = o.get();
+
+ Test(int o) {
+ this.o = new AtomicInteger(o);
+ }
+
+ void foo() {
+ while ((o = j) != 0) {}
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/afterExcl.java b/java/typeMigration/testData/intentions/atomic/afterExcl.java
new file mode 100644
index 000000000000..72f91198ce3d
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/afterExcl.java
@@ -0,0 +1,9 @@
+import java.util.concurrent.atomic.AtomicBoolean;
+
+// "Convert to atomic" "true"
+class Test {
+ final AtomicBoolean field= new AtomicBoolean(false);
+ {
+ boolean b = !field.get();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/afterTA1.java b/java/typeMigration/testData/intentions/atomic/afterTA1.java
new file mode 100644
index 000000000000..a90ed666ea30
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/afterTA1.java
@@ -0,0 +1,10 @@
+// "Convert to atomic" "true"
+import java.lang.annotation.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+@Target(value = ElementType.TYPE_USE)
+public @interface TA { int value(); }
+
+class T {
+ final AtomicReference<@TA(42) String> v = new AtomicReference<String>();
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before1.java b/java/typeMigration/testData/intentions/atomic/before1.java
new file mode 100644
index 000000000000..d3b926f29fb3
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before1.java
@@ -0,0 +1,7 @@
+// "Convert to atomic" "true"
+class Test {
+ int[] <caret>field=foo();
+ int[] foo() {
+ return null;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before10.java b/java/typeMigration/testData/intentions/atomic/before10.java
new file mode 100644
index 000000000000..a4e7c9db6b75
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before10.java
@@ -0,0 +1,8 @@
+// "Convert to atomic" "true"
+class Test {
+ final int <caret>o = 0;
+
+ void foo() {
+ boolean b = this.o == 1;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before11.java b/java/typeMigration/testData/intentions/atomic/before11.java
new file mode 100644
index 000000000000..b1abb55f9503
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before11.java
@@ -0,0 +1,8 @@
+// "Convert to atomic" "false"
+class Test {
+ void foo() {
+ try (AutoCloseable <caret>r = null) {
+ System.out.println(r);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before12.java b/java/typeMigration/testData/intentions/atomic/before12.java
new file mode 100644
index 000000000000..2c634df22c2f
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before12.java
@@ -0,0 +1,10 @@
+// "Convert to atomic" "true"
+class Test {
+
+ {
+ int <caret>i = 0;
+ Integer j = 0;
+
+ assert j == i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before13.java b/java/typeMigration/testData/intentions/atomic/before13.java
new file mode 100644
index 000000000000..179e2b165252
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before13.java
@@ -0,0 +1,4 @@
+// "Convert to atomic" "true"
+class Test {
+ volatile int <caret>i = 0;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before14.java b/java/typeMigration/testData/intentions/atomic/before14.java
new file mode 100644
index 000000000000..042b4c4dd2a1
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before14.java
@@ -0,0 +1,8 @@
+// "Convert to atomic" "true"
+class T {
+ private long <caret>l = 10L;
+
+ public synchronized void update(long m) {
+ l = m;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before2.java b/java/typeMigration/testData/intentions/atomic/before2.java
new file mode 100644
index 000000000000..d33fffc40e20
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before2.java
@@ -0,0 +1,7 @@
+// "Convert to atomic" "true"
+class Test {
+ Object[] <caret>field=foo();
+ Object[] foo() {
+ return null;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before3.java b/java/typeMigration/testData/intentions/atomic/before3.java
new file mode 100644
index 000000000000..661dbdd63fb2
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before3.java
@@ -0,0 +1,5 @@
+// "Convert to atomic" "true"
+class Test {
+ int[] <caret>field= new int[]{1};
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before4.java b/java/typeMigration/testData/intentions/atomic/before4.java
new file mode 100644
index 000000000000..ecf4b985a5d2
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before4.java
@@ -0,0 +1,7 @@
+// "Convert to atomic" "true"
+class Test {
+ int <caret>i = 0;
+
+ int j = i + 5;
+ String s = "i = " + i;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before5.java b/java/typeMigration/testData/intentions/atomic/before5.java
new file mode 100644
index 000000000000..7ace336aa8be
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before5.java
@@ -0,0 +1,7 @@
+// "Convert to atomic" "true"
+class Test {
+ int <caret>i = 0 + 8;
+
+ int j = i + 5;
+ String s = "i = " + i;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before6.java b/java/typeMigration/testData/intentions/atomic/before6.java
new file mode 100644
index 000000000000..abc59802e025
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before6.java
@@ -0,0 +1,4 @@
+// "Convert to atomic" "true"
+class Test {
+ int[] <caret>i = new int[0];
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before7.java b/java/typeMigration/testData/intentions/atomic/before7.java
new file mode 100644
index 000000000000..fd2d066a4337
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before7.java
@@ -0,0 +1,9 @@
+// "Convert to atomic" "true"
+class Test {
+ int <caret>o = 0;
+ int j = o;
+
+ void foo() {
+ while ((o = j) != 0) {}
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before8.java b/java/typeMigration/testData/intentions/atomic/before8.java
new file mode 100644
index 000000000000..d2ef50810f7e
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before8.java
@@ -0,0 +1,9 @@
+// "Convert to atomic" "true"
+class Test {
+ int <caret>o;
+ int j = o;
+
+ void foo() {
+ while ((o = j) != 0) {}
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/before9.java b/java/typeMigration/testData/intentions/atomic/before9.java
new file mode 100644
index 000000000000..a9f693800f81
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/before9.java
@@ -0,0 +1,13 @@
+// "Convert to atomic" "true"
+class Test {
+ final int <caret>o;
+ int j = o;
+
+ Test(int o) {
+ this.o = o;
+ }
+
+ void foo() {
+ while ((o = j) != 0) {}
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/beforeExcl.java b/java/typeMigration/testData/intentions/atomic/beforeExcl.java
new file mode 100644
index 000000000000..3df455583c35
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/beforeExcl.java
@@ -0,0 +1,7 @@
+// "Convert to atomic" "true"
+class Test {
+ boolean <caret>field=false;
+ {
+ boolean b = !field;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/atomic/beforeTA1.java b/java/typeMigration/testData/intentions/atomic/beforeTA1.java
new file mode 100644
index 000000000000..10bdd5df4822
--- /dev/null
+++ b/java/typeMigration/testData/intentions/atomic/beforeTA1.java
@@ -0,0 +1,9 @@
+// "Convert to atomic" "true"
+import java.lang.annotation.*;
+
+@Target(value = ElementType.TYPE_USE)
+public @interface TA { int value(); }
+
+class T {
+ @TA(42) String <caret>v;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/after1.java b/java/typeMigration/testData/intentions/threadLocal/after1.java
new file mode 100644
index 000000000000..b5df8fd35214
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/after1.java
@@ -0,0 +1,12 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ final ThreadLocal<Integer> field = new ThreadLocal<Integer>() {
+ @Override
+ protected Integer initialValue() {
+ return 0;
+ }
+ };
+ void foo() {
+ field.set(field.get() + 1);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/after2.java b/java/typeMigration/testData/intentions/threadLocal/after2.java
new file mode 100644
index 000000000000..3a546c5b0c9a
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/after2.java
@@ -0,0 +1,12 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ final ThreadLocal<String> field = new ThreadLocal<String>() {
+ @Override
+ protected String initialValue() {
+ return "";
+ }
+ };
+ void foo() {
+ System.out.println(field.get());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/after3.java b/java/typeMigration/testData/intentions/threadLocal/after3.java
new file mode 100644
index 000000000000..9fc0f825ac4b
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/after3.java
@@ -0,0 +1,12 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ final ThreadLocal<Integer> field = new ThreadLocal<Integer>() {
+ @Override
+ protected Integer initialValue() {
+ return new Integer(0);
+ }
+ };
+ void foo() {
+ if (field.get() == null) return;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/after4.java b/java/typeMigration/testData/intentions/threadLocal/after4.java
new file mode 100644
index 000000000000..8410a1c33c0e
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/after4.java
@@ -0,0 +1,12 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ final ThreadLocal<String> field = new ThreadLocal<String>() {
+ @Override
+ protected String initialValue() {
+ return "";
+ }
+ };
+ void foo() {
+ if (field.get().indexOf("a") == -1) return;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/after5.java b/java/typeMigration/testData/intentions/threadLocal/after5.java
new file mode 100644
index 000000000000..435e1b6a50e6
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/after5.java
@@ -0,0 +1,12 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ final ThreadLocal<Integer> field = new ThreadLocal<Integer>() {
+ @Override
+ protected Integer initialValue() {
+ return new Integer(0);
+ }
+ };
+ void foo(Test t) {
+ if (t.field.get() == null) return;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/after6.java b/java/typeMigration/testData/intentions/threadLocal/after6.java
new file mode 100644
index 000000000000..1879a46be16d
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/after6.java
@@ -0,0 +1,12 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ static final ThreadLocal<Integer> field;
+ static {
+ field = new ThreadLocal<Integer>() {
+ @Override
+ protected Integer initialValue() {
+ return new Integer(0);
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/after7.java b/java/typeMigration/testData/intentions/threadLocal/after7.java
new file mode 100644
index 000000000000..5398ff5e2991
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/after7.java
@@ -0,0 +1,15 @@
+// "Convert to ThreadLocal" "true"
+class X {
+ private final ThreadLocal<byte[]> bytes = new ThreadLocal<byte[]>() {
+ @Override
+ protected byte[] initialValue() {
+ return new byte[10];
+ }
+ };
+
+ byte foo(byte b) {
+ bytes.get()[0] = 1;
+ foo(bytes.get()[1])
+ return bytes.get()[2];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/after8.java b/java/typeMigration/testData/intentions/threadLocal/after8.java
new file mode 100644
index 000000000000..d158894b6130
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/after8.java
@@ -0,0 +1,9 @@
+// "Convert to ThreadLocal" "true"
+class X {
+ final ThreadLocal<Integer> i = new ThreadLocal<Integer>() {
+ @Override
+ protected Integer initialValue() {
+ return 0;
+ }
+ };
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/afterTA1.java b/java/typeMigration/testData/intentions/threadLocal/afterTA1.java
new file mode 100644
index 000000000000..0e3687e146b6
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/afterTA1.java
@@ -0,0 +1,14 @@
+// "Convert to ThreadLocal" "true"
+import java.lang.annotation.*;
+
+@Target(value = ElementType.TYPE_USE)
+public @interface TA { int value(); }
+
+class Test {
+ final ThreadLocal<@TA(42) Integer> field = new ThreadLocal<Integer>() {
+ @Override
+ protected Integer initialValue() {
+ return 0;
+ }
+ };
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/before1.java b/java/typeMigration/testData/intentions/threadLocal/before1.java
new file mode 100644
index 000000000000..e35925390137
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/before1.java
@@ -0,0 +1,7 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ int <caret>field=0;
+ void foo() {
+ field++;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/before2.java b/java/typeMigration/testData/intentions/threadLocal/before2.java
new file mode 100644
index 000000000000..47c6471739d7
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/before2.java
@@ -0,0 +1,7 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ String <caret>field="";
+ void foo() {
+ System.out.println(field);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/before3.java b/java/typeMigration/testData/intentions/threadLocal/before3.java
new file mode 100644
index 000000000000..19d296cffa36
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/before3.java
@@ -0,0 +1,7 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ Integer <caret>field=new Integer(0);
+ void foo() {
+ if (field == null) return;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/before4.java b/java/typeMigration/testData/intentions/threadLocal/before4.java
new file mode 100644
index 000000000000..66d2efa6230a
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/before4.java
@@ -0,0 +1,7 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ String <caret>field="";
+ void foo() {
+ if (field.indexOf("a") == -1) return;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/before5.java b/java/typeMigration/testData/intentions/threadLocal/before5.java
new file mode 100644
index 000000000000..c459443241e4
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/before5.java
@@ -0,0 +1,7 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ Integer <caret>field=new Integer(0);
+ void foo(Test t) {
+ if (t.field == null) return;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/before6.java b/java/typeMigration/testData/intentions/threadLocal/before6.java
new file mode 100644
index 000000000000..74427e6e4f06
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/before6.java
@@ -0,0 +1,7 @@
+// "Convert to ThreadLocal" "true"
+class Test {
+ static final Integer <caret>field;
+ static {
+ field = new Integer(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/before7.java b/java/typeMigration/testData/intentions/threadLocal/before7.java
new file mode 100644
index 000000000000..dfff0417b272
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/before7.java
@@ -0,0 +1,10 @@
+// "Convert to ThreadLocal" "true"
+class X {
+ private final byte[] <caret>bytes = new byte[10];
+
+ byte foo(byte b) {
+ bytes[0] = 1;
+ foo(bytes[1])
+ return bytes[2];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/before8.java b/java/typeMigration/testData/intentions/threadLocal/before8.java
new file mode 100644
index 000000000000..af321e0da56c
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/before8.java
@@ -0,0 +1,4 @@
+// "Convert to ThreadLocal" "true"
+class X {
+ volatile int <caret>i = 0;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/intentions/threadLocal/beforeTA1.java b/java/typeMigration/testData/intentions/threadLocal/beforeTA1.java
new file mode 100644
index 000000000000..ac3409c2e759
--- /dev/null
+++ b/java/typeMigration/testData/intentions/threadLocal/beforeTA1.java
@@ -0,0 +1,9 @@
+// "Convert to ThreadLocal" "true"
+import java.lang.annotation.*;
+
+@Target(value = ElementType.TYPE_USE)
+public @interface TA { int value(); }
+
+class Test {
+ @TA(42) int <caret>field = 0;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/CompositeReturnType.java b/java/typeMigration/testData/refactoring/changeTypeSignature/CompositeReturnType.java
new file mode 100644
index 000000000000..051e42810e3d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/CompositeReturnType.java
@@ -0,0 +1,9 @@
+import java.util.List;
+class A<T> {
+ List<T> getKey(){return null;}
+}
+public class B extends A<S<caret>tring> {
+ List<String> getKey() {
+ return new List<String>();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/CompositeReturnType.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/CompositeReturnType.java.after
new file mode 100644
index 000000000000..8966bc1ee03d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/CompositeReturnType.java.after
@@ -0,0 +1,9 @@
+import java.util.List;
+class A<T> {
+ List<T> getKey(){return null;}
+}
+public class B extends A<Object> {
+ List<Object> getKey() {
+ return new List<>();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/FieldTypeMigration.java b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldTypeMigration.java
new file mode 100644
index 000000000000..fabb24302b8d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldTypeMigration.java
@@ -0,0 +1,12 @@
+class Test {
+ interface A<T> {
+ void foo(T t);
+ }
+
+ class B implements A<Inte<caret>ger> {
+ Integer str;
+ public void foo(Integer s) {
+ str = s;
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/FieldTypeMigration.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldTypeMigration.java.after
new file mode 100644
index 000000000000..01a6bf49322e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldTypeMigration.java.after
@@ -0,0 +1,12 @@
+class Test {
+ interface A<T> {
+ void foo(T t);
+ }
+
+ class B implements A<String> {
+ String str;
+ public void foo(String s) {
+ str = s;
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage.java b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage.java
new file mode 100644
index 000000000000..92864f163560
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage.java
@@ -0,0 +1,16 @@
+import java.util.List;
+
+class A<T> {
+ T t;
+ List<T> list = new List<T>();
+}
+
+class B extends A<S<caret>tring> {
+ void foo() {
+ if (t == null) return;
+ if (list == null) return;
+ for (String s : list) {
+ //do nothing
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage.java.after
new file mode 100644
index 000000000000..07ee7a4e9351
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage.java.after
@@ -0,0 +1,16 @@
+import java.util.List;
+
+class A<T> {
+ T t;
+ List<T> list = new List<T>();
+}
+
+class B extends A<Object> {
+ void foo() {
+ if (t == null) return;
+ if (list == null) return;
+ for (Object s : list) {
+ //do nothing
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage1.java b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage1.java
new file mode 100644
index 000000000000..bff01e33a9e3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage1.java
@@ -0,0 +1,17 @@
+import java.util.*;
+
+class A<T> {
+ protected T t;
+ protected List<T> list = new ArrayList<T>();
+}
+
+public class B extends A<S<caret>tring> {
+ void foo() {
+ if (t == null) return;
+ if (list == null) return;
+ System.out.println(t);
+ for (String s : list) {
+ //do nothing
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage1.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage1.java.after
new file mode 100644
index 000000000000..b3764fda80de
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/FieldUsage1.java.after
@@ -0,0 +1,17 @@
+import java.util.*;
+
+class A<T> {
+ protected T t;
+ protected List<T> list = new ArrayList<T>();
+}
+
+public class B extends A<Object> {
+ void foo() {
+ if (t == null) return;
+ if (list == null) return;
+ System.out.println(t);
+ for (Object s : list) {
+ //do nothing
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ListTypeArguments.java b/java/typeMigration/testData/refactoring/changeTypeSignature/ListTypeArguments.java
new file mode 100644
index 000000000000..98b178156750
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ListTypeArguments.java
@@ -0,0 +1,4 @@
+import java.util.List;
+class ListTypeArguments implements List<I<caret>nteger> {
+ public boolean add(Integer o){return true;}
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ListTypeArguments.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/ListTypeArguments.java.after
new file mode 100644
index 000000000000..535acf216d57
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ListTypeArguments.java.after
@@ -0,0 +1,4 @@
+import java.util.List;
+class ListTypeArguments implements List<Object> {
+ public boolean add(Object o){return true;}
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/MethodReturnTypeMigration.java b/java/typeMigration/testData/refactoring/changeTypeSignature/MethodReturnTypeMigration.java
new file mode 100644
index 000000000000..8183831c3ff3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/MethodReturnTypeMigration.java
@@ -0,0 +1,16 @@
+class Test {
+ interface A<T> {
+ T foo();
+ }
+
+ class B implements A<Stri<caret>ng> {
+ public String foo() {
+ return null;
+ }
+
+ public void bar() {
+ String s = foo();
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/MethodReturnTypeMigration.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/MethodReturnTypeMigration.java.after
new file mode 100644
index 000000000000..405cd8a74384
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/MethodReturnTypeMigration.java.after
@@ -0,0 +1,16 @@
+class Test {
+ interface A<T> {
+ T foo();
+ }
+
+ class B implements A<Integer> {
+ public Integer foo() {
+ return null;
+ }
+
+ public void bar() {
+ Integer s = foo();
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration.java b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration.java
new file mode 100644
index 000000000000..fdce63b995a8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration.java
@@ -0,0 +1,29 @@
+import java.util.*;
+
+class Test {
+ class C<T> {
+ List<T> l;
+
+ void bar(Map<T, T> t){}
+
+ void f(T t){}
+
+ }
+
+ class D extends C<Strin<caret>g> {
+ void foo(String s) {
+ f(s);
+ }
+
+ public void main() {
+ for (String integer : l) {
+
+ }
+ }
+
+ void bar(Map<String, String> t) {
+ super.bar(t);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration.java.after
new file mode 100644
index 000000000000..ff031aa42904
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration.java.after
@@ -0,0 +1,29 @@
+import java.util.*;
+
+class Test {
+ class C<T> {
+ List<T> l;
+
+ void bar(Map<T, T> t){}
+
+ void f(T t){}
+
+ }
+
+ class D extends C<Object> {
+ void foo(String s) {
+ f(s);
+ }
+
+ public void main() {
+ for (Object integer : l) {
+
+ }
+ }
+
+ void bar(Map<Object, Object> t) {
+ super.bar(t);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration1.java b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration1.java
new file mode 100644
index 000000000000..fdce63b995a8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration1.java
@@ -0,0 +1,29 @@
+import java.util.*;
+
+class Test {
+ class C<T> {
+ List<T> l;
+
+ void bar(Map<T, T> t){}
+
+ void f(T t){}
+
+ }
+
+ class D extends C<Strin<caret>g> {
+ void foo(String s) {
+ f(s);
+ }
+
+ public void main() {
+ for (String integer : l) {
+
+ }
+ }
+
+ void bar(Map<String, String> t) {
+ super.bar(t);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration1.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration1.java.after
new file mode 100644
index 000000000000..f3cef5b65bba
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration1.java.after
@@ -0,0 +1,29 @@
+import java.util.*;
+
+class Test {
+ class C<T> {
+ List<T> l;
+
+ void bar(Map<T, T> t){}
+
+ void f(T t){}
+
+ }
+
+ class D extends C<Integer> {
+ void foo(Integer s) {
+ f(s);
+ }
+
+ public void main() {
+ for (Integer integer : l) {
+
+ }
+ }
+
+ void bar(Map<Integer, Integer> t) {
+ super.bar(t);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration2.java b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration2.java
new file mode 100644
index 000000000000..278b80eb95d5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration2.java
@@ -0,0 +1,31 @@
+import java.util.*;
+
+class Test {
+ class C<T> {
+ List<T> l;
+
+ void bar(Map<T, T> t){
+ for (T t1 : t.keySet()) {}
+ }
+
+ void f(T t){}
+
+ }
+
+ class D extends C<Strin<caret>g> {
+ void foo(String s) {
+ f(s);
+ }
+
+ public void main() {
+ for (String integer : l) {
+
+ }
+ }
+
+ void bar(Map<String, String> t) {
+ super.bar(t);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration2.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration2.java.after
new file mode 100644
index 000000000000..5978a88ee283
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ParameterMigration2.java.after
@@ -0,0 +1,31 @@
+import java.util.*;
+
+class Test {
+ class C<T> {
+ List<T> l;
+
+ void bar(Map<T, T> t){
+ for (T t1 : t.keySet()) {}
+ }
+
+ void f(T t){}
+
+ }
+
+ class D extends C<Integer> {
+ void foo(Integer s) {
+ f(s);
+ }
+
+ public void main() {
+ for (Integer integer : l) {
+
+ }
+ }
+
+ void bar(Map<Integer, Integer> t) {
+ super.bar(t);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter.java b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter.java
new file mode 100644
index 000000000000..416bf0f810b8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter.java
@@ -0,0 +1,16 @@
+class A<T> {
+ void foo(T t){}
+ void bar(T t, int i){}
+}
+
+class B extends A<S<caret>tring>{
+ void foo(String t) {
+ super.foo(t);
+ }
+
+ void bar(String t, int i){
+ foo(t);
+ int k = i;
+ super.bar(t, k);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter.java.after
new file mode 100644
index 000000000000..64847ab2afd1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter.java.after
@@ -0,0 +1,16 @@
+class A<T> {
+ void foo(T t){}
+ void bar(T t, int i){}
+}
+
+class B extends A<Object> {
+ void foo(Object t) {
+ super.foo(t);
+ }
+
+ void bar(Object t, int i){
+ foo(t);
+ int k = i;
+ super.bar(t, k);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter1.java b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter1.java
new file mode 100644
index 000000000000..f9bdb275f3aa
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter1.java
@@ -0,0 +1,20 @@
+class A<T> {
+ void foo(T t){}
+ void bar(T t, int i){}
+}
+
+class B extends A<S<caret>tring>{
+ void foo(String t) {
+ super.foo(t);
+ }
+
+ void bar(String t, int i){
+ foo(t);
+ int k = i;
+ super.bar(t, k);
+ }
+
+ void bar1(String s) {
+ foo(s);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter1.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter1.java.after
new file mode 100644
index 000000000000..1777cb6da9d8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter1.java.after
@@ -0,0 +1,20 @@
+class A<T> {
+ void foo(T t){}
+ void bar(T t, int i){}
+}
+
+class B extends A<Integer> {
+ void foo(Integer t) {
+ super.foo(t);
+ }
+
+ void bar(Integer t, int i){
+ foo(t);
+ int k = i;
+ super.bar(t, k);
+ }
+
+ void bar1(Integer s) {
+ foo(s);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter2.java b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter2.java
new file mode 100644
index 000000000000..62c7cf4da263
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter2.java
@@ -0,0 +1,12 @@
+class A<T> {
+ T bar(){}
+}
+
+class B extends A<S<caret>tring>{
+ void barInner(String s) {
+ }
+
+ void foo() {
+ barInner(bar());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter2.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter2.java.after
new file mode 100644
index 000000000000..e5ed5910c2c1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/PassedParameter2.java.after
@@ -0,0 +1,12 @@
+class A<T> {
+ T bar(){}
+}
+
+class B extends A<Object> {
+ void barInner(Object s) {
+ }
+
+ void foo() {
+ barInner(bar());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType.java b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType.java
new file mode 100644
index 000000000000..17960b186a46
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType.java
@@ -0,0 +1,14 @@
+class A<T> {
+ T foo(){
+ return null;
+ }
+}
+
+class B extends A<S<caret>tring> {
+ String foo(){return null;}
+
+ void bar() {
+ foo();
+ if (foo() == null) return;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType.java.after
new file mode 100644
index 000000000000..1758610f1571
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType.java.after
@@ -0,0 +1,14 @@
+class A<T> {
+ T foo(){
+ return null;
+ }
+}
+
+class B extends A<Object> {
+ Object foo(){return null;}
+
+ void bar() {
+ foo();
+ if (foo() == null) return;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType1.java b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType1.java
new file mode 100644
index 000000000000..9e01a295be05
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType1.java
@@ -0,0 +1,15 @@
+class A<T> {
+ T foo(){
+ return null;
+ }
+}
+
+public class B extends A<S<caret>tring> {
+ String foo(){return null;}
+
+ void bar() {
+ foo();
+ if (foo() == null) return;
+ System.out.println(foo());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType1.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType1.java.after
new file mode 100644
index 000000000000..8a584bdca610
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType1.java.after
@@ -0,0 +1,15 @@
+class A<T> {
+ T foo(){
+ return null;
+ }
+}
+
+public class B extends A<Object> {
+ Object foo(){return null;}
+
+ void bar() {
+ foo();
+ if (foo() == null) return;
+ System.out.println(foo());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType2.java b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType2.java
new file mode 100644
index 000000000000..83b7294972fc
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType2.java
@@ -0,0 +1,14 @@
+class A<T> {
+ T foo(){
+ return null;
+ }
+}
+
+class B extends A<S<caret>tring> {
+ String foo(){return super.foo();}
+
+ void bar() {
+ foo();
+ if (foo() == null) return;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType2.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType2.java.after
new file mode 100644
index 000000000000..a26f7d3f1655
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/ReturnType2.java.after
@@ -0,0 +1,14 @@
+class A<T> {
+ T foo(){
+ return null;
+ }
+}
+
+class B extends A<Object> {
+ Object foo(){return super.foo();}
+
+ void bar() {
+ foo();
+ if (foo() == null) return;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy.java b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy.java
new file mode 100644
index 000000000000..2bfa264828c0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy.java
@@ -0,0 +1,18 @@
+abstract class A<E> {
+ abstract E foo();
+}
+
+abstract class B<T> extends A<T> {
+}
+
+class C extends B<S<caret>tring> {
+ String foo() {
+ return null;
+ }
+
+ void bar() {
+ if (foo() == null) {
+ //do smth
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy.java.after
new file mode 100644
index 000000000000..4c4736302857
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy.java.after
@@ -0,0 +1,18 @@
+abstract class A<E> {
+ abstract E foo();
+}
+
+abstract class B<T> extends A<T> {
+}
+
+class C extends B<Object> {
+ Object foo() {
+ return null;
+ }
+
+ void bar() {
+ if (foo() == null) {
+ //do smth
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy1.java b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy1.java
new file mode 100644
index 000000000000..5396a7c59422
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy1.java
@@ -0,0 +1,19 @@
+abstract class A<E> {
+ public abstract E foo();
+}
+
+abstract class B<T> extends A<T> {
+}
+
+public class C extends B<S<caret>tring> {
+ public String foo() {
+ return null;
+ }
+
+ void bar() {
+ if (foo() == null) {
+ //do smth
+ }
+ System.out.println(foo());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy1.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy1.java.after
new file mode 100644
index 000000000000..16a02ae4ea3d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy1.java.after
@@ -0,0 +1,19 @@
+abstract class A<E> {
+ public abstract E foo();
+}
+
+abstract class B<T> extends A<T> {
+}
+
+public class C extends B<Object> {
+ public Object foo() {
+ return null;
+ }
+
+ void bar() {
+ if (foo() == null) {
+ //do smth
+ }
+ System.out.println(foo());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy2.java b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy2.java
new file mode 100644
index 000000000000..2eb6d429915e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy2.java
@@ -0,0 +1,18 @@
+public class Test extends B<S<caret>tring>{
+ String foo() {
+ return null;
+ }
+
+ void bar() {
+ if (foo() == null) {}
+ }
+}
+
+abstract class A<T> {
+ abstract T foo();
+}
+
+abstract class B<E extends Object> extends A<E> {
+}
+
+
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy2.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy2.java.after
new file mode 100644
index 000000000000..b30ab01e5594
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchy2.java.after
@@ -0,0 +1,18 @@
+public class Test extends B<Object> {
+ Object foo() {
+ return null;
+ }
+
+ void bar() {
+ if (foo() == null) {}
+ }
+}
+
+abstract class A<T> {
+ abstract T foo();
+}
+
+abstract class B<E extends Object> extends A<E> {
+}
+
+
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsage.java b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsage.java
new file mode 100644
index 000000000000..3bf853421127
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsage.java
@@ -0,0 +1,15 @@
+import java.util.List;
+class A<E> {
+ E e;
+ List<E> list = new List<E>();
+}
+
+class B<T> extends A<T> {}
+
+class C extends B <S<caret>tring> {
+ void foo() {
+ if (e == null && list != null) {
+ //do smth
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsage.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsage.java.after
new file mode 100644
index 000000000000..5eeea8234a2e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsage.java.after
@@ -0,0 +1,15 @@
+import java.util.List;
+class A<E> {
+ E e;
+ List<E> list = new List<E>();
+}
+
+class B<T> extends A<T> {}
+
+class C extends B<Object> {
+ void foo() {
+ if (e == null && list != null) {
+ //do smth
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsageConflict.java b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsageConflict.java
new file mode 100644
index 000000000000..bf9237fe6fb3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsageConflict.java
@@ -0,0 +1,16 @@
+import java.util.List;
+class A<E> {
+ E e;
+ List<E> list = new List<E>();
+}
+
+class B<T> extends A<T> {}
+
+class C extends B <S<caret>tring> {
+ void foo() {
+ if (e == null && list != null) {
+ for (String s : list) {
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsageConflict.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsageConflict.java.after
new file mode 100644
index 000000000000..ffecf75c7f20
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/TypeHierarchyFieldUsageConflict.java.after
@@ -0,0 +1,16 @@
+import java.util.List;
+class A<E> {
+ E e;
+ List<E> list = new List<E>();
+}
+
+class B<T> extends A<T> {}
+
+class C extends B<Object> {
+ void foo() {
+ if (e == null && list != null) {
+ for (Object s : list) {
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/UsedInSuper.java b/java/typeMigration/testData/refactoring/changeTypeSignature/UsedInSuper.java
new file mode 100644
index 000000000000..4cbee666c3cb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/UsedInSuper.java
@@ -0,0 +1,9 @@
+class A<T> {
+ T foo(){return null;}
+ T bar(){return foo();}
+}
+
+class B extends A<S<caret>tring> {
+ String foo(){return super.bar();}
+ String bar(){return super.foo();}
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/changeTypeSignature/UsedInSuper.java.after b/java/typeMigration/testData/refactoring/changeTypeSignature/UsedInSuper.java.after
new file mode 100644
index 000000000000..d321e6520dc0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/changeTypeSignature/UsedInSuper.java.after
@@ -0,0 +1,9 @@
+class A<T> {
+ T foo(){return null;}
+ T bar(){return foo();}
+}
+
+class B extends A<Object> {
+ Object foo(){return super.bar();}
+ Object bar(){return super.foo();}
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/after/Expr.items
new file mode 100644
index 000000000000..7ce904f6afe4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/after/Expr.items
@@ -0,0 +1,33 @@
+Types:
+PsiField:myForAccess : ClassParent
+PsiLocalVariable:vf : ClassParent
+PsiLocalVariable:vfcthis : ClassParent
+PsiLocalVariable:vfnew : ClassParent
+PsiLocalVariable:vfparen : ClassParent
+PsiLocalVariable:vfthis : ClassParent
+PsiLocalVariable:vm : ClassParent
+PsiLocalVariable:vmcthis : ClassParent
+PsiLocalVariable:vmnew : ClassParent
+PsiLocalVariable:vmparen : ClassParent
+PsiLocalVariable:vmthis : ClassParent
+PsiMethod:forAccess : ClassParent
+PsiMethodCallExpression:(this).forAccess() : ClassParent
+PsiMethodCallExpression:Expr.this.forAccess() : ClassParent
+PsiMethodCallExpression:forAccess() : ClassParent
+PsiMethodCallExpression:forAccess() : ClassParent
+PsiMethodCallExpression:forAccess() : ClassParent
+PsiMethodCallExpression:new Expr().forAccess() : ClassParent
+PsiMethodCallExpression:this.forAccess() : ClassParent
+PsiReferenceExpression:(this).myForAccess : ClassParent
+PsiReferenceExpression:Expr.this.myForAccess : ClassParent
+PsiReferenceExpression:myForAccess : ClassParent
+PsiReferenceExpression:myForAccess : ClassParent
+PsiReferenceExpression:new Expr().myForAccess : ClassParent
+PsiReferenceExpression:this.myForAccess : ClassParent
+
+Conversions:
+
+New expression type changes:
+Fails:
+forAccess()->ClassParent
+forAccess()->ClassParent
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/after/Expr.java
new file mode 100644
index 000000000000..65fd52a3e86e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/after/Expr.java
@@ -0,0 +1,35 @@
+class ClassParent {}
+class ClassChild extends ClassParent {
+ public void forAccess2() {
+ }
+
+ public int myForAccess;
+}
+class ClassGrandChild extends ClassChild {}
+
+class Expr {
+ public ClassParent myForAccess;
+ public ClassParent forAccess() {
+ return myForAccess;
+ }
+
+ public void methMemAcc() {
+ ClassParent vf = myForAccess;
+ ClassParent vm = forAccess();
+
+ ClassParent vfthis = this.myForAccess;
+ ClassParent vmthis = this.forAccess();
+
+ ClassParent vfcthis = Expr.this.myForAccess;
+ ClassParent vmcthis = Expr.this.forAccess();
+
+ ClassParent vfparen = (this).myForAccess;
+ ClassParent vmparen = (this).forAccess();
+
+ ClassParent vfnew = new Expr().myForAccess;
+ ClassParent vmnew = new Expr().forAccess();
+
+ int v = forAccess().myForAccess;
+ forAccess().forAccess2();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/before/Expr.java
new file mode 100644
index 000000000000..1c13032fa121
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Lvalue/before/Expr.java
@@ -0,0 +1,35 @@
+class ClassParent {}
+class ClassChild extends ClassParent {
+ public void forAccess2() {
+ }
+
+ public int myForAccess;
+}
+class ClassGrandChild extends ClassChild {}
+
+class Expr {
+ public ClassChild myForAccess;
+ public ClassChild forAccess() {
+ return myForAccess;
+ }
+
+ public void methMemAcc() {
+ ClassChild vf = myForAccess;
+ ClassChild vm = forAccess();
+
+ ClassChild vfthis = this.myForAccess;
+ ClassChild vmthis = this.forAccess();
+
+ ClassChild vfcthis = Expr.this.myForAccess;
+ ClassChild vmcthis = Expr.this.forAccess();
+
+ ClassChild vfparen = (this).myForAccess;
+ ClassChild vmparen = (this).forAccess();
+
+ ClassChild vfnew = new Expr().myForAccess;
+ ClassChild vmnew = new Expr().forAccess();
+
+ int v = forAccess().myForAccess;
+ forAccess().forAccess2();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/after/Expr.items
new file mode 100644
index 000000000000..d79df57fc220
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/after/Expr.items
@@ -0,0 +1,37 @@
+Types:
+PsiField:myField : ClassGrandChild
+PsiField:myForAccess1 : ClassGrandChild
+PsiField:myForAccess2 : ClassGrandChild
+PsiField:myForAccess3 : ClassGrandChild
+PsiField:myForAccess4 : ClassGrandChild
+PsiField:myForAccess5 : ClassGrandChild
+PsiMethod:forAccess1 : ClassGrandChild
+PsiMethod:forAccess2 : ClassGrandChild
+PsiMethod:forAccess3 : ClassGrandChild
+PsiMethod:forAccess4 : ClassGrandChild
+PsiMethod:forAccess5 : ClassGrandChild
+PsiMethodCallExpression:(this).forAccess4() : ClassGrandChild
+PsiMethodCallExpression:Expr.this.forAccess3() : ClassGrandChild
+PsiMethodCallExpression:forAccess1() : ClassGrandChild
+PsiMethodCallExpression:new Expr().forAccess5() : ClassGrandChild
+PsiMethodCallExpression:this.forAccess2() : ClassGrandChild
+PsiReferenceExpression:(this).myForAccess4 : ClassGrandChild
+PsiReferenceExpression:Expr.this.myForAccess3 : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myForAccess1 : ClassGrandChild
+PsiReferenceExpression:new Expr().myForAccess5 : ClassGrandChild
+PsiReferenceExpression:this.myForAccess2 : ClassGrandChild
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/after/Expr.java
new file mode 100644
index 000000000000..11599a2cd3a6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/after/Expr.java
@@ -0,0 +1,54 @@
+class ClassParent {}
+class ClassChild extends ClassParent {
+ public void forAccess2() {
+ }
+
+ public int myForAccess;
+}
+class ClassGrandChild extends ClassChild {}
+
+class Expr {
+ private ClassGrandChild myField;
+
+ public ClassGrandChild myForAccess1;
+ public ClassGrandChild forAccess1() {
+ return null;
+ }
+
+ public ClassGrandChild myForAccess2;
+ public ClassGrandChild forAccess2() {
+ return null;
+ }
+
+ public ClassGrandChild myForAccess3;
+ public ClassGrandChild forAccess3() {
+ return null;
+ }
+
+ public ClassGrandChild myForAccess4;
+ public ClassGrandChild forAccess4() {
+ return null;
+ }
+
+ public ClassGrandChild myForAccess5;
+ public ClassGrandChild forAccess5() {
+ return null;
+ }
+
+ public void methMemAcc() {
+ myField = myForAccess1;
+ myField = forAccess1();
+
+ myField = this.myForAccess2;
+ myField = this.forAccess2();
+
+ myField = Expr.this.myForAccess3;
+ myField = Expr.this.forAccess3();
+
+ myField = (this).myForAccess4;
+ myField = (this).forAccess4();
+
+ myField = new Expr().myForAccess5;
+ myField = new Expr().forAccess5();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/before/Expr.java
new file mode 100644
index 000000000000..64998cf198c8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccess2Rvalue/before/Expr.java
@@ -0,0 +1,54 @@
+class ClassParent {}
+class ClassChild extends ClassParent {
+ public void forAccess2() {
+ }
+
+ public int myForAccess;
+}
+class ClassGrandChild extends ClassChild {}
+
+class Expr {
+ private ClassChild myField;
+
+ public ClassChild myForAccess1;
+ public ClassChild forAccess1() {
+ return null;
+ }
+
+ public ClassChild myForAccess2;
+ public ClassChild forAccess2() {
+ return null;
+ }
+
+ public ClassChild myForAccess3;
+ public ClassChild forAccess3() {
+ return null;
+ }
+
+ public ClassChild myForAccess4;
+ public ClassChild forAccess4() {
+ return null;
+ }
+
+ public ClassChild myForAccess5;
+ public ClassChild forAccess5() {
+ return null;
+ }
+
+ public void methMemAcc() {
+ myField = myForAccess1;
+ myField = forAccess1();
+
+ myField = this.myForAccess2;
+ myField = this.forAccess2();
+
+ myField = Expr.this.myForAccess3;
+ myField = Expr.this.forAccess3();
+
+ myField = (this).myForAccess4;
+ myField = (this).forAccess4();
+
+ myField = new Expr().myForAccess5;
+ myField = new Expr().forAccess5();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/after/Ession.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/after/Ession.items
new file mode 100644
index 000000000000..15e80380b536
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/after/Ession.items
@@ -0,0 +1,17 @@
+Types:
+PsiField:myForSuperAccess : ClassParent
+PsiLocalVariable:vfcsuper : ClassParent
+PsiLocalVariable:vfsuper : ClassParent
+PsiLocalVariable:vmcsuper : ClassParent
+PsiLocalVariable:vmsuper : ClassParent
+PsiMethod:forSuperAccess : ClassParent
+PsiMethodCallExpression:Expr.super.forSuperAccess() : ClassParent
+PsiMethodCallExpression:super.forSuperAccess() : ClassParent
+PsiReferenceExpression:Expr.super.myForSuperAccess : ClassParent
+PsiReferenceExpression:myForSuperAccess : ClassParent
+PsiReferenceExpression:super.myForSuperAccess : ClassParent
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/after/Expr.java
new file mode 100644
index 000000000000..3a9531d8f9d8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/after/Expr.java
@@ -0,0 +1,20 @@
+class ClassParent {}
+class ClassChild extends ClassParent {}
+class ClassGrandChild extends ClassChild {}
+
+class Ession {
+ public ClassParent myForSuperAccess;
+ public ClassParent forSuperAccess() {
+ return myForSuperAccess;
+ }
+}
+
+class Expr extends Ession {
+ public void methMemAcc() {
+ ClassParent vfsuper = super.myForSuperAccess;
+ ClassParent vmsuper = super.forSuperAccess();
+
+ ClassParent vfcsuper = Expr.super.myForSuperAccess;
+ ClassParent vmcsuper = Expr.super.forSuperAccess();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/before/Expr.java
new file mode 100644
index 000000000000..898b41a6ab6f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Lvalue/before/Expr.java
@@ -0,0 +1,20 @@
+class ClassParent {}
+class ClassChild extends ClassParent {}
+class ClassGrandChild extends ClassChild {}
+
+class Ession {
+ public ClassChild myForSuperAccess;
+ public ClassChild forSuperAccess() {
+ return myForSuperAccess;
+ }
+}
+
+class Expr extends Ession {
+ public void methMemAcc() {
+ ClassChild vfsuper = super.myForSuperAccess;
+ ClassChild vmsuper = super.forSuperAccess();
+
+ ClassChild vfcsuper = Expr.super.myForSuperAccess;
+ ClassChild vmcsuper = Expr.super.forSuperAccess();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/after/Expr.items
new file mode 100644
index 000000000000..95bf149e7b68
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/after/Expr.items
@@ -0,0 +1,19 @@
+Types:
+PsiField:myField : ClassGrandChild
+PsiField:myForSuperAccess1 : ClassGrandChild
+PsiField:myForSuperAccess2 : ClassGrandChild
+PsiMethod:forSuperAccess1 : ClassGrandChild
+PsiMethod:forSuperAccess2 : ClassGrandChild
+PsiMethodCallExpression:Expr.super.forSuperAccess2() : ClassGrandChild
+PsiMethodCallExpression:super.forSuperAccess1() : ClassGrandChild
+PsiReferenceExpression:Expr.super.myForSuperAccess2 : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:myField : ClassGrandChild
+PsiReferenceExpression:super.myForSuperAccess1 : ClassGrandChild
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/after/Expr.java
new file mode 100644
index 000000000000..9ffe2e3a7332
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/after/Expr.java
@@ -0,0 +1,26 @@
+class ClassParent {}
+class ClassChild extends ClassParent {}
+class ClassGrandChild extends ClassChild {}
+
+class Ession {
+ public ClassGrandChild myForSuperAccess1;
+ public ClassGrandChild forSuperAccess1() {
+ return null;
+ }
+
+ public ClassGrandChild myForSuperAccess2;
+ public ClassGrandChild forSuperAccess2() {
+ return null;
+ }
+}
+
+class Expr extends Ession {
+ private ClassGrandChild myField;
+ public void methMemAcc() {
+ myField = super.myForSuperAccess1;
+ myField = super.forSuperAccess1();
+
+ myField = Expr.super.myForSuperAccess2;
+ myField = Expr.super.forSuperAccess2();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/before/Expr.java
new file mode 100644
index 000000000000..0a244c6448bd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprAccessParent2Rvalue/before/Expr.java
@@ -0,0 +1,26 @@
+class ClassParent {}
+class ClassChild extends ClassParent {}
+class ClassGrandChild extends ClassChild {}
+
+class Ession {
+ public ClassChild myForSuperAccess1;
+ public ClassChild forSuperAccess1() {
+ return null;
+ }
+
+ public ClassChild myForSuperAccess2;
+ public ClassChild forSuperAccess2() {
+ return null;
+ }
+}
+
+class Expr extends Ession {
+ private ClassChild myField;
+ public void methMemAcc() {
+ myField = super.myForSuperAccess1;
+ myField = super.forSuperAccess1();
+
+ myField = Expr.super.myForSuperAccess2;
+ myField = Expr.super.forSuperAccess2();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/after/Expr.items
new file mode 100644
index 000000000000..0f10ca83564b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/after/Expr.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : double
+PsiReferenceExpression:p : double
+
+Conversions:
+
+New expression type changes:
+Fails:
+p->double
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/after/Expr.java
new file mode 100644
index 000000000000..9258f512d2b1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/after/Expr.java
@@ -0,0 +1,6 @@
+class Expr {
+ public void meth(double p) {
+ String[] sa = new String[]{"0", "1"};
+ String s = sa[p];
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/before/Expr.java
new file mode 100644
index 000000000000..57fde1c6b34c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessNegative/before/Expr.java
@@ -0,0 +1,6 @@
+class Expr {
+ public void meth(int p) {
+ String[] sa = new String[]{"0", "1"};
+ String s = sa[p];
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/after/Expr.items
new file mode 100644
index 000000000000..afc565fc6df7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/after/Expr.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:p : char
+PsiReferenceExpression:p : char
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/after/Expr.java
new file mode 100644
index 000000000000..7971b5e9e770
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/after/Expr.java
@@ -0,0 +1,6 @@
+class Expr {
+ public void meth(char p) {
+ String[] sa = new String[]{"0", "1"};
+ String s = sa[p];
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/before/Expr.java
new file mode 100644
index 000000000000..57fde1c6b34c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprArrayAccessPositive/before/Expr.java
@@ -0,0 +1,6 @@
+class Expr {
+ public void meth(int p) {
+ String[] sa = new String[]{"0", "1"};
+ String s = sa[p];
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/after/Expr.items
new file mode 100644
index 000000000000..4e6bf57cbb3e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/after/Expr.items
@@ -0,0 +1,30 @@
+Types:
+PsiLocalVariable:vba : int
+PsiLocalVariable:vbb : int
+PsiLocalVariable:vbc : int
+PsiParameter:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+PsiReferenceExpression:pb : int
+
+Conversions:
+
+New expression type changes:
+Fails:
+pb->int
+pb->int
+pb->int
+pb->int
+pb->int
+pb->int
+pb->int
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/after/Expr.java
new file mode 100644
index 000000000000..d0dd0e83a559
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/after/Expr.java
@@ -0,0 +1,16 @@
+class Expr {
+ public void meth(int pb) {
+ int vba = pb & pb;
+ int vbb = pb ^ pb;
+ int vbc = pb | pb;
+ boolean vbd = pb && pb;
+ boolean vbe = pb || pb;
+
+ boolean vn1 = false;
+ vn1 &= pb;
+ boolean vn2 = false;
+ vn2 ^= pb;
+ boolean vn3 = false;
+ vn3 |= pb;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/before/Expr.java
new file mode 100644
index 000000000000..d0364a40ca25
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanBoolean/before/Expr.java
@@ -0,0 +1,16 @@
+class Expr {
+ public void meth(boolean pb) {
+ boolean vba = pb & pb;
+ boolean vbb = pb ^ pb;
+ boolean vbc = pb | pb;
+ boolean vbd = pb && pb;
+ boolean vbe = pb || pb;
+
+ boolean vn1 = false;
+ vn1 &= pb;
+ boolean vn2 = false;
+ vn2 ^= pb;
+ boolean vn3 = false;
+ vn3 |= pb;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/after/Expr.items
new file mode 100644
index 000000000000..21ecfb0d65a5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/after/Expr.items
@@ -0,0 +1,19 @@
+Types:
+PsiParameter:pi : java.lang.Object
+PsiReferenceExpression:pi : java.lang.Object
+PsiReferenceExpression:pi : java.lang.Object
+PsiReferenceExpression:pi : java.lang.Object
+PsiReferenceExpression:pi : java.lang.Object
+PsiReferenceExpression:pi : java.lang.Object
+PsiReferenceExpression:pi : java.lang.Object
+
+Conversions:
+
+New expression type changes:
+Fails:
+pi->java.lang.Object
+pi->java.lang.Object
+pi->java.lang.Object
+pi->java.lang.Object
+pi->java.lang.Object
+pi->java.lang.Object
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/after/Expr.java
new file mode 100644
index 000000000000..c54d809c3906
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/after/Expr.java
@@ -0,0 +1,10 @@
+class Expr {
+ public void meth(Object pi) {
+ boolean vb1 = pi > 0;
+ boolean vb2 = pi >= 0;
+ boolean vb3 = pi < 0;
+ boolean vb4 = pi <= 0;
+ boolean vb6 = pi == 0;
+ boolean vb7 = pi != 0;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/before/Expr.java
new file mode 100644
index 000000000000..1b113b43a3e6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanNumeric/before/Expr.java
@@ -0,0 +1,10 @@
+class Expr {
+ public void meth(int pi) {
+ boolean vb1 = pi > 0;
+ boolean vb2 = pi >= 0;
+ boolean vb3 = pi < 0;
+ boolean vb4 = pi <= 0;
+ boolean vb6 = pi == 0;
+ boolean vb7 = pi != 0;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/after/Expr.items
new file mode 100644
index 000000000000..815d62ca7530
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/after/Expr.items
@@ -0,0 +1,15 @@
+Types:
+PsiParameter:ps : double
+PsiReferenceExpression:ps : double
+PsiReferenceExpression:ps : double
+PsiReferenceExpression:ps : double
+PsiReferenceExpression:ps : double
+
+Conversions:
+
+New expression type changes:
+Fails:
+ps->double
+ps->double
+ps->double
+ps->double
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/after/Expr.java
new file mode 100644
index 000000000000..bc4c04967759
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/after/Expr.java
@@ -0,0 +1,8 @@
+class Expr {
+ public void meth(double ps) {
+ boolean vb5 = ps instanceof CharSequence;
+ boolean vb8 = ps == "string";
+ boolean vb9 = ps != "string";
+ boolean vbf = (1 >= 0) && (ps instanceof CharSequence);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/before/Expr.java
new file mode 100644
index 000000000000..6def87eb9709
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcBooleanReference/before/Expr.java
@@ -0,0 +1,8 @@
+class Expr {
+ public void meth(String ps) {
+ boolean vb5 = ps instanceof CharSequence;
+ boolean vb8 = ps == "string";
+ boolean vb9 = ps != "string";
+ boolean vbf = (1 >= 0) && (ps instanceof CharSequence);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/after/Expr.items
new file mode 100644
index 000000000000..aeddc71515d9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/after/Expr.items
@@ -0,0 +1,58 @@
+Types:
+PsiLocalVariable:vb9 : boolean
+PsiLocalVariable:vba : boolean
+PsiLocalVariable:vbb : boolean
+PsiParameter:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+PsiReferenceExpression:p : boolean
+
+Conversions:
+
+New expression type changes:
+Fails:
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
+p->boolean
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/after/Expr.java
new file mode 100644
index 000000000000..c90c55120370
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/after/Expr.java
@@ -0,0 +1,35 @@
+class Expr {
+ public void meth(boolean p) {
+ int vb1 = p * p;
+ int vb2 = p / p;
+ int vb3 = p % p;
+ int vb4 = p + p;
+ int vb5 = p - p;
+ boolean vb9 = p & p;
+ boolean vba = p ^ p;
+ boolean vbb = p | p;
+
+ int vn1 = 0;
+ vn1 *= p;
+ int vn2 = 0;
+ vn2 /= p;
+ int vn3 = 0;
+ vn3 %= p;
+ int vn4 = 0;
+ vn4 += p;
+ int vn5 = 0;
+ vn5 -= p;
+ int vn6 = 0;
+ vn6 <<= p;
+ int vn7 = 0;
+ vn7 >>= p;
+ int vn8 = 0;
+ vn8 >>>= p;
+ int vn9 = 0;
+ vn9 &= p;
+ int vna = 0;
+ vna ^= p;
+ int vnb = 0;
+ vnb |= p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/before/Expr.java
new file mode 100644
index 000000000000..057b284248a0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Boolean/before/Expr.java
@@ -0,0 +1,35 @@
+class Expr {
+ public void meth(int p) {
+ int vb1 = p * p;
+ int vb2 = p / p;
+ int vb3 = p % p;
+ int vb4 = p + p;
+ int vb5 = p - p;
+ int vb9 = p & p;
+ int vba = p ^ p;
+ int vbb = p | p;
+
+ int vn1 = 0;
+ vn1 *= p;
+ int vn2 = 0;
+ vn2 /= p;
+ int vn3 = 0;
+ vn3 %= p;
+ int vn4 = 0;
+ vn4 += p;
+ int vn5 = 0;
+ vn5 -= p;
+ int vn6 = 0;
+ vn6 <<= p;
+ int vn7 = 0;
+ vn7 >>= p;
+ int vn8 = 0;
+ vn8 >>>= p;
+ int vn9 = 0;
+ vn9 &= p;
+ int vna = 0;
+ vna ^= p;
+ int vnb = 0;
+ vnb |= p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/after/Expr.items
new file mode 100644
index 000000000000..0fdb9d1291e9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/after/Expr.items
@@ -0,0 +1,78 @@
+Types:
+PsiLocalVariable:vb1 : float
+PsiLocalVariable:vb2 : float
+PsiLocalVariable:vb3 : float
+PsiLocalVariable:vb4 : float
+PsiLocalVariable:vb5 : float
+PsiLocalVariable:vn1 : float
+PsiLocalVariable:vn2 : float
+PsiLocalVariable:vn3 : float
+PsiLocalVariable:vn4 : float
+PsiLocalVariable:vn5 : float
+PsiLocalVariable:vu1 : float
+PsiLocalVariable:vu2 : float
+PsiLocalVariable:vu3 : float
+PsiLocalVariable:vu4 : float
+PsiLocalVariable:vu5 : float
+PsiLocalVariable:vu6 : float
+PsiParameter:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:vn1 : float
+PsiReferenceExpression:vn2 : float
+PsiReferenceExpression:vn3 : float
+PsiReferenceExpression:vn4 : float
+PsiReferenceExpression:vn5 : float
+
+Conversions:
+0 -> $
+0 -> $
+0 -> $
+0 -> $
+0 -> $
+
+New expression type changes:
+Fails:
+p->float
+p->float
+p->float
+p->float
+p->float
+p->float
+p->float
+p->float
+p->float
+p->float
+p->float
+p->float
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/after/Expr.java
new file mode 100644
index 000000000000..8e16d5b5d974
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/after/Expr.java
@@ -0,0 +1,42 @@
+class Expr {
+ public void meth(float p) {
+ float vu1 = p++;
+ float vu2 = p--;
+ float vu3 = ++p;
+ float vu4 = --p;
+ float vu5 = -p;
+ float vu6 = +p;
+
+ float vb1 = p * p;
+ float vb2 = p / p;
+ float vb3 = p % p;
+ float vb4 = p + p;
+ float vb5 = p - p;
+ int vb9 = p & p;
+ int vba = p ^ p;
+ int vbb = p | p;
+
+ float vn1 = 0;
+ vn1 *= p;
+ float vn2 = 0;
+ vn2 /= p;
+ float vn3 = 0;
+ vn3 %= p;
+ float vn4 = 0;
+ vn4 += p;
+ float vn5 = 0;
+ vn5 -= p;
+ int vn6 = 0;
+ vn6 <<= p;
+ int vn7 = 0;
+ vn7 >>= p;
+ int vn8 = 0;
+ vn8 >>>= p;
+ int vn9 = 0;
+ vn9 &= p;
+ int vna = 0;
+ vna ^= p;
+ int vnb = 0;
+ vnb |= p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/before/Expr.java
new file mode 100644
index 000000000000..4088b28a0060
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Floating/before/Expr.java
@@ -0,0 +1,42 @@
+class Expr {
+ public void meth(int p) {
+ int vu1 = p++;
+ int vu2 = p--;
+ int vu3 = ++p;
+ int vu4 = --p;
+ int vu5 = -p;
+ int vu6 = +p;
+
+ int vb1 = p * p;
+ int vb2 = p / p;
+ int vb3 = p % p;
+ int vb4 = p + p;
+ int vb5 = p - p;
+ int vb9 = p & p;
+ int vba = p ^ p;
+ int vbb = p | p;
+
+ int vn1 = 0;
+ vn1 *= p;
+ int vn2 = 0;
+ vn2 /= p;
+ int vn3 = 0;
+ vn3 %= p;
+ int vn4 = 0;
+ vn4 += p;
+ int vn5 = 0;
+ vn5 -= p;
+ int vn6 = 0;
+ vn6 <<= p;
+ int vn7 = 0;
+ vn7 >>= p;
+ int vn8 = 0;
+ vn8 >>>= p;
+ int vn9 = 0;
+ vn9 &= p;
+ int vna = 0;
+ vna ^= p;
+ int vnb = 0;
+ vnb |= p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/after/Expr.items
new file mode 100644
index 000000000000..36e79ff677b4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/after/Expr.items
@@ -0,0 +1,98 @@
+Types:
+PsiLocalVariable:vb1 : long
+PsiLocalVariable:vb2 : long
+PsiLocalVariable:vb3 : long
+PsiLocalVariable:vb4 : long
+PsiLocalVariable:vb5 : long
+PsiLocalVariable:vb6 : long
+PsiLocalVariable:vb7 : long
+PsiLocalVariable:vb8 : long
+PsiLocalVariable:vb9 : long
+PsiLocalVariable:vba : long
+PsiLocalVariable:vbb : long
+PsiLocalVariable:vn1 : long
+PsiLocalVariable:vn2 : long
+PsiLocalVariable:vn3 : long
+PsiLocalVariable:vn4 : long
+PsiLocalVariable:vn5 : long
+PsiLocalVariable:vn6 : long
+PsiLocalVariable:vn7 : long
+PsiLocalVariable:vn8 : long
+PsiLocalVariable:vn9 : long
+PsiLocalVariable:vna : long
+PsiLocalVariable:vnb : long
+PsiLocalVariable:vu1 : long
+PsiLocalVariable:vu2 : long
+PsiLocalVariable:vu3 : long
+PsiLocalVariable:vu4 : long
+PsiLocalVariable:vu5 : long
+PsiLocalVariable:vu6 : long
+PsiLocalVariable:vu7 : long
+PsiParameter:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:vn1 : long
+PsiReferenceExpression:vn2 : long
+PsiReferenceExpression:vn3 : long
+PsiReferenceExpression:vn4 : long
+PsiReferenceExpression:vn5 : long
+PsiReferenceExpression:vn6 : long
+PsiReferenceExpression:vn7 : long
+PsiReferenceExpression:vn8 : long
+PsiReferenceExpression:vn9 : long
+PsiReferenceExpression:vna : long
+PsiReferenceExpression:vnb : long
+
+Conversions:
+0 -> $
+0 -> $
+0 -> $
+0 -> $
+0 -> $
+0 -> $
+0 -> $
+0 -> $
+0 -> $
+0 -> $
+0 -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/after/Expr.java
new file mode 100644
index 000000000000..323dad23d5d3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/after/Expr.java
@@ -0,0 +1,46 @@
+class Expr {
+ public void meth(long p) {
+ long vu1 = p++;
+ long vu2 = p--;
+ long vu3 = ++p;
+ long vu4 = --p;
+ long vu5 = -p;
+ long vu6 = +p;
+ long vu7 = ~p;
+
+ long vb1 = p * p;
+ long vb2 = p / p;
+ long vb3 = p % p;
+ long vb4 = p + p;
+ long vb5 = p - p;
+ long vb6 = p << p;
+ long vb7 = p >> p;
+ long vb8 = p >>> p;
+ long vb9 = p & p;
+ long vba = p ^ p;
+ long vbb = p | p;
+
+ long vn1 = 0;
+ vn1 *= p;
+ long vn2 = 0;
+ vn2 /= p;
+ long vn3 = 0;
+ vn3 %= p;
+ long vn4 = 0;
+ vn4 += p;
+ long vn5 = 0;
+ vn5 -= p;
+ long vn6 = 0;
+ vn6 <<= p;
+ long vn7 = 0;
+ vn7 >>= p;
+ long vn8 = 0;
+ vn8 >>>= p;
+ long vn9 = 0;
+ vn9 &= p;
+ long vna = 0;
+ vna ^= p;
+ long vnb = 0;
+ vnb |= p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/before/Expr.java
new file mode 100644
index 000000000000..716f4b7e60e1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2Int/before/Expr.java
@@ -0,0 +1,46 @@
+class Expr {
+ public void meth(int p) {
+ int vu1 = p++;
+ int vu2 = p--;
+ int vu3 = ++p;
+ int vu4 = --p;
+ int vu5 = -p;
+ int vu6 = +p;
+ int vu7 = ~p;
+
+ int vb1 = p * p;
+ int vb2 = p / p;
+ int vb3 = p % p;
+ int vb4 = p + p;
+ int vb5 = p - p;
+ int vb6 = p << p;
+ int vb7 = p >> p;
+ int vb8 = p >>> p;
+ int vb9 = p & p;
+ int vba = p ^ p;
+ int vbb = p | p;
+
+ int vn1 = 0;
+ vn1 *= p;
+ int vn2 = 0;
+ vn2 /= p;
+ int vn3 = 0;
+ vn3 %= p;
+ int vn4 = 0;
+ vn4 += p;
+ int vn5 = 0;
+ vn5 -= p;
+ int vn6 = 0;
+ vn6 <<= p;
+ int vn7 = 0;
+ vn7 >>= p;
+ int vn8 = 0;
+ vn8 >>>= p;
+ int vn9 = 0;
+ vn9 &= p;
+ int vna = 0;
+ vna ^= p;
+ int vnb = 0;
+ vnb |= p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/after/Expr.items
new file mode 100644
index 000000000000..406008949bd1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/after/Expr.items
@@ -0,0 +1,62 @@
+Types:
+PsiLocalVariable:vb4 : java.lang.String
+PsiLocalVariable:vn4 : java.lang.String
+PsiParameter:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:vn4 : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
+0->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
+p->java.lang.String
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/after/Expr.java
new file mode 100644
index 000000000000..62fd2ff0b0ff
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/after/Expr.java
@@ -0,0 +1,35 @@
+class Expr {
+ public void meth(String p) {
+ int vb1 = p * p;
+ int vb2 = p / p;
+ int vb3 = p % p;
+ String vb4 = p + p;
+ int vb5 = p - p;
+ int vb9 = p & p;
+ int vba = p ^ p;
+ int vbb = p | p;
+
+ int vn1 = 0;
+ vn1 *= p;
+ int vn2 = 0;
+ vn2 /= p;
+ int vn3 = 0;
+ vn3 %= p;
+ String vn4 = 0;
+ vn4 += p;
+ int vn5 = 0;
+ vn5 -= p;
+ int vn6 = 0;
+ vn6 <<= p;
+ int vn7 = 0;
+ vn7 >>= p;
+ int vn8 = 0;
+ vn8 >>>= p;
+ int vn9 = 0;
+ vn9 &= p;
+ int vna = 0;
+ vna ^= p;
+ int vnb = 0;
+ vnb |= p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/before/Expr.java
new file mode 100644
index 000000000000..057b284248a0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCalcNumeric2String/before/Expr.java
@@ -0,0 +1,35 @@
+class Expr {
+ public void meth(int p) {
+ int vb1 = p * p;
+ int vb2 = p / p;
+ int vb3 = p % p;
+ int vb4 = p + p;
+ int vb5 = p - p;
+ int vb9 = p & p;
+ int vba = p ^ p;
+ int vbb = p | p;
+
+ int vn1 = 0;
+ vn1 *= p;
+ int vn2 = 0;
+ vn2 /= p;
+ int vn3 = 0;
+ vn3 %= p;
+ int vn4 = 0;
+ vn4 += p;
+ int vn5 = 0;
+ vn5 -= p;
+ int vn6 = 0;
+ vn6 <<= p;
+ int vn7 = 0;
+ vn7 >>= p;
+ int vn8 = 0;
+ vn8 >>>= p;
+ int vn9 = 0;
+ vn9 &= p;
+ int vna = 0;
+ vna ^= p;
+ int vnb = 0;
+ vnb |= p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/after/Expr.items
new file mode 100644
index 000000000000..01f325b2852d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/after/Expr.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
+(short) p->java.lang.String
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/after/Expr.java
new file mode 100644
index 000000000000..5a7343152288
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/after/Expr.java
@@ -0,0 +1,5 @@
+class Expr {
+ public void meth(String p) {
+ short v = (short) p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/before/Expr.java
new file mode 100644
index 000000000000..e3519b4bb4bf
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvalueNeg/before/Expr.java
@@ -0,0 +1,5 @@
+class Expr {
+ public void meth(byte p) {
+ short v = (short) p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/after/Expr.items
new file mode 100644
index 000000000000..f69d09024863
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/after/Expr.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:p : int
+PsiReferenceExpression:p : int
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/after/Expr.java
new file mode 100644
index 000000000000..64aecc896b80
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/after/Expr.java
@@ -0,0 +1,5 @@
+class Expr {
+ public void meth(int p) {
+ short v = (short) p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/before/Expr.java
new file mode 100644
index 000000000000..e3519b4bb4bf
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprCast2LvaluePos/before/Expr.java
@@ -0,0 +1,5 @@
+class Expr {
+ public void meth(byte p) {
+ short v = (short) p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/after/Expr.items
new file mode 100644
index 000000000000..0b73994dece5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/after/Expr.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:pns : java.lang.Object
+PsiReferenceExpression:pns : java.lang.Object
+PsiReferenceExpression:pns : java.lang.Object
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/after/Expr.java
new file mode 100644
index 000000000000..cf844f4eddf2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/after/Expr.java
@@ -0,0 +1,9 @@
+class Expr {
+ private String myString;
+ public void meth(Object pns, String ps) {
+ myString = ps + ps;
+ myString = ps + pns;
+ myString = pns + ps;
+ myString += ps;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/before/Expr.java
new file mode 100644
index 000000000000..71b89f955e59
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2Reference/before/Expr.java
@@ -0,0 +1,9 @@
+class Expr {
+ private String myString;
+ public void meth(int pns, String ps) {
+ myString = ps + ps;
+ myString = ps + pns;
+ myString = pns + ps;
+ myString += ps;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/after/Expr.items
new file mode 100644
index 000000000000..46d6b1f5a15f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/after/Expr.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:pns : java.lang.String
+PsiReferenceExpression:pns : java.lang.String
+PsiReferenceExpression:pns : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/after/Expr.java
new file mode 100644
index 000000000000..5ce2b795d268
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/after/Expr.java
@@ -0,0 +1,9 @@
+class Expr {
+ private String myString;
+ public void meth(String pns, String ps) {
+ myString = ps + ps;
+ myString = ps + pns;
+ myString = pns + ps;
+ myString += ps;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/before/Expr.java
new file mode 100644
index 000000000000..71b89f955e59
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatNumeric2String/before/Expr.java
@@ -0,0 +1,9 @@
+class Expr {
+ private String myString;
+ public void meth(int pns, String ps) {
+ myString = ps + ps;
+ myString = ps + pns;
+ myString = pns + ps;
+ myString += ps;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/after/Expr.items
new file mode 100644
index 000000000000..3bb9c1ebf19a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/after/Expr.items
@@ -0,0 +1,17 @@
+Types:
+PsiField:myString : int
+PsiParameter:ps : int
+PsiReferenceExpression:myString : int
+PsiReferenceExpression:myString : int
+PsiReferenceExpression:myString : int
+PsiReferenceExpression:myString : int
+PsiReferenceExpression:ps : int
+PsiReferenceExpression:ps : int
+PsiReferenceExpression:ps : int
+PsiReferenceExpression:ps : int
+PsiReferenceExpression:ps : int
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/after/Expr.java
new file mode 100644
index 000000000000..ac05959f3c08
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/after/Expr.java
@@ -0,0 +1,9 @@
+class Expr {
+ private int myString;
+ public void meth(int ps, int pns) {
+ myString = ps + ps;
+ myString = ps + pns;
+ myString = pns + ps;
+ myString += ps;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/before/Expr.java
new file mode 100644
index 000000000000..bb57398b961c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Numeric/before/Expr.java
@@ -0,0 +1,9 @@
+class Expr {
+ private String myString;
+ public void meth(String ps, int pns) {
+ myString = ps + ps;
+ myString = ps + pns;
+ myString = pns + ps;
+ myString += ps;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/after/Expr.items
new file mode 100644
index 000000000000..302e3c9da48c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/after/Expr.items
@@ -0,0 +1,23 @@
+Types:
+PsiField:myString : int
+PsiParameter:ps : java.lang.Object
+PsiReferenceExpression:myString : int
+PsiReferenceExpression:myString : int
+PsiReferenceExpression:myString : int
+PsiReferenceExpression:myString : int
+PsiReferenceExpression:ps : java.lang.Object
+PsiReferenceExpression:ps : java.lang.Object
+PsiReferenceExpression:ps : java.lang.Object
+PsiReferenceExpression:ps : java.lang.Object
+PsiReferenceExpression:ps : java.lang.Object
+
+Conversions:
+
+New expression type changes:
+Fails:
+myString->int
+ps->java.lang.Object
+ps->java.lang.Object
+ps->java.lang.Object
+ps->java.lang.Object
+ps->java.lang.Object
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/after/Expr.java
new file mode 100644
index 000000000000..c23893bd5b63
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/after/Expr.java
@@ -0,0 +1,9 @@
+class Expr {
+ private int myString;
+ public void meth(Object ps, int pns) {
+ myString = ps + ps;
+ myString = ps + pns;
+ myString = pns + ps;
+ myString += ps;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/before/Expr.java
new file mode 100644
index 000000000000..bb57398b961c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprConcatString2Reference/before/Expr.java
@@ -0,0 +1,9 @@
+class Expr {
+ private String myString;
+ public void meth(String ps, int pns) {
+ myString = ps + ps;
+ myString = ps + pns;
+ myString = pns + ps;
+ myString += ps;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/after/Expr.items
new file mode 100644
index 000000000000..7712b490ec9a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/after/Expr.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.util.List
+PsiReferenceExpression:p : java.util.List
+
+Conversions:
+
+New expression type changes:
+Fails:
+p->java.util.List
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/after/Expr.java
new file mode 100644
index 000000000000..93da179e0c37
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/after/Expr.java
@@ -0,0 +1,9 @@
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+class Expr {
+ public void meth(List p) {
+ boolean b = p instanceof HashSet;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/before/Expr.java
new file mode 100644
index 000000000000..72af0a04ab0b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofNeg/before/Expr.java
@@ -0,0 +1,9 @@
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+class Expr {
+ public void meth(Set p) {
+ boolean b = p instanceof HashSet;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/after/Expr.items
new file mode 100644
index 000000000000..5b608c5c0b1a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/after/Expr.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:p : java.util.AbstractMap
+PsiReferenceExpression:p : java.util.AbstractMap
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/after/Expr.java
new file mode 100644
index 000000000000..e7f8a225bd9e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/after/Expr.java
@@ -0,0 +1,9 @@
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.Map;
+
+class Expr {
+ public void meth(AbstractMap p) {
+ boolean b = p instanceof HashMap;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/before/Expr.java
new file mode 100644
index 000000000000..fa8ab953a084
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprInstanceofPos/before/Expr.java
@@ -0,0 +1,9 @@
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.Map;
+
+class Expr {
+ public void meth(Map p) {
+ boolean b = p instanceof HashMap;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/after/Expr.items
new file mode 100644
index 000000000000..b446d1101a06
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/after/Expr.items
@@ -0,0 +1,35 @@
+Types:
+PsiField:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:myField : boolean
+
+Conversions:
+
+New expression type changes:
+Fails:
+"#"->boolean
+'#'->boolean
+043->boolean
+043F->boolean
+043L->boolean
+0x23->boolean
+0x23F->boolean
+0x23L->boolean
+35->boolean
+35.0->boolean
+35F->boolean
+35L->boolean
+null->boolean
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/after/Expr.java
new file mode 100644
index 000000000000..d0d0a2d12326
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/after/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private boolean myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/before/Expr.java
new file mode 100644
index 000000000000..05b89dc47d4f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralBoolean/before/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/after/Expr.items
new file mode 100644
index 000000000000..efc0c3bb0c41
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/after/Expr.items
@@ -0,0 +1,37 @@
+Types:
+PsiField:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+
+Conversions:
+
+New expression type changes:
+Fails:
+"#"->byte
+'#'->byte
+043->byte
+043F->byte
+043L->byte
+0x23->byte
+0x23F->byte
+0x23L->byte
+35->byte
+35.0->byte
+35F->byte
+35L->byte
+false->byte
+null->byte
+true->byte
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/after/Expr.java
new file mode 100644
index 000000000000..6288f06f450a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/after/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private byte myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/before/Expr.java
new file mode 100644
index 000000000000..05b89dc47d4f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralByte/before/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/after/Expr.items
new file mode 100644
index 000000000000..62960ffeacf8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/after/Expr.items
@@ -0,0 +1,36 @@
+Types:
+PsiField:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+
+Conversions:
+
+New expression type changes:
+Fails:
+"#"->char
+043->char
+043F->char
+043L->char
+0x23->char
+0x23F->char
+0x23L->char
+35->char
+35.0->char
+35F->char
+35L->char
+false->char
+null->char
+true->char
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/after/Expr.java
new file mode 100644
index 000000000000..eab5b7cf5059
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/after/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private char myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/before/Expr.java
new file mode 100644
index 000000000000..05b89dc47d4f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralChar/before/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/after/Expr.items
new file mode 100644
index 000000000000..2a1f903ca5ab
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/after/Expr.items
@@ -0,0 +1,17 @@
+Types:
+PsiField:myField : java.lang.Class<? extends java.util.Collection[]>
+PsiReferenceExpression:myField : java.lang.Class<? extends java.util.Collection[]>
+PsiReferenceExpression:myField : java.lang.Class<? extends java.util.Collection[]>
+PsiReferenceExpression:myField : java.lang.Class<? extends java.util.Collection[]>
+PsiReferenceExpression:myField : java.lang.Class<? extends java.util.Collection[]>
+PsiReferenceExpression:myField : java.lang.Class<? extends java.util.Collection[]>
+
+Conversions:
+Set[].class -> $
+
+New expression type changes:
+Fails:
+Set.class->java.lang.Class<? extends java.util.Collection[]>
+int.class->java.lang.Class<? extends java.util.Collection[]>
+int[].class->java.lang.Class<? extends java.util.Collection[]>
+void.class->java.lang.Class<? extends java.util.Collection[]>
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/after/Expr.java
new file mode 100644
index 000000000000..a9f761e2bd1f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/after/Expr.java
@@ -0,0 +1,13 @@
+import java.util.Collection;
+import java.util.Set;
+
+class Expr {
+ private Class<? extends Collection[]> myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/before/Expr.java
new file mode 100644
index 000000000000..202ef9ef2da6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassExtends/before/Expr.java
@@ -0,0 +1,13 @@
+import java.util.Collection;
+import java.util.Set;
+
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/after/Expr.items
new file mode 100644
index 000000000000..485a0f5d91a4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/after/Expr.items
@@ -0,0 +1,16 @@
+Types:
+PsiField:myField : java.lang.Class<java.lang.Integer>
+PsiReferenceExpression:myField : java.lang.Class<java.lang.Integer>
+PsiReferenceExpression:myField : java.lang.Class<java.lang.Integer>
+PsiReferenceExpression:myField : java.lang.Class<java.lang.Integer>
+PsiReferenceExpression:myField : java.lang.Class<java.lang.Integer>
+PsiReferenceExpression:myField : java.lang.Class<java.lang.Integer>
+
+Conversions:
+
+New expression type changes:
+Fails:
+Set.class->java.lang.Class<java.lang.Integer>
+Set[].class->java.lang.Class<java.lang.Integer>
+int[].class->java.lang.Class<java.lang.Integer>
+void.class->java.lang.Class<java.lang.Integer>
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/after/Expr.java
new file mode 100644
index 000000000000..44edef75bfe4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/after/Expr.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Expr {
+ private Class<Integer> myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/before/Expr.java
new file mode 100644
index 000000000000..35a3d63f8dea
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitive/before/Expr.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/after/Expr.items
new file mode 100644
index 000000000000..cd609774cf24
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/after/Expr.items
@@ -0,0 +1,16 @@
+Types:
+PsiField:myField : java.lang.Class<int[]>
+PsiReferenceExpression:myField : java.lang.Class<int[]>
+PsiReferenceExpression:myField : java.lang.Class<int[]>
+PsiReferenceExpression:myField : java.lang.Class<int[]>
+PsiReferenceExpression:myField : java.lang.Class<int[]>
+PsiReferenceExpression:myField : java.lang.Class<int[]>
+
+Conversions:
+
+New expression type changes:
+Fails:
+Set.class->java.lang.Class<int[]>
+Set[].class->java.lang.Class<int[]>
+int.class->java.lang.Class<int[]>
+void.class->java.lang.Class<int[]>
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/after/Expr.java
new file mode 100644
index 000000000000..9939d2f3d410
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/after/Expr.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Expr {
+ private Class<int[]> myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/before/Expr.java
new file mode 100644
index 000000000000..35a3d63f8dea
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassPrimitiveArray/before/Expr.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/after/Expr.items
new file mode 100644
index 000000000000..0bda2fd18195
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/after/Expr.items
@@ -0,0 +1,17 @@
+Types:
+PsiField:myField : java.lang.Class
+PsiReferenceExpression:myField : java.lang.Class
+PsiReferenceExpression:myField : java.lang.Class
+PsiReferenceExpression:myField : java.lang.Class
+PsiReferenceExpression:myField : java.lang.Class
+PsiReferenceExpression:myField : java.lang.Class
+
+Conversions:
+Set.class -> $
+Set[].class -> $
+int.class -> $
+int[].class -> $
+void.class -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/after/Expr.java
new file mode 100644
index 000000000000..9edcf9d47a31
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/after/Expr.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Expr {
+ private Class myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/before/Expr.java
new file mode 100644
index 000000000000..35a3d63f8dea
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassRaw/before/Expr.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/after/Expr.items
new file mode 100644
index 000000000000..ee8fece53e89
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/after/Expr.items
@@ -0,0 +1,16 @@
+Types:
+PsiField:myField : java.lang.Class<java.util.Set>
+PsiReferenceExpression:myField : java.lang.Class<java.util.Set>
+PsiReferenceExpression:myField : java.lang.Class<java.util.Set>
+PsiReferenceExpression:myField : java.lang.Class<java.util.Set>
+PsiReferenceExpression:myField : java.lang.Class<java.util.Set>
+PsiReferenceExpression:myField : java.lang.Class<java.util.Set>
+
+Conversions:
+
+New expression type changes:
+Fails:
+Set[].class->java.lang.Class<java.util.Set>
+int.class->java.lang.Class<java.util.Set>
+int[].class->java.lang.Class<java.util.Set>
+void.class->java.lang.Class<java.util.Set>
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/after/Expr.java
new file mode 100644
index 000000000000..45fd995735ae
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/after/Expr.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Expr {
+ private Class<Set> myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/before/Expr.java
new file mode 100644
index 000000000000..35a3d63f8dea
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReference/before/Expr.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/after/Expr.items
new file mode 100644
index 000000000000..26be6c5d8e6f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/after/Expr.items
@@ -0,0 +1,16 @@
+Types:
+PsiField:myField : java.lang.Class<java.util.Set[]>
+PsiReferenceExpression:myField : java.lang.Class<java.util.Set[]>
+PsiReferenceExpression:myField : java.lang.Class<java.util.Set[]>
+PsiReferenceExpression:myField : java.lang.Class<java.util.Set[]>
+PsiReferenceExpression:myField : java.lang.Class<java.util.Set[]>
+PsiReferenceExpression:myField : java.lang.Class<java.util.Set[]>
+
+Conversions:
+
+New expression type changes:
+Fails:
+Set.class->java.lang.Class<java.util.Set[]>
+int.class->java.lang.Class<java.util.Set[]>
+int[].class->java.lang.Class<java.util.Set[]>
+void.class->java.lang.Class<java.util.Set[]>
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/after/Expr.java
new file mode 100644
index 000000000000..46b110d7f75f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/after/Expr.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Expr {
+ private Class<Set[]> myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/before/Expr.java
new file mode 100644
index 000000000000..35a3d63f8dea
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassReferenceArray/before/Expr.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/after/Expr.items
new file mode 100644
index 000000000000..61336d444497
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/after/Expr.items
@@ -0,0 +1,17 @@
+Types:
+PsiField:myField : java.lang.Class<? super java.util.AbstractSet[]>
+PsiReferenceExpression:myField : java.lang.Class<? super java.util.AbstractSet[]>
+PsiReferenceExpression:myField : java.lang.Class<? super java.util.AbstractSet[]>
+PsiReferenceExpression:myField : java.lang.Class<? super java.util.AbstractSet[]>
+PsiReferenceExpression:myField : java.lang.Class<? super java.util.AbstractSet[]>
+PsiReferenceExpression:myField : java.lang.Class<? super java.util.AbstractSet[]>
+
+Conversions:
+Set[].class -> $
+
+New expression type changes:
+Fails:
+Set.class->java.lang.Class<? super java.util.AbstractSet[]>
+int.class->java.lang.Class<? super java.util.AbstractSet[]>
+int[].class->java.lang.Class<? super java.util.AbstractSet[]>
+void.class->java.lang.Class<? super java.util.AbstractSet[]>
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/after/Expr.java
new file mode 100644
index 000000000000..3ae94c8c1228
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/after/Expr.java
@@ -0,0 +1,13 @@
+import java.util.AbstractSet;
+import java.util.Set;
+
+class Expr {
+ private Class<? super AbstractSet[]> myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/before/Expr.java
new file mode 100644
index 000000000000..1e5b26a44e4f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralClassSuper/before/Expr.java
@@ -0,0 +1,13 @@
+import java.util.AbstractSet;
+import java.util.Set;
+
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = int.class;
+ myField = int[].class;
+ myField = Set.class;
+ myField = Set[].class;
+ myField = void.class;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/after/Expr.items
new file mode 100644
index 000000000000..eb7229ef905e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/after/Expr.items
@@ -0,0 +1,36 @@
+Types:
+PsiField:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+PsiReferenceExpression:myField : double
+
+Conversions:
+'#' -> $
+043 -> $
+043F -> $
+043L -> $
+0x23 -> $
+0x23F -> $
+0x23L -> $
+35 -> $
+35F -> $
+35L -> $
+
+New expression type changes:
+Fails:
+"#"->double
+false->double
+null->double
+true->double
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/after/Expr.java
new file mode 100644
index 000000000000..a1fafc25fe6e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/after/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private double myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/before/Expr.java
new file mode 100644
index 000000000000..05b89dc47d4f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralDouble/before/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/after/Expr.items
new file mode 100644
index 000000000000..dcf1562d69b7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/after/Expr.items
@@ -0,0 +1,35 @@
+Types:
+PsiField:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+
+Conversions:
+'#' -> $
+043 -> $
+043L -> $
+0x23 -> $
+0x23F -> $
+0x23L -> $
+35 -> $
+35L -> $
+
+New expression type changes:
+Fails:
+"#"->float
+35.0->float
+false->float
+null->float
+true->float
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/after/Expr.java
new file mode 100644
index 000000000000..8210b283c426
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/after/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private float myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/before/Expr.java
new file mode 100644
index 000000000000..05b89dc47d4f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralFloat/before/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/after/Expr.items
new file mode 100644
index 000000000000..6969f1efd214
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/after/Expr.items
@@ -0,0 +1,33 @@
+Types:
+PsiField:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+
+Conversions:
+'#' -> $
+
+New expression type changes:
+Fails:
+"#"->int
+043F->int
+043L->int
+0x23L->int
+35.0->int
+35F->int
+35L->int
+false->int
+null->int
+true->int
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/after/Expr.java
new file mode 100644
index 000000000000..51bce6ac6430
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/after/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private int myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/before/Expr.java
new file mode 100644
index 000000000000..05b89dc47d4f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralInt/before/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/after/Expr.items
new file mode 100644
index 000000000000..71718fa25bb1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/after/Expr.items
@@ -0,0 +1,34 @@
+Types:
+PsiField:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+
+Conversions:
+'#' -> $
+043 -> $
+0x23 -> $
+0x23F -> $
+35 -> $
+
+New expression type changes:
+Fails:
+"#"->long
+043F->long
+35.0->long
+35F->long
+false->long
+null->long
+true->long
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/after/Expr.java
new file mode 100644
index 000000000000..1556e9f05ffb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/after/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private long myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/before/Expr.java
new file mode 100644
index 000000000000..05b89dc47d4f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralLong/before/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/after/Expr.items
new file mode 100644
index 000000000000..f282b956c933
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/after/Expr.items
@@ -0,0 +1,37 @@
+Types:
+PsiField:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+
+Conversions:
+
+New expression type changes:
+Fails:
+"#"->short
+'#'->short
+043->short
+043F->short
+043L->short
+0x23->short
+0x23F->short
+0x23L->short
+35->short
+35.0->short
+35F->short
+35L->short
+false->short
+null->short
+true->short
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/after/Expr.java
new file mode 100644
index 000000000000..39b549b335bb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/after/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private short myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/before/Expr.java
new file mode 100644
index 000000000000..05b89dc47d4f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralShort/before/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/after/Expr.items
new file mode 100644
index 000000000000..6bb1edafdfa8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/after/Expr.items
@@ -0,0 +1,35 @@
+Types:
+PsiField:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+PsiReferenceExpression:myField : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
+'#'->java.lang.String
+043->java.lang.String
+043F->java.lang.String
+043L->java.lang.String
+0x23->java.lang.String
+0x23F->java.lang.String
+0x23L->java.lang.String
+35->java.lang.String
+35.0->java.lang.String
+35F->java.lang.String
+35L->java.lang.String
+false->java.lang.String
+true->java.lang.String
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/after/Expr.java
new file mode 100644
index 000000000000..3adc44418ad4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/after/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private String myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/before/Expr.java
new file mode 100644
index 000000000000..05b89dc47d4f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprLiteralString/before/Expr.java
@@ -0,0 +1,27 @@
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = null;
+
+ myField = false;
+ myField = true;
+
+ myField = 043;
+ myField = 35;
+ myField = 0x23;
+
+ myField = '#';
+
+ myField = 043L;
+ myField = 35L;
+ myField = 0x23L;
+
+ myField = 043F;
+ myField = 35F;
+ myField = 0x23F;
+
+ myField = 35.0;
+
+ myField = "#";
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/after/Expr.items
new file mode 100644
index 000000000000..444531918ce0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/after/Expr.items
@@ -0,0 +1,22 @@
+Types:
+PsiArrayInitializerExpression:{pfc} : FaceParent[][]
+PsiArrayInitializerExpression:{pfc} : FaceParent[][]
+PsiArrayInitializerExpression:{{pfc}} : FaceParent[][][]
+PsiField:myArrayOne : FaceParent[][]
+PsiField:myArrayTwo : FaceParent[][][]
+PsiNewExpression:new FaceChild[][][]{{pfc}} : FaceParent[][][]
+PsiNewExpression:new FaceChild[][]{pfc} : FaceParent[][]
+PsiParameter:pfc : FaceParent[]
+PsiReferenceExpression:myArrayOne : FaceParent[][]
+PsiReferenceExpression:myArrayTwo : FaceParent[][][]
+PsiReferenceExpression:pfc : FaceParent[]
+PsiReferenceExpression:pfc : FaceParent[]
+
+Conversions:
+pfc -> $
+pfc -> $
+
+New expression type changes:
+new FaceChild[][][]{{pfc}} -> FaceParent[][][]
+new FaceChild[][]{pfc} -> FaceParent[][]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/after/Expr.java
new file mode 100644
index 000000000000..570367998bd1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/after/Expr.java
@@ -0,0 +1,11 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+
+class Expr {
+ private FaceParent[][] myArrayOne;
+ private FaceParent[][][] myArrayTwo;
+ public void meth(FaceParent[] pfc) {
+ myArrayOne = new FaceParent[][]{pfc};
+ myArrayTwo = new FaceParent[][][]{{pfc}};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/before/Expr.java
new file mode 100644
index 000000000000..d88808766d7d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Lvalue/before/Expr.java
@@ -0,0 +1,11 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+
+class Expr {
+ private FaceChild[][] myArrayOne;
+ private FaceChild[][][] myArrayTwo;
+ public void meth(FaceChild[] pfc) {
+ myArrayOne = new FaceChild[][]{pfc};
+ myArrayTwo = new FaceChild[][][]{{pfc}};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/after/Expr.items
new file mode 100644
index 000000000000..4b4b9036abb0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/after/Expr.items
@@ -0,0 +1,14 @@
+Types:
+PsiArrayInitializerExpression:{null} : ClassParent[][]
+PsiArrayInitializerExpression:{pfc} : ClassParent[][]
+PsiField:myField : ClassParent[][][]
+PsiNewExpression:new FaceChild[][][]{{pfc}, {null}, null} : ClassParent[][][]
+PsiParameter:pfc : ClassParent[]
+PsiReferenceExpression:myField : ClassParent[][][]
+PsiReferenceExpression:pfc : ClassParent[]
+
+Conversions:
+
+New expression type changes:
+new FaceChild[][][]{{pfc}, {null}, null} -> ClassParent[][][]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/after/Expr.java
new file mode 100644
index 000000000000..fc54bb6ca9d6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/after/Expr.java
@@ -0,0 +1,11 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Expr {
+ private ClassParent[][][] myField;
+ public void meth(ClassParent[] pfc) {
+ myField = new ClassParent[][][]{{pfc}, {null}, null};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/before/Expr.java
new file mode 100644
index 000000000000..8c4093e44d75
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayArray2Rvalue/before/Expr.java
@@ -0,0 +1,11 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Expr {
+ private FaceChild[][][] myField;
+ public void meth(FaceChild[] pfc) {
+ myField = new FaceChild[][][]{{pfc}, {null}, null};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/after/Expr.items
new file mode 100644
index 000000000000..825ef4f10f19
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/after/Expr.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:myField : java.util.Set<java.lang.Integer>[]
+PsiReferenceExpression:myField : java.util.Set<java.lang.Integer>[]
+
+Conversions:
+
+New expression type changes:
+Fails:
+new Set[1]->java.util.Set<java.lang.Integer>[]
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/after/Expr.java
new file mode 100644
index 000000000000..5083896eb293
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/after/Expr.java
@@ -0,0 +1,8 @@
+import java.util.Set;
+
+class Expr {
+ private Set<Integer>[] myField;
+ public void meth() {
+ myField = new Set[1];
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/before/Expr.java
new file mode 100644
index 000000000000..c2301a434ec9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayGen2Rvalue/before/Expr.java
@@ -0,0 +1,8 @@
+import java.util.Set;
+
+class Expr {
+ private Set[] myField;
+ public void meth() {
+ myField = new Set[1];
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/after/Expr.items
new file mode 100644
index 000000000000..d5976f11c486
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/after/Expr.items
@@ -0,0 +1,25 @@
+Types:
+PsiArrayInitializerExpression:{!p} : int[]
+PsiArrayInitializerExpression:{p} : int[]
+PsiArrayInitializerExpression:{p} : int[]
+PsiArrayInitializerExpression:{{p}, {!p}} : int[][]
+PsiField:myArrayOne : int[]
+PsiField:myArrayTwo : int[][]
+PsiNewExpression:new boolean[][]{{p}, {!p}} : int[][]
+PsiNewExpression:new boolean[]{p} : int[]
+PsiParameter:p : int
+PsiReferenceExpression:myArrayOne : int[]
+PsiReferenceExpression:myArrayTwo : int[][]
+PsiReferenceExpression:p : int
+PsiReferenceExpression:p : int
+PsiReferenceExpression:p : int
+
+Conversions:
+p -> $
+p -> $
+
+New expression type changes:
+new boolean[][]{{p}, {!p}} -> int[][]
+new boolean[]{p} -> int[]
+Fails:
+!p->int
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/after/Expr.java
new file mode 100644
index 000000000000..0c6c31bf4929
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/after/Expr.java
@@ -0,0 +1,8 @@
+class Expr {
+ private int[] myArrayOne;
+ private int[][] myArrayTwo;
+ public void meth(int p) {
+ myArrayOne = new int[]{p};
+ myArrayTwo = new int[][]{{p}, {!p}};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/before/Expr.java
new file mode 100644
index 000000000000..e7724ca422f4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Lvalue/before/Expr.java
@@ -0,0 +1,8 @@
+class Expr {
+ private boolean[] myArrayOne;
+ private boolean[][] myArrayTwo;
+ public void meth(boolean p) {
+ myArrayOne = new boolean[]{p};
+ myArrayTwo = new boolean[][]{{p}, {!p}};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/after/Expr.items
new file mode 100644
index 000000000000..5f371c0c6430
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/after/Expr.items
@@ -0,0 +1,21 @@
+Types:
+PsiArrayInitializerExpression:{!p} : int[]
+PsiArrayInitializerExpression:{0} : int[]
+PsiArrayInitializerExpression:{p} : int[]
+PsiArrayInitializerExpression:{true} : int[]
+PsiArrayInitializerExpression:{{p}, {!p}, {true}, {0}} : int[][]
+PsiField:myField : int[][]
+PsiNewExpression:new boolean[][]{{p}, {!p}, {true}, {0}} : int[][]
+PsiParameter:p : int
+PsiReferenceExpression:myField : int[][]
+PsiReferenceExpression:p : int
+PsiReferenceExpression:p : int
+
+Conversions:
+p -> $
+
+New expression type changes:
+new boolean[][]{{p}, {!p}, {true}, {0}} -> int[][]
+Fails:
+!p->int
+true->int
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/after/Expr.java
new file mode 100644
index 000000000000..58017644820c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/after/Expr.java
@@ -0,0 +1,6 @@
+class Expr {
+ private int[][] myField;
+ public void meth(int p) {
+ myField = new int[][]{{p}, {!p}, {true}, {0}};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/before/Expr.java
new file mode 100644
index 000000000000..cb1e0d64aa4b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayPrimitive2Rvalue/before/Expr.java
@@ -0,0 +1,6 @@
+class Expr {
+ private boolean[][] myField;
+ public void meth(boolean p) {
+ myField = new boolean[][]{{p}, {!p}, {true}, {0}};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/after/Expr.items
new file mode 100644
index 000000000000..a1472a46da67
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/after/Expr.items
@@ -0,0 +1,34 @@
+Types:
+PsiArrayInitializerExpression:{pcc} : FaceParent[]
+PsiArrayInitializerExpression:{pcp} : FaceParent[]
+PsiArrayInitializerExpression:{pfc, pcp, pcc} : FaceParent[]
+PsiArrayInitializerExpression:{pfc} : FaceParent[]
+PsiArrayInitializerExpression:{{pfc}, {pcp}, {pcc}} : FaceParent[][]
+PsiField:myArrayOne : FaceParent[]
+PsiField:myArrayTwo : FaceParent[][]
+PsiNewExpression:new FaceChild[][]{{pfc}, {pcp}, {pcc}} : FaceParent[][]
+PsiNewExpression:new FaceChild[]{pfc, pcp, pcc} : FaceParent[]
+PsiParameter:pcc : ClassChild
+PsiParameter:pcp : ClassParent
+PsiParameter:pfc : FaceParent
+PsiReferenceExpression:myArrayOne : FaceParent[]
+PsiReferenceExpression:myArrayTwo : FaceParent[][]
+PsiReferenceExpression:pcc : ClassChild
+PsiReferenceExpression:pcc : ClassChild
+PsiReferenceExpression:pcp : ClassParent
+PsiReferenceExpression:pcp : ClassParent
+PsiReferenceExpression:pfc : FaceParent
+PsiReferenceExpression:pfc : FaceParent
+
+Conversions:
+pcc -> $
+pcc -> $
+pcp -> $
+pcp -> $
+pfc -> $
+pfc -> $
+
+New expression type changes:
+new FaceChild[][]{{pfc}, {pcp}, {pcc}} -> FaceParent[][]
+new FaceChild[]{pfc, pcp, pcc} -> FaceParent[]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/after/Expr.java
new file mode 100644
index 000000000000..bfae5390508e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/after/Expr.java
@@ -0,0 +1,13 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Expr {
+ private FaceParent[] myArrayOne;
+ private FaceParent[][] myArrayTwo;
+ public void meth(FaceParent pfc, ClassParent pcp, ClassChild pcc) {
+ myArrayOne = new FaceParent[]{pfc, pcp, pcc};
+ myArrayTwo = new FaceParent[][]{{pfc}, {pcp}, {pcc}};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/before/Expr.java
new file mode 100644
index 000000000000..5cb70f7265f7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Lvalue/before/Expr.java
@@ -0,0 +1,13 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Expr {
+ private FaceChild[] myArrayOne;
+ private FaceChild[][] myArrayTwo;
+ public void meth(FaceChild pfc, ClassParent pcp, ClassChild pcc) {
+ myArrayOne = new FaceChild[]{pfc, pcp, pcc};
+ myArrayTwo = new FaceChild[][]{{pfc}, {pcp}, {pcc}};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/after/Expr.items
new file mode 100644
index 000000000000..4dabd7d9161e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/after/Expr.items
@@ -0,0 +1,18 @@
+Types:
+PsiArrayInitializerExpression:{null} : ClassParent[]
+PsiArrayInitializerExpression:{pcc} : ClassParent[]
+PsiArrayInitializerExpression:{pcp} : ClassParent[]
+PsiArrayInitializerExpression:{pfc} : ClassParent[]
+PsiField:myField : ClassParent[][]
+PsiNewExpression:new FaceChild[][]{{pfc}, {pcp}, {pcc}, {null}} : ClassParent[][]
+PsiParameter:pcc : ClassChild
+PsiParameter:pfc : ClassParent
+PsiReferenceExpression:myField : ClassParent[][]
+PsiReferenceExpression:pcc : ClassChild
+PsiReferenceExpression:pfc : ClassParent
+
+Conversions:
+
+New expression type changes:
+new FaceChild[][]{{pfc}, {pcp}, {pcc}, {null}} -> ClassParent[][]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/after/Expr.java
new file mode 100644
index 000000000000..f2d53b50f272
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/after/Expr.java
@@ -0,0 +1,11 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Expr {
+ private ClassParent[][] myField;
+ public void meth(ClassParent pfc, ClassParent pcp, ClassChild pcc) {
+ myField = new ClassParent[][]{{pfc}, {pcp}, {pcc}, {null}};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/before/Expr.java
new file mode 100644
index 000000000000..9e973b7925a0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewArrayReftype2Rvalue/before/Expr.java
@@ -0,0 +1,11 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Expr {
+ private FaceChild[][] myField;
+ public void meth(FaceChild pfc, ClassParent pcp, ClassChild pcc) {
+ myField = new FaceChild[][]{{pfc}, {pcp}, {pcc}, {null}};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/after/Expr.items
new file mode 100644
index 000000000000..d19a8ab094b7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/after/Expr.items
@@ -0,0 +1,17 @@
+Types:
+PsiField:myField : java.util.Set<Subject>
+PsiNewExpression:new Set() : java.util.Set
+PsiNewExpression:new Set<Ancestor>() : java.util.Set<Subject>
+PsiNewExpression:new Set<Descendant>() : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+
+Conversions:
+
+New expression type changes:
+new Set() -> java.util.Set
+new Set<Ancestor>() -> java.util.Set<Subject>
+new Set<Descendant>() -> java.util.Set<Subject>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/after/Expr.java
new file mode 100644
index 000000000000..aab73939b929
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/after/Expr.java
@@ -0,0 +1,15 @@
+import java.util.Set;
+
+class Ancestor {}
+class Subject extends Ancestor {}
+class Descendant extends Subject {}
+
+class Expr {
+ private Set<Subject> myField;
+ public void meth() {
+ myField = new Set();
+ myField = new Set<Subject>();
+ myField = new Set<Subject>();
+ myField = new Set<Subject>();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/before/Expr.java
new file mode 100644
index 000000000000..e38d8aa7229f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGen/before/Expr.java
@@ -0,0 +1,15 @@
+import java.util.Set;
+
+class Ancestor {}
+class Subject extends Ancestor {}
+class Descendant extends Subject {}
+
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = new Set();
+ myField = new Set<Ancestor>();
+ myField = new Set<Subject>();
+ myField = new Set<Descendant>();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/after/Expr.items
new file mode 100644
index 000000000000..9003258e73a5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/after/Expr.items
@@ -0,0 +1,16 @@
+Types:
+PsiField:myField : java.util.Set<? extends Subject>
+PsiNewExpression:new Set() : java.util.Set
+PsiNewExpression:new Set<Ancestor>() : java.util.Set<Subject>
+PsiNewExpression:new Set<Subject>() : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<? extends Subject>
+PsiReferenceExpression:myField : java.util.Set<? extends Subject>
+PsiReferenceExpression:myField : java.util.Set<? extends Subject>
+
+Conversions:
+
+New expression type changes:
+new Set() -> java.util.Set
+new Set<Ancestor>() -> java.util.Set<Subject>
+new Set<Subject>() -> java.util.Set<Subject>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/after/Expr.java
new file mode 100644
index 000000000000..f939534d6972
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/after/Expr.java
@@ -0,0 +1,15 @@
+import java.util.Set;
+
+class Ancestor {}
+class Subject extends Ancestor {}
+class Descendant extends Subject {}
+
+class Expr {
+ private Set<? extends Subject> myField;
+ public void meth() {
+ myField = new Set();
+ myField = new Set<Subject>();
+ myField = new Set<Subject>();
+ // myField = new Set<Descendant>();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/before/Expr.java
new file mode 100644
index 000000000000..e65ce8b9a8fc
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenExtends/before/Expr.java
@@ -0,0 +1,15 @@
+import java.util.Set;
+
+class Ancestor {}
+class Subject extends Ancestor {}
+class Descendant extends Subject {}
+
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = new Set();
+ myField = new Set<Ancestor>();
+ myField = new Set<Subject>();
+ // myField = new Set<Descendant>();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/after/Expr.items
new file mode 100644
index 000000000000..ca323d833a2c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/after/Expr.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:myField : java.util.Set<? super Subject>
+PsiNewExpression:new Set() : java.util.Set
+PsiReferenceExpression:myField : java.util.Set<? super Subject>
+
+Conversions:
+
+New expression type changes:
+new Set() -> java.util.Set
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/after/Expr.java
new file mode 100644
index 000000000000..4f5a29eecc6c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/after/Expr.java
@@ -0,0 +1,15 @@
+import java.util.Set;
+
+class Ancestor {}
+class Subject extends Ancestor {}
+class Descendant extends Subject {}
+
+class Expr {
+ private Set<? super Subject> myField;
+ public void meth() {
+ myField = new Set();
+ // myField = new Set<Ancestor>();
+ // myField = new Set<Subject>();
+ // myField = new Set<Descendant>();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/before/Expr.java
new file mode 100644
index 000000000000..73a22ebeccde
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewGenSuper/before/Expr.java
@@ -0,0 +1,15 @@
+import java.util.Set;
+
+class Ancestor {}
+class Subject extends Ancestor {}
+class Descendant extends Subject {}
+
+class Expr {
+ private Object myField;
+ public void meth() {
+ myField = new Set();
+ // myField = new Set<Ancestor>();
+ // myField = new Set<Subject>();
+ // myField = new Set<Descendant>();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/after/Expr.items
new file mode 100644
index 000000000000..cab7f8173076
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/after/Expr.items
@@ -0,0 +1,27 @@
+Types:
+PsiField:myField : Expr.Subject
+PsiNewExpression:new Descendant() : Expr.Descendant
+PsiNewExpression:new Descendant() {} : Expr.Descendant
+PsiNewExpression:new Subject() {} : Expr.Subject
+PsiNewExpression:this.new Descendant() : Expr.Descendant
+PsiReferenceExpression:myField : Expr.Subject
+PsiReferenceExpression:myField : Expr.Subject
+PsiReferenceExpression:myField : Expr.Subject
+PsiReferenceExpression:myField : Expr.Subject
+PsiReferenceExpression:myField : Expr.Subject
+PsiReferenceExpression:myField : Expr.Subject
+PsiReferenceExpression:myField : Expr.Subject
+PsiReferenceExpression:myField : Expr.Subject
+PsiReferenceExpression:myField : Expr.Subject
+
+Conversions:
+
+New expression type changes:
+new Descendant() -> Expr.Descendant
+new Descendant() {} -> Expr.Descendant
+new Subject() {} -> Expr.Subject
+this.new Descendant() -> Expr.Descendant
+Fails:
+new Ancestor()->Expr.Subject
+new Ancestor() {}->Expr.Subject
+this.new Ancestor()->Expr.Subject
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/after/Expr.java
new file mode 100644
index 000000000000..5cc9c87ec7e4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/after/Expr.java
@@ -0,0 +1,21 @@
+class Expr {
+ private class Ancestor {}
+ private class Subject extends Ancestor {}
+ private class Descendant extends Subject {}
+
+ private Subject myField;
+
+ public void meth() {
+ myField = new Ancestor();
+ myField = this.new Ancestor();
+ myField = new Ancestor() {};
+
+ myField = new Subject();
+ myField = this.new Subject();
+ myField = new Subject() {};
+
+ myField = new Descendant();
+ myField = this.new Descendant();
+ myField = new Descendant() {};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/before/Expr.java
new file mode 100644
index 000000000000..ed03e4ddc1d3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprNewReference/before/Expr.java
@@ -0,0 +1,21 @@
+class Expr {
+ private class Ancestor {}
+ private class Subject extends Ancestor {}
+ private class Descendant extends Subject {}
+
+ private Ancestor myField;
+
+ public void meth() {
+ myField = new Ancestor();
+ myField = this.new Ancestor();
+ myField = new Ancestor() {};
+
+ myField = new Subject();
+ myField = this.new Subject();
+ myField = new Subject() {};
+
+ myField = new Descendant();
+ myField = this.new Descendant();
+ myField = new Descendant() {};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/after/Expr.items
new file mode 100644
index 000000000000..e91631f5c332
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/after/Expr.items
@@ -0,0 +1,9 @@
+Types:
+PsiMethod:meth : java.lang.String
+PsiParameter:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/after/Expr.java
new file mode 100644
index 000000000000..37c310d405e3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/after/Expr.java
@@ -0,0 +1,5 @@
+class Expr {
+ public String meth(String p) {
+ return p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/before/Expr.java
new file mode 100644
index 000000000000..76e26b5c15bb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Lvalue/before/Expr.java
@@ -0,0 +1,5 @@
+class Expr {
+ public int meth(int p) {
+ return p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/after/Expr.items
new file mode 100644
index 000000000000..e91631f5c332
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/after/Expr.items
@@ -0,0 +1,9 @@
+Types:
+PsiMethod:meth : java.lang.String
+PsiParameter:p : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/after/Expr.java
new file mode 100644
index 000000000000..37c310d405e3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/after/Expr.java
@@ -0,0 +1,5 @@
+class Expr {
+ public String meth(String p) {
+ return p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/before/Expr.java
new file mode 100644
index 000000000000..76e26b5c15bb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprReturn2Rvalue/before/Expr.java
@@ -0,0 +1,5 @@
+class Expr {
+ public int meth(int p) {
+ return p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/after/Expr.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/after/Expr.items
new file mode 100644
index 000000000000..6e445ca2c431
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/after/Expr.items
@@ -0,0 +1,10 @@
+Types:
+PsiLocalVariable:v : java.lang.String
+PsiParameter:pd : java.lang.String
+PsiReferenceExpression:pd : java.lang.String
+PsiReferenceExpression:pd : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/after/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/after/Expr.java
new file mode 100644
index 000000000000..1e75f910f300
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/after/Expr.java
@@ -0,0 +1,5 @@
+class Expr {
+ public void meth(String pd, int pp) {
+ String v = pp > 0 ? pd : pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/before/Expr.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/before/Expr.java
new file mode 100644
index 000000000000..3a714e5334a4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/exprTernary/before/Expr.java
@@ -0,0 +1,5 @@
+class Expr {
+ public void meth(double pd, int pp) {
+ double v = pp > 0 ? pd : pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/after/Overriding.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/after/Overriding.java
new file mode 100644
index 000000000000..9fb5b2161ba1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/after/Overriding.java
@@ -0,0 +1,13 @@
+class Parent {
+ private byte myInt;
+ public byte getInt() {
+ return myInt;
+ }
+}
+
+class Child extends Parent {
+ private byte myInt;
+ public byte getInt() {
+ return myInt;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/after/Parent.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/after/Parent.items
new file mode 100644
index 000000000000..0857363a2808
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/after/Parent.items
@@ -0,0 +1,12 @@
+Types:
+PsiField:myInt : byte
+PsiField:myInt : byte
+PsiMethod:getInt : byte
+PsiMethod:getInt : byte
+PsiReferenceExpression:myInt : byte
+PsiReferenceExpression:myInt : byte
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/before/Overriding.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/before/Overriding.java
new file mode 100644
index 000000000000..212ce8080636
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingDown/before/Overriding.java
@@ -0,0 +1,13 @@
+class Parent {
+ private int myInt;
+ public int getInt() {
+ return myInt;
+ }
+}
+
+class Child extends Parent {
+ private int myInt;
+ public int getInt() {
+ return myInt;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/after/Child.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/after/Child.items
new file mode 100644
index 000000000000..0857363a2808
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/after/Child.items
@@ -0,0 +1,12 @@
+Types:
+PsiField:myInt : byte
+PsiField:myInt : byte
+PsiMethod:getInt : byte
+PsiMethod:getInt : byte
+PsiReferenceExpression:myInt : byte
+PsiReferenceExpression:myInt : byte
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/after/Overriding.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/after/Overriding.java
new file mode 100644
index 000000000000..9fb5b2161ba1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/after/Overriding.java
@@ -0,0 +1,13 @@
+class Parent {
+ private byte myInt;
+ public byte getInt() {
+ return myInt;
+ }
+}
+
+class Child extends Parent {
+ private byte myInt;
+ public byte getInt() {
+ return myInt;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/before/Overriding.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/before/Overriding.java
new file mode 100644
index 000000000000..212ce8080636
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/overridingUp/before/Overriding.java
@@ -0,0 +1,13 @@
+class Parent {
+ private int myInt;
+ public int getInt() {
+ return myInt;
+ }
+}
+
+class Child extends Parent {
+ private int myInt;
+ public int getInt() {
+ return myInt;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/after/Spec.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/after/Spec.items
new file mode 100644
index 000000000000..4428712f4683
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/after/Spec.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:p : java.util.Set
+
+Conversions:
+#meth(double) -> PsiMethod:meth
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/after/Spec.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/after/Spec.java
new file mode 100644
index 000000000000..b6c748c1e749
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/after/Spec.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Spec {
+ /**
+ * @see #meth(java.util.Set)
+ */
+ public void methRef() {
+ }
+
+ public void meth(Set p) {
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/before/Spec.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/before/Spec.java
new file mode 100644
index 000000000000..45080dc2dec1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/specJavadoc/before/Spec.java
@@ -0,0 +1,12 @@
+import java.util.Set;
+
+class Spec {
+ /**
+ * @see #meth(double)
+ */
+ public void methRef() {
+ }
+
+ public void meth(double p) {
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/after/Spec.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/after/Spec.items
new file mode 100644
index 000000000000..8ffc5c9a6744
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/after/Spec.items
@@ -0,0 +1,7 @@
+Types:
+PsiField:myField : boolean
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/after/Spec.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/after/Spec.java
new file mode 100644
index 000000000000..03d0dc267246
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/after/Spec.java
@@ -0,0 +1,3 @@
+class Spec {
+ private boolean myField;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/before/Spec.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/before/Spec.java
new file mode 100644
index 000000000000..36a606c54faa
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/specNotUsed/before/Spec.java
@@ -0,0 +1,3 @@
+class Spec {
+ private int myField;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/after/Type.items
new file mode 100644
index 000000000000..e56da57e1062
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/after/Type.items
@@ -0,0 +1,13 @@
+Types:
+PsiField:myDescendants : Subject[]
+PsiParameter:p : Subject[]
+PsiReferenceExpression:myDescendants : Subject[]
+PsiReferenceExpression:p : Subject[]
+PsiReferenceExpression:p : Subject[]
+PsiReferenceExpression:p : Subject[]
+
+Conversions:
+myAncestors -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/after/Type.java
new file mode 100644
index 000000000000..5b667afd7284
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/after/Type.java
@@ -0,0 +1,15 @@
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Ancestor[] myAncestors;
+ private Subject[] mySubjects;
+ private Subject[] myDescendants;
+
+ public void meth(Subject[] p) {
+ myAncestors = p;
+ mySubjects = p;
+ myDescendants = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/before/Type.java
new file mode 100644
index 000000000000..6c0ad8e907ae
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Lvalue/before/Type.java
@@ -0,0 +1,15 @@
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Ancestor[] myAncestors;
+ private Subject[] mySubjects;
+ private Descendant[] myDescendants;
+
+ public void meth(Descendant[] p) {
+ myAncestors = p;
+ mySubjects = p;
+ myDescendants = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/after/Type.items
new file mode 100644
index 000000000000..aa0545cd97f1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/after/Type.items
@@ -0,0 +1,13 @@
+Types:
+PsiField:myField : Subject[][]
+PsiParameter:pa : Subject[][]
+PsiReferenceExpression:myField : Subject[][]
+PsiReferenceExpression:myField : Subject[][]
+PsiReferenceExpression:myField : Subject[][]
+PsiReferenceExpression:pa : Subject[][]
+
+Conversions:
+pd -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/after/Type.java
new file mode 100644
index 000000000000..1dc9d19b69d7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/after/Type.java
@@ -0,0 +1,12 @@
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Subject[][] myField;
+ public void meth(Subject[][] pa, Subject[][] ps, Descendant[][] pd) {
+ myField = pa;
+ myField = ps;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/before/Type.java
new file mode 100644
index 000000000000..b84f5fada9b6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayReftype2Rvalue/before/Type.java
@@ -0,0 +1,12 @@
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Ancestor[][] myField;
+ public void meth(Ancestor[][] pa, Subject[][] ps, Descendant[][] pd) {
+ myField = pa;
+ myField = ps;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/after/Type.items
new file mode 100644
index 000000000000..bfcf79449245
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/after/Type.items
@@ -0,0 +1,16 @@
+Types:
+PsiField:myHolder : Holder[]
+PsiParameter:p : Holder[]
+PsiReferenceExpression:myHolder : Holder[]
+PsiReferenceExpression:p : Holder[]
+PsiReferenceExpression:p : Holder[]
+PsiReferenceExpression:p : Holder[]
+PsiReferenceExpression:p : Holder[]
+
+Conversions:
+myCloneable -> $
+myObject -> $
+mySerializable -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/after/Type.java
new file mode 100644
index 000000000000..ea67626d3e12
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/after/Type.java
@@ -0,0 +1,15 @@
+class Holder implements Cloneable, java.io.Serializable {}
+
+class Type {
+ private Object myObject;
+ private Cloneable myCloneable;
+ private java.io.Serializable mySerializable;
+ private Holder[] myHolder;
+
+ public void meth(Holder[] p) {
+ myObject = p;
+ myCloneable = p;
+ mySerializable = p;
+ myHolder = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/before/Type.java
new file mode 100644
index 000000000000..41bb17f7fec2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayRoots2Lvalue/before/Type.java
@@ -0,0 +1,15 @@
+class Holder implements Cloneable, java.io.Serializable {}
+
+class Type {
+ private Object myObject;
+ private Cloneable myCloneable;
+ private java.io.Serializable mySerializable;
+ private Holder myHolder;
+
+ public void meth(Holder p) {
+ myObject = p;
+ myCloneable = p;
+ mySerializable = p;
+ myHolder = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/after/Type.items
new file mode 100644
index 000000000000..9bcbf6e3ccf2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/after/Type.items
@@ -0,0 +1,13 @@
+Types:
+PsiField:myDescendants : Subject[]
+PsiParameter:p : Subject...
+PsiReferenceExpression:myDescendants : Subject[]
+PsiReferenceExpression:p : Subject[]
+PsiReferenceExpression:p : Subject[]
+PsiReferenceExpression:p : Subject[]
+
+Conversions:
+myAncestors -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/after/Type.java
new file mode 100644
index 000000000000..82714edc14eb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/after/Type.java
@@ -0,0 +1,15 @@
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Ancestor[] myAncestors;
+ private Subject[] mySubjects;
+ private Subject[] myDescendants;
+
+ public void meth(Subject... p) {
+ myAncestors = p;
+ mySubjects = p;
+ myDescendants = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/before/Type.java
new file mode 100644
index 000000000000..6c0ad8e907ae
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2Lvalue/before/Type.java
@@ -0,0 +1,15 @@
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Ancestor[] myAncestors;
+ private Subject[] mySubjects;
+ private Descendant[] myDescendants;
+
+ public void meth(Descendant[] p) {
+ myAncestors = p;
+ mySubjects = p;
+ myDescendants = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/after/Type.items
new file mode 100644
index 000000000000..8e16567f6b52
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/after/Type.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:myField : Descendant[]
+PsiParameter:p : Descendant[]
+PsiReferenceExpression:myField : Descendant[]
+PsiReferenceExpression:p : Descendant[]
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/after/Type.java
new file mode 100644
index 000000000000..b14ffa0b66b9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/after/Type.java
@@ -0,0 +1,10 @@
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Descendant[] myField;
+ public void meth(Descendant[] p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/before/Type.java
new file mode 100644
index 000000000000..299d07095294
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvalueNeg/before/Type.java
@@ -0,0 +1,10 @@
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Ancestor[] myField;
+ public void meth(Subject... p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/after/Type.items
new file mode 100644
index 000000000000..fa58313766a2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/after/Type.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:myField : Subject[]
+PsiReferenceExpression:myField : Subject[]
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/after/Type.java
new file mode 100644
index 000000000000..b17f19ce9366
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/after/Type.java
@@ -0,0 +1,10 @@
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Subject[] myField;
+ public void meth(Subject... p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/before/Type.java
new file mode 100644
index 000000000000..299d07095294
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeArrayVararg2RvaluePos/before/Type.java
@@ -0,0 +1,10 @@
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Ancestor[] myField;
+ public void meth(Subject... p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/after/Type.items
new file mode 100644
index 000000000000..d2a5bdf18da5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/after/Type.items
@@ -0,0 +1,11 @@
+Types:
+PsiParameter:p : java.lang.Boolean
+PsiReferenceExpression:p : java.lang.Boolean
+PsiReferenceExpression:p : java.lang.Boolean
+
+Conversions:
+myField -> $
+myFieldSuper3 -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/after/Type.java
new file mode 100644
index 000000000000..256ad8ae87ba
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/after/Type.java
@@ -0,0 +1,8 @@
+class Type {
+ private boolean myField;
+ private Object myFieldSuper3;
+ public void meth(Boolean p) {
+ myField = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/before/Type.java
new file mode 100644
index 000000000000..e27196d88750
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Lvalue/before/Type.java
@@ -0,0 +1,8 @@
+class Type {
+ private boolean myField;
+ private Object myFieldSuper3;
+ public void meth(boolean p) {
+ myField = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/after/Type.items
new file mode 100644
index 000000000000..ddbe17fb4ffc
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/after/Type.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:myField : boolean
+PsiReferenceExpression:myField : boolean
+
+Conversions:
+p -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/after/Type.java
new file mode 100644
index 000000000000..d58f3df69336
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/after/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private boolean myField;
+ public void meth(Boolean p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/before/Type.java
new file mode 100644
index 000000000000..fcfe89fe9eca
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxBoolean2Rvalue/before/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private Boolean myField;
+ public void meth(Boolean p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/after/Type.items
new file mode 100644
index 000000000000..1c80a5546782
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/after/Type.items
@@ -0,0 +1,15 @@
+Types:
+PsiParameter:p : java.lang.Byte
+PsiReferenceExpression:p : java.lang.Byte
+PsiReferenceExpression:p : java.lang.Byte
+PsiReferenceExpression:p : java.lang.Byte
+PsiReferenceExpression:p : java.lang.Byte
+
+Conversions:
+myField -> $
+myFieldSuper1 -> $
+myFieldSuper2 -> $
+myFieldSuper3 -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/after/Type.java
new file mode 100644
index 000000000000..40e19f5b4a68
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/after/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private byte myField;
+ private short myFieldSuper1;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(Byte p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/before/Type.java
new file mode 100644
index 000000000000..c525d82e6f19
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Lvalue/before/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private byte myField;
+ private short myFieldSuper1;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(byte p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/after/Type.items
new file mode 100644
index 000000000000..192b82591e68
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/after/Type.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:myField : byte
+PsiReferenceExpression:myField : byte
+
+Conversions:
+p -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/after/Type.java
new file mode 100644
index 000000000000..435b929c8591
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/after/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private byte myField;
+ public void meth(Byte p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/before/Type.java
new file mode 100644
index 000000000000..c0c7993580df
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxByte2Rvalue/before/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private Byte myField;
+ public void meth(Byte p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/after/Type.items
new file mode 100644
index 000000000000..3499c81915b3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/after/Type.items
@@ -0,0 +1,13 @@
+Types:
+PsiParameter:p : java.lang.Character
+PsiReferenceExpression:p : java.lang.Character
+PsiReferenceExpression:p : java.lang.Character
+PsiReferenceExpression:p : java.lang.Character
+
+Conversions:
+myField -> $
+myFieldSuper1 -> $
+myFieldSuper3 -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/after/Type.java
new file mode 100644
index 000000000000..c075b5ea1ae1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/after/Type.java
@@ -0,0 +1,10 @@
+class Type {
+ private char myField;
+ private int myFieldSuper1;
+ private Object myFieldSuper3;
+ public void meth(Character p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/before/Type.java
new file mode 100644
index 000000000000..c821e8a38b8e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Lvalue/before/Type.java
@@ -0,0 +1,10 @@
+class Type {
+ private char myField;
+ private int myFieldSuper1;
+ private Object myFieldSuper3;
+ public void meth(char p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/after/Type.items
new file mode 100644
index 000000000000..8f1b31f74f05
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/after/Type.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:myField : char
+PsiReferenceExpression:myField : char
+
+Conversions:
+p -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/after/Type.java
new file mode 100644
index 000000000000..bec7b611e95a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/after/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private char myField;
+ public void meth(Character p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/before/Type.java
new file mode 100644
index 000000000000..a98d2a5fa05a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxChar2Rvalue/before/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private Character myField;
+ public void meth(Character p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/after/Type.items
new file mode 100644
index 000000000000..c961b407f293
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/after/Type.items
@@ -0,0 +1,13 @@
+Types:
+PsiParameter:p : java.lang.Double
+PsiReferenceExpression:p : java.lang.Double
+PsiReferenceExpression:p : java.lang.Double
+PsiReferenceExpression:p : java.lang.Double
+
+Conversions:
+myField -> $
+myFieldSuper2 -> $
+myFieldSuper3 -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/after/Type.java
new file mode 100644
index 000000000000..c2cc8485f4f5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/after/Type.java
@@ -0,0 +1,10 @@
+class Type {
+ private double myField;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(Double p) {
+ myField = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/before/Type.java
new file mode 100644
index 000000000000..56ec2d53eb99
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Lvalue/before/Type.java
@@ -0,0 +1,10 @@
+class Type {
+ private double myField;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(double p) {
+ myField = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/after/Type.items
new file mode 100644
index 000000000000..2c80921ecfcb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/after/Type.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:myField : double
+PsiReferenceExpression:myField : double
+
+Conversions:
+p -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/after/Type.java
new file mode 100644
index 000000000000..ac0e3c68ebdb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/after/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private double myField;
+ public void meth(Double p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/before/Type.java
new file mode 100644
index 000000000000..4950dcb0d5bd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxDouble2Rvalue/before/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private Double myField;
+ public void meth(Double p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/after/Type.items
new file mode 100644
index 000000000000..d51dd6bd244e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/after/Type.items
@@ -0,0 +1,15 @@
+Types:
+PsiParameter:p : java.lang.Float
+PsiReferenceExpression:p : java.lang.Float
+PsiReferenceExpression:p : java.lang.Float
+PsiReferenceExpression:p : java.lang.Float
+PsiReferenceExpression:p : java.lang.Float
+
+Conversions:
+myField -> $
+myFieldSuper1 -> $
+myFieldSuper2 -> $
+myFieldSuper3 -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/after/Type.java
new file mode 100644
index 000000000000..4e06d3369857
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/after/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private float myField;
+ private double myFieldSuper1;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(Float p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/before/Type.java
new file mode 100644
index 000000000000..24ec9a945603
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Lvalue/before/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private float myField;
+ private double myFieldSuper1;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(float p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/after/Type.items
new file mode 100644
index 000000000000..1b905928d822
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/after/Type.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:myField : float
+PsiReferenceExpression:myField : float
+
+Conversions:
+p -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/after/Type.java
new file mode 100644
index 000000000000..1db8edb10bed
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/after/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private float myField;
+ public void meth(Float p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/before/Type.java
new file mode 100644
index 000000000000..078b103e8df1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxFloat2Rvalue/before/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private Float myField;
+ public void meth(Float p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/after/Type.items
new file mode 100644
index 000000000000..24c52d5796ed
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/after/Type.items
@@ -0,0 +1,15 @@
+Types:
+PsiParameter:p : java.lang.Integer
+PsiReferenceExpression:p : java.lang.Integer
+PsiReferenceExpression:p : java.lang.Integer
+PsiReferenceExpression:p : java.lang.Integer
+PsiReferenceExpression:p : java.lang.Integer
+
+Conversions:
+myField -> $
+myFieldSuper1 -> $
+myFieldSuper2 -> $
+myFieldSuper3 -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/after/Type.java
new file mode 100644
index 000000000000..e0075f597b24
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/after/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private int myField;
+ private long myFieldSuper1;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(Integer p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/before/Type.java
new file mode 100644
index 000000000000..9c2f74c3f26f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Lvalue/before/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private int myField;
+ private long myFieldSuper1;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(int p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/after/Type.items
new file mode 100644
index 000000000000..d95e0af0768c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/after/Type.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:myField : int
+PsiReferenceExpression:myField : int
+
+Conversions:
+p -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/after/Type.java
new file mode 100644
index 000000000000..4bf28b31788c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/after/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private int myField;
+ public void meth(Integer p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/before/Type.java
new file mode 100644
index 000000000000..87273262b496
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxInt2Rvalue/before/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private Integer myField;
+ public void meth(Integer p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/after/Type.items
new file mode 100644
index 000000000000..29939f335f62
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/after/Type.items
@@ -0,0 +1,15 @@
+Types:
+PsiParameter:p : java.lang.Long
+PsiReferenceExpression:p : java.lang.Long
+PsiReferenceExpression:p : java.lang.Long
+PsiReferenceExpression:p : java.lang.Long
+PsiReferenceExpression:p : java.lang.Long
+
+Conversions:
+myField -> $
+myFieldSuper1 -> $
+myFieldSuper2 -> $
+myFieldSuper3 -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/after/Type.java
new file mode 100644
index 000000000000..695801b1bc4f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/after/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private long myField;
+ private float myFieldSuper1;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(Long p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/before/Type.java
new file mode 100644
index 000000000000..c6a909f7c46a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Lvalue/before/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private long myField;
+ private float myFieldSuper1;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(long p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/after/Type.items
new file mode 100644
index 000000000000..0fa3e3feb520
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/after/Type.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:myField : long
+PsiReferenceExpression:myField : long
+
+Conversions:
+p -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/after/Type.java
new file mode 100644
index 000000000000..6f407a2591a1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/after/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private long myField;
+ public void meth(Long p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/before/Type.java
new file mode 100644
index 000000000000..ceceb07caa8e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxLong2Rvalue/before/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private Long myField;
+ public void meth(Long p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/after/Type.items
new file mode 100644
index 000000000000..c6a4cc9b70c8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/after/Type.items
@@ -0,0 +1,15 @@
+Types:
+PsiParameter:p : java.lang.Short
+PsiReferenceExpression:p : java.lang.Short
+PsiReferenceExpression:p : java.lang.Short
+PsiReferenceExpression:p : java.lang.Short
+PsiReferenceExpression:p : java.lang.Short
+
+Conversions:
+myField -> $
+myFieldSuper1 -> $
+myFieldSuper2 -> $
+myFieldSuper3 -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/after/Type.java
new file mode 100644
index 000000000000..50d61183a785
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/after/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private short myField;
+ private int myFieldSuper1;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(Short p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/before/Type.java
new file mode 100644
index 000000000000..52eb7aa5b30c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Lvalue/before/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private short myField;
+ private int myFieldSuper1;
+ private Number myFieldSuper2;
+ private Object myFieldSuper3;
+ public void meth(short p) {
+ myField = p;
+ myFieldSuper1 = p;
+ myFieldSuper2 = p;
+ myFieldSuper3 = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/after/Type.items
new file mode 100644
index 000000000000..28ba15701be6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/after/Type.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:myField : short
+PsiReferenceExpression:myField : short
+
+Conversions:
+p -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/after/Type.java
new file mode 100644
index 000000000000..ba146982c723
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/after/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private short myField;
+ public void meth(Short p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/before/Type.java
new file mode 100644
index 000000000000..9ca0f4947260
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeAutoboxShort2Rvalue/before/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private Short myField;
+ public void meth(Short p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/after/Type.items
new file mode 100644
index 000000000000..6106a705cdd8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/after/Type.items
@@ -0,0 +1,33 @@
+Types:
+PsiField:myAncestorSupers : java.util.Set<Subject>
+PsiField:myAncestors : java.util.Set<Subject>
+PsiField:myCollection : java.util.Collection<Subject>
+PsiField:myDescendantExtends : java.util.Set<Subject>
+PsiField:myDescendants : java.util.Set<Subject>
+PsiParameter:p : java.util.Set<Subject>
+PsiReferenceExpression:myAncestorSupers : java.util.Set<Subject>
+PsiReferenceExpression:myAncestors : java.util.Set<Subject>
+PsiReferenceExpression:myCollection : java.util.Collection<Subject>
+PsiReferenceExpression:myDescendantExtends : java.util.Set<Subject>
+PsiReferenceExpression:myDescendants : java.util.Set<Subject>
+PsiReferenceExpression:p : java.util.Set<Subject>
+PsiReferenceExpression:p : java.util.Set<Subject>
+PsiReferenceExpression:p : java.util.Set<Subject>
+PsiReferenceExpression:p : java.util.Set<Subject>
+PsiReferenceExpression:p : java.util.Set<Subject>
+PsiReferenceExpression:p : java.util.Set<Subject>
+PsiReferenceExpression:p : java.util.Set<Subject>
+PsiReferenceExpression:p : java.util.Set<Subject>
+PsiReferenceExpression:p : java.util.Set<Subject>
+PsiReferenceExpression:p : java.util.Set<Subject>
+PsiReferenceExpression:p : java.util.Set<Subject>
+
+Conversions:
+myAncestorExtends -> $
+myDescendantSupers -> $
+mySet -> $
+mySubjectExtends -> $
+mySubjectSupers -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/after/Type.java
new file mode 100644
index 000000000000..7e3eeb9770ca
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/after/Type.java
@@ -0,0 +1,40 @@
+import java.util.Collection;
+import java.util.Set;
+
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Set<Subject> myAncestors;
+ private Set<? extends Ancestor> myAncestorExtends;
+ private Set<Subject> myAncestorSupers;
+
+ private Set<Subject> mySubjects;
+ private Set<? extends Subject> mySubjectExtends;
+ private Set<? super Subject> mySubjectSupers;
+
+ private Set<Subject> myDescendants;
+ private Set<Subject> myDescendantExtends;
+ private Set<? super Descendant> myDescendantSupers;
+
+ private Set mySet;
+ private Collection<Subject> myCollection;
+
+ public void meth(Set<Subject> p) {
+ myAncestors = p;
+ myAncestorExtends = p;
+ myAncestorSupers = p;
+
+ mySubjects = p;
+ mySubjectExtends = p;
+ mySubjectSupers = p;
+
+ myDescendants = p;
+ myDescendantExtends = p;
+ myDescendantSupers = p;
+
+ mySet = p;
+ myCollection = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/before/Type.java
new file mode 100644
index 000000000000..2e63240580ca
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestor2Lvalue/before/Type.java
@@ -0,0 +1,40 @@
+import java.util.Collection;
+import java.util.Set;
+
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Set<Ancestor> myAncestors;
+ private Set<? extends Ancestor> myAncestorExtends;
+ private Set<? super Ancestor> myAncestorSupers;
+
+ private Set<Subject> mySubjects;
+ private Set<? extends Subject> mySubjectExtends;
+ private Set<? super Subject> mySubjectSupers;
+
+ private Set<Descendant> myDescendants;
+ private Set<? extends Descendant> myDescendantExtends;
+ private Set<? super Descendant> myDescendantSupers;
+
+ private Set mySet;
+ private Collection<Ancestor> myCollection;
+
+ public void meth(Set p) {
+ myAncestors = p;
+ myAncestorExtends = p;
+ myAncestorSupers = p;
+
+ mySubjects = p;
+ mySubjectExtends = p;
+ mySubjectSupers = p;
+
+ myDescendants = p;
+ myDescendantExtends = p;
+ myDescendantSupers = p;
+
+ mySet = p;
+ myCollection = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/after/Type.items
new file mode 100644
index 000000000000..6cb2f2be0d34
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/after/Type.items
@@ -0,0 +1,33 @@
+Types:
+PsiField:myAncestorSupers : java.util.Set<? extends Subject>
+PsiField:myAncestors : java.util.Set<? extends Subject>
+PsiField:myDescendantExtends : java.util.Set<? extends Subject>
+PsiField:myDescendantSupers : java.util.Set<? extends Subject>
+PsiField:myDescendants : java.util.Set<? extends Subject>
+PsiField:mySubjectSupers : java.util.Set<? extends Subject>
+PsiField:mySubjects : java.util.Set<? extends Subject>
+PsiParameter:p : java.util.Set<? extends Subject>
+PsiReferenceExpression:myAncestorSupers : java.util.Set<? extends Subject>
+PsiReferenceExpression:myAncestors : java.util.Set<? extends Subject>
+PsiReferenceExpression:myDescendantExtends : java.util.Set<? extends Subject>
+PsiReferenceExpression:myDescendantSupers : java.util.Set<? extends Subject>
+PsiReferenceExpression:myDescendants : java.util.Set<? extends Subject>
+PsiReferenceExpression:mySubjectSupers : java.util.Set<? extends Subject>
+PsiReferenceExpression:mySubjects : java.util.Set<? extends Subject>
+PsiReferenceExpression:p : java.util.Set<? extends Subject>
+PsiReferenceExpression:p : java.util.Set<? extends Subject>
+PsiReferenceExpression:p : java.util.Set<? extends Subject>
+PsiReferenceExpression:p : java.util.Set<? extends Subject>
+PsiReferenceExpression:p : java.util.Set<? extends Subject>
+PsiReferenceExpression:p : java.util.Set<? extends Subject>
+PsiReferenceExpression:p : java.util.Set<? extends Subject>
+PsiReferenceExpression:p : java.util.Set<? extends Subject>
+PsiReferenceExpression:p : java.util.Set<? extends Subject>
+PsiReferenceExpression:p : java.util.Set<? extends Subject>
+
+Conversions:
+myAncestorExtends -> $
+mySet -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/after/Type.java
new file mode 100644
index 000000000000..2ffef9b4e9ad
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/after/Type.java
@@ -0,0 +1,37 @@
+import java.util.Set;
+
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Set<? extends Subject> myAncestors;
+ private Set<? extends Ancestor> myAncestorExtends;
+ private Set<? extends Subject> myAncestorSupers;
+
+ private Set<? extends Subject> mySubjects;
+ private Set<? extends Subject> mySubjectExtends;
+ private Set<? extends Subject> mySubjectSupers;
+
+ private Set<? extends Subject> myDescendants;
+ private Set<? extends Subject> myDescendantExtends;
+ private Set<? extends Subject> myDescendantSupers;
+
+ private Set mySet;
+
+ public void meth(Set<? extends Subject> p) {
+ myAncestors = p;
+ myAncestorExtends = p;
+ myAncestorSupers = p;
+
+ mySubjects = p;
+ mySubjectExtends = p;
+ mySubjectSupers = p;
+
+ myDescendants = p;
+ myDescendantExtends = p;
+ myDescendantSupers = p;
+
+ mySet = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/before/Type.java
new file mode 100644
index 000000000000..4fc8d5baf167
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenAncestorWildcard2Lvalue/before/Type.java
@@ -0,0 +1,37 @@
+import java.util.Set;
+
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Set<Ancestor> myAncestors;
+ private Set<? extends Ancestor> myAncestorExtends;
+ private Set<? super Ancestor> myAncestorSupers;
+
+ private Set<Subject> mySubjects;
+ private Set<? extends Subject> mySubjectExtends;
+ private Set<? super Subject> mySubjectSupers;
+
+ private Set<Descendant> myDescendants;
+ private Set<? extends Descendant> myDescendantExtends;
+ private Set<? super Descendant> myDescendantSupers;
+
+ private Set mySet;
+
+ public void meth(Set p) {
+ myAncestors = p;
+ myAncestorExtends = p;
+ myAncestorSupers = p;
+
+ mySubjects = p;
+ mySubjectExtends = p;
+ mySubjectSupers = p;
+
+ myDescendants = p;
+ myDescendantExtends = p;
+ myDescendantSupers = p;
+
+ mySet = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/after/Type.items
new file mode 100644
index 000000000000..ab6a62095446
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/after/Type.items
@@ -0,0 +1,37 @@
+Types:
+PsiField:myField : java.util.Set<Subject>
+PsiLocalVariable:ancestorExtends : java.util.Set<Subject>
+PsiLocalVariable:ancestorSupers : java.util.Set<Subject>
+PsiLocalVariable:ancestors : java.util.Set<Subject>
+PsiLocalVariable:descendantExtends : java.util.Set<Subject>
+PsiLocalVariable:descendantSupers : java.util.Set<Subject>
+PsiLocalVariable:descendants : java.util.Set<Subject>
+PsiLocalVariable:myCollection : java.util.AbstractSet<Subject>
+PsiLocalVariable:subjectExtends : java.util.Set<Subject>
+PsiLocalVariable:subjectSupers : java.util.Set<Subject>
+PsiReferenceExpression:ancestorExtends : java.util.Set<Subject>
+PsiReferenceExpression:ancestorSupers : java.util.Set<Subject>
+PsiReferenceExpression:ancestors : java.util.Set<Subject>
+PsiReferenceExpression:descendantExtends : java.util.Set<Subject>
+PsiReferenceExpression:descendantSupers : java.util.Set<Subject>
+PsiReferenceExpression:descendants : java.util.Set<Subject>
+PsiReferenceExpression:myCollection : java.util.AbstractSet<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:myField : java.util.Set<Subject>
+PsiReferenceExpression:subjectExtends : java.util.Set<Subject>
+PsiReferenceExpression:subjectSupers : java.util.Set<Subject>
+
+Conversions:
+set -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/after/Type.java
new file mode 100644
index 000000000000..119e65ca61b5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/after/Type.java
@@ -0,0 +1,39 @@
+import java.util.AbstractSet;
+import java.util.Set;
+
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Set<Subject> myField;
+
+ public void meth() {
+ Set<Subject> ancestors = null;
+ myField = ancestors;
+ Set<Subject> ancestorExtends = null;
+ myField = ancestorExtends;
+ Set<Subject> ancestorSupers = null;
+ myField = ancestorSupers;
+
+ // turning everything into Set<Subject> is actually too strict, but correct
+ Set<Subject> subjects = null;
+ myField = subjects;
+ Set<Subject> subjectExtends = null;
+ myField = subjectExtends;
+ Set<Subject> subjectSupers = null;
+ myField = subjectSupers;
+
+ Set<Subject> descendants = null;
+ myField = descendants;
+ Set<Subject> descendantExtends = null;
+ myField = descendantExtends;
+ Set<Subject> descendantSupers = null;
+ myField = descendantSupers;
+
+ Set set = null;
+ myField = set;
+ AbstractSet<Subject> myCollection = null;
+ myField = myCollection;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/before/Type.java
new file mode 100644
index 000000000000..e53aa1d3cd1b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendant2Rvalue/before/Type.java
@@ -0,0 +1,39 @@
+import java.util.AbstractSet;
+import java.util.Set;
+
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Set myField;
+
+ public void meth() {
+ Set<Ancestor> ancestors = null;
+ myField = ancestors;
+ Set<? extends Ancestor> ancestorExtends = null;
+ myField = ancestorExtends;
+ Set<? super Ancestor> ancestorSupers = null;
+ myField = ancestorSupers;
+
+ // turning everything into Set<Subject> is actually too strict, but correct
+ Set<Subject> subjects = null;
+ myField = subjects;
+ Set<? extends Subject> subjectExtends = null;
+ myField = subjectExtends;
+ Set<? super Subject> subjectSupers = null;
+ myField = subjectSupers;
+
+ Set<Descendant> descendants = null;
+ myField = descendants;
+ Set<? extends Descendant> descendantExtends = null;
+ myField = descendantExtends;
+ Set<? super Descendant> descendantSupers = null;
+ myField = descendantSupers;
+
+ Set set = null;
+ myField = set;
+ AbstractSet<Descendant> myCollection = null;
+ myField = myCollection;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/after/Type.items
new file mode 100644
index 000000000000..e34aedf887d3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/after/Type.items
@@ -0,0 +1,32 @@
+Types:
+PsiField:myField : java.util.Set<? super Subject>
+PsiLocalVariable:ancestorExtends : java.util.Set<? super Subject>
+PsiLocalVariable:descendantExtends : java.util.Set<? super Subject>
+PsiLocalVariable:descendantSupers : java.util.Set<? super Subject>
+PsiLocalVariable:descendants : java.util.Set<? super Subject>
+PsiLocalVariable:subjectExtends : java.util.Set<? super Subject>
+PsiReferenceExpression:ancestorExtends : java.util.Set<? super Subject>
+PsiReferenceExpression:descendantExtends : java.util.Set<? super Subject>
+PsiReferenceExpression:descendantSupers : java.util.Set<? super Subject>
+PsiReferenceExpression:descendants : java.util.Set<? super Subject>
+PsiReferenceExpression:myField : java.util.Set<? super Subject>
+PsiReferenceExpression:myField : java.util.Set<? super Subject>
+PsiReferenceExpression:myField : java.util.Set<? super Subject>
+PsiReferenceExpression:myField : java.util.Set<? super Subject>
+PsiReferenceExpression:myField : java.util.Set<? super Subject>
+PsiReferenceExpression:myField : java.util.Set<? super Subject>
+PsiReferenceExpression:myField : java.util.Set<? super Subject>
+PsiReferenceExpression:myField : java.util.Set<? super Subject>
+PsiReferenceExpression:myField : java.util.Set<? super Subject>
+PsiReferenceExpression:myField : java.util.Set<? super Subject>
+PsiReferenceExpression:subjectExtends : java.util.Set<? super Subject>
+
+Conversions:
+ancestorSupers -> $
+ancestors -> $
+set -> $
+subjectSupers -> $
+subjects -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/after/Type.java
new file mode 100644
index 000000000000..a0982c89aa5c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/after/Type.java
@@ -0,0 +1,35 @@
+import java.util.Set;
+
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Set<? super Subject> myField;
+
+ public void meth() {
+ Set<Ancestor> ancestors = null;
+ myField = ancestors;
+ Set<? super Subject> ancestorExtends = null;
+ myField = ancestorExtends;
+ Set<? super Ancestor> ancestorSupers = null;
+ myField = ancestorSupers;
+
+ Set<Subject> subjects = null;
+ myField = subjects;
+ Set<? super Subject> subjectExtends = null;
+ myField = subjectExtends;
+ Set<? super Subject> subjectSupers = null;
+ myField = subjectSupers;
+
+ Set<? super Subject> descendants = null;
+ myField = descendants;
+ Set<? super Subject> descendantExtends = null;
+ myField = descendantExtends;
+ Set<? super Subject> descendantSupers = null;
+ myField = descendantSupers;
+
+ Set set = null;
+ myField = set;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/before/Type.java
new file mode 100644
index 000000000000..79f4d219b47c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenDescendantWildcard2Rvalue/before/Type.java
@@ -0,0 +1,35 @@
+import java.util.Set;
+
+interface Ancestor {}
+interface Subject extends Ancestor {}
+class Descendant implements Subject {}
+
+class Type {
+ private Set myField;
+
+ public void meth() {
+ Set<Ancestor> ancestors = null;
+ myField = ancestors;
+ Set<? extends Ancestor> ancestorExtends = null;
+ myField = ancestorExtends;
+ Set<? super Ancestor> ancestorSupers = null;
+ myField = ancestorSupers;
+
+ Set<Subject> subjects = null;
+ myField = subjects;
+ Set<? extends Subject> subjectExtends = null;
+ myField = subjectExtends;
+ Set<? super Subject> subjectSupers = null;
+ myField = subjectSupers;
+
+ Set<Descendant> descendants = null;
+ myField = descendants;
+ Set<? extends Descendant> descendantExtends = null;
+ myField = descendantExtends;
+ Set<? super Descendant> descendantSupers = null;
+ myField = descendantSupers;
+
+ Set set = null;
+ myField = set;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/after/Type.items
new file mode 100644
index 000000000000..9da02a3b248c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/after/Type.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.util.Set
+PsiReferenceExpression:p : java.util.Set
+
+Conversions:
+myField -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/after/Type.java
new file mode 100644
index 000000000000..f66a7c1fadc0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/after/Type.java
@@ -0,0 +1,10 @@
+import java.util.Set;
+
+class Any {}
+
+class Type {
+ private Set<Any> myField;
+ public void meth(Set p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/before/Type.java
new file mode 100644
index 000000000000..968d7e85e0b7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Lvalue/before/Type.java
@@ -0,0 +1,10 @@
+import java.util.Set;
+
+class Any {}
+
+class Type {
+ private Set<Any> myField;
+ public void meth(Set<Any> p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/after/Type.items
new file mode 100644
index 000000000000..a3dd46449c57
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/after/Type.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:myField : java.util.Set
+PsiReferenceExpression:myField : java.util.Set
+
+Conversions:
+p -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/after/Type.java
new file mode 100644
index 000000000000..f78a0b3d5a68
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/after/Type.java
@@ -0,0 +1,10 @@
+import java.util.Set;
+
+class Any {}
+
+class Type {
+ private Set myField;
+ public void meth(Set<Any> p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/before/Type.java
new file mode 100644
index 000000000000..968d7e85e0b7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeGenRaw2Rvalue/before/Type.java
@@ -0,0 +1,10 @@
+import java.util.Set;
+
+class Any {}
+
+class Type {
+ private Set<Any> myField;
+ public void meth(Set<Any> p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/after/Type.items
new file mode 100644
index 000000000000..361d3837f2da
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/after/Type.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:myField : boolean
+PsiParameter:p : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:p : boolean
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/after/Type.java
new file mode 100644
index 000000000000..8a5b062df2e6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/after/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private boolean myField;
+ public void meth(boolean p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/before/Type.java
new file mode 100644
index 000000000000..b9185a0c81ed
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Lvalue/before/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private int myField;
+ public void meth(int p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/after/Type.items
new file mode 100644
index 000000000000..361d3837f2da
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/after/Type.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:myField : boolean
+PsiParameter:p : boolean
+PsiReferenceExpression:myField : boolean
+PsiReferenceExpression:p : boolean
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/after/Type.java
new file mode 100644
index 000000000000..8a5b062df2e6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/after/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private boolean myField;
+ public void meth(boolean p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/before/Type.java
new file mode 100644
index 000000000000..b9185a0c81ed
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubBoolean2Rvalue/before/Type.java
@@ -0,0 +1,6 @@
+class Type {
+ private int myField;
+ public void meth(int p) {
+ myField = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/after/Type.items
new file mode 100644
index 000000000000..71e76cc5a1e9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/after/Type.items
@@ -0,0 +1,26 @@
+Types:
+PsiField:myField : byte
+PsiParameter:pc : byte
+PsiParameter:pd : byte
+PsiParameter:pf : byte
+PsiParameter:pi : byte
+PsiParameter:pl : byte
+PsiParameter:ps : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:myField : byte
+PsiReferenceExpression:pc : byte
+PsiReferenceExpression:pd : byte
+PsiReferenceExpression:pf : byte
+PsiReferenceExpression:pi : byte
+PsiReferenceExpression:pl : byte
+PsiReferenceExpression:ps : byte
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/after/Type.java
new file mode 100644
index 000000000000..ac3a40879f5b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/after/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private byte myField;
+ public void meth(byte pb, byte ps, byte pc, byte pi, byte pl, byte pf, byte pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/before/Type.java
new file mode 100644
index 000000000000..f7edce2eea98
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubByte2Rvalue/before/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private double myField;
+ public void meth(byte pb, short ps, char pc, int pi, long pl, float pf, double pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/after/Type.items
new file mode 100644
index 000000000000..521321c601c1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/after/Type.items
@@ -0,0 +1,22 @@
+Types:
+PsiField:myByte : char
+PsiField:myShort : char
+PsiParameter:p : char
+PsiReferenceExpression:myByte : char
+PsiReferenceExpression:myShort : char
+PsiReferenceExpression:p : char
+PsiReferenceExpression:p : char
+PsiReferenceExpression:p : char
+PsiReferenceExpression:p : char
+PsiReferenceExpression:p : char
+PsiReferenceExpression:p : char
+PsiReferenceExpression:p : char
+
+Conversions:
+myDouble -> $
+myFloat -> $
+myInt -> $
+myLong -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/after/Type.java
new file mode 100644
index 000000000000..8b94e45d5626
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/after/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private char myByte;
+ private char myShort;
+ private char myChar;
+ private int myInt;
+ private long myLong;
+ private float myFloat;
+ private double myDouble;
+ public void meth(char p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/before/Type.java
new file mode 100644
index 000000000000..2d55ceaa511a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Lvalue/before/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private byte myByte;
+ private short myShort;
+ private char myChar;
+ private int myInt;
+ private long myLong;
+ private float myFloat;
+ private double myDouble;
+ public void meth(byte p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/after/Type.items
new file mode 100644
index 000000000000..404f84f33867
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/after/Type.items
@@ -0,0 +1,26 @@
+Types:
+PsiField:myField : char
+PsiParameter:pb : char
+PsiParameter:pd : char
+PsiParameter:pf : char
+PsiParameter:pi : char
+PsiParameter:pl : char
+PsiParameter:ps : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:myField : char
+PsiReferenceExpression:pb : char
+PsiReferenceExpression:pd : char
+PsiReferenceExpression:pf : char
+PsiReferenceExpression:pi : char
+PsiReferenceExpression:pl : char
+PsiReferenceExpression:ps : char
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/after/Type.java
new file mode 100644
index 000000000000..dc346a77074c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/after/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private char myField;
+ public void meth(char pb, char ps, char pc, char pi, char pl, char pf, char pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/before/Type.java
new file mode 100644
index 000000000000..f7edce2eea98
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubChar2Rvalue/before/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private double myField;
+ public void meth(byte pb, short ps, char pc, int pi, long pl, float pf, double pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/after/Type.items
new file mode 100644
index 000000000000..6946fcefbac0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/after/Type.items
@@ -0,0 +1,26 @@
+Types:
+PsiField:myByte : double
+PsiField:myChar : double
+PsiField:myFloat : double
+PsiField:myInt : double
+PsiField:myLong : double
+PsiField:myShort : double
+PsiParameter:p : double
+PsiReferenceExpression:myByte : double
+PsiReferenceExpression:myChar : double
+PsiReferenceExpression:myFloat : double
+PsiReferenceExpression:myInt : double
+PsiReferenceExpression:myLong : double
+PsiReferenceExpression:myShort : double
+PsiReferenceExpression:p : double
+PsiReferenceExpression:p : double
+PsiReferenceExpression:p : double
+PsiReferenceExpression:p : double
+PsiReferenceExpression:p : double
+PsiReferenceExpression:p : double
+PsiReferenceExpression:p : double
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/after/Type.java
new file mode 100644
index 000000000000..8a5035c81e4d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/after/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private double myByte;
+ private double myShort;
+ private double myChar;
+ private double myInt;
+ private double myLong;
+ private double myFloat;
+ private double myDouble;
+ public void meth(double p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/before/Type.java
new file mode 100644
index 000000000000..2d55ceaa511a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubDouble2Lvalue/before/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private byte myByte;
+ private short myShort;
+ private char myChar;
+ private int myInt;
+ private long myLong;
+ private float myFloat;
+ private double myDouble;
+ public void meth(byte p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/after/Type.items
new file mode 100644
index 000000000000..c479836287e0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/after/Type.items
@@ -0,0 +1,25 @@
+Types:
+PsiField:myByte : float
+PsiField:myChar : float
+PsiField:myInt : float
+PsiField:myLong : float
+PsiField:myShort : float
+PsiParameter:p : float
+PsiReferenceExpression:myByte : float
+PsiReferenceExpression:myChar : float
+PsiReferenceExpression:myInt : float
+PsiReferenceExpression:myLong : float
+PsiReferenceExpression:myShort : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+
+Conversions:
+myDouble -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/after/Type.java
new file mode 100644
index 000000000000..8b59184de85f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/after/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private float myByte;
+ private float myShort;
+ private float myChar;
+ private float myInt;
+ private float myLong;
+ private float myFloat;
+ private double myDouble;
+ public void meth(float p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/before/Type.java
new file mode 100644
index 000000000000..2d55ceaa511a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Lvalue/before/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private byte myByte;
+ private short myShort;
+ private char myChar;
+ private int myInt;
+ private long myLong;
+ private float myFloat;
+ private double myDouble;
+ public void meth(byte p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/after/Type.items
new file mode 100644
index 000000000000..7a22f6771caf
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/after/Type.items
@@ -0,0 +1,21 @@
+Types:
+PsiField:myField : float
+PsiParameter:pd : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:myField : float
+PsiReferenceExpression:pd : float
+
+Conversions:
+pb -> $
+pc -> $
+pi -> $
+pl -> $
+ps -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/after/Type.java
new file mode 100644
index 000000000000..0b933cce77dd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/after/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private float myField;
+ public void meth(byte pb, short ps, char pc, int pi, long pl, float pf, float pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/before/Type.java
new file mode 100644
index 000000000000..f7edce2eea98
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubFloat2Rvalue/before/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private double myField;
+ public void meth(byte pb, short ps, char pc, int pi, long pl, float pf, double pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/after/Type.items
new file mode 100644
index 000000000000..200b3b8b3fb5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/after/Type.items
@@ -0,0 +1,23 @@
+Types:
+PsiField:myByte : int
+PsiField:myChar : int
+PsiField:myShort : int
+PsiParameter:p : int
+PsiReferenceExpression:myByte : int
+PsiReferenceExpression:myChar : int
+PsiReferenceExpression:myShort : int
+PsiReferenceExpression:p : int
+PsiReferenceExpression:p : int
+PsiReferenceExpression:p : int
+PsiReferenceExpression:p : int
+PsiReferenceExpression:p : int
+PsiReferenceExpression:p : int
+PsiReferenceExpression:p : int
+
+Conversions:
+myDouble -> $
+myFloat -> $
+myLong -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/after/Type.java
new file mode 100644
index 000000000000..b15830da724d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/after/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private int myByte;
+ private int myShort;
+ private int myChar;
+ private int myInt;
+ private long myLong;
+ private float myFloat;
+ private double myDouble;
+ public void meth(int p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/before/Type.java
new file mode 100644
index 000000000000..2d55ceaa511a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Lvalue/before/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private byte myByte;
+ private short myShort;
+ private char myChar;
+ private int myInt;
+ private long myLong;
+ private float myFloat;
+ private double myDouble;
+ public void meth(byte p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/after/Type.items
new file mode 100644
index 000000000000..b7c45d6a6aff
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/after/Type.items
@@ -0,0 +1,23 @@
+Types:
+PsiField:myField : int
+PsiParameter:pd : int
+PsiParameter:pf : int
+PsiParameter:pl : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:myField : int
+PsiReferenceExpression:pd : int
+PsiReferenceExpression:pf : int
+PsiReferenceExpression:pl : int
+
+Conversions:
+pb -> $
+pc -> $
+ps -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/after/Type.java
new file mode 100644
index 000000000000..c13b0ab9bee2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/after/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private int myField;
+ public void meth(byte pb, short ps, char pc, int pi, int pl, int pf, int pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/before/Type.java
new file mode 100644
index 000000000000..f7edce2eea98
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubInt2Rvalue/before/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private double myField;
+ public void meth(byte pb, short ps, char pc, int pi, long pl, float pf, double pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/after/Type.items
new file mode 100644
index 000000000000..3f94bd20c6e8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/after/Type.items
@@ -0,0 +1,24 @@
+Types:
+PsiField:myByte : long
+PsiField:myChar : long
+PsiField:myInt : long
+PsiField:myShort : long
+PsiParameter:p : long
+PsiReferenceExpression:myByte : long
+PsiReferenceExpression:myChar : long
+PsiReferenceExpression:myInt : long
+PsiReferenceExpression:myShort : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+PsiReferenceExpression:p : long
+
+Conversions:
+myDouble -> $
+myFloat -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/after/Type.java
new file mode 100644
index 000000000000..1b594666283c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/after/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private long myByte;
+ private long myShort;
+ private long myChar;
+ private long myInt;
+ private long myLong;
+ private float myFloat;
+ private double myDouble;
+ public void meth(long p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/before/Type.java
new file mode 100644
index 000000000000..2d55ceaa511a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Lvalue/before/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private byte myByte;
+ private short myShort;
+ private char myChar;
+ private int myInt;
+ private long myLong;
+ private float myFloat;
+ private double myDouble;
+ public void meth(byte p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/after/Type.items
new file mode 100644
index 000000000000..98a3c92987b9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/after/Type.items
@@ -0,0 +1,22 @@
+Types:
+PsiField:myField : long
+PsiParameter:pd : long
+PsiParameter:pf : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:myField : long
+PsiReferenceExpression:pd : long
+PsiReferenceExpression:pf : long
+
+Conversions:
+pb -> $
+pc -> $
+pi -> $
+ps -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/after/Type.java
new file mode 100644
index 000000000000..e3e3b25d89b4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/after/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private long myField;
+ public void meth(byte pb, short ps, char pc, int pi, long pl, long pf, long pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/before/Type.java
new file mode 100644
index 000000000000..f7edce2eea98
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubLong2Rvalue/before/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private double myField;
+ public void meth(byte pb, short ps, char pc, int pi, long pl, float pf, double pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/after/Type.items
new file mode 100644
index 000000000000..8f0cd52a3560
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/after/Type.items
@@ -0,0 +1,22 @@
+Types:
+PsiField:myByte : short
+PsiField:myChar : short
+PsiParameter:p : short
+PsiReferenceExpression:myByte : short
+PsiReferenceExpression:myChar : short
+PsiReferenceExpression:p : short
+PsiReferenceExpression:p : short
+PsiReferenceExpression:p : short
+PsiReferenceExpression:p : short
+PsiReferenceExpression:p : short
+PsiReferenceExpression:p : short
+PsiReferenceExpression:p : short
+
+Conversions:
+myDouble -> $
+myFloat -> $
+myInt -> $
+myLong -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/after/Type.java
new file mode 100644
index 000000000000..ccbe23c4b4e2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/after/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private short myByte;
+ private short myShort;
+ private short myChar;
+ private int myInt;
+ private long myLong;
+ private float myFloat;
+ private double myDouble;
+ public void meth(short p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/before/Type.java
new file mode 100644
index 000000000000..2d55ceaa511a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Lvalue/before/Type.java
@@ -0,0 +1,18 @@
+class Type {
+ private byte myByte;
+ private short myShort;
+ private char myChar;
+ private int myInt;
+ private long myLong;
+ private float myFloat;
+ private double myDouble;
+ public void meth(byte p) {
+ myByte = p;
+ myShort = p;
+ myChar = p;
+ myInt = p;
+ myLong = p;
+ myFloat = p;
+ myDouble = p;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/after/Type.items
new file mode 100644
index 000000000000..754060e723ec
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/after/Type.items
@@ -0,0 +1,25 @@
+Types:
+PsiField:myField : short
+PsiParameter:pc : short
+PsiParameter:pd : short
+PsiParameter:pf : short
+PsiParameter:pi : short
+PsiParameter:pl : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:myField : short
+PsiReferenceExpression:pc : short
+PsiReferenceExpression:pd : short
+PsiReferenceExpression:pf : short
+PsiReferenceExpression:pi : short
+PsiReferenceExpression:pl : short
+
+Conversions:
+pb -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/after/Type.java
new file mode 100644
index 000000000000..eb53bcd49ebc
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/after/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private short myField;
+ public void meth(byte pb, short ps, short pc, short pi, short pl, short pf, short pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/before/Type.java
new file mode 100644
index 000000000000..f7edce2eea98
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typePrimsubShort2Rvalue/before/Type.java
@@ -0,0 +1,12 @@
+class Type {
+ private double myField;
+ public void meth(byte pb, short ps, char pc, int pi, long pl, float pf, double pd) {
+ myField = pb;
+ myField = ps;
+ myField = pc;
+ myField = pi;
+ myField = pl;
+ myField = pf;
+ myField = pd;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/after/Type.items
new file mode 100644
index 000000000000..78431b6e4a4a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/after/Type.items
@@ -0,0 +1,17 @@
+Types:
+PsiField:myField : ClassChild
+PsiParameter:pcp : ClassChild
+PsiParameter:pfc : ClassChild
+PsiParameter:pfp : ClassChild
+PsiReferenceExpression:myField : ClassChild
+PsiReferenceExpression:myField : ClassChild
+PsiReferenceExpression:myField : ClassChild
+PsiReferenceExpression:myField : ClassChild
+PsiReferenceExpression:pcp : ClassChild
+PsiReferenceExpression:pfc : ClassChild
+PsiReferenceExpression:pfp : ClassChild
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/after/Type.java
new file mode 100644
index 000000000000..f5d9434c07c4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/after/Type.java
@@ -0,0 +1,14 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private ClassChild myField;
+ public void meth(ClassChild pcc, ClassChild pcp, ClassChild pfc, ClassChild pfp) {
+ myField = pcc;
+ myField = pcp;
+ myField = pfc;
+ myField = pfp;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/before/Type.java
new file mode 100644
index 000000000000..e5cfab9f9af5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassChild2Rvalue/before/Type.java
@@ -0,0 +1,14 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private FaceParent myField;
+ public void meth(ClassChild pcc, ClassParent pcp, FaceChild pfc, FaceParent pfp) {
+ myField = pcc;
+ myField = pcp;
+ myField = pfc;
+ myField = pfp;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/after/Type.items
new file mode 100644
index 000000000000..18fce6b3d6ec
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/after/Type.items
@@ -0,0 +1,15 @@
+Types:
+PsiField:myClassChild : ClassParent
+PsiParameter:p : ClassParent
+PsiReferenceExpression:myClassChild : ClassParent
+PsiReferenceExpression:p : ClassParent
+PsiReferenceExpression:p : ClassParent
+PsiReferenceExpression:p : ClassParent
+PsiReferenceExpression:p : ClassParent
+
+Conversions:
+myFaceChild -> $
+myFaceParent -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/after/Type.java
new file mode 100644
index 000000000000..8d7fee567890
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/after/Type.java
@@ -0,0 +1,18 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private ClassParent myClassChild;
+ private ClassParent myClassParent;
+ private FaceChild myFaceChild;
+ private FaceParent myFaceParent;
+
+ public void meth(ClassParent p) {
+ myClassChild = p;
+ myClassParent = p;
+ myFaceChild = p;
+ myFaceParent = p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/before/Type.java
new file mode 100644
index 000000000000..074af076748d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Lvalue/before/Type.java
@@ -0,0 +1,18 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private ClassChild myClassChild;
+ private ClassParent myClassParent;
+ private FaceChild myFaceChild;
+ private FaceParent myFaceParent;
+
+ public void meth(ClassChild p) {
+ myClassChild = p;
+ myClassParent = p;
+ myFaceChild = p;
+ myFaceParent = p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/after/Type.items
new file mode 100644
index 000000000000..4e7bfb9a5f9a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/after/Type.items
@@ -0,0 +1,16 @@
+Types:
+PsiField:myField : ClassParent
+PsiParameter:pfc : ClassParent
+PsiParameter:pfp : ClassParent
+PsiReferenceExpression:myField : ClassParent
+PsiReferenceExpression:myField : ClassParent
+PsiReferenceExpression:myField : ClassParent
+PsiReferenceExpression:myField : ClassParent
+PsiReferenceExpression:pfc : ClassParent
+PsiReferenceExpression:pfp : ClassParent
+
+Conversions:
+pcc -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/after/Type.java
new file mode 100644
index 000000000000..9953f41083c5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/after/Type.java
@@ -0,0 +1,14 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private ClassParent myField;
+ public void meth(ClassChild pcc, ClassParent pcp, ClassParent pfc, ClassParent pfp) {
+ myField = pcc;
+ myField = pcp;
+ myField = pfc;
+ myField = pfp;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/before/Type.java
new file mode 100644
index 000000000000..e5cfab9f9af5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefClassParent2Rvalue/before/Type.java
@@ -0,0 +1,14 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private FaceParent myField;
+ public void meth(ClassChild pcc, ClassParent pcp, FaceChild pfc, FaceParent pfp) {
+ myField = pcc;
+ myField = pcp;
+ myField = pfc;
+ myField = pfp;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/after/Type.items
new file mode 100644
index 000000000000..9dd227a952df
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/after/Type.items
@@ -0,0 +1,16 @@
+Types:
+PsiField:myClassChild : FaceChild
+PsiField:myClassParent : FaceChild
+PsiParameter:p : FaceChild
+PsiReferenceExpression:myClassChild : FaceChild
+PsiReferenceExpression:myClassParent : FaceChild
+PsiReferenceExpression:p : FaceChild
+PsiReferenceExpression:p : FaceChild
+PsiReferenceExpression:p : FaceChild
+PsiReferenceExpression:p : FaceChild
+
+Conversions:
+myFaceParent -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/after/Type.java
new file mode 100644
index 000000000000..f4b8de1d6028
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/after/Type.java
@@ -0,0 +1,18 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private FaceChild myClassChild;
+ private FaceChild myClassParent;
+ private FaceChild myFaceChild;
+ private FaceParent myFaceParent;
+
+ public void meth(FaceChild p) {
+ myClassChild = p;
+ myClassParent = p;
+ myFaceChild = p;
+ myFaceParent = p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/before/Type.java
new file mode 100644
index 000000000000..074af076748d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Lvalue/before/Type.java
@@ -0,0 +1,18 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private ClassChild myClassChild;
+ private ClassParent myClassParent;
+ private FaceChild myFaceChild;
+ private FaceParent myFaceParent;
+
+ public void meth(ClassChild p) {
+ myClassChild = p;
+ myClassParent = p;
+ myFaceChild = p;
+ myFaceParent = p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/after/Type.items
new file mode 100644
index 000000000000..91683c097f98
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/after/Type.items
@@ -0,0 +1,15 @@
+Types:
+PsiField:myField : FaceChild
+PsiParameter:pfp : FaceChild
+PsiReferenceExpression:myField : FaceChild
+PsiReferenceExpression:myField : FaceChild
+PsiReferenceExpression:myField : FaceChild
+PsiReferenceExpression:myField : FaceChild
+PsiReferenceExpression:pfp : FaceChild
+
+Conversions:
+pcc -> $
+pcp -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/after/Type.java
new file mode 100644
index 000000000000..f16470efa1df
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/after/Type.java
@@ -0,0 +1,14 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private FaceChild myField;
+ public void meth(ClassChild pcc, ClassParent pcp, FaceChild pfc, FaceChild pfp) {
+ myField = pcc;
+ myField = pcp;
+ myField = pfc;
+ myField = pfp;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/before/Type.java
new file mode 100644
index 000000000000..e5cfab9f9af5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceChild2Rvalue/before/Type.java
@@ -0,0 +1,14 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private FaceParent myField;
+ public void meth(ClassChild pcc, ClassParent pcp, FaceChild pfc, FaceParent pfp) {
+ myField = pcc;
+ myField = pcp;
+ myField = pfc;
+ myField = pfp;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/after/Type.items b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/after/Type.items
new file mode 100644
index 000000000000..a10aad579ef2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/after/Type.items
@@ -0,0 +1,17 @@
+Types:
+PsiField:myClassChild : FaceParent
+PsiField:myClassParent : FaceParent
+PsiField:myFaceChild : FaceParent
+PsiParameter:p : FaceParent
+PsiReferenceExpression:myClassChild : FaceParent
+PsiReferenceExpression:myClassParent : FaceParent
+PsiReferenceExpression:myFaceChild : FaceParent
+PsiReferenceExpression:p : FaceParent
+PsiReferenceExpression:p : FaceParent
+PsiReferenceExpression:p : FaceParent
+PsiReferenceExpression:p : FaceParent
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/after/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/after/Type.java
new file mode 100644
index 000000000000..d53c072b9b56
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/after/Type.java
@@ -0,0 +1,18 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private FaceParent myClassChild;
+ private FaceParent myClassParent;
+ private FaceParent myFaceChild;
+ private FaceParent myFaceParent;
+
+ public void meth(FaceParent p) {
+ myClassChild = p;
+ myClassParent = p;
+ myFaceChild = p;
+ myFaceParent = p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/before/Type.java b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/before/Type.java
new file mode 100644
index 000000000000..074af076748d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/migrateTypeSignature/typeRefFaceParent2Lvalue/before/Type.java
@@ -0,0 +1,18 @@
+interface FaceParent {}
+interface FaceChild extends FaceParent {}
+class ClassParent implements FaceChild {}
+class ClassChild extends ClassParent {}
+
+class Type {
+ private ClassChild myClassChild;
+ private ClassParent myClassParent;
+ private FaceChild myFaceChild;
+ private FaceParent myFaceParent;
+
+ public void meth(ClassChild p) {
+ myClassChild = p;
+ myClassParent = p;
+ myFaceChild = p;
+ myFaceParent = p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t01/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t01/after/Test.items
new file mode 100644
index 000000000000..702373b694d5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t01/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiMethodCallExpression:i.foo(new Integer[0]) : Foo
+PsiParameter:i : Foo
+PsiReferenceExpression:i : Foo
+
+Conversions:
+i.foo -> PsiMethod:moo
+
+New expression type changes:
+Fails:
+new Integer[0]->int
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t01/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t01/after/test.java
new file mode 100644
index 000000000000..cf8dd0203f05
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t01/after/test.java
@@ -0,0 +1,39 @@
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Oct 16, 2004
+ * Time: 10:10:35 PM
+ * To change this template use File | Settings | File Templates.
+ */
+
+class Foo {
+ Moo moo(int i) {
+ return null;
+ }
+}
+
+class Moo {
+ Foo foo(Integer[] j) {
+ return null;
+ }
+}
+
+class P {
+ int f(int y) {
+ return y;
+ }
+}
+
+class G extends P {
+ int f(int y) {
+ return y;
+ }
+}
+
+public class Test {
+ Moo g(Foo i) {
+ Foo j = i.moo(new Integer[0]);
+ return null;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t01/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t01/before/test.java
new file mode 100644
index 000000000000..1f7a52e4aa63
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t01/before/test.java
@@ -0,0 +1,39 @@
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Oct 16, 2004
+ * Time: 10:10:35 PM
+ * To change this template use File | Settings | File Templates.
+ */
+
+class Foo {
+ Moo moo(int i) {
+ return null;
+ }
+}
+
+class Moo {
+ Foo foo(Integer[] j) {
+ return null;
+ }
+}
+
+class P {
+ int f(int y) {
+ return y;
+ }
+}
+
+class G extends P {
+ int f(int y) {
+ return y;
+ }
+}
+
+public class Test {
+ Moo g(Moo i) {
+ Foo j = i.foo(new Integer[0]);
+ return null;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t02/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t02/after/Test.items
new file mode 100644
index 000000000000..eb13633449ca
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t02/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethod:sum : java.lang.Integer
+PsiMethodCallExpression:sum(n, k) : java.lang.Integer
+
+Conversions:
+a -> $
+i + j -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t02/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t02/after/test.java
new file mode 100644
index 000000000000..5842b8fa99e0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t02/after/test.java
@@ -0,0 +1,20 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Nov 15, 2004
+ * Time: 5:40:02 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Test {
+ Integer sum(int i, int j) {
+ return i + j;
+ }
+
+ int foo(int n, int k) {
+ int a;
+
+ a = sum(n, k);
+
+ return a;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t02/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t02/before/test.java
new file mode 100644
index 000000000000..d0ebca58783c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t02/before/test.java
@@ -0,0 +1,20 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Nov 15, 2004
+ * Time: 5:40:02 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Test {
+ int sum(int i, int j) {
+ return i + j;
+ }
+
+ int foo(int n, int k) {
+ int a;
+
+ a = sum(n, k);
+
+ return a;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t03/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t03/after/Test.items
new file mode 100644
index 000000000000..f1747c90b2ed
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t03/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethod:sum : java.lang.Integer
+PsiMethodCallExpression:sum(i, k) : java.lang.Integer
+
+Conversions:
+a -> $
+i + j -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t03/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t03/after/test.java
new file mode 100644
index 000000000000..5fd61417ba05
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t03/after/test.java
@@ -0,0 +1,22 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Nov 15, 2004
+ * Time: 5:40:02 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Test {
+ Integer sum(int i, int j) {
+ return i + j;
+ }
+
+ int[] foo(int n, int k) {
+ int[] a = new int[n];
+
+ for (int i = 0; i < a.length; i++) {
+ a[i] = sum(i, k);
+ }
+
+ return a;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t03/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t03/before/test.java
new file mode 100644
index 000000000000..9e1559784bde
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t03/before/test.java
@@ -0,0 +1,22 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Nov 15, 2004
+ * Time: 5:40:02 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Test {
+ int sum(int i, int j) {
+ return i + j;
+ }
+
+ int[] foo(int n, int k) {
+ int[] a = new int[n];
+
+ for (int i = 0; i < a.length; i++) {
+ a[i] = sum(i, k);
+ }
+
+ return a;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t04/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t04/after/Test.items
new file mode 100644
index 000000000000..edea723357ea
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t04/after/Test.items
@@ -0,0 +1,21 @@
+Types:
+PsiLocalVariable:a : java.lang.Long[][]
+PsiMethod:bar : java.lang.Long[]
+PsiMethod:foo : java.lang.Long[][]
+PsiMethodCallExpression:bar() : java.lang.Long[]
+PsiNewExpression:new Integer[0] : java.lang.Long[]
+PsiNewExpression:new Integer[0] : java.lang.Long[]
+PsiNewExpression:new Integer[0] : java.lang.Long[]
+PsiNewExpression:new Integer[][] {new Integer[0], new Integer[0]} : java.lang.Long[][]
+PsiReferenceExpression:a : java.lang.Long[][]
+PsiReferenceExpression:a : java.lang.Long[][]
+PsiReferenceExpression:a : java.lang.Long[][]
+
+Conversions:
+
+New expression type changes:
+new Integer[0] -> java.lang.Long[]
+new Integer[0] -> java.lang.Long[]
+new Integer[0] -> java.lang.Long[]
+new Integer[][] {new Integer[0], new Integer[0]} -> java.lang.Long[][]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t04/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t04/after/test.java
new file mode 100644
index 000000000000..080208fcbd6c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t04/after/test.java
@@ -0,0 +1,22 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Nov 15, 2004
+ * Time: 5:40:02 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Test {
+ Long[] bar() {
+ return new Long[0];
+ }
+
+ Long[][] foo(int n, int k) {
+ Long[][] a = new Long[][]{new Long[0], new Long[0]};
+
+ for (int i = 0; i < a.length; i++) {
+ a[i] = bar();
+ }
+
+ return a;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t04/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t04/before/test.java
new file mode 100644
index 000000000000..591b5a530d2b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t04/before/test.java
@@ -0,0 +1,22 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Nov 15, 2004
+ * Time: 5:40:02 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Test {
+ Integer[] bar() {
+ return new Integer[0];
+ }
+
+ Integer[] foo(int n, int k) {
+ Integer[][] a = new Integer[][] {new Integer[0], new Integer[0]};
+
+ for (int i = 0; i < a.length; i++) {
+ a[i] = bar();
+ }
+
+ return a;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t05/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t05/after/Test.items
new file mode 100644
index 000000000000..8152c1b711e7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t05/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:i : java.lang.Integer
+PsiReferenceExpression:i : java.lang.Integer
+
+Conversions:
+i -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t05/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t05/after/test.java
new file mode 100644
index 000000000000..b74d13b84fda
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t05/after/test.java
@@ -0,0 +1,22 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Nov 15, 2004
+ * Time: 5:40:02 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Test {
+ int sum(Integer i, int j) {
+ return i + j;
+ }
+
+ int[] foo(int n, int k) {
+ int[] a = new int[] {1, 2, 3, 4};
+
+ for (int i = 0; i < a.length; i++) {
+ a[i] = sum(i, k);
+ }
+
+ return a;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t05/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t05/before/test.java
new file mode 100644
index 000000000000..e8a96127f4fd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t05/before/test.java
@@ -0,0 +1,22 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Nov 15, 2004
+ * Time: 5:40:02 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Test {
+ int sum(int i, int j) {
+ return i + j;
+ }
+
+ int[] foo(int n, int k) {
+ int[] a = new int[] {1, 2, 3, 4};
+
+ for (int i = 0; i < a.length; i++) {
+ a[i] = sum(i, k);
+ }
+
+ return a;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t06/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t06/after/Test.items
new file mode 100644
index 000000000000..3ad4c0f7992f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t06/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiLocalVariable:a : B
+PsiMethod:getA : B
+PsiMethodCallExpression:getA () : B
+PsiReferenceExpression:a : B
+
+Conversions:
+
+New expression type changes:
+Fails:
+new A ()->B
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t06/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t06/after/test.java
new file mode 100644
index 000000000000..f4fa6ab1f876
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t06/after/test.java
@@ -0,0 +1,25 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Nov 15, 2004
+ * Time: 5:40:02 PM
+ * To change this template use File | Settings | File Templates.
+ */
+class A {}
+class B {}
+
+public class Test {
+ B getA() {
+ return new A ();
+ }
+
+ int foo() {
+ B a = getA ();
+
+ if (a != null){
+ return 0;
+ }
+
+ return 1;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t06/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t06/before/test.java
new file mode 100644
index 000000000000..862356ebd9cc
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t06/before/test.java
@@ -0,0 +1,25 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: Nov 15, 2004
+ * Time: 5:40:02 PM
+ * To change this template use File | Settings | File Templates.
+ */
+class A {}
+class B {}
+
+public class Test {
+ A getA() {
+ return new A ();
+ }
+
+ int foo() {
+ A a = getA ();
+
+ if (a != null){
+ return 0;
+ }
+
+ return 1;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t07/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t07/after/Test.items
new file mode 100644
index 000000000000..12252787a292
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t07/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:f : java.lang.Integer[]
+PsiNewExpression:new int[0] : java.lang.Integer[]
+
+Conversions:
+
+New expression type changes:
+new int[0] -> java.lang.Integer[]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t07/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t07/after/test.java
new file mode 100644
index 000000000000..09d7a0982009
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t07/after/test.java
@@ -0,0 +1,3 @@
+public class Test {
+ Integer[] f = new Integer[0];
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t07/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t07/before/test.java
new file mode 100644
index 000000000000..87955af32435
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t07/before/test.java
@@ -0,0 +1,3 @@
+public class Test {
+ int[] f = new int[0];
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t08/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t08/after/Test.items
new file mode 100644
index 000000000000..7c09ce5a46f7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t08/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:f : java.lang.String[]
+PsiNewExpression:new Integer[0] : java.lang.String[]
+PsiParameter:i : java.lang.String
+PsiReferenceExpression:f : java.lang.String[]
+
+Conversions:
+
+New expression type changes:
+new Integer[0] -> java.lang.String[]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t08/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t08/after/test.java
new file mode 100644
index 000000000000..9f13a80a2f2a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t08/after/test.java
@@ -0,0 +1,6 @@
+public class Test {
+ String[] f = new String[0];
+ void foo() {
+ for (String i : f) {}
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t08/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t08/before/test.java
new file mode 100644
index 000000000000..e38a9aa3155d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t08/before/test.java
@@ -0,0 +1,6 @@
+public class Test {
+ Integer[] f = new Integer[0];
+ void foo() {
+ for (Integer i : f) {}
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t09/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t09/after/Test.items
new file mode 100644
index 000000000000..39394462b76e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t09/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiField:f : java.lang.String[]
+PsiNewExpression:new Integer[0] : java.lang.String[]
+PsiParameter:g : java.lang.String[]
+PsiReferenceExpression:f : java.lang.String[]
+
+Conversions:
+f -> $
+
+New expression type changes:
+new Integer[0] -> java.lang.String[]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t09/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t09/after/test.java
new file mode 100644
index 000000000000..5e779c9e12f5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t09/after/test.java
@@ -0,0 +1,8 @@
+public class Test {
+ String[] f = new String[0];
+ void foo() {
+ bar(1, f);
+ }
+
+ void bar(int i, String[] g){}
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t09/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t09/before/test.java
new file mode 100644
index 000000000000..db3f02ed1976
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t09/before/test.java
@@ -0,0 +1,8 @@
+public class Test {
+ Integer[] f = new Integer[0];
+ void foo() {
+ bar(1, f);
+ }
+
+ void bar(int i, Integer[] g){}
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t10/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t10/after/Test.items
new file mode 100644
index 000000000000..77d161720fb5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t10/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:f : java.util.List<java.lang.String>
+PsiParameter:i : java.lang.String
+PsiReferenceExpression:f : java.util.List<java.lang.String>
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t10/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t10/after/test.java
new file mode 100644
index 000000000000..7820f54d0340
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t10/after/test.java
@@ -0,0 +1,7 @@
+import java.util.List;
+public class Test {
+ List<String> f;
+ void foo() {
+ for (String i : f) {}
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t10/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t10/before/test.java
new file mode 100644
index 000000000000..726f23a4bf8d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t10/before/test.java
@@ -0,0 +1,7 @@
+import java.util.List;
+public class Test {
+ List<Integer> f;
+ void foo() {
+ for (Integer i : f) {}
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t100/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t100/after/Test.items
new file mode 100644
index 000000000000..135dca6a135e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t100/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:f : java.util.Map<java.lang.String,java.lang.Integer>
+PsiNewExpression:new HashMap<String,String>() : java.util.HashMap<java.lang.String,java.lang.Integer>
+
+Conversions:
+
+New expression type changes:
+new HashMap<String,String>() -> java.util.HashMap<java.lang.String,java.lang.Integer>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t100/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t100/after/test.java
new file mode 100644
index 000000000000..b2917c86149e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t100/after/test.java
@@ -0,0 +1,6 @@
+import java.util.*;
+public class Test {
+ Map<String, Integer> f = new HashMap<>();
+
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t100/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t100/before/test.java
new file mode 100644
index 000000000000..7bf03e3a27da
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t100/before/test.java
@@ -0,0 +1,6 @@
+import java.util.*;
+public class Test {
+ Map<String,String> f = new HashMap<String,String>();
+
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t101/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t101/after/Test.items
new file mode 100644
index 000000000000..285bc5b6ca51
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t101/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethodCallExpression:p.get(0) : java.util.ArrayList<java.lang.Integer>
+PsiParameter:p : java.util.ArrayList<java.lang.Integer>[]
+PsiReferenceExpression:p : java.util.ArrayList<java.lang.Integer>[]
+
+Conversions:
+p.get(0) -> $qualifier$[$i$] $qualifier$.get($i$) p.get(0)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t101/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t101/after/test.java
new file mode 100644
index 000000000000..6344b428b46c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t101/after/test.java
@@ -0,0 +1,6 @@
+import java.util.*;
+public class Test {
+ void meth(ArrayList<Integer>[] p) {
+ ArrayList<Integer> v = p[0];
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t101/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t101/before/test.java
new file mode 100644
index 000000000000..e16f3d100bc9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t101/before/test.java
@@ -0,0 +1,6 @@
+import java.util.*;
+public class Test {
+ void meth(List<ArrayList<Integer>> p) {
+ ArrayList<Integer> v = p.get(0);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t102/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t102/after/Test.items
new file mode 100644
index 000000000000..b9f794b195bf
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t102/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:s : java.lang.Object[]
+PsiReferenceExpression:s : java.lang.Object[]
+
+Conversions:
+
+New expression type changes:
+Fails:
+s->java.lang.Object[]
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t102/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t102/after/test.java
new file mode 100644
index 000000000000..dcd056fcaf90
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t102/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+public class Test {
+ void method(Object[] s) {
+ s.add(null);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t102/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t102/before/test.java
new file mode 100644
index 000000000000..f59b5db84644
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t102/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+public class Test {
+ void method(Set<? extends Object> s) {
+ s.add(null);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t103/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t103/after/Test.items
new file mode 100644
index 000000000000..b13c3192a1d8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t103/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:l : java.lang.Integer[]
+PsiReferenceExpression:l : java.lang.Integer[]
+
+Conversions:
+
+New expression type changes:
+Fails:
+l->java.lang.Integer[]
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t103/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t103/after/test.java
new file mode 100644
index 000000000000..af807d53c7b0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t103/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+public class Test {
+ void method(Integer[] l) {
+ l.set(1, "");
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t103/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t103/before/test.java
new file mode 100644
index 000000000000..7e5802d50574
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t103/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+public class Test {
+ void method(ArrayList<String> l) {
+ l.set(1, "");
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t104/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t104/after/Test.items
new file mode 100644
index 000000000000..f085abb3c681
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t104/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:l : java.lang.String[]
+PsiReferenceExpression:l : java.lang.String[]
+
+Conversions:
+
+New expression type changes:
+Fails:
+l->java.lang.String[]
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t104/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t104/after/test.java
new file mode 100644
index 000000000000..d70a09a513bd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t104/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+public class Test {
+ void method(String[] l) {
+ l.set(1, "");
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t104/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t104/before/test.java
new file mode 100644
index 000000000000..bc4b40c061a2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t104/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+public class Test {
+ void method(ArrayList l) {
+ l.set(1, "");
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t105/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t105/after/Test.items
new file mode 100644
index 000000000000..7821f01df96c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t105/after/Test.items
@@ -0,0 +1,7 @@
+Types:
+PsiField:t : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t105/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t105/after/test.java
new file mode 100644
index 000000000000..71797316503f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t105/after/test.java
@@ -0,0 +1,3 @@
+public class Test<T> {
+ String t;
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t105/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t105/before/test.java
new file mode 100644
index 000000000000..763dc905176d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t105/before/test.java
@@ -0,0 +1,3 @@
+public class Test<T> {
+ T t;
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t106/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t106/after/Test.items
new file mode 100644
index 000000000000..2fab8a1f5fae
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t106/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:t : java.lang.String
+PsiReferenceExpression:t : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
+t->java.lang.String
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t106/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t106/after/test.java
new file mode 100644
index 000000000000..dafbfca4a742
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t106/after/test.java
@@ -0,0 +1,6 @@
+public class Test<T extends Number> {
+ String t;
+ void foo() {
+ int i = t.intValue();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t106/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t106/before/test.java
new file mode 100644
index 000000000000..65ad21055710
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t106/before/test.java
@@ -0,0 +1,6 @@
+public class Test<T extends Number> {
+ T t;
+ void foo() {
+ int i = t.intValue();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t107/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t107/after/Test.items
new file mode 100644
index 000000000000..93a16148be72
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t107/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:t : java.lang.Integer
+PsiMethodCallExpression:t.intValue() : int
+PsiReferenceExpression:t : java.lang.Integer
+
+Conversions:
+t.intValue() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t107/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t107/after/test.java
new file mode 100644
index 000000000000..ce44f19e2458
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t107/after/test.java
@@ -0,0 +1,6 @@
+public class Test<T extends Number> {
+ Integer t;
+ void foo() {
+ int i = t.intValue();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t107/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t107/before/test.java
new file mode 100644
index 000000000000..65ad21055710
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t107/before/test.java
@@ -0,0 +1,6 @@
+public class Test<T extends Number> {
+ T t;
+ void foo() {
+ int i = t.intValue();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t108/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t108/after/Test.items
new file mode 100644
index 000000000000..a9f530ce25f7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t108/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiMethodCallExpression:integer.intValue() : int
+PsiParameter:integer : java.lang.Number
+PsiParameter:l : java.util.List<? extends java.lang.Number>
+PsiReferenceExpression:integer : java.lang.Number
+PsiReferenceExpression:l : java.util.List<? extends java.lang.Number>
+
+Conversions:
+integer.intValue() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t108/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t108/after/test.java
new file mode 100644
index 000000000000..26b9322b4739
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t108/after/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+public class Test {
+ void method(List<? extends Number> l) {
+ for (Number integer : l) {
+ System.out.println(integer.intValue());
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t108/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t108/before/test.java
new file mode 100644
index 000000000000..08a3229cd932
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t108/before/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+public class Test {
+ void method(List<Integer> l) {
+ for (Integer integer : l) {
+ System.out.println(integer.intValue());
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t109/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t109/after/Test.items
new file mode 100644
index 000000000000..6a47f6675781
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t109/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiMethodCallExpression:integer.hashCode() : int
+PsiParameter:integer : java.lang.Object
+PsiParameter:l : java.util.List<? super java.lang.Number>
+PsiReferenceExpression:integer : java.lang.Object
+PsiReferenceExpression:l : java.util.List<? super java.lang.Number>
+
+Conversions:
+integer.hashCode() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t109/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t109/after/test.java
new file mode 100644
index 000000000000..bae70cd5b0d4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t109/after/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+public class Test {
+ void method(List<? super Number> l) {
+ for (Object integer : l) {
+ System.out.println(integer.hashCode());
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t109/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t109/before/test.java
new file mode 100644
index 000000000000..26280e892cd0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t109/before/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+public class Test {
+ void method(List<Integer> l) {
+ for (Integer integer : l) {
+ System.out.println(integer.hashCode());
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t11/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t11/after/Test.items
new file mode 100644
index 000000000000..4058a7862ff2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t11/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:f : java.util.Map<java.lang.String,java.lang.Integer>
+PsiMethodCallExpression:f.keySet() : java.util.Set<java.lang.String>
+PsiParameter:i : java.lang.String
+PsiReferenceExpression:f : java.util.Map<java.lang.String,java.lang.Integer>
+
+Conversions:
+f.keySet() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t11/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t11/after/test.java
new file mode 100644
index 000000000000..1491875ea2b7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t11/after/test.java
@@ -0,0 +1,7 @@
+import java.util.Map;
+public class Test {
+ Map<String, Integer> f;
+ void foo() {
+ for (String i : f.keySet()) {}
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t11/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t11/before/test.java
new file mode 100644
index 000000000000..b0aa7086f175
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t11/before/test.java
@@ -0,0 +1,7 @@
+import java.util.Map;
+public class Test {
+ Map<Integer, Integer> f;
+ void foo() {
+ for (Integer i : f.keySet()) {}
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t110/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t110/after/Test.items
new file mode 100644
index 000000000000..3853e035e26b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t110/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiParameter:integer : java.lang.String
+PsiParameter:l : java.util.List<? extends java.lang.String>
+PsiReferenceExpression:integer : java.lang.String
+PsiReferenceExpression:l : java.util.List<? extends java.lang.String>
+
+Conversions:
+
+New expression type changes:
+Fails:
+integer->java.lang.String
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t110/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t110/after/test.java
new file mode 100644
index 000000000000..cb813fd6567f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t110/after/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+public class Test {
+ void method(List<? extends String> l) {
+ for (String integer : l) {
+ System.out.println(integer.intValue());
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t110/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t110/before/test.java
new file mode 100644
index 000000000000..08a3229cd932
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t110/before/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+public class Test {
+ void method(List<Integer> l) {
+ for (Integer integer : l) {
+ System.out.println(integer.intValue());
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t111/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t111/after/Test.items
new file mode 100644
index 000000000000..29717a0b2377
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t111/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiParameter:i : java.lang.Integer[]
+PsiReferenceExpression:i : java.lang.Integer[]
+PsiReferenceExpression:i : java.lang.Integer[]
+
+Conversions:
+
+New expression type changes:
+Fails:
+i->java.lang.Integer[]
+i++->java.lang.Integer[]
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t111/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t111/after/test.java
new file mode 100644
index 000000000000..e257e485d6bb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t111/after/test.java
@@ -0,0 +1,7 @@
+public class Test {
+ void method(Integer[] i) {
+ if (i == 0) {
+ i++;
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t111/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t111/before/test.java
new file mode 100644
index 000000000000..2620dd9f5d6a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t111/before/test.java
@@ -0,0 +1,7 @@
+public class Test {
+ void method(Integer i) {
+ if (i == 0) {
+ i++;
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t112/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t112/after/Test.items
new file mode 100644
index 000000000000..78f2ed729f10
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t112/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiMethod:method : java.lang.Integer[]
+
+Conversions:
+112 -> new java.lang.Integer[]{$qualifier$} $qualifier$ 112
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t112/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t112/after/test.java
new file mode 100644
index 000000000000..c31ec11010c3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t112/after/test.java
@@ -0,0 +1,5 @@
+public class Test {
+ Integer[] method() {
+ return new Integer[]{112};
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t112/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t112/before/test.java
new file mode 100644
index 000000000000..e7bf28f0de1e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t112/before/test.java
@@ -0,0 +1,5 @@
+public class Test {
+ Integer method() {
+ return 112;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t113/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t113/after/Test.items
new file mode 100644
index 000000000000..1b69785be552
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t113/after/Test.items
@@ -0,0 +1,7 @@
+Types:
+PsiParameter:p : java.lang.Number...
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t113/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t113/after/test.java
new file mode 100644
index 000000000000..9f9bdcaffad7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t113/after/test.java
@@ -0,0 +1,7 @@
+public class Test {
+ void method(Number... p) {}
+
+ public void doSmth() {
+ m(123);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t113/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t113/before/test.java
new file mode 100644
index 000000000000..6627e8d101de
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t113/before/test.java
@@ -0,0 +1,7 @@
+public class Test {
+ void method(Integer... p) {}
+
+ public void doSmth() {
+ m(123);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t114/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t114/after/Test.items
new file mode 100644
index 000000000000..b6c70f112866
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t114/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.lang.String...
+PsiReferenceExpression:p : java.lang.String[]
+
+Conversions:
+
+New expression type changes:
+Fails:
+p[0]->java.lang.String
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t114/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t114/after/test.java
new file mode 100644
index 000000000000..6e2b9f24c22a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t114/after/test.java
@@ -0,0 +1,9 @@
+public class Test {
+ void method(String... p) {
+ int i = p[0].intValue();
+ }
+
+ public void doSmth() {
+ m(123);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t114/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t114/before/test.java
new file mode 100644
index 000000000000..f73951e56432
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t114/before/test.java
@@ -0,0 +1,9 @@
+public class Test {
+ void method(Integer... p) {
+ int i = p[0].intValue();
+ }
+
+ public void doSmth() {
+ m(123);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t115/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t115/after/Test.items
new file mode 100644
index 000000000000..b07cf0af793c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t115/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:i : java.lang.String...
+
+Conversions:
+
+New expression type changes:
+Fails:
+2->java.lang.String
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t115/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t115/after/test.java
new file mode 100644
index 000000000000..8d69a2330c70
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t115/after/test.java
@@ -0,0 +1,8 @@
+class Test {
+ void foo(String... i) {
+ }
+
+ void bar() {
+ foo("str", 2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t115/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t115/before/test.java
new file mode 100644
index 000000000000..f585aba2e91c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t115/before/test.java
@@ -0,0 +1,8 @@
+class Test {
+ void foo(Object... i) {
+ }
+
+ void bar() {
+ foo("str", 2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t116/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t116/after/Test.items
new file mode 100644
index 000000000000..0aee5ef814c6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t116/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:str : java.lang.String
+PsiParameter:number : java.lang.String
+PsiReferenceExpression:number : java.lang.String
+PsiReferenceExpression:str : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t116/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t116/after/test.java
new file mode 100644
index 000000000000..95ddfb44251f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t116/after/test.java
@@ -0,0 +1,9 @@
+class Test {
+ String str;
+
+ void foo(String[] p) {
+ for (String number : p) {
+ number = str;
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t116/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t116/before/test.java
new file mode 100644
index 000000000000..d68047e81823
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t116/before/test.java
@@ -0,0 +1,9 @@
+class Test {
+ Number str;
+
+ void foo(String[] p) {
+ for (Number number : p) {
+ number = str;
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t117/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t117/after/Test.items
new file mode 100644
index 000000000000..0aee5ef814c6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t117/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:str : java.lang.String
+PsiParameter:number : java.lang.String
+PsiReferenceExpression:number : java.lang.String
+PsiReferenceExpression:str : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t117/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t117/after/test.java
new file mode 100644
index 000000000000..3172eaa133dc
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t117/after/test.java
@@ -0,0 +1,10 @@
+import java.util.*;
+class Test {
+ String str;
+
+ void foo(List<String> p) {
+ for (String number : p) {
+ number = str;
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t117/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t117/before/test.java
new file mode 100644
index 000000000000..46cde69dca96
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t117/before/test.java
@@ -0,0 +1,10 @@
+import java.util.*;
+class Test {
+ Number str;
+
+ void foo(List<String> p) {
+ for (Number number : p) {
+ number = str;
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t118/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t118/after/Test.items
new file mode 100644
index 000000000000..dcd1be2928cb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t118/after/Test.items
@@ -0,0 +1,7 @@
+Types:
+PsiParameter:p : java.lang.Integer...
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t118/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t118/after/test.java
new file mode 100644
index 000000000000..37d684a97957
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t118/after/test.java
@@ -0,0 +1,10 @@
+import java.util.*;
+class Test {
+
+ void method(Integer... p) {
+ }
+
+ public void doSmth(ArrayList<Integer> p) {
+ method(p.get(2));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t118/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t118/before/test.java
new file mode 100644
index 000000000000..012a188e5ad5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t118/before/test.java
@@ -0,0 +1,10 @@
+import java.util.*;
+class Test {
+
+ void method(Integer p) {
+ }
+
+ public void doSmth(ArrayList<Integer> p) {
+ method(p.get(2));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t119/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t119/after/Test.items
new file mode 100644
index 000000000000..dcd1be2928cb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t119/after/Test.items
@@ -0,0 +1,7 @@
+Types:
+PsiParameter:p : java.lang.Integer...
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t119/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t119/after/test.java
new file mode 100644
index 000000000000..28446b6bc761
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t119/after/test.java
@@ -0,0 +1,9 @@
+class Test {
+
+ void method(Integer... p) {
+ }
+
+ public void doSmth(Integer[] p) {
+ method(p[2]);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t119/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t119/before/test.java
new file mode 100644
index 000000000000..28aeed25cefa
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t119/before/test.java
@@ -0,0 +1,9 @@
+class Test {
+
+ void method(Integer p) {
+ }
+
+ public void doSmth(Integer[] p) {
+ method(p[2]);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t12/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t12/after/Test.items
new file mode 100644
index 000000000000..a1b75e0f23ac
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t12/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:f : java.util.List<java.lang.String>
+PsiLocalVariable:i : java.lang.String
+PsiReferenceExpression:f : java.util.List<java.lang.String>
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t12/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t12/after/test.java
new file mode 100644
index 000000000000..657869206253
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t12/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+public class Test {
+ List<String> f;
+ void foo() {
+ String i = Collections.min(f);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t12/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t12/before/test.java
new file mode 100644
index 000000000000..24199ff02584
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t12/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+public class Test {
+ List<Integer> f;
+ void foo() {
+ Integer i = Collections.min(f);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t120/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t120/after/Test.items
new file mode 100644
index 000000000000..6f23d60f1d3c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t120/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiParameter:p : java.lang.String...
+PsiParameter:p : java.lang.String[]
+PsiReferenceExpression:p : java.lang.String[]
+PsiReferenceExpression:p : java.lang.String[]
+
+Conversions:
+
+New expression type changes:
+Fails:
+p[3]->java.lang.String
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t120/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t120/after/test.java
new file mode 100644
index 000000000000..e40c1215581b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t120/after/test.java
@@ -0,0 +1,10 @@
+class Test {
+
+ void method(String... p) {
+ }
+
+ public void doSmth(String[] p) {
+ method(p[2]);
+ System.out.println(p[3].intValue());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t120/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t120/before/test.java
new file mode 100644
index 000000000000..0f65e57d94ee
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t120/before/test.java
@@ -0,0 +1,10 @@
+class Test {
+
+ void method(Integer p) {
+ }
+
+ public void doSmth(Integer[] p) {
+ method(p[2]);
+ System.out.println(p[3].intValue());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t121/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t121/after/Test.items
new file mode 100644
index 000000000000..dadc2c72891a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t121/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiMethodCallExpression:p.add(8) : boolean
+PsiParameter:p : java.util.ArrayList<java.lang.Float>
+PsiReferenceExpression:p : java.util.ArrayList<java.lang.Float>
+
+Conversions:
+8 -> $
+p.add(8) -> $
+
+New expression type changes:
+Fails:
+8->java.lang.Float
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t121/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t121/after/test.java
new file mode 100644
index 000000000000..e3a952e4d560
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t121/after/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+class Test {
+
+ void method(ArrayList<Float> p){
+ p.add(8);
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t121/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t121/before/test.java
new file mode 100644
index 000000000000..aad87ca532b7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t121/before/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+class Test {
+
+ void method(ArrayList<Number> p){
+ p.add(8);
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t122/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t122/after/Test.items
new file mode 100644
index 000000000000..00092fc53a55
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t122/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.util.List<java.lang.Integer>[]
+PsiReferenceExpression:p : java.util.List<java.lang.Integer>[]
+
+Conversions:
+
+New expression type changes:
+Fails:
+p->java.util.List<java.lang.Integer>[]
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t122/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t122/after/test.java
new file mode 100644
index 000000000000..5784ee52e360
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t122/after/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+class Test {
+
+ void method(List<Integer>[] p){
+ ArrayList<Integer> v = p.get(0);
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t122/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t122/before/test.java
new file mode 100644
index 000000000000..bb086dad2af8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t122/before/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+class Test {
+
+ void method(List<ArrayList<Integer>> p){
+ ArrayList<Integer> v = p.get(0);
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t123/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t123/after/Test.items
new file mode 100644
index 000000000000..691d3e6a1e26
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t123/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiField:n : java.lang.Integer
+PsiParameter:number : java.lang.Integer
+PsiParameter:p : java.lang.Integer[]
+PsiReferenceExpression:n : java.lang.Integer
+PsiReferenceExpression:number : java.lang.Integer
+PsiReferenceExpression:p : java.lang.Integer[]
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t123/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t123/after/test.java
new file mode 100644
index 000000000000..883991ffec9d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t123/after/test.java
@@ -0,0 +1,9 @@
+class Test {
+ Integer n;
+
+ void foo(Integer[] p) {
+ for (Integer number : p) {
+ n = number;
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t123/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t123/before/test.java
new file mode 100644
index 000000000000..516fcf828234
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t123/before/test.java
@@ -0,0 +1,9 @@
+class Test {
+ Number n;
+
+ void foo(Number[] p) {
+ for (Number number : p) {
+ n = number;
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t124/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t124/after/Test.items
new file mode 100644
index 000000000000..4a7df94f76b2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t124/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.lang.Integer
+PsiReferenceExpression:p : java.lang.Integer
+
+Conversions:
+
+New expression type changes:
+Fails:
+p->java.lang.Integer
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t124/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t124/after/test.java
new file mode 100644
index 000000000000..f41fe88534f4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t124/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public <U> U meth(Integer p) {
+ return p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t124/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t124/before/test.java
new file mode 100644
index 000000000000..b40d864d16c7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t124/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public <U> U meth(U p) {
+ return p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t125/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t125/after/Test.items
new file mode 100644
index 000000000000..3859bad4e428
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t125/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.lang.Integer
+PsiReferenceExpression:p : java.lang.Integer
+
+Conversions:
+
+New expression type changes:
+Fails:
+Collections.singletonList(p)->java.util.List<java.lang.Integer>
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t125/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t125/after/test.java
new file mode 100644
index 000000000000..7854f476cc9e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t125/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ public <U> List<U> meth(Integer p) {
+ return Collections.singletonList(p);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t125/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t125/before/test.java
new file mode 100644
index 000000000000..30cf3914d62a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t125/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ public <U> List<U> meth(U p) {
+ return Collections.singletonList(p);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t126/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t126/after/Test.items
new file mode 100644
index 000000000000..f870c21c0523
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t126/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiMethod:meth : T
+
+Conversions:
+
+New expression type changes:
+Fails:
+map.get(2)->T
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t126/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t126/after/test.java
new file mode 100644
index 000000000000..7b2814378d28
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t126/after/test.java
@@ -0,0 +1,9 @@
+import java.util.*;
+
+class Test<T> {
+ Map<Integer, String> map;
+
+ T meth() {
+ return map.get(2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t126/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t126/before/test.java
new file mode 100644
index 000000000000..0dc76ccbdc72
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t126/before/test.java
@@ -0,0 +1,9 @@
+import java.util.*;
+
+class Test<T> {
+ Map<Integer, String> map;
+
+ String meth() {
+ return map.get(2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t127/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t127/after/Test.items
new file mode 100644
index 000000000000..78aa0fbd396b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t127/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiLocalVariable:i : long
+PsiMethod:test234 : long
+PsiMethodCallExpression:test234(1,
+ 2) : long
+
+Conversions:
+1 -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t127/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t127/after/test.java
new file mode 100644
index 000000000000..06a4d09a41a6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t127/after/test.java
@@ -0,0 +1,13 @@
+public class Test {
+
+ public long test234(int i,
+ int j)
+ {
+ return 1;
+ }
+
+ public void foo() {
+ long i = test234(1,
+ 2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t127/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t127/before/test.java
new file mode 100644
index 000000000000..dd2c813fd38e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t127/before/test.java
@@ -0,0 +1,13 @@
+public class Test {
+
+ public int test234(int i,
+ int j)
+ {
+ return 1;
+ }
+
+ public void foo() {
+ int i = test234(1,
+ 2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t128/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t128/after/Test.items
new file mode 100644
index 000000000000..24ec208dbb43
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t128/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethodCallExpression:e.printStackTrace() : void
+PsiParameter:e : Test.E
+PsiReferenceExpression:e : Test.E
+
+Conversions:
+e.printStackTrace() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t128/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t128/after/test.java
new file mode 100644
index 000000000000..8f2ad153d911
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t128/after/test.java
@@ -0,0 +1,16 @@
+class Test {
+ static class E extends Exception { }
+ static class E1 extends E { }
+ static class E2 extends E { }
+
+ void m(boolean f) {
+ try {
+ if (f)
+ throw new E1();
+ else
+ throw new E2();
+ } catch (E e) {
+ e.printStackTrace();
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t128/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t128/before/test.java
new file mode 100644
index 000000000000..33bb6bf973c1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t128/before/test.java
@@ -0,0 +1,16 @@
+class Test {
+ static class E extends Exception { }
+ static class E1 extends E { }
+ static class E2 extends E { }
+
+ void m(boolean f) {
+ try {
+ if (f)
+ throw new E1();
+ else
+ throw new E2();
+ } catch (E1 | E2 e) {
+ e.printStackTrace();
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t129/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t129/after/Test.items
new file mode 100644
index 000000000000..8ca26492b5bd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t129/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethodCallExpression:e.printStackTrace() : void
+PsiParameter:e : Test.E1 | Test.E2
+PsiReferenceExpression:e : Test.E1 | Test.E2
+
+Conversions:
+e.printStackTrace() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t129/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t129/after/test.java
new file mode 100644
index 000000000000..33bb6bf973c1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t129/after/test.java
@@ -0,0 +1,16 @@
+class Test {
+ static class E extends Exception { }
+ static class E1 extends E { }
+ static class E2 extends E { }
+
+ void m(boolean f) {
+ try {
+ if (f)
+ throw new E1();
+ else
+ throw new E2();
+ } catch (E1 | E2 e) {
+ e.printStackTrace();
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t129/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t129/before/test.java
new file mode 100644
index 000000000000..8f2ad153d911
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t129/before/test.java
@@ -0,0 +1,16 @@
+class Test {
+ static class E extends Exception { }
+ static class E1 extends E { }
+ static class E2 extends E { }
+
+ void m(boolean f) {
+ try {
+ if (f)
+ throw new E1();
+ else
+ throw new E2();
+ } catch (E e) {
+ e.printStackTrace();
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t13/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t13/after/Test.items
new file mode 100644
index 000000000000..ca5cc75efa2e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t13/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:f : java.util.List<java.lang.Integer>
+PsiMethodCallExpression:f.add("val") : boolean
+PsiReferenceExpression:f : java.util.List<java.lang.Integer>
+
+Conversions:
+f.add("val") -> $
+
+New expression type changes:
+Fails:
+"val"->java.lang.Integer
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t13/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t13/after/test.java
new file mode 100644
index 000000000000..53b97a29e38c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t13/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+public class Test {
+ List<Integer> f;
+ void foo() {
+ f.add("val");
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t13/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t13/before/test.java
new file mode 100644
index 000000000000..9024eab86966
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t13/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+public class Test {
+ List<String> f;
+ void foo() {
+ f.add("val");
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t130/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t130/after/Test.items
new file mode 100644
index 000000000000..056ae7968e06
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t130/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiMethodCallExpression:e.printStackTrace() : void
+PsiParameter:e : Test.E
+PsiReferenceExpression:e : Test.E
+PsiReferenceExpression:e : Test.E
+
+Conversions:
+e.printStackTrace() -> $
+
+New expression type changes:
+Fails:
+e->Test.E
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t130/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t130/after/test.java
new file mode 100644
index 000000000000..67ed3db2315a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t130/after/test.java
@@ -0,0 +1,18 @@
+class Test {
+ static class E extends Exception { }
+ static interface I { void i(); }
+ static class E1 extends E implements I { public void i() { } }
+ static class E2 extends E implements I { public void i() { } }
+
+ void m(boolean f) {
+ try {
+ if (f)
+ throw new E1();
+ else
+ throw new E2();
+ } catch (E e) {
+ e.printStackTrace();
+ e.i();
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t130/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t130/before/test.java
new file mode 100644
index 000000000000..7ee7852db3d4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t130/before/test.java
@@ -0,0 +1,18 @@
+class Test {
+ static class E extends Exception { }
+ static interface I { void i(); }
+ static class E1 extends E implements I { public void i() { } }
+ static class E2 extends E implements I { public void i() { } }
+
+ void m(boolean f) {
+ try {
+ if (f)
+ throw new E1();
+ else
+ throw new E2();
+ } catch (E1 | E2 e) {
+ e.printStackTrace();
+ e.i();
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t131/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t131/after/Test.items
new file mode 100644
index 000000000000..e8d3b6152d2d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t131/after/Test.items
@@ -0,0 +1,13 @@
+Types:
+PsiMethodCallExpression:e.i() : void
+PsiMethodCallExpression:e.printStackTrace() : void
+PsiParameter:e : Test.E2 | Test.E1
+PsiReferenceExpression:e : Test.E2 | Test.E1
+PsiReferenceExpression:e : Test.E2 | Test.E1
+
+Conversions:
+e.i() -> $
+e.printStackTrace() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t131/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t131/after/test.java
new file mode 100644
index 000000000000..5c02bb8a41f2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t131/after/test.java
@@ -0,0 +1,18 @@
+class Test {
+ static class E extends Exception { }
+ static interface I { void i(); }
+ static class E1 extends E implements I { public void i() { } }
+ static class E2 extends E implements I { public void i() { } }
+
+ void m(boolean f) {
+ try {
+ if (f)
+ throw new E1();
+ else
+ throw new E2();
+ } catch (E2 | E1 e) {
+ e.printStackTrace();
+ e.i();
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t131/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t131/before/test.java
new file mode 100644
index 000000000000..7ee7852db3d4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t131/before/test.java
@@ -0,0 +1,18 @@
+class Test {
+ static class E extends Exception { }
+ static interface I { void i(); }
+ static class E1 extends E implements I { public void i() { } }
+ static class E2 extends E implements I { public void i() { } }
+
+ void m(boolean f) {
+ try {
+ if (f)
+ throw new E1();
+ else
+ throw new E2();
+ } catch (E1 | E2 e) {
+ e.printStackTrace();
+ e.i();
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t132/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t132/after/Test.items
new file mode 100644
index 000000000000..e5b813b90288
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t132/after/Test.items
@@ -0,0 +1,15 @@
+Types:
+PsiMethodCallExpression:i.f() : void
+PsiMethodCallExpression:i.f() : void
+PsiParameter:i : I
+PsiParameter:i : I
+PsiParameter:i : I
+PsiReferenceExpression:i : I
+PsiReferenceExpression:i : I
+
+Conversions:
+i.f() -> $
+i.f() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t132/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t132/after/test.java
new file mode 100644
index 000000000000..6f53c98f5459
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t132/after/test.java
@@ -0,0 +1,25 @@
+interface I {
+ void f();
+}
+
+interface J extends I {
+ void g();
+}
+
+public interface Test {
+ void h(I i);
+}
+
+class B implements Test {
+ @Override
+ public void h(I i) {
+ i.f();
+ }
+}
+
+class C implements Test {
+ @Override
+ public void h(I i) {
+ i.f();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t132/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t132/before/test.java
new file mode 100644
index 000000000000..2e6ab23c21d6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t132/before/test.java
@@ -0,0 +1,25 @@
+interface I {
+ void f();
+}
+
+interface J extends I {
+ void g();
+}
+
+public interface Test {
+ void h(J i);
+}
+
+class B implements Test {
+ @Override
+ public void h(J i) {
+ i.f();
+ }
+}
+
+class C implements Test {
+ @Override
+ public void h(J i) {
+ i.f();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t133/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t133/after/Test.items
new file mode 100644
index 000000000000..777fddf90a83
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t133/after/Test.items
@@ -0,0 +1,16 @@
+Types:
+PsiMethodCallExpression:i.f() : void
+PsiMethodCallExpression:i.f() : void
+PsiParameter:i : I
+PsiParameter:i : I
+PsiParameter:i : I
+PsiParameter:i : I
+PsiReferenceExpression:i : I
+PsiReferenceExpression:i : I
+
+Conversions:
+i.f() -> $
+i.f() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t133/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t133/after/test.java
new file mode 100644
index 000000000000..41db920f7120
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t133/after/test.java
@@ -0,0 +1,33 @@
+interface I {
+ void f();
+}
+
+interface J extends I {
+ void g();
+}
+
+public interface Test {
+ void h(I i);
+}
+
+class B implements Test {
+ @Override
+ public void h(I i) {
+ i.f();
+ }
+}
+
+class C extends B {
+ @Override
+ public void h(I i) {
+ i.f();
+ }
+}
+
+abstract class F implements Test {}
+
+class FF extends F {
+ @Override
+ public void h(I i) {
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t133/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t133/before/test.java
new file mode 100644
index 000000000000..5599c1a59b46
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t133/before/test.java
@@ -0,0 +1,33 @@
+interface I {
+ void f();
+}
+
+interface J extends I {
+ void g();
+}
+
+public interface Test {
+ void h(J i);
+}
+
+class B implements Test {
+ @Override
+ public void h(J i) {
+ i.f();
+ }
+}
+
+class C extends B {
+ @Override
+ public void h(J i) {
+ i.f();
+ }
+}
+
+abstract class F implements Test {}
+
+class FF extends F {
+ @Override
+ public void h(J i) {
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t134/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t134/after/Test.items
new file mode 100644
index 000000000000..2880fefdc224
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t134/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiLocalVariable:i : java.lang.String
+PsiParameter:a : java.lang.String
+PsiReferenceExpression:a : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t134/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t134/after/test.java
new file mode 100644
index 000000000000..26cb24f419d2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t134/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ void buzz(final String a, final int b, final int c) {
+ String i = a + b + c;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t134/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t134/before/test.java
new file mode 100644
index 000000000000..7a7760404f36
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t134/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ void buzz(final int a, final int b, final int c) {
+ int i = a + b + c;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t135/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t135/after/Test.items
new file mode 100644
index 000000000000..4e20b05def59
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t135/after/Test.items
@@ -0,0 +1,16 @@
+Types:
+PsiField:bar : int
+PsiField:foo : int
+PsiParameter:bar : int
+PsiParameter:foo : int
+PsiReferenceExpression:bar : int
+PsiReferenceExpression:bar : int
+PsiReferenceExpression:foo : int
+PsiReferenceExpression:foo : int
+PsiReferenceExpression:this.bar : int
+PsiReferenceExpression:this.foo : int
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t135/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t135/after/test.java
new file mode 100644
index 000000000000..c992fd8569bf
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t135/after/test.java
@@ -0,0 +1,19 @@
+class Test {
+ private int foo, bar;
+
+ public long getFoo() {
+ return foo;
+ }
+
+ public void setFoo(int foo) {
+ this.foo = foo;
+ }
+
+ public long getBar() {
+ return bar;
+ }
+
+ public void setBar(int bar) {
+ this.bar = bar;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t135/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t135/before/test.java
new file mode 100644
index 000000000000..756e9380835d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t135/before/test.java
@@ -0,0 +1,19 @@
+class Test {
+ private long foo, bar;
+
+ public long getFoo() {
+ return foo;
+ }
+
+ public void setFoo(long foo) {
+ this.foo = foo;
+ }
+
+ public long getBar() {
+ return bar;
+ }
+
+ public void setBar(long bar) {
+ this.bar = bar;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t136/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t136/after/Test.items
new file mode 100644
index 000000000000..617357a07275
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t136/after/Test.items
@@ -0,0 +1,17 @@
+Types:
+PsiLocalVariable:ints : java.util.ArrayList<java.lang.String>
+PsiMethodCallExpression:ints.add(i) : boolean
+PsiNewExpression:new ArrayList<Integer>() : java.util.ArrayList<java.lang.String>
+PsiParameter:i : java.lang.String
+PsiReferenceExpression:i : java.lang.String
+PsiReferenceExpression:i : java.lang.String
+PsiReferenceExpression:ints : java.util.ArrayList<java.lang.String>
+PsiReferenceExpression:ints : java.util.ArrayList<java.lang.String>
+
+Conversions:
+i -> $
+ints.add(i) -> $
+
+New expression type changes:
+new ArrayList<Integer>() -> java.util.ArrayList<java.lang.String>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t136/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t136/after/test.java
new file mode 100644
index 000000000000..08185f4c079c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t136/after/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+class Test {
+ private void foo(String i) {
+ ArrayList<String> ints = new ArrayList<>();
+ ints.add(i);
+ Object j = constantaB == null ? ints : i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t136/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t136/before/test.java
new file mode 100644
index 000000000000..e66f3a5f5bfa
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t136/before/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+class Test {
+ private void foo(Integer i) {
+ ArrayList<Integer> ints = new ArrayList<Integer>();
+ ints.add(i);
+ Object j = constantaB == null ? ints : i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t137/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t137/after/Test.items
new file mode 100644
index 000000000000..01da876f7e94
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t137/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:i : java.lang.String
+PsiReferenceExpression:i : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
+i[0]->java.lang.String
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t137/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t137/after/test.java
new file mode 100644
index 000000000000..b2d59c1303dc
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t137/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ private void foo(String i) {
+ int p = i[0];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t137/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t137/before/test.java
new file mode 100644
index 000000000000..832535bc9440
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t137/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ private void foo(int i) {
+ int p = i[0];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t138/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t138/after/Test.items
new file mode 100644
index 000000000000..176574ab1bc0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t138/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:set : java.util.Collection<java.lang.String>
+PsiReferenceExpression:set : java.util.Collection<java.lang.String>
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t138/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t138/after/test.java
new file mode 100644
index 000000000000..141e122e2ccc
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t138/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ Set<String> mySet = new HashSet();
+ void foo(Collection<String> set) {
+ mySet.retainAll(set);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t138/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t138/before/test.java
new file mode 100644
index 000000000000..28feb3c90d4a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t138/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ Set<String> mySet = new HashSet();
+ void foo(Set<String> set) {
+ mySet.retainAll(set);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t139/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t139/after/Test.items
new file mode 100644
index 000000000000..2fbe632fa578
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t139/after/Test.items
@@ -0,0 +1,7 @@
+Types:
+PsiParameter:s : java.lang.Integer
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t139/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t139/after/test.java
new file mode 100644
index 000000000000..d91661b68309
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t139/after/test.java
@@ -0,0 +1,10 @@
+import java.util.*;
+
+abstract class A implements Iterable<String> {}
+
+class Test {
+ void test(A it) {
+ for(Integer s : it) {
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t139/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t139/before/test.java
new file mode 100644
index 000000000000..f937525f52e2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t139/before/test.java
@@ -0,0 +1,10 @@
+import java.util.*;
+
+abstract class A implements Iterable<String> {}
+
+class Test {
+ void test(A it) {
+ for(String s : it) {
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t14/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t14/after/Test.items
new file mode 100644
index 000000000000..21635daebc66
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t14/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:f : A
+PsiMethodCallExpression:f.foo() : int
+PsiReferenceExpression:f : A
+
+Conversions:
+f.foo() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t14/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t14/after/test.java
new file mode 100644
index 000000000000..de034ae20adf
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t14/after/test.java
@@ -0,0 +1,13 @@
+public class Test {
+ A f;
+ int bar(){
+ return f.foo();
+ }
+}
+class A {
+ int foo(){
+ return 0;
+ }
+}
+
+class B extends A{} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t14/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t14/before/test.java
new file mode 100644
index 000000000000..8f6feeba681d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t14/before/test.java
@@ -0,0 +1,13 @@
+public class Test {
+ B f;
+ int bar(){
+ return f.foo();
+ }
+}
+class A {
+ int foo(){
+ return 0;
+ }
+}
+
+class B extends A{} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t15/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t15/after/Test.items
new file mode 100644
index 000000000000..31ff4b94b421
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t15/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:f : A
+PsiMethodCallExpression:f.foo(f) : int
+PsiReferenceExpression:f : A
+PsiReferenceExpression:f : A
+
+Conversions:
+f.foo(f) -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t15/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t15/after/test.java
new file mode 100644
index 000000000000..dcc5808448d5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t15/after/test.java
@@ -0,0 +1,16 @@
+public class Test {
+ A f;
+ int bar(){
+ return f.foo(f);
+ }
+}
+class A {
+ /**
+ * @param a
+ */
+ int foo(A a){
+ return 0;
+ }
+}
+
+class B extends A{} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t15/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t15/before/test.java
new file mode 100644
index 000000000000..b22cc32ea85b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t15/before/test.java
@@ -0,0 +1,16 @@
+public class Test {
+ B f;
+ int bar(){
+ return f.foo(f);
+ }
+}
+class A {
+ /**
+ * @param a
+ */
+ int foo(A a){
+ return 0;
+ }
+}
+
+class B extends A{} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t16/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t16/after/Test.items
new file mode 100644
index 000000000000..c0038308e560
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t16/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiField:f : B
+PsiMethodCallExpression:f.foo(f) : B
+PsiReferenceExpression:f : B
+PsiReferenceExpression:f : B
+
+Conversions:
+f -> $
+f.foo(f) -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t16/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t16/after/test.java
new file mode 100644
index 000000000000..8c87396bcb3d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t16/after/test.java
@@ -0,0 +1,15 @@
+class Test {
+ B f;
+
+ A bar() {
+ return f.foo(f);
+ }
+}
+class A {
+ <T> T foo(T t) {
+ return t;
+ }
+}
+
+class B extends A {
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t16/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t16/before/test.java
new file mode 100644
index 000000000000..c401bf03de20
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t16/before/test.java
@@ -0,0 +1,15 @@
+class Test {
+ A f;
+
+ A bar() {
+ return f.foo(f);
+ }
+}
+class A {
+ <T> T foo(T t) {
+ return t;
+ }
+}
+
+class B extends A {
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t17/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t17/after/Test.items
new file mode 100644
index 000000000000..aa0aa0551659
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t17/after/Test.items
@@ -0,0 +1,18 @@
+Types:
+PsiField:f : B
+PsiMethodCallExpression:f.foo(s) : B
+PsiMethodCallExpression:s.add(f) : boolean
+PsiParameter:s : java.util.Set<B>
+PsiReferenceExpression:f : B
+PsiReferenceExpression:f : B
+PsiReferenceExpression:s : java.util.Set<B>
+PsiReferenceExpression:s : java.util.Set<B>
+
+Conversions:
+f -> $
+f.foo(s) -> $
+s -> $
+s.add(f) -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t17/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t17/after/test.java
new file mode 100644
index 000000000000..73530057f21b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t17/after/test.java
@@ -0,0 +1,17 @@
+import java.util.*;
+class Test {
+ B f;
+
+ A bar(Set<B> s) {
+ s.add(f);
+ return f.foo(s);
+ }
+}
+class A {
+ <T> T foo(Set<T> t) {
+ return null;
+ }
+}
+
+class B extends A {
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t17/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t17/before/test.java
new file mode 100644
index 000000000000..a425495c6065
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t17/before/test.java
@@ -0,0 +1,17 @@
+import java.util.*;
+class Test {
+ A f;
+
+ A bar(Set<A> s) {
+ s.add(f);
+ return f.foo(s);
+ }
+}
+class A {
+ <T> T foo(Set<T> t) {
+ return null;
+ }
+}
+
+class B extends A {
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t18/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t18/after/Test.items
new file mode 100644
index 000000000000..2f426a4bb9b0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t18/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:f : B
+PsiReferenceExpression:f : B
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t18/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t18/after/test.java
new file mode 100644
index 000000000000..35d9b61c1045
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t18/after/test.java
@@ -0,0 +1,11 @@
+import java.util.*;
+class Test {
+ B f;
+ void bar(Set<A> s) {
+ for (String s : f) {}
+ }
+}
+
+class A<Y> extends List<String> {}
+
+class B extends A<Integer> {} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t18/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t18/before/test.java
new file mode 100644
index 000000000000..3113a46d5dc6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t18/before/test.java
@@ -0,0 +1,11 @@
+import java.util.*;
+class Test {
+ A f;
+ void bar(Set<A> s) {
+ for (String s : f) {}
+ }
+}
+
+class A<Y> extends List<String> {}
+
+class B extends A<Integer> {} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t19/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t19/after/Test.items
new file mode 100644
index 000000000000..a2ec06ad3634
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t19/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:f : java.util.HashMap<java.lang.Integer,java.lang.Integer>
+PsiLocalVariable:s : java.util.Set<java.lang.Integer>
+PsiMethodCallExpression:f.keySet() : java.util.Set<java.lang.Integer>
+PsiReferenceExpression:f : java.util.HashMap<java.lang.Integer,java.lang.Integer>
+
+Conversions:
+f.keySet() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t19/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t19/after/test.java
new file mode 100644
index 000000000000..9609791bb138
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t19/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ HashMap<Integer, Integer> f;
+ void foo() {
+ Set<Integer> s = f.keySet();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t19/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t19/before/test.java
new file mode 100644
index 000000000000..815f0ed1ab3a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t19/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ Map<String, String> f;
+ void foo() {
+ Set<String> s = f.keySet();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t20/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t20/after/Test.items
new file mode 100644
index 000000000000..c97038d663ce
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t20/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:f : java.util.Map<java.lang.String,java.lang.String>
+PsiLocalVariable:s : java.util.Set<java.lang.String>
+PsiMethodCallExpression:f.keySet() : java.util.Set<java.lang.String>
+PsiReferenceExpression:f : java.util.Map<java.lang.String,java.lang.String>
+
+Conversions:
+f.keySet() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t20/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t20/after/test.java
new file mode 100644
index 000000000000..815f0ed1ab3a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t20/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ Map<String, String> f;
+ void foo() {
+ Set<String> s = f.keySet();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t20/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t20/before/test.java
new file mode 100644
index 000000000000..9609791bb138
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t20/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ HashMap<Integer, Integer> f;
+ void foo() {
+ Set<Integer> s = f.keySet();
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t21/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t21/after/Test.items
new file mode 100644
index 000000000000..53630275ac1c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t21/after/Test.items
@@ -0,0 +1,14 @@
+Types:
+PsiField:f : java.util.Map<java.lang.String,java.util.Set<java.lang.String>>
+PsiLocalVariable:stringList : java.util.Set<java.lang.String>
+PsiMethodCallExpression:f.get(s) : java.util.Set<java.lang.String>
+PsiMethodCallExpression:stringList.add(s) : boolean
+PsiReferenceExpression:f : java.util.Map<java.lang.String,java.util.Set<java.lang.String>>
+PsiReferenceExpression:stringList : java.util.Set<java.lang.String>
+
+Conversions:
+f.get(s) -> $
+stringList.add(s) -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t21/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t21/after/test.java
new file mode 100644
index 000000000000..34e758cb64d6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t21/after/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+class Test {
+ Map<String, Set<String>> f;
+ void foo(String s) {
+ Set<String> stringList = f.get(s);
+ stringList.add(s);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t21/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t21/before/test.java
new file mode 100644
index 000000000000..1f647aff2488
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t21/before/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+class Test {
+ Map<String, List<String>> f;
+ void foo(String s) {
+ List<String> stringList = f.get(s);
+ stringList.add(s);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t22/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t22/after/Test.items
new file mode 100644
index 000000000000..e8b61ea780ac
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t22/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:f : java.lang.Integer
+PsiParameter:s : java.lang.Integer
+PsiReferenceExpression:f : java.lang.Integer
+
+Conversions:
+f -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t22/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t22/after/test.java
new file mode 100644
index 000000000000..affc2b3da86f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t22/after/test.java
@@ -0,0 +1,8 @@
+class Test {
+ Integer f;
+ void foo(Integer s) {}
+
+ void bar() {
+ foo(f);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t22/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t22/before/test.java
new file mode 100644
index 000000000000..24b0b43cb5a2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t22/before/test.java
@@ -0,0 +1,8 @@
+class Test {
+ String f;
+ void foo(String... s) {}
+
+ void bar() {
+ foo(f);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t23/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t23/after/Test.items
new file mode 100644
index 000000000000..99507129472e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t23/after/Test.items
@@ -0,0 +1,22 @@
+Types:
+PsiField:f : HashMap<java.lang.String,java.util.List<java.lang.String>>
+PsiLocalVariable:set : java.util.List<java.lang.String>
+PsiMethodCallExpression:f.get(s) : java.util.List<java.lang.String>
+PsiMethodCallExpression:f.put(s, set) : java.util.List<java.lang.String>
+PsiMethodCallExpression:set.add(s1) : boolean
+PsiReferenceExpression:f : HashMap<java.lang.String,java.util.List<java.lang.String>>
+PsiReferenceExpression:f : HashMap<java.lang.String,java.util.List<java.lang.String>>
+PsiReferenceExpression:set : java.util.List<java.lang.String>
+PsiReferenceExpression:set : java.util.List<java.lang.String>
+PsiReferenceExpression:set : java.util.List<java.lang.String>
+PsiReferenceExpression:set : java.util.List<java.lang.String>
+
+Conversions:
+f.get(s) -> $
+f.put(s, set) -> $
+set -> $
+set.add(s1) -> $
+
+New expression type changes:
+Fails:
+new HashSet<String>()->java.util.List<java.lang.String>
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t23/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t23/after/test.java
new file mode 100644
index 000000000000..df9ad40dc0e9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t23/after/test.java
@@ -0,0 +1,15 @@
+import java.util.*;
+class Test {
+ HashMap<String, List<String>> f;
+
+ void foo(String s, String s1) {
+ List<String> set = f.get(s);
+ if (set == null) {
+ set = new HashSet<String>();
+ f.put(s, set);
+ }
+ set.add(s1);
+ }
+}
+
+class HashMap<K, V> extends java.util.HashMap<K, V>{} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t23/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t23/before/test.java
new file mode 100644
index 000000000000..a99eafcc46dc
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t23/before/test.java
@@ -0,0 +1,15 @@
+import java.util.*;
+class Test {
+ HashMap<String, Set<String>> f;
+
+ void foo(String s, String s1) {
+ Set<String> set = f.get(s);
+ if (set == null) {
+ set = new HashSet<String>();
+ f.put(s, set);
+ }
+ set.add(s1);
+ }
+}
+
+class HashMap<K, V> extends java.util.HashMap<K, V>{} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t24/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t24/after/Test.items
new file mode 100644
index 000000000000..21962d201ce2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t24/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:f : D
+PsiReferenceExpression:f : D
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t24/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t24/after/test.java
new file mode 100644
index 000000000000..6e0abdb55348
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t24/after/test.java
@@ -0,0 +1,14 @@
+public class Test {
+ D f;
+ C foo() {
+ return null;
+ }
+}
+class B extends Test {
+ C foo() {
+ return f;
+ }
+}
+
+class C {}
+class D extends C{}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t24/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t24/before/test.java
new file mode 100644
index 000000000000..536dfc3ebd30
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t24/before/test.java
@@ -0,0 +1,14 @@
+public class Test {
+ C f;
+ C foo() {
+ return null;
+ }
+}
+class B extends Test {
+ C foo() {
+ return f;
+ }
+}
+
+class C {}
+class D extends C{}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t25/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t25/after/Test.items
new file mode 100644
index 000000000000..21962d201ce2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t25/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:f : D
+PsiReferenceExpression:f : D
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t25/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t25/after/test.java
new file mode 100644
index 000000000000..b06e456332d8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t25/after/test.java
@@ -0,0 +1,15 @@
+public class Test {
+ D f;
+ C foo() {
+ return f;
+ }
+}
+
+class B extends Test {
+ C foo() {
+ return null;
+ }
+}
+
+class C {}
+class D extends C{}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t25/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t25/before/test.java
new file mode 100644
index 000000000000..2994877fade8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t25/before/test.java
@@ -0,0 +1,15 @@
+public class Test {
+ C f;
+ C foo() {
+ return f;
+ }
+}
+
+class B extends Test {
+ C foo() {
+ return null;
+ }
+}
+
+class C {}
+class D extends C{}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t26/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t26/after/Test.items
new file mode 100644
index 000000000000..eae7ba330dd9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t26/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:f : D
+PsiParameter:c : D
+PsiParameter:c : D
+PsiReferenceExpression:c : D
+PsiReferenceExpression:f : D
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t26/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t26/after/test.java
new file mode 100644
index 000000000000..ee47caa11464
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t26/after/test.java
@@ -0,0 +1,15 @@
+class Test {
+ D f;
+ void foo(D c) {
+ f = c;
+ }
+}
+
+class B extends Test {
+ void foo(D c) {
+
+ }
+}
+
+class C {}
+class D extends C{} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t26/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t26/before/test.java
new file mode 100644
index 000000000000..581f5fa3bc83
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t26/before/test.java
@@ -0,0 +1,15 @@
+class Test {
+ C f;
+ void foo(C c) {
+ f = c;
+ }
+}
+
+class B extends Test {
+ void foo(C c) {
+
+ }
+}
+
+class C {}
+class D extends C{} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t27/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t27/after/Test.items
new file mode 100644
index 000000000000..eae7ba330dd9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t27/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:f : D
+PsiParameter:c : D
+PsiParameter:c : D
+PsiReferenceExpression:c : D
+PsiReferenceExpression:f : D
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t27/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t27/after/test.java
new file mode 100644
index 000000000000..5eb0cb2d97b9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t27/after/test.java
@@ -0,0 +1,13 @@
+class Test {
+ D f;
+ void foo(D c) {}
+}
+
+class B extends Test {
+ void foo(D c) {
+ f = c;
+ }
+}
+
+class C {}
+class D extends C{} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t27/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t27/before/test.java
new file mode 100644
index 000000000000..a18da122856d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t27/before/test.java
@@ -0,0 +1,13 @@
+class Test {
+ C f;
+ void foo(C c) {}
+}
+
+class B extends Test {
+ void foo(C c) {
+ f = c;
+ }
+}
+
+class C {}
+class D extends C{} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t28/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t28/after/Test.items
new file mode 100644
index 000000000000..80d6c0c3bf37
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t28/after/Test.items
@@ -0,0 +1,13 @@
+Types:
+PsiField:f : java.lang.String[]
+PsiMethodCallExpression:f.size() : int
+PsiMethodCallExpression:f.toArray(new String[f.size()]) : java.lang.String[]
+PsiReferenceExpression:f : java.lang.String[]
+PsiReferenceExpression:f : java.lang.String[]
+
+Conversions:
+f.size() -> $qualifier$.length $qualifier$.size()
+f.toArray(new String[f.size()]) -> $qualifier$ $qualifier$.toArray($expr$)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t28/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t28/after/test.java
new file mode 100644
index 000000000000..0b1e27daa0ee
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t28/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ String[] f;
+ String[] get() {
+ return f;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t28/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t28/before/test.java
new file mode 100644
index 000000000000..43c040a3baf4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t28/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ List<String> f;
+ String[] get() {
+ return f.toArray(new String[f.size()]);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t29/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t29/after/Test.items
new file mode 100644
index 000000000000..5b040a6aaa19
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t29/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiMethod:get : java.util.List<java.lang.String>
+
+Conversions:
+f.toArray(new String[f.size()]) -> $qualifier$ $qualifier$.toArray($expr$)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t29/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t29/after/test.java
new file mode 100644
index 000000000000..23a1f11f461e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t29/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ List<String> f;
+ List<String> get() {
+ return f;
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t29/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t29/before/test.java
new file mode 100644
index 000000000000..43c040a3baf4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t29/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ List<String> f;
+ String[] get() {
+ return f.toArray(new String[f.size()]);
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t30/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t30/after/Test.items
new file mode 100644
index 000000000000..cfd748933e5d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t30/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:f : java.lang.String[]
+PsiMethodCallExpression:f.size() : int
+PsiReferenceExpression:f : java.lang.String[]
+
+Conversions:
+f.size() -> $qualifier$.length $qualifier$.size()
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t30/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t30/after/test.java
new file mode 100644
index 000000000000..28f71fc98c82
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t30/after/test.java
@@ -0,0 +1,9 @@
+import java.util.*;
+class Test {
+ String[] f;
+ void foo() {
+ for (int i = 0; i < f.length; i++) {
+
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t30/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t30/before/test.java
new file mode 100644
index 000000000000..5317e2164e7b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t30/before/test.java
@@ -0,0 +1,9 @@
+import java.util.*;
+class Test {
+ List<String> f;
+ void foo() {
+ for (int i = 0; i < f.size(); i++) {
+
+ }
+ }
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t31/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t31/after/Test.items
new file mode 100644
index 000000000000..7459a22f27d0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t31/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:f : java.lang.Object
+PsiReferenceExpression:f : java.lang.Object
+
+Conversions:
+
+New expression type changes:
+Fails:
+f->java.lang.Object
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t31/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t31/after/test.java
new file mode 100644
index 000000000000..ec7fb8e9807d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t31/after/test.java
@@ -0,0 +1,8 @@
+class Test {
+ Object f;
+ void foo(){}
+
+ void bar() {
+ f.foo();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t31/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t31/before/test.java
new file mode 100644
index 000000000000..b8c08fdfd786
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t31/before/test.java
@@ -0,0 +1,8 @@
+class Test {
+ Test f;
+ void foo(){}
+
+ void bar() {
+ f.foo();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t32/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t32/after/Test.items
new file mode 100644
index 000000000000..5638ea15f4a6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t32/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:i : int
+
+Conversions:
+#bar(long) -> PsiMethod:bar
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t32/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t32/after/test.java
new file mode 100644
index 000000000000..27e7eeb25258
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t32/after/test.java
@@ -0,0 +1,7 @@
+/**
+* {@link #bar(int)}
+*/
+class Test {
+
+ void bar(int i) {}
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t32/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t32/before/test.java
new file mode 100644
index 000000000000..a98179d5054c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t32/before/test.java
@@ -0,0 +1,7 @@
+/**
+* {@link #bar(long)}
+*/
+class Test {
+
+ void bar(long i) {}
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t33/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t33/after/Test.items
new file mode 100644
index 000000000000..df8f4d2c09d4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t33/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:l : java.util.List<java.lang.Integer>
+PsiNewExpression:new ArrayList<String>() : java.util.ArrayList<java.lang.Integer>
+PsiReferenceExpression:l : java.util.List<java.lang.Integer>
+
+Conversions:
+
+New expression type changes:
+new ArrayList<String>() -> java.util.ArrayList<java.lang.Integer>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t33/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t33/after/test.java
new file mode 100644
index 000000000000..126292ad9322
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t33/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ List<Integer> l;
+ void foo() {
+ l = new ArrayList<>();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t33/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t33/before/test.java
new file mode 100644
index 000000000000..f604f9185e2d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t33/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ List<String> l;
+ void foo() {
+ l = new ArrayList<String>();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t34/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t34/after/Test.items
new file mode 100644
index 000000000000..d9f0bafc62d7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t34/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:l : java.util.AbstractList<java.lang.String>
+PsiNewExpression:new ArrayList<String>() : java.util.ArrayList<java.lang.String>
+PsiReferenceExpression:l : java.util.AbstractList<java.lang.String>
+
+Conversions:
+
+New expression type changes:
+new ArrayList<String>() -> java.util.ArrayList<java.lang.String>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t34/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t34/after/test.java
new file mode 100644
index 000000000000..954f507013c6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t34/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ AbstractList<String> l;
+ void foo() {
+ l = new ArrayList<>();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t34/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t34/before/test.java
new file mode 100644
index 000000000000..f604f9185e2d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t34/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ List<String> l;
+ void foo() {
+ l = new ArrayList<String>();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t35/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t35/after/Test.items
new file mode 100644
index 000000000000..2b28dc8c0984
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t35/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiField:myParent : TestImpl
+PsiParameter:parent : TestImpl
+PsiParameter:parent : TestImpl
+PsiReferenceExpression:myParent : TestImpl
+PsiReferenceExpression:parent : TestImpl
+PsiReferenceExpression:parent : TestImpl
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t35/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t35/after/test.java
new file mode 100644
index 000000000000..b575a53519c4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t35/after/test.java
@@ -0,0 +1,13 @@
+class Test {
+ TestImpl myParent;
+
+ public Test(TestImpl parent) {
+ myParent = parent;
+ }
+
+ class TestImpl extends Test {
+ public TestImpl(TestImpl parent) {
+ super(parent);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t35/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t35/before/test.java
new file mode 100644
index 000000000000..83f66b0bea7c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t35/before/test.java
@@ -0,0 +1,13 @@
+class Test {
+ Test myParent;
+
+ public Test(Test parent) {
+ myParent = parent;
+ }
+
+ class TestImpl extends Test {
+ public TestImpl(Test parent) {
+ super(parent);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t36/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t36/after/Test.items
new file mode 100644
index 000000000000..521251a0dd37
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t36/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:i : byte
+PsiReferenceExpression:i : byte
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t36/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t36/after/test.java
new file mode 100644
index 000000000000..8fd62fdc775d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t36/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ void foo(byte i) {
+ long j = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t36/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t36/before/test.java
new file mode 100644
index 000000000000..1cbff3a1272c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t36/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ void foo(int i) {
+ long j = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t37/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t37/after/Test.items
new file mode 100644
index 000000000000..26c064a26ffa
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t37/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiParameter:i : int
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t37/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t37/after/test.java
new file mode 100644
index 000000000000..032dc398e040
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t37/after/test.java
@@ -0,0 +1,7 @@
+class Test {
+ void foo(int i) {
+ int i1 = i + 1;
+ int i2 = i - 1;
+ int i3 = i >> 1;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t37/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t37/before/test.java
new file mode 100644
index 000000000000..2cc80bd340ed
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t37/before/test.java
@@ -0,0 +1,7 @@
+class Test {
+ void foo(short i) {
+ int i1 = i + 1;
+ int i2 = i - 1;
+ int i3 = i >> 1;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t38/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t38/after/Test.items
new file mode 100644
index 000000000000..ce5df8ea5fcb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t38/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiParameter:i : long
+PsiReferenceExpression:i : long
+PsiReferenceExpression:i : long
+PsiReferenceExpression:i : long
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t38/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t38/after/test.java
new file mode 100644
index 000000000000..7ef08a9041c0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t38/after/test.java
@@ -0,0 +1,7 @@
+class Test {
+ void foo(long i) {
+ int i1 = i + 1;
+ int i2 = i - 1;
+ int i3 = i >> 1;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t38/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t38/before/test.java
new file mode 100644
index 000000000000..7ef08a9041c0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t38/before/test.java
@@ -0,0 +1,7 @@
+class Test {
+ void foo(long i) {
+ int i1 = i + 1;
+ int i2 = i - 1;
+ int i3 = i >> 1;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t39/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t39/after/Test.items
new file mode 100644
index 000000000000..3c746805c0f1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t39/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiParameter:i : byte
+PsiReferenceExpression:i : byte
+PsiReferenceExpression:i : byte
+PsiReferenceExpression:i : byte
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t39/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t39/after/test.java
new file mode 100644
index 000000000000..0b59f99cc084
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t39/after/test.java
@@ -0,0 +1,7 @@
+class Test {
+ void foo(byte i) {
+ int i1 = i + 1;
+ int i2 = i - 1;
+ int i3 = i >> 1;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t39/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t39/before/test.java
new file mode 100644
index 000000000000..7ef08a9041c0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t39/before/test.java
@@ -0,0 +1,7 @@
+class Test {
+ void foo(long i) {
+ int i1 = i + 1;
+ int i2 = i - 1;
+ int i3 = i >> 1;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t40/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t40/after/Test.items
new file mode 100644
index 000000000000..2aff3bd8c623
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t40/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:l : java.util.ArrayList
+PsiReferenceExpression:l : java.util.ArrayList
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t40/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t40/after/test.java
new file mode 100644
index 000000000000..83cae108fdd9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t40/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ ArrayList l;
+ void foo() {
+ l = new ArrayList();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t40/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t40/before/test.java
new file mode 100644
index 000000000000..dd72766db414
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t40/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ List l;
+ void foo() {
+ l = new ArrayList();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t41/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t41/after/Test.items
new file mode 100644
index 000000000000..583812d7778b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t41/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:l : java.util.ArrayList
+PsiNewExpression:new ArrayList<String>() : java.util.ArrayList<java.lang.String>
+PsiReferenceExpression:l : java.util.ArrayList
+
+Conversions:
+
+New expression type changes:
+new ArrayList<String>() -> java.util.ArrayList<java.lang.String>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t41/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t41/after/test.java
new file mode 100644
index 000000000000..3ac0475a9e96
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t41/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ ArrayList l;
+ void foo() {
+ l = new ArrayList<String>();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t41/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t41/before/test.java
new file mode 100644
index 000000000000..8b8b5018717b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t41/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ List l;
+ void foo() {
+ l = new ArrayList<String>();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t42/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t42/after/Test.items
new file mode 100644
index 000000000000..d1417fa9ad32
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t42/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:l : java.util.ArrayList<java.lang.String>
+PsiNewExpression:new ArrayList() : java.util.ArrayList
+PsiReferenceExpression:l : java.util.ArrayList<java.lang.String>
+
+Conversions:
+
+New expression type changes:
+new ArrayList() -> java.util.ArrayList
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t42/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t42/after/test.java
new file mode 100644
index 000000000000..0dd8c405b1d9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t42/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ ArrayList<String> l;
+ void foo() {
+ l = new ArrayList();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t42/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t42/before/test.java
new file mode 100644
index 000000000000..dd72766db414
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t42/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+class Test {
+ List l;
+ void foo() {
+ l = new ArrayList();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t43/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t43/after/Test.items
new file mode 100644
index 000000000000..b1e94aa2143b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t43/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:o : java.lang.Long
+
+Conversions:
+l -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t43/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t43/after/test.java
new file mode 100644
index 000000000000..c386bc247acd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t43/after/test.java
@@ -0,0 +1,4 @@
+class Test {
+ long l;
+ Long o = l;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t43/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t43/before/test.java
new file mode 100644
index 000000000000..d7e1595d92bb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t43/before/test.java
@@ -0,0 +1,4 @@
+class Test {
+ long l;
+ Object o = l;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t44/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t44/after/Test.items
new file mode 100644
index 000000000000..3cae6713c3b0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t44/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:i : byte
+PsiReferenceExpression:i : byte
+
+Conversions:
+l -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t44/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t44/after/test.java
new file mode 100644
index 000000000000..60a560399b71
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t44/after/test.java
@@ -0,0 +1,7 @@
+class Test {
+ long l;
+ byte i;
+ void foo() {
+ l = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t44/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t44/before/test.java
new file mode 100644
index 000000000000..4dee20b44e33
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t44/before/test.java
@@ -0,0 +1,7 @@
+class Test {
+ long l;
+ int i;
+ void foo() {
+ l = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t45/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t45/after/Test.items
new file mode 100644
index 000000000000..c97169454693
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t45/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:i : byte
+PsiField:l : byte
+PsiReferenceExpression:i : byte
+PsiReferenceExpression:l : byte
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t45/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t45/after/test.java
new file mode 100644
index 000000000000..45fcb1f6eb1f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t45/after/test.java
@@ -0,0 +1,7 @@
+class Test {
+ byte l;
+ byte i;
+ void foo() {
+ l = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t45/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t45/before/test.java
new file mode 100644
index 000000000000..4dee20b44e33
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t45/before/test.java
@@ -0,0 +1,7 @@
+class Test {
+ long l;
+ int i;
+ void foo() {
+ l = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t46/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t46/after/Test.items
new file mode 100644
index 000000000000..934d4a09ec3b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t46/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:j : int
+
+Conversions:
+i -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t46/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t46/after/test.java
new file mode 100644
index 000000000000..f77f19689836
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t46/after/test.java
@@ -0,0 +1,4 @@
+class Test {
+ byte i;
+ int j = i;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t46/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t46/before/test.java
new file mode 100644
index 000000000000..5256726fdd95
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t46/before/test.java
@@ -0,0 +1,4 @@
+class Test {
+ byte i;
+ long j = i;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t47/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t47/after/Test.items
new file mode 100644
index 000000000000..d39a160ee9a7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t47/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:o : int
+
+Conversions:
+
+New expression type changes:
+Fails:
+null->int
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t47/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t47/after/test.java
new file mode 100644
index 000000000000..99f4d773fd24
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t47/after/test.java
@@ -0,0 +1,3 @@
+class Test {
+ int o = null;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t47/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t47/before/test.java
new file mode 100644
index 000000000000..308305e1cb41
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t47/before/test.java
@@ -0,0 +1,3 @@
+class Test {
+ Object o = null;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t48/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t48/after/Test.items
new file mode 100644
index 000000000000..fedb3311ad6b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t48/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiLocalVariable:set : java.util.Set<B>
+PsiParameter:s : java.util.AbstractSet<B>
+PsiReferenceExpression:s : java.util.AbstractSet<B>
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t48/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t48/after/test.java
new file mode 100644
index 000000000000..60e1a9ddd8c7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t48/after/test.java
@@ -0,0 +1,9 @@
+import java.util.*;
+class Test {
+ void foo(AbstractSet<B> s) {
+ Set<B> set = s;
+ }
+
+ class A {}
+ class B extends A{}
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t48/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t48/before/test.java
new file mode 100644
index 000000000000..e859716610c8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t48/before/test.java
@@ -0,0 +1,9 @@
+import java.util.*;
+class Test {
+ void foo(AbstractSet<A> s) {
+ Set<A> set = s;
+ }
+
+ class A {}
+ class B extends A{}
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t49/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t49/after/Test.items
new file mode 100644
index 000000000000..b65d6bce02d1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t49/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:f : java.util.Set<B>
+PsiParameter:s : java.util.AbstractSet<B>
+PsiReferenceExpression:f : java.util.Set<B>
+PsiReferenceExpression:s : java.util.AbstractSet<B>
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t49/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t49/after/test.java
new file mode 100644
index 000000000000..91c41afa26e2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t49/after/test.java
@@ -0,0 +1,10 @@
+import java.util.*;
+class Test {
+ Set<B> f;
+ void foo(AbstractSet<B> s) {
+ f = s;
+ }
+
+ class A {}
+ class B extends A{}
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t49/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t49/before/test.java
new file mode 100644
index 000000000000..8a2a9a9054ce
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t49/before/test.java
@@ -0,0 +1,10 @@
+import java.util.*;
+class Test {
+ Set<A> f;
+ void foo(AbstractSet<A> s) {
+ f = s;
+ }
+
+ class A {}
+ class B extends A{}
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t50/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t50/after/Test.items
new file mode 100644
index 000000000000..895bdd4d4118
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t50/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:c : java.util.Set<? extends JButton>
+PsiField:c1 : java.util.Set<? extends JButton>
+PsiReferenceExpression:c : java.util.Set<? extends JButton>
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t50/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t50/after/test.java
new file mode 100644
index 000000000000..50d5fb0229ca
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t50/after/test.java
@@ -0,0 +1,5 @@
+import java.util.*;
+class Test {
+ Set<? extends JButton> c;
+ Set<? extends JButton> c1 = c;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t50/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t50/before/test.java
new file mode 100644
index 000000000000..05b20ee8b1fe
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t50/before/test.java
@@ -0,0 +1,5 @@
+import java.util.*;
+class Test {
+ Set<? extends JComponent> c;
+ Set<? extends JComponent> c1 = c;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t51/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t51/after/Test.items
new file mode 100644
index 000000000000..81f430c2e8ab
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t51/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:f : java.lang.Object[]
+PsiNewExpression:new String[] {"a"} : java.lang.Object[]
+
+Conversions:
+"a" -> $
+
+New expression type changes:
+new String[] {"a"} -> java.lang.Object[]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t51/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t51/after/test.java
new file mode 100644
index 000000000000..bbd211f73928
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t51/after/test.java
@@ -0,0 +1,3 @@
+class Test {
+ Object[] f = new Object[] {"a"};
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t51/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t51/before/test.java
new file mode 100644
index 000000000000..7a9a090c342f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t51/before/test.java
@@ -0,0 +1,3 @@
+class Test {
+ String[] f = new String[] {"a"};
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t52/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t52/after/Test.items
new file mode 100644
index 000000000000..fae3f5aa0b83
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t52/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:f : java.lang.Object[]
+PsiNewExpression:new Set() : java.util.Set
+PsiNewExpression:new Set[] { new Set() } : java.lang.Object[]
+
+Conversions:
+
+New expression type changes:
+new Set() -> java.util.Set
+new Set[] { new Set() } -> java.lang.Object[]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t52/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t52/after/test.java
new file mode 100644
index 000000000000..034f9e2a7285
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t52/after/test.java
@@ -0,0 +1,4 @@
+import java.util.*;
+class Test {
+ Object[] f = new Object[] { new Set() };
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t52/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t52/before/test.java
new file mode 100644
index 000000000000..abf3b7a12aff
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t52/before/test.java
@@ -0,0 +1,4 @@
+import java.util.*;
+class Test {
+ Set[] f = new Set[] { new Set() };
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t53/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t53/after/Test.items
new file mode 100644
index 000000000000..6f10a470aef3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t53/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:f : java.util.Set<java.lang.String>[]
+
+Conversions:
+
+New expression type changes:
+Fails:
+new double[0]->java.util.Set<java.lang.String>[]
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t53/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t53/after/test.java
new file mode 100644
index 000000000000..52d1899803c8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t53/after/test.java
@@ -0,0 +1,4 @@
+import java.util.*;
+class Test {
+ Set<String>[] f = new double[0];
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t53/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t53/before/test.java
new file mode 100644
index 000000000000..50be5aada106
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t53/before/test.java
@@ -0,0 +1,4 @@
+import java.util.*;
+class Test {
+ double[] f = new double[0];
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t54/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t54/after/Test.items
new file mode 100644
index 000000000000..584021476055
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t54/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:f : java.util.Set<? extends java.lang.Integer>
+PsiNewExpression:new Set<Object>() : java.util.Set<java.lang.Integer>
+
+Conversions:
+
+New expression type changes:
+new Set<Object>() -> java.util.Set<java.lang.Integer>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t54/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t54/after/test.java
new file mode 100644
index 000000000000..11cbc3fe7520
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t54/after/test.java
@@ -0,0 +1,4 @@
+import java.util.*;
+class Test {
+ Set<? extends Integer> f = new Set<>();
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t54/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t54/before/test.java
new file mode 100644
index 000000000000..96573db084dd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t54/before/test.java
@@ -0,0 +1,4 @@
+import java.util.*;
+class Test {
+ Set<Object> f = new Set<Object>();
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t55/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t55/after/Test.items
new file mode 100644
index 000000000000..465e20e4a213
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t55/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:f : java.util.Set<?>
+PsiNewExpression:new Set<Object>() : java.util.Set<java.lang.Object>
+
+Conversions:
+
+New expression type changes:
+new Set<Object>() -> java.util.Set<java.lang.Object>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t55/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t55/after/test.java
new file mode 100644
index 000000000000..c895ff398fa6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t55/after/test.java
@@ -0,0 +1,4 @@
+import java.util.*;
+class Test {
+ Set<?> f = new Set<>();
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t55/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t55/before/test.java
new file mode 100644
index 000000000000..96573db084dd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t55/before/test.java
@@ -0,0 +1,4 @@
+import java.util.*;
+class Test {
+ Set<Object> f = new Set<Object>();
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t56/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t56/after/Test.items
new file mode 100644
index 000000000000..05ed851f0ce0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t56/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiParameter:i : double
+PsiReferenceExpression:i : double
+PsiReferenceExpression:i : double
+
+Conversions:
+
+New expression type changes:
+Fails:
+i->double
+i->double
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t56/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t56/after/test.java
new file mode 100644
index 000000000000..2f5cc73acbbb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t56/after/test.java
@@ -0,0 +1,6 @@
+class Test {
+ void foo(double i) {
+ int[] a = new int[i];
+ System.out.println(a[i]);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t56/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t56/before/test.java
new file mode 100644
index 000000000000..0f9888806c18
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t56/before/test.java
@@ -0,0 +1,6 @@
+class Test {
+ void foo(int i) {
+ int[] a = new int[i];
+ System.out.println(a[i]);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t57/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t57/after/Test.items
new file mode 100644
index 000000000000..af2ecf9c114e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t57/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:i : byte
+PsiReferenceExpression:i : byte
+PsiReferenceExpression:i : byte
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t57/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t57/after/test.java
new file mode 100644
index 000000000000..ce9df2fbb45d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t57/after/test.java
@@ -0,0 +1,6 @@
+class Test {
+ void foo(byte i) {
+ int[] a = new int[i];
+ System.out.println(a[i]);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t57/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t57/before/test.java
new file mode 100644
index 000000000000..0f9888806c18
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t57/before/test.java
@@ -0,0 +1,6 @@
+class Test {
+ void foo(int i) {
+ int[] a = new int[i];
+ System.out.println(a[i]);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t58/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t58/after/Test.items
new file mode 100644
index 000000000000..19b07a44c139
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t58/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:f : java.lang.Object
+
+Conversions:
+new String[1] -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t58/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t58/after/test.java
new file mode 100644
index 000000000000..ff4055ac3129
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t58/after/test.java
@@ -0,0 +1,3 @@
+class Test {
+ Object f = new String[1];
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t58/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t58/before/test.java
new file mode 100644
index 000000000000..8df4d62d721a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t58/before/test.java
@@ -0,0 +1,3 @@
+class Test {
+ String[] f = new String[1];
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t59/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t59/after/Test.items
new file mode 100644
index 000000000000..ea0dda8061b2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t59/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:f : java.lang.Cloneable
+
+Conversions:
+new String[1] -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t59/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t59/after/test.java
new file mode 100644
index 000000000000..78a09afee42b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t59/after/test.java
@@ -0,0 +1,3 @@
+class Test {
+ Cloneable f = new String[1];
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t59/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t59/before/test.java
new file mode 100644
index 000000000000..8df4d62d721a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t59/before/test.java
@@ -0,0 +1,3 @@
+class Test {
+ String[] f = new String[1];
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t60/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t60/after/Test.items
new file mode 100644
index 000000000000..88822343977c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t60/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:p : java.lang.Object
+PsiReferenceExpression:p : java.lang.Object
+
+Conversions:
+i -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t60/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t60/after/test.java
new file mode 100644
index 000000000000..9ab940eaf425
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t60/after/test.java
@@ -0,0 +1,6 @@
+class Test {
+ Object p;
+ void foo(int... i) {
+ p = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t60/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t60/before/test.java
new file mode 100644
index 000000000000..26172c13d2e7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t60/before/test.java
@@ -0,0 +1,6 @@
+class Test {
+ int[] p;
+ void foo(int... i) {
+ p = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t61/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t61/after/Test.items
new file mode 100644
index 000000000000..830074d65d6b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t61/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiLocalVariable:p : int[]
+PsiParameter:i : int...
+PsiReferenceExpression:i : int[]
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t61/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t61/after/test.java
new file mode 100644
index 000000000000..1b05fce5b5b9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t61/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ void foo(int... i) {
+ int[] p = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t61/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t61/before/test.java
new file mode 100644
index 000000000000..e9f49f1c3846
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t61/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ void foo(int i) {
+ int p = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t62/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t62/after/Test.items
new file mode 100644
index 000000000000..88822343977c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t62/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:p : java.lang.Object
+PsiReferenceExpression:p : java.lang.Object
+
+Conversions:
+i -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t62/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t62/after/test.java
new file mode 100644
index 000000000000..9ab940eaf425
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t62/after/test.java
@@ -0,0 +1,6 @@
+class Test {
+ Object p;
+ void foo(int... i) {
+ p = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t62/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t62/before/test.java
new file mode 100644
index 000000000000..26172c13d2e7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t62/before/test.java
@@ -0,0 +1,6 @@
+class Test {
+ int[] p;
+ void foo(int... i) {
+ p = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t63/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t63/after/Test.items
new file mode 100644
index 000000000000..69dcdaf945c5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t63/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiField:p : double[]
+PsiParameter:i : double[]
+PsiReferenceExpression:i : double[]
+PsiReferenceExpression:p : double[]
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t63/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t63/after/test.java
new file mode 100644
index 000000000000..9602f0b3d59f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t63/after/test.java
@@ -0,0 +1,6 @@
+class Test {
+ double[] p;
+ void foo(double[] i) {
+ p = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t63/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t63/before/test.java
new file mode 100644
index 000000000000..26172c13d2e7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t63/before/test.java
@@ -0,0 +1,6 @@
+class Test {
+ int[] p;
+ void foo(int... i) {
+ p = i;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t64/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t64/after/Test.items
new file mode 100644
index 000000000000..8ae72a21d857
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t64/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiLocalVariable:p : int
+PsiParameter:i : int
+PsiReferenceExpression:i : int
+
+Conversions:
+
+New expression type changes:
+Fails:
+foo(1, 2)->int
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t64/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t64/after/test.java
new file mode 100644
index 000000000000..29f4004383eb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t64/after/test.java
@@ -0,0 +1,9 @@
+class Test {
+ void foo(int i) {
+ int p = i;
+ }
+
+ void bar() {
+ foo(1, 2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t64/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t64/before/test.java
new file mode 100644
index 000000000000..5583e3c06a5d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t64/before/test.java
@@ -0,0 +1,9 @@
+class Test {
+ void foo(int... i) {
+ int[] p = i;
+ }
+
+ void bar() {
+ foo(1, 2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t65/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t65/after/Test.items
new file mode 100644
index 000000000000..a1201587163f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t65/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiLocalVariable:p : java.lang.String
+PsiParameter:i : java.lang.String
+PsiReferenceExpression:i : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
+1->java.lang.String
+2->java.lang.String
+foo(1, 2)->java.lang.String
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t65/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t65/after/test.java
new file mode 100644
index 000000000000..3532ce557f8c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t65/after/test.java
@@ -0,0 +1,9 @@
+class Test {
+ void foo(String i) {
+ String p = i;
+ }
+
+ void bar() {
+ foo(1, 2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t65/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t65/before/test.java
new file mode 100644
index 000000000000..5583e3c06a5d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t65/before/test.java
@@ -0,0 +1,9 @@
+class Test {
+ void foo(int... i) {
+ int[] p = i;
+ }
+
+ void bar() {
+ foo(1, 2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t66/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t66/after/Test.items
new file mode 100644
index 000000000000..f8bf3a92ff7d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t66/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiLocalVariable:p : int
+PsiParameter:i : int
+PsiReferenceExpression:i : int
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t66/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t66/after/test.java
new file mode 100644
index 000000000000..56608039cf5e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t66/after/test.java
@@ -0,0 +1,9 @@
+class Test {
+ void foo(int i) {
+ int p = i;
+ }
+
+ void bar() {
+ foo(1);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t66/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t66/before/test.java
new file mode 100644
index 000000000000..45ea51dddf11
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t66/before/test.java
@@ -0,0 +1,9 @@
+class Test {
+ void foo(int... i) {
+ int[] p = i;
+ }
+
+ void bar() {
+ foo(1);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t67/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t67/after/Test.items
new file mode 100644
index 000000000000..0e5e72eb6f30
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t67/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiField:myForAccess : java.lang.String
+PsiMethod:forAccess : java.lang.String
+PsiMethodCallExpression:this.forAccess() : java.lang.String
+PsiParameter:p : java.lang.String
+PsiReferenceExpression:myForAccess : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t67/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t67/after/test.java
new file mode 100644
index 000000000000..8a4fda4a0fac
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t67/after/test.java
@@ -0,0 +1,9 @@
+class Test {
+ private String myForAccess;
+ private String forAccess() {
+ return myForAccess;
+ }
+ public void methMemAcc(String p) {
+ p = this.forAccess();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t67/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t67/before/test.java
new file mode 100644
index 000000000000..57a1c5db091b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t67/before/test.java
@@ -0,0 +1,9 @@
+class Test {
+ private Object myForAccess;
+ private Object forAccess() {
+ return myForAccess;
+ }
+ public void methMemAcc(Object p) {
+ p = this.forAccess();
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t68/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t68/after/Test.items
new file mode 100644
index 000000000000..e31709e870fb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t68/after/Test.items
@@ -0,0 +1,17 @@
+Types:
+PsiArrayInitializerExpression:{p} : double[]
+PsiArrayInitializerExpression:{p} : double[]
+PsiArrayInitializerExpression:{{p},{p}} : double[][]
+PsiLocalVariable:a : double[][]
+PsiNewExpression:new int[][]{{p},{p}} : double[][]
+PsiParameter:p : double
+PsiReferenceExpression:p : double
+PsiReferenceExpression:p : double
+
+Conversions:
+p -> $
+p -> $
+
+New expression type changes:
+new int[][]{{p},{p}} -> double[][]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t68/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t68/after/test.java
new file mode 100644
index 000000000000..f9d9a9257c5d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t68/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void foo(double p) {
+ double[][] a = new double[][]{{p},{p}};
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t68/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t68/before/test.java
new file mode 100644
index 000000000000..9f84d15cc993
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t68/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void foo(int p) {
+ int[][] a = new int[][]{{p},{p}};
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t69/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t69/after/Test.items
new file mode 100644
index 000000000000..6471629f221e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t69/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : byte
+PsiReferenceExpression:p : byte
+PsiReferenceExpression:p : byte
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t69/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t69/after/test.java
new file mode 100644
index 000000000000..bba00df7f5ed
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t69/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void foo(byte p) {
+ int[][] a = new int[][]{{p},{p}};
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t69/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t69/before/test.java
new file mode 100644
index 000000000000..9f84d15cc993
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t69/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void foo(int p) {
+ int[][] a = new int[][]{{p},{p}};
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t70/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t70/after/Test.items
new file mode 100644
index 000000000000..9811dea4870e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t70/after/Test.items
@@ -0,0 +1,18 @@
+Types:
+PsiArrayInitializerExpression:{p} : float[]
+PsiArrayInitializerExpression:{p} : float[]
+PsiArrayInitializerExpression:{{p}, {p}} : float[][]
+PsiField:a : float[][]
+PsiNewExpression:new int[][]{{p}, {p}} : float[][]
+PsiParameter:p : float
+PsiReferenceExpression:a : float[][]
+PsiReferenceExpression:p : float
+PsiReferenceExpression:p : float
+
+Conversions:
+p -> $
+p -> $
+
+New expression type changes:
+new int[][]{{p}, {p}} -> float[][]
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t70/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t70/after/test.java
new file mode 100644
index 000000000000..7ef5f832a7d9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t70/after/test.java
@@ -0,0 +1,6 @@
+class Test {
+ float[][] a;
+ public void foo(float p) {
+ a = new float[][]{{p}, {p}};
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t70/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t70/before/test.java
new file mode 100644
index 000000000000..d98804a2576f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t70/before/test.java
@@ -0,0 +1,6 @@
+class Test {
+ int[][] a;
+ public void foo(int p) {
+ a = new int[][]{{p}, {p}};
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t71/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t71/after/Test.items
new file mode 100644
index 000000000000..f65db392b622
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t71/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:f : java.lang.Class<? extends java.lang.Number>
+
+Conversions:
+byte.class -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t71/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t71/after/test.java
new file mode 100644
index 000000000000..be0143bbaafb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t71/after/test.java
@@ -0,0 +1,3 @@
+class Test {
+ Class<? extends Number> f = byte.class;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t71/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t71/before/test.java
new file mode 100644
index 000000000000..e3c0a3aecee2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t71/before/test.java
@@ -0,0 +1,3 @@
+class Test {
+ Class f = byte.class;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t72/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t72/after/Test.items
new file mode 100644
index 000000000000..cacd1729289d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t72/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:f : java.lang.Class<java.lang.Integer>
+
+Conversions:
+
+New expression type changes:
+Fails:
+byte.class->java.lang.Class<java.lang.Integer>
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t72/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t72/after/test.java
new file mode 100644
index 000000000000..ace9fbcc92a8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t72/after/test.java
@@ -0,0 +1,3 @@
+class Test {
+ Class<Integer> f = byte.class;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t72/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t72/before/test.java
new file mode 100644
index 000000000000..e3c0a3aecee2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t72/before/test.java
@@ -0,0 +1,3 @@
+class Test {
+ Class f = byte.class;
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t73/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t73/after/Test.items
new file mode 100644
index 000000000000..f46b39d67281
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t73/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiArrayInitializerExpression:{} : java.util.Set<java.awt.Component>[]
+PsiField:f : java.util.Set<java.awt.Component>[][]
+
+Conversions:
+
+New expression type changes:
+Fails:
+new Set[][]{{}}->java.util.Set<java.awt.Component>[][]
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t73/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t73/after/test.java
new file mode 100644
index 000000000000..da9d9b2e6fe8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t73/after/test.java
@@ -0,0 +1,6 @@
+import java.util.*;
+import javax.swing.*;
+import java.awt.*;
+class Test {
+ Set<Component>[][] f = new Set[][]{{}};
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t73/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t73/before/test.java
new file mode 100644
index 000000000000..b07764b2c29f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t73/before/test.java
@@ -0,0 +1,6 @@
+import java.util.*;
+import javax.swing.*;
+import java.awt.*;
+class Test {
+ Set<JComponent>[][] f = new Set[][]{{}};
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t74/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t74/after/Test.items
new file mode 100644
index 000000000000..236f769a7b98
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t74/after/Test.items
@@ -0,0 +1,22 @@
+Types:
+PsiLocalVariable:v1 : float
+PsiLocalVariable:v2 : float
+PsiLocalVariable:v3 : float
+PsiLocalVariable:v4 : float
+PsiLocalVariable:vu1 : float
+PsiLocalVariable:vu2 : float
+PsiLocalVariable:vu3 : float
+PsiParameter:pi : float
+PsiReferenceExpression:pi : float
+PsiReferenceExpression:pi : float
+PsiReferenceExpression:pi : float
+PsiReferenceExpression:pi : float
+PsiReferenceExpression:pi : float
+PsiReferenceExpression:pi : float
+PsiReferenceExpression:pi : float
+
+Conversions:
+
+New expression type changes:
+Fails:
+~pi->float
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t74/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t74/after/test.java
new file mode 100644
index 000000000000..25d776d7d8c6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t74/after/test.java
@@ -0,0 +1,11 @@
+class Test {
+ public void meth(float pi) {
+ float v1 = pi++;
+ float v2 = pi--;
+ float v3 = ++pi;
+ float v4 = --pi;
+ float vu1 = -pi;
+ float vu2 = +pi;
+ float vu3 = ~pi;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t74/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t74/before/test.java
new file mode 100644
index 000000000000..c6e83eedc1bd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t74/before/test.java
@@ -0,0 +1,11 @@
+class Test {
+ public void meth(int pi) {
+ int v1 = pi++;
+ int v2 = pi--;
+ int v3 = ++pi;
+ int v4 = --pi;
+ int vu1 = -pi;
+ int vu2 = +pi;
+ int vu3 = ~pi;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t75/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t75/after/Test.items
new file mode 100644
index 000000000000..9c3eb7b369e3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t75/after/Test.items
@@ -0,0 +1,38 @@
+Types:
+PsiLocalVariable:vn4 : java.lang.String
+PsiParameter:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
+pn->java.lang.String
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t75/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t75/after/test.java
new file mode 100644
index 000000000000..750c3d1d51a4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t75/after/test.java
@@ -0,0 +1,12 @@
+class Test {
+ public void meth(String pn) {
+ int vn1 = pn * pn;
+ int vn2 = pn / pn;
+ int vn3 = pn % pn;
+ String vn4 = pn + pn;
+ int vn5 = pn - pn;
+ int vn6 = pn << pn;
+ int vn7 = pn >> pn;
+ int vn8 = pn >>> pn;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t75/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t75/before/test.java
new file mode 100644
index 000000000000..fdde94165b43
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t75/before/test.java
@@ -0,0 +1,12 @@
+class Test {
+ public void meth(byte pn) {
+ int vn1 = pn * pn;
+ int vn2 = pn / pn;
+ int vn3 = pn % pn;
+ int vn4 = pn + pn;
+ int vn5 = pn - pn;
+ int vn6 = pn << pn;
+ int vn7 = pn >> pn;
+ int vn8 = pn >>> pn;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t76/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t76/after/Test.items
new file mode 100644
index 000000000000..7a2163c3200b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t76/after/Test.items
@@ -0,0 +1,37 @@
+Types:
+PsiLocalVariable:vn1 : float
+PsiLocalVariable:vn2 : float
+PsiLocalVariable:vn3 : float
+PsiLocalVariable:vn4 : float
+PsiLocalVariable:vn5 : float
+PsiLocalVariable:vn6 : float
+PsiLocalVariable:vn7 : float
+PsiLocalVariable:vn8 : float
+PsiParameter:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+PsiReferenceExpression:pn : float
+
+Conversions:
+
+New expression type changes:
+Fails:
+pn->float
+pn->float
+pn->float
+pn->float
+pn->float
+pn->float
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t76/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t76/after/test.java
new file mode 100644
index 000000000000..3e6b69cf7c94
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t76/after/test.java
@@ -0,0 +1,12 @@
+class Test {
+ public void meth(float pn) {
+ float vn1 = pn * pn;
+ float vn2 = pn / pn;
+ float vn3 = pn % pn;
+ float vn4 = pn + pn;
+ float vn5 = pn - pn;
+ float vn6 = pn << pn;
+ float vn7 = pn >> pn;
+ float vn8 = pn >>> pn;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t76/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t76/before/test.java
new file mode 100644
index 000000000000..fdde94165b43
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t76/before/test.java
@@ -0,0 +1,12 @@
+class Test {
+ public void meth(byte pn) {
+ int vn1 = pn * pn;
+ int vn2 = pn / pn;
+ int vn3 = pn % pn;
+ int vn4 = pn + pn;
+ int vn5 = pn - pn;
+ int vn6 = pn << pn;
+ int vn7 = pn >> pn;
+ int vn8 = pn >>> pn;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t77/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t77/after/Test.items
new file mode 100644
index 000000000000..dc0f44202f9b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t77/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:pn : java.lang.Object
+PsiReferenceExpression:pn : java.lang.Object
+
+Conversions:
+
+New expression type changes:
+Fails:
+pn->java.lang.Object
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t77/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t77/after/test.java
new file mode 100644
index 000000000000..4e8733a49d43
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t77/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void meth(Object pn, int p) {
+ p += pn;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t77/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t77/before/test.java
new file mode 100644
index 000000000000..252a45c4acc5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t77/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void meth(int pn, int p) {
+ p += pn;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t78/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t78/after/Test.items
new file mode 100644
index 000000000000..f935ec3be774
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t78/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiParameter:p : java.lang.String
+PsiParameter:pn : java.lang.String
+PsiReferenceExpression:p : java.lang.String
+PsiReferenceExpression:pn : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t78/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t78/after/test.java
new file mode 100644
index 000000000000..573deb573d11
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t78/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void meth(String pn, String p) {
+ p += pn;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t78/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t78/before/test.java
new file mode 100644
index 000000000000..252a45c4acc5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t78/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void meth(int pn, int p) {
+ p += pn;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t79/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t79/after/Test.items
new file mode 100644
index 000000000000..9e7dba8b794e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t79/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:p : byte
+PsiReferenceExpression:p : byte
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t79/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t79/after/test.java
new file mode 100644
index 000000000000..37ec2cb0f5fd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t79/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void meth(byte p) {
+ float f = (float)p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t79/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t79/before/test.java
new file mode 100644
index 000000000000..30db2da5fa91
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t79/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void meth(int p) {
+ float f = (float)p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t80/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t80/after/Test.items
new file mode 100644
index 000000000000..55661712f811
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t80/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:p : double
+PsiReferenceExpression:p : double
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t80/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t80/after/test.java
new file mode 100644
index 000000000000..5fe4738b6a5e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t80/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void meth(double p) {
+ float f = (float)p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t80/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t80/before/test.java
new file mode 100644
index 000000000000..30db2da5fa91
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t80/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void meth(int p) {
+ float f = (float)p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t81/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t81/after/Test.items
new file mode 100644
index 000000000000..f89012c7c140
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t81/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:o : A
+PsiReferenceExpression:o : A
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t81/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t81/after/test.java
new file mode 100644
index 000000000000..55deae9424fa
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t81/after/test.java
@@ -0,0 +1,9 @@
+class A {}
+
+class B extends A {}
+
+class Test {
+ void foo(A o) {
+ if (o instanceof B){}
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t81/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t81/before/test.java
new file mode 100644
index 000000000000..8bccf86ced7b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t81/before/test.java
@@ -0,0 +1,9 @@
+class A {}
+
+class B extends A {}
+
+class Test {
+ void foo(Object o) {
+ if (o instanceof B){}
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t82/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t82/after/Test.items
new file mode 100644
index 000000000000..5164a4b2f6d9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t82/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:o : C
+PsiReferenceExpression:o : C
+
+Conversions:
+
+New expression type changes:
+Fails:
+o->C
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t82/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t82/after/test.java
new file mode 100644
index 000000000000..83b747a3cb27
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t82/after/test.java
@@ -0,0 +1,11 @@
+class C{}
+
+class A {}
+
+class B extends A {}
+
+class Test {
+ void foo(C o) {
+ if (o instanceof B){}
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t82/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t82/before/test.java
new file mode 100644
index 000000000000..cb617f44766f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t82/before/test.java
@@ -0,0 +1,11 @@
+class C{}
+
+class A {}
+
+class B extends A {}
+
+class Test {
+ void foo(Object o) {
+ if (o instanceof B){}
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t83/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t83/after/Test.items
new file mode 100644
index 000000000000..9f0dab259a44
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t83/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiParameter:p : java.lang.Object
+PsiReferenceExpression:p : java.lang.Object
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t83/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t83/after/test.java
new file mode 100644
index 000000000000..2a6715c81d3f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t83/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void meth(Object p) {
+ float f = (float)p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t83/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t83/before/test.java
new file mode 100644
index 000000000000..30db2da5fa91
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t83/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ public void meth(int p) {
+ float f = (float)p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t84/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t84/after/Test.items
new file mode 100644
index 000000000000..5f64399bef41
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t84/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiLocalVariable:f : java.util.Set<? extends java.util.Set>
+PsiParameter:p : java.util.Set<? extends java.util.Set>
+PsiReferenceExpression:p : java.util.Set<? extends java.util.Set>
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t84/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t84/after/test.java
new file mode 100644
index 000000000000..b055ef3a4df9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t84/after/test.java
@@ -0,0 +1,6 @@
+import java.util.*;
+class Test {
+ public void meth(Set<? extends Set> p) {
+ Set<? extends Set> f = p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t84/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t84/before/test.java
new file mode 100644
index 000000000000..7c85f93d7a57
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t84/before/test.java
@@ -0,0 +1,6 @@
+import java.util.*;
+class Test {
+ public void meth(Set p) {
+ Set<Set> f = p;
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t85/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t85/after/Test.items
new file mode 100644
index 000000000000..76d7b14baa5d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t85/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:str : java.lang.Integer
+PsiMethod:get : java.lang.Integer
+PsiReferenceExpression:str : java.lang.Integer
+PsiReferenceExpression:str : java.lang.Integer
+PsiReferenceExpression:str : java.lang.Integer
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t85/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t85/after/test.java
new file mode 100644
index 000000000000..c43a426e5277
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t85/after/test.java
@@ -0,0 +1,8 @@
+public class Test {
+
+ Integer str;
+ Integer get(boolean f) {
+ return f ? str : str + str;
+ }
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t85/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t85/before/test.java
new file mode 100644
index 000000000000..adde8623a884
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t85/before/test.java
@@ -0,0 +1,8 @@
+public class Test {
+
+ String str;
+ String get(boolean f) {
+ return f ? str : str + str;
+ }
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t86/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t86/after/Test.items
new file mode 100644
index 000000000000..c2f8f1dd9fa6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t86/after/Test.items
@@ -0,0 +1,18 @@
+Types:
+PsiArrayAccessExpression:array[i] : java.lang.String
+PsiArrayAccessExpression:array[i] : java.lang.String
+PsiLocalVariable:array : java.util.List<java.lang.String>
+PsiMethod:getArray : java.util.List<java.lang.String>
+PsiMethodCallExpression:getArray() : java.util.List<java.lang.String>
+PsiReferenceExpression:array : java.util.List<java.lang.String>
+PsiReferenceExpression:array : java.util.List<java.lang.String>
+PsiReferenceExpression:array : java.util.List<java.lang.String>
+PsiReferenceExpression:array.length : int
+
+Conversions:
+array.length -> $qualifier$.size() $qualifier$.length
+array[i] -> $qualifier$.get($idx$) $qualifier$[$idx$]
+array[i] -> $qualifier$.set($idx$, $expr$) $qualifier$[$idx$] = $expr$ array[i] = ""
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t86/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t86/after/test.java
new file mode 100644
index 000000000000..25f8b851603d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t86/after/test.java
@@ -0,0 +1,16 @@
+import java.util.List;
+public class Test {
+
+ List<String> getArray(){
+ return null;
+ }
+
+ void foo() {
+ List<String> array = getArray();
+ for (int i = 0; i < array.size(); i++) {
+ System.out.println(array.get(i));
+ array.set(i, "");
+ }
+ }
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t86/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t86/before/test.java
new file mode 100644
index 000000000000..880c69463055
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t86/before/test.java
@@ -0,0 +1,16 @@
+import java.util.List;
+public class Test {
+
+ String[] getArray(){
+ return null;
+ }
+
+ void foo() {
+ String[] array = getArray();
+ for (int i = 0; i < array.length; i++) {
+ System.out.println(array[i]);
+ array[i] = "";
+ }
+ }
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t87/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t87/after/Test.items
new file mode 100644
index 000000000000..45193ce9dcf4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t87/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiLocalVariable:array : java.lang.String[]
+PsiMethod:getArray : java.lang.String[]
+PsiMethodCallExpression:getArray() : java.lang.String[]
+PsiReferenceExpression:array : java.lang.String[]
+
+Conversions:
+array -> Arrays.sort($qualifier$) Collections.sort($qualifier$) Collections.sort(array)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t87/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t87/after/test.java
new file mode 100644
index 000000000000..f0e5159bfcfd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t87/after/test.java
@@ -0,0 +1,13 @@
+import java.util.*;
+public class Test {
+
+ String[] getArray(){
+ return null;
+ }
+
+ void foo() {
+ String[] array = getArray();
+ Arrays.sort(array);
+ }
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t87/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t87/before/test.java
new file mode 100644
index 000000000000..12a28fa3084c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t87/before/test.java
@@ -0,0 +1,13 @@
+import java.util.*;
+public class Test {
+
+ List<String> getArray(){
+ return null;
+ }
+
+ void foo() {
+ List<String> array = getArray();
+ Collections.sort(array);
+ }
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t88/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t88/after/Test.items
new file mode 100644
index 000000000000..60ae50f9c699
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t88/after/Test.items
@@ -0,0 +1,15 @@
+Types:
+PsiLocalVariable:array : java.util.List<java.lang.String>
+PsiMethod:getArray : java.util.List<java.lang.String>
+PsiMethodCallExpression:getArray() : java.util.List<java.lang.String>
+PsiReferenceExpression:array : java.util.List<java.lang.String>
+
+Conversions:
+array -> Collections.sort($qualifier$, $expr$) Arrays.sort($qualifier$, $expr$) Arrays.sort(array, new Comparator<String>() {
+ public int compare(String s1, String s2) {
+ return 0;
+ }
+ })
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t88/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t88/after/test.java
new file mode 100644
index 000000000000..4be724c5d907
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t88/after/test.java
@@ -0,0 +1,18 @@
+import java.util.*;
+public class Test {
+
+ List<String> getArray(){
+ return null;
+ }
+
+ void foo() {
+ List<String> array = getArray();
+ Collections.sort(array, new Comparator<String>() {
+ public int compare(String s1, String s2) {
+ return 0;
+ }
+ });
+
+ }
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t88/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t88/before/test.java
new file mode 100644
index 000000000000..ce19bd33f20e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t88/before/test.java
@@ -0,0 +1,18 @@
+import java.util.*;
+public class Test {
+
+ String[] getArray(){
+ return null;
+ }
+
+ void foo() {
+ String[] array = getArray();
+ Arrays.sort(array, new Comparator<String>() {
+ public int compare(String s1, String s2) {
+ return 0;
+ }
+ });
+
+ }
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t89/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t89/after/Test.items
new file mode 100644
index 000000000000..069dfb76e5c3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t89/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiLocalVariable:array : java.lang.String[]
+PsiMethod:getArray : java.lang.String[]
+PsiMethodCallExpression:getArray() : java.lang.String[]
+PsiReferenceExpression:array : java.lang.String[]
+
+Conversions:
+
+New expression type changes:
+Fails:
+array->java.lang.String[]
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t89/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t89/after/test.java
new file mode 100644
index 000000000000..5a625c53c286
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t89/after/test.java
@@ -0,0 +1,13 @@
+import java.util.*;
+public class Test {
+
+ String[] getArray(){
+ return null;
+ }
+
+ void foo() {
+ String[] array = getArray();
+ Collections.checkedList(array, String.class);
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t89/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t89/before/test.java
new file mode 100644
index 000000000000..c12161d8c76d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t89/before/test.java
@@ -0,0 +1,13 @@
+import java.util.*;
+public class Test {
+
+ List<String> getArray(){
+ return null;
+ }
+
+ void foo() {
+ List<String> array = getArray();
+ Collections.checkedList(array, String.class);
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t90/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t90/after/Test.items
new file mode 100644
index 000000000000..721469c186fa
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t90/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiField:l : java.util.List<A>
+PsiMethodCallExpression:b.foo() : java.util.Map<java.lang.String,java.lang.String>
+PsiParameter:b : A
+PsiReferenceExpression:b : A
+PsiReferenceExpression:l : java.util.List<A>
+
+Conversions:
+b.foo() -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t90/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t90/after/test.java
new file mode 100644
index 000000000000..06c072088b02
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t90/after/test.java
@@ -0,0 +1,24 @@
+import java.util.*;
+public class Test {
+ List<A> l;
+
+ @Override
+ Map<String, String> foo() {
+ HashMap<String, String> m = new HashMap<String, String>();
+ for (A b : l) {
+ Map<String, String> map = b.foo();
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ if (!m.containsKey(entry.getKey())) {
+ m.put(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+ return m;
+ }
+}
+
+class A {
+ Map<String, String> foo(){return null;}
+}
+
+class B extends A {} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t90/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t90/before/test.java
new file mode 100644
index 000000000000..80afdc6aa08b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t90/before/test.java
@@ -0,0 +1,24 @@
+import java.util.*;
+public class Test {
+ List<B> l;
+
+ @Override
+ Map<String, String> foo() {
+ HashMap<String, String> m = new HashMap<String, String>();
+ for (B b : l) {
+ Map<String, String> map = b.foo();
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ if (!m.containsKey(entry.getKey())) {
+ m.put(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+ return m;
+ }
+}
+
+class A {
+ Map<String, String> foo(){return null;}
+}
+
+class B extends A {} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t91/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t91/after/Test.items
new file mode 100644
index 000000000000..9b53aeaf2084
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t91/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiMethod:foo : java.lang.String[]
+
+Conversions:
+"" -> new java.lang.String[]{$qualifier$} $qualifier$ ""
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t91/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t91/after/test.java
new file mode 100644
index 000000000000..9575d720b844
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t91/after/test.java
@@ -0,0 +1,5 @@
+public class Test {
+ String[] foo(){
+ return new String[]{""};
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t91/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t91/before/test.java
new file mode 100644
index 000000000000..e916bd0a5dab
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t91/before/test.java
@@ -0,0 +1,5 @@
+public class Test {
+ String foo(){
+ return "";
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t92/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t92/after/Test.items
new file mode 100644
index 000000000000..bf241c7966a7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t92/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:f : java.util.List<java.lang.Integer>
+PsiNewExpression:new ArrayList<String>(){} : java.util.ArrayList<java.lang.Integer>
+
+Conversions:
+
+New expression type changes:
+new ArrayList<String>(){} -> java.util.ArrayList<java.lang.Integer>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t92/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t92/after/test.java
new file mode 100644
index 000000000000..f70bc9515dea
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t92/after/test.java
@@ -0,0 +1,4 @@
+import java.util.*;
+public class Test {
+ List<Integer> f = new ArrayList<Integer>(){};
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t92/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t92/before/test.java
new file mode 100644
index 000000000000..89ae1f7d3101
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t92/before/test.java
@@ -0,0 +1,4 @@
+import java.util.*;
+public class Test {
+ List<String> f = new ArrayList<String>(){};
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t93/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t93/after/Test.items
new file mode 100644
index 000000000000..ea2fc9440478
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t93/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:f : java.util.Map<java.lang.Boolean,java.lang.String>
+PsiParameter:b : boolean
+PsiReferenceExpression:b : boolean
+PsiReferenceExpression:f : java.util.Map<java.lang.Boolean,java.lang.String>
+
+Conversions:
+f -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t93/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t93/after/test.java
new file mode 100644
index 000000000000..6b714f8e8862
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t93/after/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+public class Test {
+ Map<Boolean, String> f;
+
+ void foo(boolean b) {
+ f.put(b, null);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t93/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t93/before/test.java
new file mode 100644
index 000000000000..292b5f9f0361
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t93/before/test.java
@@ -0,0 +1,8 @@
+import java.util.*;
+public class Test {
+ Map<Boolean, String> f;
+
+ void foo(Boolean b) {
+ f.put(b, null);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t94/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t94/after/Test.items
new file mode 100644
index 000000000000..76ae2a02000b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t94/after/Test.items
@@ -0,0 +1,13 @@
+Types:
+PsiLocalVariable:array : java.lang.String[]
+PsiMethod:getArray : java.lang.String[]
+PsiMethodCallExpression:getArray() : java.lang.String[]
+PsiReferenceExpression:array : java.lang.String[]
+PsiReferenceExpression:array : java.lang.String[]
+
+Conversions:
+array -> Arrays.binarySearch($qualifier$, $key$) Collections.binarySearch($qualifier$, $key$) Collections.binarySearch(array, "")
+array -> Arrays.sort($qualifier$) Collections.sort($qualifier$) Collections.sort(array)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t94/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t94/after/test.java
new file mode 100644
index 000000000000..d8df3e65dd43
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t94/after/test.java
@@ -0,0 +1,14 @@
+import java.util.*;
+public class Test {
+
+ String[] getArray(){
+ return null;
+ }
+
+ void foo() {
+ String[] array = getArray();
+ Arrays.binarySearch(array, "");
+ Arrays.sort(array);
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t94/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t94/before/test.java
new file mode 100644
index 000000000000..99bf050d6f00
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t94/before/test.java
@@ -0,0 +1,14 @@
+import java.util.*;
+public class Test {
+
+ List<String> getArray(){
+ return null;
+ }
+
+ void foo() {
+ List<String> array = getArray();
+ Collections.binarySearch(array, "");
+ Collections.sort(array);
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t95/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t95/after/Test.items
new file mode 100644
index 000000000000..d3f8033938ea
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t95/after/Test.items
@@ -0,0 +1,13 @@
+Types:
+PsiLocalVariable:array : java.util.List<java.lang.String>
+PsiMethod:getArray : java.util.List<java.lang.String>
+PsiMethodCallExpression:getArray() : java.util.List<java.lang.String>
+PsiReferenceExpression:array : java.util.List<java.lang.String>
+PsiReferenceExpression:array : java.util.List<java.lang.String>
+
+Conversions:
+array -> Collections.binarySearch($qualifier$, $key$) Arrays.binarySearch($qualifier$, $key$) Arrays.binarySearch(array, "")
+array -> Collections.sort($qualifier$) Arrays.sort($qualifier$) Arrays.sort(array)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t95/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t95/after/test.java
new file mode 100644
index 000000000000..99bf050d6f00
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t95/after/test.java
@@ -0,0 +1,14 @@
+import java.util.*;
+public class Test {
+
+ List<String> getArray(){
+ return null;
+ }
+
+ void foo() {
+ List<String> array = getArray();
+ Collections.binarySearch(array, "");
+ Collections.sort(array);
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t95/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t95/before/test.java
new file mode 100644
index 000000000000..d8df3e65dd43
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t95/before/test.java
@@ -0,0 +1,14 @@
+import java.util.*;
+public class Test {
+
+ String[] getArray(){
+ return null;
+ }
+
+ void foo() {
+ String[] array = getArray();
+ Arrays.binarySearch(array, "");
+ Arrays.sort(array);
+ }
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t96/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t96/after/Test.items
new file mode 100644
index 000000000000..d107b7626a41
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t96/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:f1 : java.lang.String
+PsiField:f2 : java.lang.String
+PsiReferenceExpression:f1 : java.lang.String
+
+Conversions:
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t96/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t96/after/test.java
new file mode 100644
index 000000000000..25357fd46118
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t96/after/test.java
@@ -0,0 +1,5 @@
+public class Test {
+ String f1 = null;
+ String f2 = f1;
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t96/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t96/before/test.java
new file mode 100644
index 000000000000..55d7110ccb83
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t96/before/test.java
@@ -0,0 +1,5 @@
+public class Test {
+ Integer f1 = null;
+ Integer f2 = f1;
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t97/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t97/after/Test.items
new file mode 100644
index 000000000000..1d376856a7ac
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t97/after/Test.items
@@ -0,0 +1,8 @@
+Types:
+PsiField:f1 : int
+
+Conversions:
+
+New expression type changes:
+Fails:
+{0}->int
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t97/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t97/after/test.java
new file mode 100644
index 000000000000..61687e78d725
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t97/after/test.java
@@ -0,0 +1,4 @@
+public class Test {
+ int f1 = {0};
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t97/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t97/before/test.java
new file mode 100644
index 000000000000..f33899c2c3d7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t97/before/test.java
@@ -0,0 +1,4 @@
+public class Test {
+ Integer[] f1 = {0};
+
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t98/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t98/after/Test.items
new file mode 100644
index 000000000000..9b5e0b6b54e9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t98/after/Test.items
@@ -0,0 +1,21 @@
+Types:
+PsiArrayAccessExpression:array[i] : java.lang.String
+PsiArrayAccessExpression:array[i] : java.lang.String
+PsiArrayAccessExpression:array[i] : java.lang.String
+PsiLocalVariable:array : java.util.List<java.lang.String>
+PsiMethod:getArray : java.util.List<java.lang.String>
+PsiMethodCallExpression:getArray() : java.util.List<java.lang.String>
+PsiReferenceExpression:array : java.util.List<java.lang.String>
+PsiReferenceExpression:array : java.util.List<java.lang.String>
+PsiReferenceExpression:array : java.util.List<java.lang.String>
+PsiReferenceExpression:array : java.util.List<java.lang.String>
+PsiReferenceExpression:array.length : int
+
+Conversions:
+array.length -> $qualifier$.size() $qualifier$.length
+array[i] -> $qualifier$.get($idx$) $qualifier$[$idx$]
+array[i] -> $qualifier$.get($idx$) $qualifier$[$idx$]
+array[i] -> $qualifier$.get($idx$) $qualifier$[$idx$]
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t98/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t98/after/test.java
new file mode 100644
index 000000000000..86e1e0b4f6c2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t98/after/test.java
@@ -0,0 +1,17 @@
+import java.util.List;
+public class Test {
+
+ List<String> getArray(){
+ return null;
+ }
+
+ void foo(String param) {
+ List<String> array = getArray();
+ for (int i = 0; i < array.size(); i++) {
+ System.out.println(array.get(i));
+ String str = array.get(i);
+ param = array.get(i);
+ }
+ }
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t98/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t98/before/test.java
new file mode 100644
index 000000000000..b79f9495d4ac
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t98/before/test.java
@@ -0,0 +1,17 @@
+import java.util.List;
+public class Test {
+
+ String[] getArray(){
+ return null;
+ }
+
+ void foo(String param) {
+ String[] array = getArray();
+ for (int i = 0; i < array.length; i++) {
+ System.out.println(array[i]);
+ String str = array[i];
+ param = array[i];
+ }
+ }
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t99/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t99/after/Test.items
new file mode 100644
index 000000000000..93ca5aa6a01e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t99/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:f : java.util.Set<java.util.List<int[]>>
+PsiNewExpression:new Set<List<char[]>>() : java.util.Set<java.util.List<int[]>>
+
+Conversions:
+
+New expression type changes:
+new Set<List<char[]>>() -> java.util.Set<java.util.List<int[]>>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t99/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t99/after/test.java
new file mode 100644
index 000000000000..1f7b49a490d9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t99/after/test.java
@@ -0,0 +1,6 @@
+import java.util.*;
+public class Test {
+ Set<List<int[]>> f = new Set<>();
+
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/t99/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/t99/before/test.java
new file mode 100644
index 000000000000..7ae6a2b492ba
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/t99/before/test.java
@@ -0,0 +1,6 @@
+import java.util.*;
+public class Test {
+ Set<List<char[]>> f = new Set<List<char[]>>();
+
+
+}
diff --git a/java/typeMigration/testData/refactoring/typeMigration/typeAnno/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/typeAnno/after/Test.items
new file mode 100644
index 000000000000..ab263cc2b7a6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/typeAnno/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:list : java.util.Collection<java.lang.Integer>
+PsiNewExpression:new ArrayList<>(2) : java.util.ArrayList<java.lang.Integer>
+
+Conversions:
+
+New expression type changes:
+new ArrayList<>(2) -> java.util.ArrayList<java.lang.Integer>
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigration/typeAnno/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/typeAnno/after/test.java
new file mode 100644
index 000000000000..7d25d562b91d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/typeAnno/after/test.java
@@ -0,0 +1,9 @@
+import java.lang.annotation.*;
+import java.util.*;
+
+@Target(value = ElementType.TYPE_USE)
+public @interface TA { }
+
+class Test {
+ Collection<@TA Integer> list = new ArrayList<>(2);
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigration/typeAnno/before/test.java b/java/typeMigration/testData/refactoring/typeMigration/typeAnno/before/test.java
new file mode 100644
index 000000000000..6cc51471d8d8
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigration/typeAnno/before/test.java
@@ -0,0 +1,9 @@
+import java.lang.annotation.*;
+import java.util.*;
+
+@Target(value = ElementType.TYPE_USE)
+public @interface TA { }
+
+class Test {
+ ArrayList<@TA Integer> list = new ArrayList<>(2);
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/after/Test.items
new file mode 100644
index 000000000000..9d1b1894378f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/after/Test.items
@@ -0,0 +1,25 @@
+Types:
+PsiAssignmentExpression:i += 2 : java.util.concurrent.atomic.AtomicInteger
+PsiAssignmentExpression:i -= 5 : java.util.concurrent.atomic.AtomicInteger
+PsiBinaryExpression:i + 9 : int
+PsiBinaryExpression:i - 9 : int
+PsiBinaryExpression:i == 0 : boolean
+PsiField:i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+
+Conversions:
+0 -> new java.util.concurrent.atomic.AtomicInteger($val$) $val$
+9 -> $qualifier$.set($val$) $qualifier$ = $val$ i = 9
+i + 9 -> $qualifier$.get() + $val$ $qualifier$+$val$
+i += 2 -> $qualifier$.getAndAdd(($val$)) $qualifier$ += $val$
+i - 9 -> $qualifier$.get() - $val$ $qualifier$-$val$
+i -= 5 -> $qualifier$.getAndAdd(-($val$)) $qualifier$ -= $val$
+i == 0 -> $qualifier$.get() == $val$ $qualifier$==$val$
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/after/Test.java
new file mode 100644
index 000000000000..5c16607a8b70
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/after/Test.java
@@ -0,0 +1,16 @@
+import java.util.concurrent.atomic.AtomicInteger;
+
+class Test {
+ AtomicInteger i = new AtomicInteger(0);
+
+ void foo() {
+ i.getAndAdd((2));
+ i.getAndAdd(-(5));
+ if (i.get() == 0) {
+ i.set(9);
+ }
+
+ System.out.println(i.get() + 9);
+ System.out.println(i.get() - 9);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/before/Test.java
new file mode 100644
index 000000000000..b96f02057dfd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directAssignments/before/Test.java
@@ -0,0 +1,14 @@
+class Test {
+ int i = 0;
+
+ void foo() {
+ i += 2;
+ i -= 5;
+ if (i == 0) {
+ i = 9;
+ }
+
+ System.out.println(i + 9);
+ System.out.println(i - 9);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/after/Test.items
new file mode 100644
index 000000000000..e0e121ecf00d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/after/Test.items
@@ -0,0 +1,19 @@
+Types:
+PsiAssignmentExpression:b += 0 : java.util.concurrent.atomic.AtomicReference<java.lang.Byte>
+PsiBinaryExpression:b == 0 : boolean
+PsiField:b : java.util.concurrent.atomic.AtomicReference<java.lang.Byte>
+PsiPostfixExpression:b++ : java.util.concurrent.atomic.AtomicReference<java.lang.Byte>
+PsiReferenceExpression:b : java.util.concurrent.atomic.AtomicReference<java.lang.Byte>
+PsiReferenceExpression:b : java.util.concurrent.atomic.AtomicReference<java.lang.Byte>
+PsiReferenceExpression:b : java.util.concurrent.atomic.AtomicReference<java.lang.Byte>
+PsiReferenceExpression:b : java.util.concurrent.atomic.AtomicReference<java.lang.Byte>
+
+Conversions:
+0 -> new java.util.concurrent.atomic.AtomicReference<java.lang.Byte>((byte)$val$) $val$
+b += 0 -> $qualifier$.set(new Byte((byte)($qualifier$.get() + $val$))) $qualifier$+=$val$
+b -> $qualifier$.get() $qualifier$ b
+b == 0 -> $qualifier$.get() == $val$ $qualifier$==$val$
+b++ -> $qualifier$.getAndSet(new Byte((byte)($qualifier$.get() + 1))) $qualifier$++
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/after/Test.java
new file mode 100644
index 000000000000..a1dbfc714326
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/after/Test.java
@@ -0,0 +1,14 @@
+import java.util.concurrent.atomic.AtomicReference;
+
+class Test {
+ AtomicReference<Byte> b = new AtomicReference<Byte>((byte) 0);
+
+ void bar() {
+ if (b.get() == 0) {
+ b.getAndSet(new Byte((byte) (b.get() + 1)));
+ b.set(new Byte((byte) (b.get() + 0)));
+ //System.out.println(b + 10);
+ System.out.println(b.get());
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/before/Test.java
new file mode 100644
index 000000000000..fa494c28a3c4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directByte/before/Test.java
@@ -0,0 +1,12 @@
+class Test {
+ byte b = 0;
+
+ void bar() {
+ if (b == 0) {
+ b++;
+ b += 0;
+ //System.out.println(b + 10);
+ System.out.println(b);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/after/Test.items
new file mode 100644
index 000000000000..95f366691485
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:b : java.util.concurrent.atomic.AtomicBoolean
+PsiReferenceExpression:b : java.util.concurrent.atomic.AtomicBoolean
+PsiReferenceExpression:b : java.util.concurrent.atomic.AtomicBoolean
+
+Conversions:
+b -> $qualifier$.get() $qualifier$ b
+true -> $qualifier$.set($val$) $qualifier$ = $val$ b = true
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/after/Test.java
new file mode 100644
index 000000000000..02fc40276a86
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/after/Test.java
@@ -0,0 +1,11 @@
+import java.util.concurrent.atomic.AtomicBoolean;
+
+class Test {
+ AtomicBoolean b;
+
+ void foo() {
+ if (b.get()) {
+ b.set(true);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/before/Test.java
new file mode 100644
index 000000000000..ef5413600c40
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directConditions/before/Test.java
@@ -0,0 +1,9 @@
+class Test {
+ boolean b;
+
+ void foo() {
+ if (b) {
+ b = true;
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/after/Test.items
new file mode 100644
index 000000000000..add3ea1f98e3
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiField:lst : java.util.concurrent.atomic.AtomicReference<java.util.List<java.lang.String>>
+PsiReferenceExpression:lst : java.util.concurrent.atomic.AtomicReference<java.util.List<java.lang.String>>
+
+Conversions:
+lst -> $qualifier$.get() $qualifier$ lst
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/after/Test.java
new file mode 100644
index 000000000000..4db9a5619849
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/after/Test.java
@@ -0,0 +1,12 @@
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+class Test {
+ AtomicReference<List<String>> lst;
+
+ void foo() {
+ for (String s : lst.get()) {
+ System.out.println(s);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/before/Test.java
new file mode 100644
index 000000000000..1d40f4082444
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directForeach/before/Test.java
@@ -0,0 +1,11 @@
+import java.util.*;
+
+class Test {
+ List<String> lst;
+
+ void foo() {
+ for (String s : lst) {
+ System.out.println(s);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/after/Test.items
new file mode 100644
index 000000000000..852aa470a285
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/after/Test.items
@@ -0,0 +1,25 @@
+Types:
+PsiField:i : java.util.concurrent.atomic.AtomicInteger
+PsiPostfixExpression:i++ : java.util.concurrent.atomic.AtomicInteger
+PsiPostfixExpression:i++ : java.util.concurrent.atomic.AtomicInteger
+PsiPostfixExpression:i-- : java.util.concurrent.atomic.AtomicInteger
+PsiPrefixExpression:++i : java.util.concurrent.atomic.AtomicInteger
+PsiPrefixExpression:--i : java.util.concurrent.atomic.AtomicInteger
+PsiPrefixExpression:--i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+PsiReferenceExpression:i : java.util.concurrent.atomic.AtomicInteger
+
+Conversions:
+++i -> $qualifier$.incrementAndGet() ++$qualifier$
+--i -> $qualifier$.decrementAndGet() --$qualifier$
+--i -> $qualifier$.decrementAndGet() --$qualifier$
+i++ -> $qualifier$.getAndIncrement() $qualifier$++
+i++ -> $qualifier$.getAndIncrement() $qualifier$++
+i-- -> $qualifier$.getAndDecrement() $qualifier$--
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/after/Test.java
new file mode 100644
index 000000000000..bdcf7171016b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/after/Test.java
@@ -0,0 +1,14 @@
+import java.util.concurrent.atomic.AtomicInteger;
+
+class Test {
+ AtomicInteger i;
+
+ void foo() {
+ i.getAndIncrement();
+ i.incrementAndGet();
+ i.getAndDecrement();
+ i.decrementAndGet();
+ System.out.println(i.getAndIncrement());
+ System.out.println(i.decrementAndGet());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/before/Test.java
new file mode 100644
index 000000000000..be6aa55d5f29
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIncrementDecrement/before/Test.java
@@ -0,0 +1,12 @@
+class Test {
+ int i;
+
+ void foo() {
+ i++;
+ ++i;
+ i--;
+ --i;
+ System.out.println(i++);
+ System.out.println(--i);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/after/Test.items
new file mode 100644
index 000000000000..69a66c34a6cb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/after/Test.items
@@ -0,0 +1,34 @@
+Types:
+PsiArrayAccessExpression:a[0] : int
+PsiArrayAccessExpression:a[0] : int
+PsiArrayAccessExpression:a[0] : int
+PsiArrayAccessExpression:a[0] : int
+PsiArrayAccessExpression:a[0] : int
+PsiArrayAccessExpression:a[0] : int
+PsiArrayAccessExpression:a[0] : int
+PsiArrayAccessExpression:a[0] : int
+PsiField:a : java.util.concurrent.atomic.AtomicIntegerArray
+PsiReferenceExpression:a : java.util.concurrent.atomic.AtomicIntegerArray
+PsiReferenceExpression:a : java.util.concurrent.atomic.AtomicIntegerArray
+PsiReferenceExpression:a : java.util.concurrent.atomic.AtomicIntegerArray
+PsiReferenceExpression:a : java.util.concurrent.atomic.AtomicIntegerArray
+PsiReferenceExpression:a : java.util.concurrent.atomic.AtomicIntegerArray
+PsiReferenceExpression:a : java.util.concurrent.atomic.AtomicIntegerArray
+PsiReferenceExpression:a : java.util.concurrent.atomic.AtomicIntegerArray
+PsiReferenceExpression:a : java.util.concurrent.atomic.AtomicIntegerArray
+PsiReferenceExpression:a : java.util.concurrent.atomic.AtomicIntegerArray
+
+Conversions:
+a[0] -> $qualifier$.decrementAndGet($idx$) --$qualifier$[$idx$] --a[0]
+a[0] -> $qualifier$.get($idx$) $qualifier$[$idx$] a[0]
+a[0] -> $qualifier$.get($idx$) $qualifier$[$idx$] a[0]
+a[0] -> $qualifier$.getAndAdd($idx$, ($val$)) $qualifier$[$idx$] += $val$ a[0] += (2)
+a[0] -> $qualifier$.getAndDecrement($idx$) $qualifier$[$idx$]-- a[0]--
+a[0] -> $qualifier$.getAndIncrement($idx$) $qualifier$[$idx$]++ a[0]++
+a[0] -> $qualifier$.incrementAndGet($idx$) ++$qualifier$[$idx$] ++a[0]
+a[0] -> $qualifier$.set($idx$, $qualifier$.get($idx$) * $val$) $qualifier$[$idx$]*=$val$ a[0] *= 2
+new int[0] -> new java.util.concurrent.atomic.AtomicIntegerArray($val$) $val$ new int[0]
+new int[1] -> new java.util.concurrent.atomic.AtomicIntegerArray($val$) $val$ new int[1]
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/after/Test.java
new file mode 100644
index 000000000000..8dbba12048fe
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/after/Test.java
@@ -0,0 +1,20 @@
+import java.util.concurrent.atomic.AtomicIntegerArray;
+
+class Test {
+ AtomicIntegerArray a = new AtomicIntegerArray(new int[1]);
+
+
+ void foo() {
+ a.getAndIncrement(0);
+ System.out.println(a.incrementAndGet(0));
+ a.getAndDecrement(0);
+ if (a.decrementAndGet(0) == 0) {
+ a.getAndAdd(0, ((2)));
+ a.set(0, a.get(0) * 2);
+ if (a.get(0) == 0) {
+ System.out.println(a.get(0) + 7);
+ }
+ }
+ a = new AtomicIntegerArray(new int[0]);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/before/Test.java
new file mode 100644
index 000000000000..5d39cf2963c6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directIntArray/before/Test.java
@@ -0,0 +1,18 @@
+class Test {
+ int[] a = new int[1];
+
+
+ void foo() {
+ a[0]++;
+ System.out.println(++a[0]);
+ a[0]--;
+ if (--a[0] == 0) {
+ a[0] += (2);
+ a[0] *= 2;
+ if (a[0] == 0) {
+ System.out.println(a[0] + 7);
+ }
+ }
+ a = new int[0];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/after/Test.items
new file mode 100644
index 000000000000..0d306b0b4747
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:s : java.util.concurrent.atomic.AtomicReference<java.lang.String>
+PsiReferenceExpression:s : java.util.concurrent.atomic.AtomicReference<java.lang.String>
+PsiReferenceExpression:s : java.util.concurrent.atomic.AtomicReference<java.lang.String>
+
+Conversions:
+"" -> new java.util.concurrent.atomic.AtomicReference<java.lang.String>($val$) $val$
+s -> $qualifier$.get() $qualifier$ s
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/after/Test.java
new file mode 100644
index 000000000000..cb32e0ba130b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/after/Test.java
@@ -0,0 +1,11 @@
+import java.util.concurrent.atomic.AtomicReference;
+
+class Test {
+ AtomicReference<String> s = new AtomicReference<String>("");
+
+ void foo() {
+ if (s == null) {
+ System.out.println(s.get());
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/before/Test.java
new file mode 100644
index 000000000000..1770416a0295
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directString/before/Test.java
@@ -0,0 +1,9 @@
+class Test {
+ String s = "";
+
+ void foo() {
+ if (s == null) {
+ System.out.println(s);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/after/Test.items
new file mode 100644
index 000000000000..b90b4a347f40
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/after/Test.items
@@ -0,0 +1,14 @@
+Types:
+PsiArrayAccessExpression:s[0] : java.lang.String
+PsiArrayAccessExpression:s[0] : java.lang.String
+PsiField:s : java.util.concurrent.atomic.AtomicReferenceArray<java.lang.String>
+PsiReferenceExpression:s : java.util.concurrent.atomic.AtomicReferenceArray<java.lang.String>
+PsiReferenceExpression:s : java.util.concurrent.atomic.AtomicReferenceArray<java.lang.String>
+
+Conversions:
+new String[2] -> new java.util.concurrent.atomic.AtomicReferenceArray<java.lang.String>($val$) $val$ new String[2]
+s[0] -> $qualifier$.get($idx$) $qualifier$[$idx$] s[0]
+s[0] -> $qualifier$.set($idx$, $val$) $qualifier$[$idx$] = $val$ s[0] = ""
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/after/Test.java
new file mode 100644
index 000000000000..42415d0c3141
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/after/Test.java
@@ -0,0 +1,11 @@
+import java.util.concurrent.atomic.AtomicReferenceArray;
+
+class Test {
+ AtomicReferenceArray<String> s = new AtomicReferenceArray<String>(new String[2]);
+
+ void foo() {
+ s.set(0, "");
+ System.out.println(s.get(0));
+
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/before/Test.java
new file mode 100644
index 000000000000..4f19feba6479
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/directStringArray/before/Test.java
@@ -0,0 +1,9 @@
+class Test {
+ String[] s = new String[2];
+
+ void foo() {
+ s[0] = "";
+ System.out.println(s[0]);
+
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/after/Test.items
new file mode 100644
index 000000000000..767993764c48
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/after/Test.items
@@ -0,0 +1,26 @@
+Types:
+PsiField:i : int
+PsiMethodCallExpression:i.addAndGet(-(9)) : int
+PsiMethodCallExpression:i.addAndGet(9) : int
+PsiMethodCallExpression:i.get() : int
+PsiMethodCallExpression:i.getAndAdd(-5) : int
+PsiMethodCallExpression:i.getAndAdd(2) : int
+PsiMethodCallExpression:i.set(9) : void
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+
+Conversions:
+i.addAndGet(-(9)) -> $qualifier$ + $delta$ $qualifier$.addAndGet($delta$)
+i.addAndGet(9) -> $qualifier$ + $delta$ $qualifier$.addAndGet($delta$)
+i.get() -> $qualifier$ $qualifier$.get()
+i.getAndAdd(-5) -> $qualifier$ += $val$ $qualifier$.getAndAdd($val$)
+i.getAndAdd(2) -> $qualifier$ += $val$ $qualifier$.getAndAdd($val$)
+i.set(9) -> $qualifier$ = $val$ $qualifier$.set($val$)
+new AtomicInteger(0) -> $qualifier$ new $type$($qualifier$)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/after/Test.java
new file mode 100644
index 000000000000..1372ccee2b27
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/after/Test.java
@@ -0,0 +1,15 @@
+import java.util.concurrent.atomic.AtomicInteger;
+class Test {
+ int i = 0;
+
+ void foo() {
+ i += 2;
+ i += -5;
+ if (i == 0) {
+ i = 9;
+ }
+
+ System.out.println(i + 9);
+ System.out.println(i + -(9));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/before/Test.java
new file mode 100644
index 000000000000..cfd312daa073
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseAssignments/before/Test.java
@@ -0,0 +1,15 @@
+import java.util.concurrent.atomic.AtomicInteger;
+class Test {
+ AtomicInteger i = new AtomicInteger(0);
+
+ void foo() {
+ i.getAndAdd(2);
+ i.getAndAdd(-5);
+ if (i.get() == 0) {
+ i.set(9);
+ }
+
+ System.out.println(i.addAndGet(9));
+ System.out.println(i.addAndGet(-(9)));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/after/Test.items
new file mode 100644
index 000000000000..8585bda9e020
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/after/Test.items
@@ -0,0 +1,26 @@
+Types:
+PsiField:b : byte
+PsiMethodCallExpression:b.get() : java.lang.Byte
+PsiMethodCallExpression:b.get() : java.lang.Byte
+PsiMethodCallExpression:b.get() : java.lang.Byte
+PsiMethodCallExpression:b.get() : java.lang.Byte
+PsiMethodCallExpression:b.getAndSet(new Byte((byte) (b.get() + 1))) : java.lang.Byte
+PsiMethodCallExpression:b.set(new Byte((byte) (b.get() + 0))) : void
+PsiReferenceExpression:b : byte
+PsiReferenceExpression:b : byte
+PsiReferenceExpression:b : byte
+PsiReferenceExpression:b : byte
+PsiReferenceExpression:b : byte
+PsiReferenceExpression:b : byte
+
+Conversions:
+b.get() -> $qualifier$ $qualifier$.get()
+b.get() -> $qualifier$ $qualifier$.get()
+b.get() -> $qualifier$ $qualifier$.get()
+b.get() -> $qualifier$ $qualifier$.get()
+b.getAndSet(new Byte((byte) (b.get() + 1))) -> $qualifier$ = $val$ $qualifier$.getAndSet($val$)
+b.set(new Byte((byte) (b.get() + 0))) -> $qualifier$ = $val$ $qualifier$.set($val$)
+new AtomicReference<Byte>((byte) 0) -> $qualifier$ new $type$($qualifier$)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/after/Test.java
new file mode 100644
index 000000000000..28445dd31728
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/after/Test.java
@@ -0,0 +1,14 @@
+import java.util.concurrent.atomic.AtomicReference;
+
+class Test {
+ byte b = (byte) 0;
+
+ void bar() {
+ if (b == 0) {
+ b = new Byte((byte) (b + 1));
+ b = new Byte((byte) (b + 0));
+ //System.out.println(b + 10);
+ System.out.println(b);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/before/Test.java
new file mode 100644
index 000000000000..a1dbfc714326
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseByte/before/Test.java
@@ -0,0 +1,14 @@
+import java.util.concurrent.atomic.AtomicReference;
+
+class Test {
+ AtomicReference<Byte> b = new AtomicReference<Byte>((byte) 0);
+
+ void bar() {
+ if (b.get() == 0) {
+ b.getAndSet(new Byte((byte) (b.get() + 1)));
+ b.set(new Byte((byte) (b.get() + 0)));
+ //System.out.println(b + 10);
+ System.out.println(b.get());
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/after/Test.items
new file mode 100644
index 000000000000..3594508bebe5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/after/Test.items
@@ -0,0 +1,13 @@
+Types:
+PsiField:b : boolean
+PsiMethodCallExpression:b.get() : boolean
+PsiMethodCallExpression:b.set(true) : void
+PsiReferenceExpression:b : boolean
+PsiReferenceExpression:b : boolean
+
+Conversions:
+b.get() -> $qualifier$ $qualifier$.get()
+b.set(true) -> $qualifier$ = $val$ $qualifier$.set($val$)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/after/Test.java
new file mode 100644
index 000000000000..92f515c35936
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/after/Test.java
@@ -0,0 +1,10 @@
+import java.util.concurrent.atomic.AtomicBoolean;
+class Test {
+ boolean b;
+
+ void foo() {
+ if (b) {
+ b = true;
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/before/Test.java
new file mode 100644
index 000000000000..5464f705ddeb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseConditions/before/Test.java
@@ -0,0 +1,10 @@
+import java.util.concurrent.atomic.AtomicBoolean;
+class Test {
+ AtomicBoolean b;
+
+ void foo() {
+ if (b.get()) {
+ b.set(true);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/after/Test.items
new file mode 100644
index 000000000000..cba5bc10f359
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/after/Test.items
@@ -0,0 +1,25 @@
+Types:
+PsiField:i : int
+PsiMethodCallExpression:i.decrementAndGet() : int
+PsiMethodCallExpression:i.decrementAndGet() : int
+PsiMethodCallExpression:i.getAndDecrement() : int
+PsiMethodCallExpression:i.getAndIncrement() : int
+PsiMethodCallExpression:i.getAndIncrement() : int
+PsiMethodCallExpression:i.incrementAndGet() : int
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+PsiReferenceExpression:i : int
+
+Conversions:
+i.decrementAndGet() -> --$qualifier$ $qualifier$.decrementAndGet()
+i.decrementAndGet() -> --$qualifier$ $qualifier$.decrementAndGet()
+i.getAndDecrement() -> $qualifier$-- $qualifier$.getAndDecrement()
+i.getAndIncrement() -> $qualifier$++ $qualifier$.getAndIncrement()
+i.getAndIncrement() -> $qualifier$++ $qualifier$.getAndIncrement()
+i.incrementAndGet() -> ++$qualifier$ $qualifier$.incrementAndGet()
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/after/Test.java
new file mode 100644
index 000000000000..dd70e550a751
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/after/Test.java
@@ -0,0 +1,13 @@
+import java.util.concurrent.atomic.AtomicInteger;
+class Test {
+ int i;
+
+ void foo() {
+ i++;
+ ++i;
+ i--;
+ --i;
+ System.out.println(i++);
+ System.out.println(--i);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/before/Test.java
new file mode 100644
index 000000000000..853e5387aca9
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIncrementDecrement/before/Test.java
@@ -0,0 +1,13 @@
+import java.util.concurrent.atomic.AtomicInteger;
+class Test {
+ AtomicInteger i;
+
+ void foo() {
+ i.getAndIncrement();
+ i.incrementAndGet();
+ i.getAndDecrement();
+ i.decrementAndGet();
+ System.out.println(i.getAndIncrement());
+ System.out.println(i.decrementAndGet());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/after/Test.items
new file mode 100644
index 000000000000..55c1c7bc2574
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/after/Test.items
@@ -0,0 +1,35 @@
+Types:
+PsiField:a : int[]
+PsiMethodCallExpression:a.addAndGet(0, 7) : int
+PsiMethodCallExpression:a.decrementAndGet(0) : int
+PsiMethodCallExpression:a.get(0) : int
+PsiMethodCallExpression:a.get(0) : int
+PsiMethodCallExpression:a.getAndAdd(0, ((2))) : int
+PsiMethodCallExpression:a.getAndDecrement(0) : int
+PsiMethodCallExpression:a.getAndIncrement(0) : int
+PsiMethodCallExpression:a.incrementAndGet(0) : int
+PsiMethodCallExpression:a.set(0, a.get(0) * 2) : void
+PsiReferenceExpression:a : int[]
+PsiReferenceExpression:a : int[]
+PsiReferenceExpression:a : int[]
+PsiReferenceExpression:a : int[]
+PsiReferenceExpression:a : int[]
+PsiReferenceExpression:a : int[]
+PsiReferenceExpression:a : int[]
+PsiReferenceExpression:a : int[]
+PsiReferenceExpression:a : int[]
+
+Conversions:
+a.addAndGet(0, 7) -> $qualifier$[$idx$] + $delta$ $qualifier$.addAndGet($idx$, $delta$)
+a.decrementAndGet(0) -> --$qualifier$[$idx$] $qualifier$.decrementAndGet($idx$)
+a.get(0) -> $qualifier$[$idx$] $qualifier$.get($idx$)
+a.get(0) -> $qualifier$[$idx$] $qualifier$.get($idx$)
+a.getAndAdd(0, ((2))) -> $qualifier$[$idx$] += $val$ $qualifier$.getAndAdd($idx$, $val$)
+a.getAndDecrement(0) -> $qualifier$[$idx$]-- $qualifier$.getAndDecrement($idx$)
+a.getAndIncrement(0) -> $qualifier$[$idx$]++ $qualifier$.getAndIncrement($idx$)
+a.incrementAndGet(0) -> ++$qualifier$[$idx$] $qualifier$.incrementAndGet($idx$)
+a.set(0, a.get(0) * 2) -> $qualifier$[$idx$] = $val$ $qualifier$.set($idx$, $val$)
+new AtomicIntegerArray(new int[1]) -> $qualifier$ new $type$($qualifier$)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/after/Test.java
new file mode 100644
index 000000000000..401714230d3c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/after/Test.java
@@ -0,0 +1,19 @@
+import java.util.concurrent.atomic.AtomicIntegerArray;
+
+class Test {
+ int[] a = new int[1];
+
+
+ void foo() {
+ a[0]++;
+ System.out.println(++a[0]);
+ a[0]--;
+ if (--a[0] == 0) {
+ a[0] += ((2));
+ a[0] = a[0] * 2;
+ if (a[0] == 0) {
+ System.out.println(a[0] + 7);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/before/Test.java
new file mode 100644
index 000000000000..df31528b9d7e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseIntArray/before/Test.java
@@ -0,0 +1,19 @@
+import java.util.concurrent.atomic.AtomicIntegerArray;
+
+class Test {
+ AtomicIntegerArray a = new AtomicIntegerArray(new int[1]);
+
+
+ void foo() {
+ a.getAndIncrement(0);
+ System.out.println(a.incrementAndGet(0));
+ a.getAndDecrement(0);
+ if (a.decrementAndGet(0) == 0) {
+ a.getAndAdd(0, ((2)));
+ a.set(0, a.get(0) * 2);
+ if (a.get(0) == 0) {
+ System.out.println(a.addAndGet(0, 7));
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/after/Test.items
new file mode 100644
index 000000000000..7c23d49d8bfd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiField:s : java.lang.String
+PsiMethodCallExpression:s.get() : java.lang.String
+PsiReferenceExpression:s : java.lang.String
+PsiReferenceExpression:s : java.lang.String
+
+Conversions:
+new AtomicReference<String>("") -> $qualifier$ new $type$($qualifier$)
+s.get() -> $qualifier$ $qualifier$.get()
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/after/Test.java
new file mode 100644
index 000000000000..a0106ff8d66f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/after/Test.java
@@ -0,0 +1,11 @@
+import java.util.concurrent.atomic.AtomicReference;
+
+class Test {
+ String s = "";
+
+ void foo() {
+ if (s == null) {
+ System.out.println(s);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/before/Test.java
new file mode 100644
index 000000000000..cb32e0ba130b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseString/before/Test.java
@@ -0,0 +1,11 @@
+import java.util.concurrent.atomic.AtomicReference;
+
+class Test {
+ AtomicReference<String> s = new AtomicReference<String>("");
+
+ void foo() {
+ if (s == null) {
+ System.out.println(s.get());
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/after/Test.items
new file mode 100644
index 000000000000..eaf82b5cc2e6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/after/Test.items
@@ -0,0 +1,14 @@
+Types:
+PsiField:s : java.lang.String[]
+PsiMethodCallExpression:s.get(0) : java.lang.String
+PsiMethodCallExpression:s.set(0, "") : void
+PsiReferenceExpression:s : java.lang.String[]
+PsiReferenceExpression:s : java.lang.String[]
+
+Conversions:
+new AtomicReferenceArray<String>(new String[2]) -> $qualifier$ new $type$($qualifier$)
+s.get(0) -> $qualifier$[$idx$] $qualifier$.get($idx$)
+s.set(0, "") -> $qualifier$[$idx$] = $val$ $qualifier$.set($idx$, $val$)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/after/Test.java
new file mode 100644
index 000000000000..0c64ea445f01
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/after/Test.java
@@ -0,0 +1,11 @@
+import java.util.concurrent.atomic.AtomicReferenceArray;
+
+class Test {
+ String[] s = new String[2];
+
+ void foo() {
+ s[0] = "";
+ System.out.println(s[0]);
+
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/before/Test.java
new file mode 100644
index 000000000000..fbc97bc2eb36
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByAtomic/reverseStringArray/before/Test.java
@@ -0,0 +1,11 @@
+import java.util.concurrent.atomic.AtomicReferenceArray;
+
+class Test {
+ AtomicReferenceArray<String> s = new AtomicReferenceArray<String>(new String[2]);
+
+ void foo() {
+ s.set(0, "");
+ System.out.println(s.get(0));
+
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/after/Test.items
new file mode 100644
index 000000000000..e01b4b5e1f8b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/after/Test.items
@@ -0,0 +1,22 @@
+Types:
+PsiBinaryExpression:i == 0 : boolean
+PsiField:i : java.lang.ThreadLocal<java.lang.Byte>
+PsiPostfixExpression:i++ : java.lang.ThreadLocal<java.lang.Byte>
+PsiPostfixExpression:i-- : java.lang.ThreadLocal<java.lang.Byte>
+PsiPrefixExpression:++i : java.lang.ThreadLocal<java.lang.Byte>
+PsiPrefixExpression:--i : java.lang.ThreadLocal<java.lang.Byte>
+PsiReferenceExpression:i : java.lang.ThreadLocal<java.lang.Byte>
+PsiReferenceExpression:i : java.lang.ThreadLocal<java.lang.Byte>
+PsiReferenceExpression:i : java.lang.ThreadLocal<java.lang.Byte>
+PsiReferenceExpression:i : java.lang.ThreadLocal<java.lang.Byte>
+PsiReferenceExpression:i : java.lang.ThreadLocal<java.lang.Byte>
+
+Conversions:
+++i -> $qualifier$.set(new java.lang.Byte((byte)($qualifier$.get() + 1))) ++$qualifier$
+--i -> $qualifier$.set(new java.lang.Byte((byte)($qualifier$.get() - 1))) --$qualifier$
+i == 0 -> $qualifier$.get() == $val$ $qualifier$==$val$
+i++ -> $qualifier$.set(new java.lang.Byte((byte)($qualifier$.get() + 1))) $qualifier$++
+i-- -> $qualifier$.set(new java.lang.Byte((byte)($qualifier$.get() - 1))) $qualifier$--
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/after/Test.java
new file mode 100644
index 000000000000..61b88dbefceb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/after/Test.java
@@ -0,0 +1,11 @@
+class Test {
+ ThreadLocal<Byte> i;
+
+ void foo() {
+ i.set(new Byte((byte) (i.get() + 1)));
+ i.set(new Byte((byte) (i.get() + 1)));
+ i.set(new Byte((byte) (i.get() - 1)));
+ i.set(new Byte((byte) (i.get() - 1)));
+ if (i.get() == 0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/before/Test.java
new file mode 100644
index 000000000000..dd3fb1bca60d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directByte/before/Test.java
@@ -0,0 +1,11 @@
+class Test {
+ byte i;
+
+ void foo() {
+ i++;
+ ++i;
+ i--;
+ --i;
+ if (i == 0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/after/Test.items
new file mode 100644
index 000000000000..1bffd7037cb6
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/after/Test.items
@@ -0,0 +1,22 @@
+Types:
+PsiBinaryExpression:i == 0 : boolean
+PsiField:i : java.lang.ThreadLocal<java.lang.Integer>
+PsiPostfixExpression:i++ : java.lang.ThreadLocal<java.lang.Integer>
+PsiPostfixExpression:i-- : java.lang.ThreadLocal<java.lang.Integer>
+PsiPrefixExpression:++i : java.lang.ThreadLocal<java.lang.Integer>
+PsiPrefixExpression:--i : java.lang.ThreadLocal<java.lang.Integer>
+PsiReferenceExpression:i : java.lang.ThreadLocal<java.lang.Integer>
+PsiReferenceExpression:i : java.lang.ThreadLocal<java.lang.Integer>
+PsiReferenceExpression:i : java.lang.ThreadLocal<java.lang.Integer>
+PsiReferenceExpression:i : java.lang.ThreadLocal<java.lang.Integer>
+PsiReferenceExpression:i : java.lang.ThreadLocal<java.lang.Integer>
+
+Conversions:
+++i -> $qualifier$.set($qualifier$.get() + 1) ++$qualifier$
+--i -> $qualifier$.set($qualifier$.get() - 1) --$qualifier$
+i == 0 -> $qualifier$.get() == $val$ $qualifier$==$val$
+i++ -> $qualifier$.set($qualifier$.get() + 1) $qualifier$++
+i-- -> $qualifier$.set($qualifier$.get() - 1) $qualifier$--
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/after/Test.java
new file mode 100644
index 000000000000..627739bc4b1c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/after/Test.java
@@ -0,0 +1,11 @@
+class Test {
+ ThreadLocal<Integer> i;
+
+ void foo() {
+ i.set(i.get() + 1);
+ i.set(i.get() + 1);
+ i.set(i.get() - 1);
+ i.set(i.get() - 1);
+ if (i.get() == 0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/before/Test.java
new file mode 100644
index 000000000000..9039f28e9617
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directInt/before/Test.java
@@ -0,0 +1,11 @@
+class Test {
+ int i;
+
+ void foo() {
+ i++;
+ ++i;
+ i--;
+ --i;
+ if (i == 0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/after/Test.items
new file mode 100644
index 000000000000..29d4312a8580
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiField:myS : java.lang.ThreadLocal<java.lang.String>
+PsiReferenceExpression:myS : java.lang.ThreadLocal<java.lang.String>
+PsiReferenceExpression:myS : java.lang.ThreadLocal<java.lang.String>
+
+Conversions:
+myS -> $qualifier$.get() $qualifier$ myS
+
+New expression type changes:
+Fails:
+""->java.lang.ThreadLocal<java.lang.String>
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/after/Test.java
new file mode 100644
index 000000000000..949869096327
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/after/Test.java
@@ -0,0 +1,9 @@
+class Test {
+ ThreadLocal<String> myS = "";
+
+ void foo() {
+ if (myS == null) {
+ System.out.println(myS.get());
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/before/Test.java
new file mode 100644
index 000000000000..8ee02790f113
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/directString/before/Test.java
@@ -0,0 +1,9 @@
+class Test {
+ String myS = "";
+
+ void foo() {
+ if (myS == null) {
+ System.out.println(myS);
+ }
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/after/Test.items b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/after/Test.items
new file mode 100644
index 000000000000..09a2a211ae6a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/after/Test.items
@@ -0,0 +1,22 @@
+Types:
+PsiBinaryExpression:i == 0 : boolean
+PsiField:i : java.lang.ThreadLocal
+PsiPostfixExpression:i++ : java.lang.ThreadLocal
+PsiPostfixExpression:i-- : java.lang.ThreadLocal
+PsiPrefixExpression:++i : java.lang.ThreadLocal
+PsiPrefixExpression:--i : java.lang.ThreadLocal
+PsiReferenceExpression:i : java.lang.ThreadLocal
+PsiReferenceExpression:i : java.lang.ThreadLocal
+PsiReferenceExpression:i : java.lang.ThreadLocal
+PsiReferenceExpression:i : java.lang.ThreadLocal
+PsiReferenceExpression:i : java.lang.ThreadLocal
+
+Conversions:
+++i -> $qualifier$.set(new java.lang.Integer(((java.lang.Integer)$qualifier$.get()).intValue() + 1)) ++$qualifier$
+--i -> $qualifier$.set(new java.lang.Integer(((java.lang.Integer)$qualifier$.get()).intValue() - 1)) --$qualifier$
+i == 0 -> ((java.lang.Integer)$qualifier$.get()).intValue() == $val$ $qualifier$==$val$
+i++ -> $qualifier$.set(new java.lang.Integer(((java.lang.Integer)$qualifier$.get()).intValue() + 1)) $qualifier$++
+i-- -> $qualifier$.set(new java.lang.Integer(((java.lang.Integer)$qualifier$.get()).intValue() - 1)) $qualifier$--
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/after/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/after/Test.java
new file mode 100644
index 000000000000..81e5fe05d6dd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/after/Test.java
@@ -0,0 +1,11 @@
+class Test {
+ ThreadLocal i;
+
+ void foo() {
+ i.set(new Integer(((Integer) i.get()).intValue() + 1));
+ i.set(new Integer(((Integer) i.get()).intValue() + 1));
+ i.set(new Integer(((Integer) i.get()).intValue() - 1));
+ i.set(new Integer(((Integer) i.get()).intValue() - 1));
+ if (((Integer) i.get()).intValue() == 0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/before/Test.java b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/before/Test.java
new file mode 100644
index 000000000000..9039f28e9617
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/typeMigrationByThreadLocal/languageLevel/before/Test.java
@@ -0,0 +1,11 @@
+class Test {
+ int i;
+
+ void foo() {
+ i++;
+ ++i;
+ i--;
+ --i;
+ if (i == 0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/assignmentExtends/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/assignmentExtends/after/Test.items
new file mode 100644
index 000000000000..b39d716277ba
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/assignmentExtends/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.util.ArrayList<? extends java.lang.Integer>
+PsiReferenceExpression:p : java.util.ArrayList<? extends java.lang.Integer>
+
+Conversions:
+
+New expression type changes:
+Fails:
+p[0]->java.util.ArrayList<? extends java.lang.Integer>
diff --git a/java/typeMigration/testData/refactoring/wildcard/assignmentExtends/after/test.java b/java/typeMigration/testData/refactoring/wildcard/assignmentExtends/after/test.java
new file mode 100644
index 000000000000..16a620ef2e6d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/assignmentExtends/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? extends Integer> p) {
+ p[0] = new Integer(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/assignmentExtends/before/test.java b/java/typeMigration/testData/refactoring/wildcard/assignmentExtends/before/test.java
new file mode 100644
index 000000000000..4a148c3bd6fe
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/assignmentExtends/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Integer[] p) {
+ p[0] = new Integer(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/assignmentSuper/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/assignmentSuper/after/Test.items
new file mode 100644
index 000000000000..8ee86c529545
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/assignmentSuper/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiArrayAccessExpression:p[0] : java.lang.Integer
+PsiParameter:p : java.util.ArrayList<? super java.lang.Integer>
+PsiReferenceExpression:p : java.util.ArrayList<? super java.lang.Integer>
+
+Conversions:
+p[0] -> $qualifier$.set($idx$, $expr$) $qualifier$[$idx$] = $expr$ p[0] = new Integer(0)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/assignmentSuper/after/test.java b/java/typeMigration/testData/refactoring/wildcard/assignmentSuper/after/test.java
new file mode 100644
index 000000000000..25cab7a9d34c
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/assignmentSuper/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? super Integer> p) {
+ p.set(0, new Integer(0));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/assignmentSuper/before/test.java b/java/typeMigration/testData/refactoring/wildcard/assignmentSuper/before/test.java
new file mode 100644
index 000000000000..4a148c3bd6fe
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/assignmentSuper/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Integer[] p) {
+ p[0] = new Integer(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/after/Test.items
new file mode 100644
index 000000000000..e2bbfc48b834
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.util.ArrayList<?>
+PsiReferenceExpression:p : java.util.ArrayList<?>
+
+Conversions:
+
+New expression type changes:
+Fails:
+p[0]->java.util.ArrayList<?>
diff --git a/java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/after/test.java b/java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/after/test.java
new file mode 100644
index 000000000000..4804293a696e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<?> p) {
+ p[0] = new Integer(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/before/test.java b/java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/before/test.java
new file mode 100644
index 000000000000..4a148c3bd6fe
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/assignmentUnbounded/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Integer[] p) {
+ p[0] = new Integer(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/consumerExtends/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/consumerExtends/after/Test.items
new file mode 100644
index 000000000000..455ebca21125
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/consumerExtends/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethodCallExpression:p.get(0) : java.lang.Number
+PsiParameter:p : java.util.ArrayList<? extends java.lang.Number>
+PsiReferenceExpression:p : java.util.ArrayList<? extends java.lang.Number>
+
+Conversions:
+p.get(0) -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/consumerExtends/after/test.java b/java/typeMigration/testData/refactoring/wildcard/consumerExtends/after/test.java
new file mode 100644
index 000000000000..b403162051ad
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/consumerExtends/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? extends Number> p, Number p2) {
+ p2 = p.get(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/consumerExtends/before/test.java b/java/typeMigration/testData/refactoring/wildcard/consumerExtends/before/test.java
new file mode 100644
index 000000000000..649da301cc82
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/consumerExtends/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<Number> p, Number p2) {
+ p2 = p.get(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/consumerSuper/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/consumerSuper/after/Test.items
new file mode 100644
index 000000000000..e4f5c3fc2088
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/consumerSuper/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiMethodCallExpression:p.get(0) : java.lang.Object
+PsiParameter:p : java.util.ArrayList<? super java.lang.Number>
+PsiParameter:p2 : java.lang.Object
+PsiReferenceExpression:p : java.util.ArrayList<? super java.lang.Number>
+PsiReferenceExpression:p2 : java.lang.Object
+
+Conversions:
+p.get(0) -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/consumerSuper/after/test.java b/java/typeMigration/testData/refactoring/wildcard/consumerSuper/after/test.java
new file mode 100644
index 000000000000..2c315ea3a723
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/consumerSuper/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? super Number> p, Object p2) {
+ p2 = p.get(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/consumerSuper/before/test.java b/java/typeMigration/testData/refactoring/wildcard/consumerSuper/before/test.java
new file mode 100644
index 000000000000..649da301cc82
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/consumerSuper/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<Number> p, Number p2) {
+ p2 = p.get(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/after/Test.items
new file mode 100644
index 000000000000..a0b14b30985e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/after/Test.items
@@ -0,0 +1,12 @@
+Types:
+PsiMethodCallExpression:p.get(0) : java.lang.Object
+PsiParameter:p : java.util.ArrayList<?>
+PsiParameter:p2 : java.lang.Object
+PsiReferenceExpression:p : java.util.ArrayList<?>
+PsiReferenceExpression:p2 : java.lang.Object
+
+Conversions:
+p.get(0) -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/after/test.java b/java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/after/test.java
new file mode 100644
index 000000000000..f10b5e2ae860
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<?> p, Object p2) {
+ p2 = p.get(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/before/test.java b/java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/before/test.java
new file mode 100644
index 000000000000..649da301cc82
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/consumerUnbounded/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<Number> p, Number p2) {
+ p2 = p.get(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/after/Test.items
new file mode 100644
index 000000000000..1ac8dc86d9ca
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethodCallExpression:p.get(0) : java.lang.Number
+PsiParameter:p : java.lang.Integer[]
+PsiReferenceExpression:p : java.lang.Integer[]
+
+Conversions:
+p.get(0) -> $qualifier$[$i$] $qualifier$.get($i$) p.get(0)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/after/test.java b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/after/test.java
new file mode 100644
index 000000000000..bfe5eb68baba
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Integer[] p) {
+ Number n = p[0];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/before/test.java b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/before/test.java
new file mode 100644
index 000000000000..bbddcc1a4d79
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToChildType/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? extends Number> p) {
+ Number n = p.get(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/after/Test.items
new file mode 100644
index 000000000000..a4ea13d41b29
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.lang.Object[]
+PsiReferenceExpression:p : java.lang.Object[]
+
+Conversions:
+
+New expression type changes:
+Fails:
+p->java.lang.Object[]
diff --git a/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/after/test.java b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/after/test.java
new file mode 100644
index 000000000000..96208756fe87
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Object[] p) {
+ Number n = p.get(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/before/test.java b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/before/test.java
new file mode 100644
index 000000000000..bbddcc1a4d79
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToSuperType/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? extends Number> p) {
+ Number n = p.get(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/after/Test.items
new file mode 100644
index 000000000000..a0fd8df506c4
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethodCallExpression:p.get(0) : java.lang.Number
+PsiParameter:p : java.lang.Number[]
+PsiReferenceExpression:p : java.lang.Number[]
+
+Conversions:
+p.get(0) -> $qualifier$[$i$] $qualifier$.get($i$) p.get(0)
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/after/test.java b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/after/test.java
new file mode 100644
index 000000000000..33a962b96171
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Number[] p) {
+ Number n = p[0];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/before/test.java b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/before/test.java
new file mode 100644
index 000000000000..bbddcc1a4d79
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getAssignmentExtendsToType/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? extends Number> p) {
+ Number n = p.get(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getExtends/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/getExtends/after/Test.items
new file mode 100644
index 000000000000..d68b720f5d5b
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getExtends/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiArrayAccessExpression:p[0] : java.lang.Integer
+PsiParameter:p : java.util.ArrayList<? extends java.lang.Integer>
+PsiReferenceExpression:p : java.util.ArrayList<? extends java.lang.Integer>
+
+Conversions:
+p[0] -> $qualifier$.get($idx$) $qualifier$[$idx$]
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/getExtends/after/test.java b/java/typeMigration/testData/refactoring/wildcard/getExtends/after/test.java
new file mode 100644
index 000000000000..529d4942a2ce
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getExtends/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? extends Integer> p) {
+ Integer p1 = p.get(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getExtends/before/test.java b/java/typeMigration/testData/refactoring/wildcard/getExtends/before/test.java
new file mode 100644
index 000000000000..685d78f23f3d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getExtends/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Integer[] p) {
+ Integer p1 = p[0];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getSuper/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/getSuper/after/Test.items
new file mode 100644
index 000000000000..5300a386dc23
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getSuper/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.util.ArrayList<? super java.lang.Integer>
+PsiReferenceExpression:p : java.util.ArrayList<? super java.lang.Integer>
+
+Conversions:
+
+New expression type changes:
+Fails:
+p[0]->java.util.ArrayList<? super java.lang.Integer>
diff --git a/java/typeMigration/testData/refactoring/wildcard/getSuper/after/test.java b/java/typeMigration/testData/refactoring/wildcard/getSuper/after/test.java
new file mode 100644
index 000000000000..eebb4c1f2dbb
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getSuper/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? super Integer> p) {
+ Integer p1 = p[0];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getSuper/before/test.java b/java/typeMigration/testData/refactoring/wildcard/getSuper/before/test.java
new file mode 100644
index 000000000000..685d78f23f3d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getSuper/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Integer[] p) {
+ Integer p1 = p[0];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getUnbounded/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/getUnbounded/after/Test.items
new file mode 100644
index 000000000000..e2bbfc48b834
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getUnbounded/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:p : java.util.ArrayList<?>
+PsiReferenceExpression:p : java.util.ArrayList<?>
+
+Conversions:
+
+New expression type changes:
+Fails:
+p[0]->java.util.ArrayList<?>
diff --git a/java/typeMigration/testData/refactoring/wildcard/getUnbounded/after/test.java b/java/typeMigration/testData/refactoring/wildcard/getUnbounded/after/test.java
new file mode 100644
index 000000000000..9ab43aa01dbe
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getUnbounded/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<?> p) {
+ Integer p1 = p[0];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/getUnbounded/before/test.java b/java/typeMigration/testData/refactoring/wildcard/getUnbounded/before/test.java
new file mode 100644
index 000000000000..685d78f23f3d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/getUnbounded/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Integer[] p) {
+ Integer p1 = p[0];
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/lengthSize/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/lengthSize/after/Test.items
new file mode 100644
index 000000000000..bf63b11ab5b2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/lengthSize/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiParameter:p : java.util.ArrayList<?>
+PsiReferenceExpression:p : java.util.ArrayList<?>
+PsiReferenceExpression:p.length : int
+
+Conversions:
+p.length -> $qualifier$.size() $qualifier$.length
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/lengthSize/after/test.java b/java/typeMigration/testData/refactoring/wildcard/lengthSize/after/test.java
new file mode 100644
index 000000000000..4f0770adbfb5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/lengthSize/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<?> p) {
+ System.out.println(p.size());
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/lengthSize/before/test.java b/java/typeMigration/testData/refactoring/wildcard/lengthSize/before/test.java
new file mode 100644
index 000000000000..e8758383dd0a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/lengthSize/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Integer[] p) {
+ System.out.println(p.length);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/after/Test.items
new file mode 100644
index 000000000000..fe9d55b37cda
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethodCallExpression:p.add(new Integer(8)) : boolean
+PsiParameter:p : java.util.Set<? super java.lang.Integer>
+PsiReferenceExpression:p : java.util.Set<? super java.lang.Integer>
+
+Conversions:
+p.add(new Integer(8)) -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/after/test.java b/java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/after/test.java
new file mode 100644
index 000000000000..25825f1f78c0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Set<? super Integer> p) {
+ p.add(new Integer(8));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/before/test.java b/java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/before/test.java
new file mode 100644
index 000000000000..d8cf544f6fde
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerCollectionChanged/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? super Number> p) {
+ p.add(new Integer(8));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerExtends/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/producerExtends/after/Test.items
new file mode 100644
index 000000000000..8b996f4d00e1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerExtends/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiMethodCallExpression:p.set(0, new Integer(8)) : java.lang.Number
+PsiParameter:p : java.util.ArrayList<? extends java.lang.Number>
+PsiReferenceExpression:p : java.util.ArrayList<? extends java.lang.Number>
+
+Conversions:
+p.set(0, new Integer(8)) -> $
+
+New expression type changes:
+Fails:
+new Integer(8)->? extends java.lang.Number
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerExtends/after/test.java b/java/typeMigration/testData/refactoring/wildcard/producerExtends/after/test.java
new file mode 100644
index 000000000000..f8f4f761d73a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerExtends/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? extends Number> p) {
+ p.set(0, new Integer(8));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerExtends/before/test.java b/java/typeMigration/testData/refactoring/wildcard/producerExtends/before/test.java
new file mode 100644
index 000000000000..b5e9a24ad373
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerExtends/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? super Number> p) {
+ p.set(0, new Integer(8));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/after/Test.items
new file mode 100644
index 000000000000..88976428ea99
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiMethodCallExpression:p.add(new Integer(8)) : boolean
+PsiParameter:p : java.util.Set<? extends java.lang.Object>
+PsiReferenceExpression:p : java.util.Set<? extends java.lang.Object>
+
+Conversions:
+p.add(new Integer(8)) -> $
+
+New expression type changes:
+Fails:
+new Integer(8)->? extends java.lang.Object
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/after/test.java b/java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/after/test.java
new file mode 100644
index 000000000000..0c24d5791d14
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(Set<? extends Object> p) {
+ p.add(new Integer(8));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/before/test.java b/java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/before/test.java
new file mode 100644
index 000000000000..d8cf544f6fde
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerExtendsCollectionChanged/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? super Number> p) {
+ p.add(new Integer(8));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/after/Test.items
new file mode 100644
index 000000000000..f2f5bb75a60f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiMethodCallExpression:p1.add(p2) : boolean
+PsiParameter:p1 : java.util.List<? extends java.lang.Number>
+PsiReferenceExpression:p1 : java.util.List<? extends java.lang.Number>
+
+Conversions:
+p1.add(p2) -> $
+
+New expression type changes:
+Fails:
+p2->? extends java.lang.Number
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/after/test.java b/java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/after/test.java
new file mode 100644
index 000000000000..5d4d6fda25a2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(List<? extends Number> p1, Number p2){
+ p1.add(p2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/before/test.java b/java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/before/test.java
new file mode 100644
index 000000000000..a2e2cb2ae329
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerExtendsFailToStopAtWildcard/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(List<Number> p1, Number p2){
+ p1.add(p2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/after/Test.items
new file mode 100644
index 000000000000..9d9b2e2a447f
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiMethodCallExpression:p1.add(p2) : boolean
+PsiParameter:p1 : java.util.List<? super java.lang.Integer>
+PsiReferenceExpression:p1 : java.util.List<? super java.lang.Integer>
+
+Conversions:
+p1.add(p2) -> $
+
+New expression type changes:
+Fails:
+p2->? super java.lang.Integer
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/after/test.java b/java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/after/test.java
new file mode 100644
index 000000000000..bbc30114137e
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(List<? super Integer> p1, Number p2){
+ p1.add(p2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/before/test.java b/java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/before/test.java
new file mode 100644
index 000000000000..a2e2cb2ae329
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerFailToStopAtWildcard/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(List<Number> p1, Number p2){
+ p1.add(p2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/after/Test.items
new file mode 100644
index 000000000000..2f3689b42ba5
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethodCallExpression:p1.add(p2) : boolean
+PsiParameter:p1 : java.util.List<? super java.lang.Number>
+PsiReferenceExpression:p1 : java.util.List<? super java.lang.Number>
+
+Conversions:
+p1.add(p2) -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/after/test.java b/java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/after/test.java
new file mode 100644
index 000000000000..353f0432f59d
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(List<? super Number> p1, Number p2){
+ p1.add(p2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/before/test.java b/java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/before/test.java
new file mode 100644
index 000000000000..a2e2cb2ae329
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerStopAtWildcard/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(List<Number> p1, Number p2){
+ p1.add(p2);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerSuper/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/producerSuper/after/Test.items
new file mode 100644
index 000000000000..b0c91006b9d1
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerSuper/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethodCallExpression:p.set(0, new Integer(8)) : java.lang.Object
+PsiParameter:p : java.util.ArrayList<? super java.lang.Integer>
+PsiReferenceExpression:p : java.util.ArrayList<? super java.lang.Integer>
+
+Conversions:
+p.set(0, new Integer(8)) -> $
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerSuper/after/test.java b/java/typeMigration/testData/refactoring/wildcard/producerSuper/after/test.java
new file mode 100644
index 000000000000..0769f09a7b7a
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerSuper/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? super Integer> p) {
+ p.set(0, new Integer(8));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerSuper/before/test.java b/java/typeMigration/testData/refactoring/wildcard/producerSuper/before/test.java
new file mode 100644
index 000000000000..b5e9a24ad373
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerSuper/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? super Number> p) {
+ p.set(0, new Integer(8));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerUnbounded/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/producerUnbounded/after/Test.items
new file mode 100644
index 000000000000..e2b8ee35fcd2
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerUnbounded/after/Test.items
@@ -0,0 +1,11 @@
+Types:
+PsiMethodCallExpression:p.set(0, new Integer(8)) : java.lang.Object
+PsiParameter:p : java.util.ArrayList<?>
+PsiReferenceExpression:p : java.util.ArrayList<?>
+
+Conversions:
+p.set(0, new Integer(8)) -> $
+
+New expression type changes:
+Fails:
+new Integer(8)->?
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerUnbounded/after/test.java b/java/typeMigration/testData/refactoring/wildcard/producerUnbounded/after/test.java
new file mode 100644
index 000000000000..37a2f8fcac83
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerUnbounded/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<?> p) {
+ p.set(0, new Integer(8));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/producerUnbounded/before/test.java b/java/typeMigration/testData/refactoring/wildcard/producerUnbounded/before/test.java
new file mode 100644
index 000000000000..b5e9a24ad373
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/producerUnbounded/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ArrayList<? super Number> p) {
+ p.set(0, new Integer(8));
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/after/Test.items
new file mode 100644
index 000000000000..7ae170499472
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethodCallExpression:l.substring(0) : java.lang.String
+PsiParameter:l : java.lang.ThreadLocal<? extends java.lang.String>
+PsiReferenceExpression:l : java.lang.ThreadLocal<? extends java.lang.String>
+
+Conversions:
+l.substring(0) -> $qualifier$.get() $qualifier$ l
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/after/test.java b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/after/test.java
new file mode 100644
index 000000000000..5275db851a70
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ void method(ThreadLocal<? extends String> l) {
+ l.get().substring(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/before/test.java b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/before/test.java
new file mode 100644
index 000000000000..8805129f7191
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerExtends/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ void method(String l) {
+ l.substring(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/Test.items
new file mode 100644
index 000000000000..d05d101463c7
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:l : java.lang.ThreadLocal<? super java.lang.String>
+PsiReferenceExpression:l : java.lang.ThreadLocal<? super java.lang.String>
+
+Conversions:
+
+New expression type changes:
+Fails:
+l->java.lang.ThreadLocal<? super java.lang.String>
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/test.java b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/test.java
new file mode 100644
index 000000000000..beb0d0ebef46
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/test.java
@@ -0,0 +1,5 @@
+class Test {
+ void method(ThreadLocal<? super String> l) {
+ l.substring(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/before/test.java b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/before/test.java
new file mode 100644
index 000000000000..8805129f7191
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/before/test.java
@@ -0,0 +1,5 @@
+class Test {
+ void method(String l) {
+ l.substring(0);
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/Test.items
new file mode 100644
index 000000000000..47a89e441962
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/Test.items
@@ -0,0 +1,9 @@
+Types:
+PsiParameter:l : java.lang.ThreadLocal<java.util.List<? extends java.lang.String>>
+PsiReferenceExpression:l : java.lang.ThreadLocal<java.util.List<? extends java.lang.String>>
+
+Conversions:
+
+New expression type changes:
+Fails:
+l->java.lang.ThreadLocal<java.util.List<? extends java.lang.String>>
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/test.java b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/test.java
new file mode 100644
index 000000000000..93724be5c0dd
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ThreadLocal<List<? extends String>> l) {
+ l.add("");
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/before/test.java b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/before/test.java
new file mode 100644
index 000000000000..8df669c77899
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(List<String> l) {
+ l.add("");
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/after/Test.items
new file mode 100644
index 000000000000..736189db2585
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/after/Test.items
@@ -0,0 +1,10 @@
+Types:
+PsiMethodCallExpression:l.add("") : boolean
+PsiParameter:l : java.lang.ThreadLocal<java.util.List<? super java.lang.String>>
+PsiReferenceExpression:l : java.lang.ThreadLocal<java.util.List<? super java.lang.String>>
+
+Conversions:
+l.add("") -> $qualifier$.get() $qualifier$ l
+
+New expression type changes:
+Fails:
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/after/test.java b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/after/test.java
new file mode 100644
index 000000000000..fb3b568ca1b0
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/after/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(ThreadLocal<List<? super String>> l) {
+ l.get().add("");
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/before/test.java b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/before/test.java
new file mode 100644
index 000000000000..8df669c77899
--- /dev/null
+++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerSuper/before/test.java
@@ -0,0 +1,7 @@
+import java.util.*;
+
+class Test {
+ void method(List<String> l) {
+ l.add("");
+ }
+} \ No newline at end of file
diff --git a/java/typeMigration/typeMigration.iml b/java/typeMigration/typeMigration.iml
new file mode 100644
index 000000000000..ac3679760ed4
--- /dev/null
+++ b/java/typeMigration/typeMigration.iml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module relativePaths="true" type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="util" />
+ <orderEntry type="module" module-name="lang-api" />
+ <orderEntry type="module" module-name="lang-impl" />
+ <orderEntry type="module" module-name="openapi" />
+ <orderEntry type="module" module-name="structuralsearch" />
+ <orderEntry type="module" module-name="java-impl" />
+ <orderEntry type="module" module-name="testFramework-java" scope="TEST" />
+ <orderEntry type="module" module-name="structuralsearch-java" />
+ </component>
+</module>
+