From 0fec50135f48c3d79b144453a7b3d2a20ed23779 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 5 Mar 2024 01:44:32 +0900 Subject: [PATCH] [kotlin] Provide CFG facade for the extract function refactoring This is the first implementation of a control flow graph facade for the extract function IDE refactoring. The exact contents of 'KtDataFlowExitPointSnapshot' will be refined later. ^KT-65762 Fixed --- .../api/descriptors/KtFe10AnalysisSession.kt | 1 + .../components/KtFe10DataFlowInfoProvider.kt | 19 + .../analysis/api/fir/KtFirAnalysisSession.kt | 2 + .../components/KtFirDataFlowInfoProvider.kt | 376 +++++++++++ ...eModuleExitPointSnapshotTestGenerated.java | 138 ++++ ...eModuleExitPointSnapshotTestGenerated.java | 594 ++++++++++++++++++ ...eModuleExitPointSnapshotTestGenerated.java | 138 ++++ ...eModuleExitPointSnapshotTestGenerated.java | 594 ++++++++++++++++++ .../AbstractExitPointSnapshotTest.kt | 54 ++ ...eModuleExitPointSnapshotTestGenerated.java | 594 ++++++++++++++++++ .../kotlin/analysis/api/KtAnalysisSession.kt | 8 +- .../api/components/KtDataFlowInfoProvider.kt | 103 +++ .../controlFlow/breakContinue.kt | 16 + .../controlFlow/breakContinue.txt | 19 + .../controlFlow/breakReturn.kt | 16 + .../controlFlow/breakReturn.txt | 18 + .../controlFlow/breakReturn2.kt | 18 + .../controlFlow/breakReturn2.txt | 20 + .../controlFlow/conditionalJumps/break.kt | 10 + .../controlFlow/conditionalJumps/break.txt | 14 + .../controlFlow/conditionalJumps/break2.kt | 12 + .../controlFlow/conditionalJumps/break2.txt | 15 + .../controlFlow/conditionalJumps/break3.kt | 15 + .../controlFlow/conditionalJumps/break3.txt | 15 + .../controlFlow/conditionalJumps/break4.kt | 14 + .../controlFlow/conditionalJumps/break4.txt | 19 + .../controlFlow/conditionalJumps/break5.kt | 13 + .../controlFlow/conditionalJumps/break5.txt | 19 + .../controlFlow/conditionalJumps/return.kt | 8 + .../controlFlow/conditionalJumps/return.txt | 14 + .../controlFlow/conditionalJumps/return2.kt | 12 + .../controlFlow/conditionalJumps/return2.txt | 18 + .../controlFlow/conditionalJumps/return3.kt | 9 + .../controlFlow/conditionalJumps/return3.txt | 16 + .../controlFlow/continueReturn.kt | 16 + .../controlFlow/continueReturn.txt | 18 + .../controlFlow/continueReturn2.kt | 18 + .../controlFlow/continueReturn2.txt | 20 + .../controlFlow/defaultTryCatch.kt | 20 + .../controlFlow/defaultTryCatch.txt | 17 + .../controlFlow/defaultTryCatch2.kt | 20 + .../controlFlow/defaultTryCatch2.txt | 17 + .../controlFlow/definiteJumps/return.kt | 6 + .../controlFlow/definiteJumps/return.txt | 14 + .../controlFlow/definiteJumps/return2.kt | 8 + .../controlFlow/definiteJumps/return2.txt | 14 + .../controlFlow/definiteJumps/return3.kt | 6 + .../controlFlow/definiteJumps/return3.txt | 13 + .../controlFlow/definiteJumps/return4.kt | 6 + .../controlFlow/definiteJumps/return4.txt | 13 + .../controlFlow/differentTargets/break.kt | 17 + .../controlFlow/differentTargets/break.txt | 19 + .../controlFlow/differentTargets/return.kt | 16 + .../controlFlow/differentTargets/return.txt | 12 + .../exitPointEquivalence/breakAndReturn.kt | 11 + .../exitPointEquivalence/breakAndReturn.txt | 12 + .../breakContinueAndDefault.kt | 10 + .../breakContinueAndDefault.txt | 15 + .../exitPointEquivalence/continueAndReturn.kt | 11 + .../continueAndReturn.txt | 12 + .../exitPointEquivalence/defaultAndBreak.kt | 10 + .../exitPointEquivalence/defaultAndBreak.txt | 14 + .../defaultAndContinue.kt | 10 + .../defaultAndContinue.txt | 14 + .../exitPointEquivalence/defaultAndReturn.kt | 9 + .../exitPointEquivalence/defaultAndReturn.txt | 12 + .../defaultAndReturnInWhen.kt | 16 + .../defaultAndReturnInWhen.txt | 12 + .../defaultAndReturnInWhen2.kt | 19 + .../defaultAndReturnInWhen2.txt | 12 + .../exitPointEquivalence/multipleBreaks.kt | 13 + .../exitPointEquivalence/multipleBreaks.txt | 13 + .../controlFlow/unconditionalJumps/break.kt | 10 + .../controlFlow/unconditionalJumps/break.txt | 12 + .../controlFlow/unconditionalJumps/break2.kt | 11 + .../controlFlow/unconditionalJumps/break2.txt | 13 + .../controlFlow/unconditionalJumps/break3.kt | 13 + .../controlFlow/unconditionalJumps/break3.txt | 13 + .../controlFlow/unconditionalJumps/break4.kt | 16 + .../controlFlow/unconditionalJumps/break4.txt | 14 + .../defaultValues/anonymousFunction.kt | 5 + .../defaultValues/anonymousFunction.txt | 14 + .../defaultValues/anonymousObject.kt | 5 + .../defaultValues/anonymousObject.txt | 14 + .../defaultValues/assignmentTarget.kt | 17 + .../defaultValues/assignmentTarget.txt | 10 + .../defaultValues/assignmentValue.kt | 17 + .../defaultValues/assignmentValue.txt | 12 + .../defaultValues/calleeExpression.kt | 7 + .../defaultValues/calleeExpression.txt | 12 + .../defaultValues/errorDefaultType.kt | 7 + .../defaultValues/errorDefaultType.txt | 12 + .../defaultValues/expressionBlock.kt | 9 + .../defaultValues/expressionBlock.txt | 10 + .../defaultValues/flexibleDefaultType.kt | 9 + .../defaultValues/flexibleDefaultType.txt | 12 + .../defaultValues/functionBodyBlock.kt | 6 + .../defaultValues/functionBodyBlock.txt | 10 + .../defaultValues/functionCall.kt | 5 + .../defaultValues/functionCall.txt | 12 + .../defaultValues/infixOperator.kt | 7 + .../defaultValues/infixOperator.txt | 10 + .../defaultValues/lambdaExpression.kt | 3 + .../defaultValues/lambdaExpression.txt | 12 + .../defaultValues/nullableDefaultType.kt | 7 + .../defaultValues/nullableDefaultType.txt | 12 + .../defaultValues/packageQualifier.kt | 5 + .../defaultValues/packageQualifier.txt | 10 + .../defaultValues/singleTypedExpression.kt | 5 + .../defaultValues/singleTypedExpression.txt | 12 + .../defaultValues/suspendFunctionCall.kt | 5 + .../defaultValues/suspendFunctionCall.txt | 12 + .../defaultValues/typeQualifier.kt | 9 + .../defaultValues/typeQualifier.txt | 10 + .../defaultValues/variableDeclaration.kt | 7 + .../defaultValues/variableDeclaration.txt | 10 + .../exitPointSnapshot/defaultValues/while.kt | 11 + .../exitPointSnapshot/defaultValues/while.txt | 15 + .../languageConstructs/arrayLiteral.kt | 4 + .../languageConstructs/arrayLiteral.txt | 12 + .../languageConstructs/labeledReturn.kt | 3 + .../languageConstructs/labeledReturn.txt | 12 + .../languageConstructs/nonLocalReturn.kt | 3 + .../languageConstructs/nonLocalReturn.txt | 12 + .../languageConstructs/nonLocalReturn2.kt | 3 + .../languageConstructs/nonLocalReturn2.txt | 12 + .../languageConstructs/parameter.kt | 3 + .../languageConstructs/parameter.txt | 10 + .../parameterDefaultValue.kt | 3 + .../parameterDefaultValue.txt | 12 + .../languageConstructs/return.kt | 4 + .../languageConstructs/return.txt | 12 + .../languageConstructs/trailingSemicolon.kt | 6 + .../languageConstructs/trailingSemicolon.txt | 12 + .../arrayElementAugmentedReassignment.kt | 7 + .../arrayElementAugmentedReassignment.txt | 12 + .../variables/arrayElementIncrementPostfix.kt | 7 + .../arrayElementIncrementPostfix.txt | 12 + .../variables/arrayElementIncrementPrefix.kt | 7 + .../variables/arrayElementIncrementPrefix.txt | 12 + .../variables/augmentedReassignment.kt | 7 + .../variables/augmentedReassignment.txt | 15 + .../variables/classPropertyReassignment.kt | 7 + .../variables/classPropertyReassignment.txt | 10 + .../variables/conditionalReassignment.kt | 9 + .../variables/conditionalReassignment.txt | 15 + .../variables/destructuredReassignment.kt | 9 + .../variables/destructuredReassignment.txt | 15 + .../variables/errorTargetReassignment.kt | 3 + .../variables/errorTargetReassignment.txt | 10 + .../variables/incrementPostfix.kt | 7 + .../variables/incrementPostfix.txt | 15 + .../variables/incrementPrefix.kt | 7 + .../variables/incrementPrefix.txt | 15 + .../variables/lambdaParameterReassignment.kt | 7 + .../variables/lambdaParameterReassignment.txt | 10 + .../variables/localVariable.kt | 7 + .../variables/localVariable.txt | 12 + .../variables/parameterReassignment.kt | 3 + .../variables/parameterReassignment.txt | 10 + .../variables/simpleReassignment.kt | 7 + .../variables/simpleReassignment.txt | 15 + .../variables/topLevelPropertyReassignment.kt | 5 + .../topLevelPropertyReassignment.txt | 10 + .../tests/analysis/api/analysisApi.kt | 7 + 165 files changed, 4351 insertions(+), 1 deletion(-) create mode 100644 analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10DataFlowInfoProvider.kt create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirDataFlowInfoProvider.kt create mode 100644 analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeDependentAnalysisScriptSourceModuleExitPointSnapshotTestGenerated.java create mode 100644 analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeDependentAnalysisSourceModuleExitPointSnapshotTestGenerated.java create mode 100644 analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeNormalAnalysisScriptSourceModuleExitPointSnapshotTestGenerated.java create mode 100644 analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeNormalAnalysisSourceModuleExitPointSnapshotTestGenerated.java create mode 100644 analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/dataFlowInfoProvider/AbstractExitPointSnapshotTest.kt create mode 100644 analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirStandaloneNormalAnalysisSourceModuleExitPointSnapshotTestGenerated.java create mode 100644 analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtDataFlowInfoProvider.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakContinue.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakContinue.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn2.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn2.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break2.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break2.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break3.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break3.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break4.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break4.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break5.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break5.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return2.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return2.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return3.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return3.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn2.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn2.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch2.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch2.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return2.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return2.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return3.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return3.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return4.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return4.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/break.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/break.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/return.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/return.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakAndReturn.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakAndReturn.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakContinueAndDefault.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakContinueAndDefault.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/continueAndReturn.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/continueAndReturn.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndBreak.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndBreak.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndContinue.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndContinue.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturn.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturn.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen2.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen2.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/multipleBreaks.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/multipleBreaks.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break2.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break2.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break3.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break3.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break4.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break4.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousFunction.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousFunction.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousObject.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousObject.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentTarget.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentTarget.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentValue.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentValue.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/calleeExpression.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/calleeExpression.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/errorDefaultType.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/errorDefaultType.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/expressionBlock.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/expressionBlock.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/flexibleDefaultType.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/flexibleDefaultType.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionBodyBlock.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionBodyBlock.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionCall.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionCall.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/infixOperator.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/infixOperator.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/lambdaExpression.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/lambdaExpression.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/nullableDefaultType.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/nullableDefaultType.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/packageQualifier.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/packageQualifier.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/singleTypedExpression.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/singleTypedExpression.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/suspendFunctionCall.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/suspendFunctionCall.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/typeQualifier.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/typeQualifier.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/variableDeclaration.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/variableDeclaration.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/while.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/while.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/arrayLiteral.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/arrayLiteral.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/labeledReturn.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/labeledReturn.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn2.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn2.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameter.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameter.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameterDefaultValue.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameterDefaultValue.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/return.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/return.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/trailingSemicolon.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/trailingSemicolon.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementAugmentedReassignment.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementAugmentedReassignment.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPostfix.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPostfix.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPrefix.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPrefix.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/augmentedReassignment.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/augmentedReassignment.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/classPropertyReassignment.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/classPropertyReassignment.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/conditionalReassignment.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/conditionalReassignment.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/destructuredReassignment.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/destructuredReassignment.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/errorTargetReassignment.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/errorTargetReassignment.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPostfix.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPostfix.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPrefix.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPrefix.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/lambdaParameterReassignment.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/lambdaParameterReassignment.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/localVariable.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/localVariable.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/parameterReassignment.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/parameterReassignment.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/simpleReassignment.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/simpleReassignment.txt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/topLevelPropertyReassignment.kt create mode 100644 analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/topLevelPropertyReassignment.txt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt index 9c8ec39b20b..98603a9c91a 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt @@ -64,6 +64,7 @@ class KtFe10AnalysisSession( override val symbolProviderByJavaPsiImpl: KtSymbolProviderByJavaPsi = KtFe10SymbolProviderByJavaPsi(this) override val resolveExtensionInfoProviderImpl: KtResolveExtensionInfoProvider = KtFe10ResolveExtensionInfoProvider(this) override val compilerFacilityImpl: KtCompilerFacility = KtFe10CompilerFacility(this) + override val dataFlowInfoProviderImpl: KtDataFlowInfoProvider = KtFe10DataFlowInfoProvider(this) override val metadataCalculatorImpl: KtMetadataCalculator get() = throw NotSupportedForK1Exception() diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10DataFlowInfoProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10DataFlowInfoProvider.kt new file mode 100644 index 00000000000..0f455764b2f --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10DataFlowInfoProvider.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.descriptors.components + +import org.jetbrains.kotlin.analysis.api.KtAnalysisNonPublicApi +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.components.KtDataFlowExitPointSnapshot +import org.jetbrains.kotlin.analysis.api.components.KtDataFlowInfoProvider +import org.jetbrains.kotlin.psi.KtExpression + +@OptIn(KtAnalysisNonPublicApi::class) +internal class KtFe10DataFlowInfoProvider(override val analysisSession: KtAnalysisSession) : KtDataFlowInfoProvider() { + override fun getExitPointSnapshot(statements: List): KtDataFlowExitPointSnapshot { + throw NotImplementedError("Method is not implemented for FE 1.0") + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt index 42e65e56510..dc47fa2dc10 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt @@ -126,6 +126,8 @@ private constructor( override val substitutorProviderImpl: KtSubstitutorProvider = KtFirSubstitutorProvider(this) + override val dataFlowInfoProviderImpl: KtDataFlowInfoProvider = KtFirDataFlowInfoProvider(this) + internal val useSiteSession: FirSession get() = firResolveSession.useSiteFirSession internal val firSymbolProvider: FirSymbolProvider get() = useSiteSession.symbolProvider internal val targetPlatform: TargetPlatform get() = useSiteSession.moduleData.platform diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirDataFlowInfoProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirDataFlowInfoProvider.kt new file mode 100644 index 00000000000..b77b6e19b85 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirDataFlowInfoProvider.kt @@ -0,0 +1,376 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fir.components + +import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.kotlin.KtFakeSourceElementKind.* +import org.jetbrains.kotlin.analysis.api.KtAnalysisNonPublicApi +import org.jetbrains.kotlin.analysis.api.components.KtDataFlowExitPointSnapshot +import org.jetbrains.kotlin.analysis.api.components.KtDataFlowExitPointSnapshot.VariableReassignment +import org.jetbrains.kotlin.analysis.api.components.KtDataFlowInfoProvider +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.utils.unwrap +import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType +import org.jetbrains.kotlin.analysis.utils.errors.withKtModuleEntry +import org.jetbrains.kotlin.analysis.utils.printer.parentsOfType +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.isLocalMember +import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction +import org.jetbrains.kotlin.fir.declarations.FirConstructor +import org.jetbrains.kotlin.fir.declarations.FirControlFlowGraphOwner +import org.jetbrains.kotlin.fir.declarations.FirErrorFunction +import org.jetbrains.kotlin.fir.declarations.FirErrorPrimaryConstructor +import org.jetbrains.kotlin.fir.declarations.FirFunction +import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor +import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.expressions.FirBlock +import org.jetbrains.kotlin.fir.expressions.FirBreakExpression +import org.jetbrains.kotlin.fir.expressions.FirContinueExpression +import org.jetbrains.kotlin.fir.expressions.FirErrorExpression +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirJump +import org.jetbrains.kotlin.fir.expressions.FirLoop +import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier +import org.jetbrains.kotlin.fir.expressions.FirReturnExpression +import org.jetbrains.kotlin.fir.expressions.FirThrowExpression +import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment +import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression +import org.jetbrains.kotlin.fir.expressions.toResolvedCallableSymbol +import org.jetbrains.kotlin.fir.psi +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.AnonymousObjectExpressionExitNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNodeWithSubgraphs +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.DelegateExpressionExitNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ElvisExitNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ElvisLhsExitNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ExitNodeMarker +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ExitSafeCallNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ExitValueParameterNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.LocalClassExitNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.PostponedLambdaExitNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.SmartCastExpressionExitNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.StubNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.WhenBranchResultExitNode +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.WhenSubjectExpressionExitNode +import org.jetbrains.kotlin.fir.resolve.dfa.controlFlowGraph +import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.commonSuperTypeOrNull +import org.jetbrains.kotlin.fir.types.isNothing +import org.jetbrains.kotlin.fir.types.isUnit +import org.jetbrains.kotlin.fir.types.resolvedType +import org.jetbrains.kotlin.fir.types.typeContext +import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry +import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtReturnExpression +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment +import org.jetbrains.kotlin.utils.exceptions.withPsiEntry +import java.util.ArrayList +import kotlin.math.sign + +@OptIn(KtAnalysisNonPublicApi::class) +internal class KtFirDataFlowInfoProvider(override val analysisSession: KtFirAnalysisSession) : KtDataFlowInfoProvider() { + override fun getExitPointSnapshot(statements: List): KtDataFlowExitPointSnapshot { + require(statements.isNotEmpty()) + require(haveCommonParent(statements)) + + val firResolveSession = analysisSession.firResolveSession + + val firStatements = statements.map { it.unwrap().getOrBuildFirOfType(firResolveSession) } + + val collector = FirElementCollector() + firStatements.forEach { it.accept(collector) } + + val firValuedReturnExpressions = collector.firReturnExpressions.filter { !it.result.resolvedType.isUnit } + + val firDefaultStatement = firStatements.last() + val defaultExpressionInfo = computeDefaultExpression(statements, firDefaultStatement) + + val firEscapingCandidates = buildSet { + add(firDefaultStatement) + addAll(collector.firReturnExpressions) + addAll(collector.firBreakExpressions) + addAll(collector.firContinueExpressions) + } + + val hasEscapingJumps = computeHasEscapingJumps(statements.first(), firStatements.first(), firEscapingCandidates) + + val loopJumpExpressions = ArrayList(collector.firBreakExpressions.size + collector.firContinueExpressions.size) + collector.firBreakExpressions.mapNotNullTo(loopJumpExpressions) { it.psi as? KtExpression } + collector.firContinueExpressions.mapNotNullTo(loopJumpExpressions) { it.psi as? KtExpression } + + return KtDataFlowExitPointSnapshot( + defaultExpressionInfo = defaultExpressionInfo, + valuedReturnExpressions = firValuedReturnExpressions.mapNotNull { it.psi as? KtReturnExpression }, + returnValueType = computeReturnType(firValuedReturnExpressions), + loopJumpExpressions = loopJumpExpressions, + hasJumps = collector.hasJumps, + hasEscapingJumps = hasEscapingJumps, + hasMultipleJumpKinds = collector.hasMultipleJumpKinds, + hasMultipleJumpTargets = collector.hasMultipleJumpTargets, + variableReassignments = collector.variableReassignments + ) + } + + private fun haveCommonParent(statements: List): Boolean { + if (statements.size < 2) { + return true + } + + val parent = statements.first().parent + return statements.all { it.parent == parent } + } + + private fun computeDefaultExpression( + statements: List, + firDefaultStatement: FirElement + ): KtDataFlowExitPointSnapshot.DefaultExpressionInfo? { + when (firDefaultStatement) { + !is FirExpression, + is FirJump<*>, + is FirBlock, + is FirThrowExpression, + is FirResolvedQualifier, + is FirUnitExpression, + is FirErrorExpression -> { + return null + } + } + + @Suppress("USELESS_IS_CHECK") // K2 warning suppression, TODO: KT-62472 + require(firDefaultStatement is FirExpression) + + val defaultExpressionFromPsi = statements.last() + val defaultExpressionFromFir = firDefaultStatement.psi as? KtExpression ?: return null + + if (!PsiTreeUtil.isAncestor(defaultExpressionFromFir, defaultExpressionFromPsi, false)) { + // In certain cases, expressions might be different in PSI and FIR sources. + // E.g., in 'foo.bar()', there is no FIR expression that corresponds to the 'bar()' KtCallExpression. + return null + } + + val defaultConeType = firDefaultStatement.resolvedType + if (defaultConeType.isNothing) { + return null + } + + val defaultType = defaultConeType.toKtType() + return KtDataFlowExitPointSnapshot.DefaultExpressionInfo(defaultExpressionFromPsi, defaultType) + } + + private fun computeReturnType(firReturnExpressions: List): KtType? { + val coneTypes = ArrayList(firReturnExpressions.size) + + for (firReturnExpression in firReturnExpressions) { + val coneType = firReturnExpression.result.resolvedType + if (coneType.isUnit) { + return null + } + + coneTypes.add(coneType) + } + + return analysisSession.useSiteSession.typeContext.commonSuperTypeOrNull(coneTypes)?.toKtType() + } + + private fun computeHasEscapingJumps(anchor: KtElement, firAnchor: FirElement, firTargets: Set): Boolean { + if (firTargets.size < 2) { + // There should be both a default expression and some kind of jump + return false + } + + val graph = findControlFlowGraph(anchor, firAnchor) + ?: errorWithAttachment("Cannot find a control flow graph for element") { + withKtModuleEntry("module", analysisSession.useSiteModule) + withPsiEntry("anchor", anchor) + withFirEntry("firAnchor", firAnchor) + } + + val exitNodes = HashMap>>() + graph.collectExitNodes(firTargets, exitNodes) + + return exitNodes.values.distinct().size > 1 + } + + private fun findControlFlowGraph(anchor: KtElement, firAnchor: FirElement): ControlFlowGraph? { + val parentDeclarations = anchor.parentsOfType(withSelf = false) + for (parentDeclaration in parentDeclarations) { + val parentFirDeclaration = parentDeclaration.getOrBuildFir(analysisSession.firResolveSession) + if (parentFirDeclaration is FirControlFlowGraphOwner) { + val graph = parentFirDeclaration.controlFlowGraphReference?.controlFlowGraph + if (graph != null && firAnchor in graph) { + return graph + } + } + } + + return null + } + + private fun ControlFlowGraph.collectExitNodes(firTargets: Set, exitNodes: MutableMap>>) { + for (node in nodes) { + val fir = node.fir + if (fir in firTargets) { + // This intentionally replaces existing values, in case if there are multiple nodes with the same FirElement. + // Here we look for exits, so we are interested in the last matching node. + exitNodes[fir] = node.followingNodes + .filter { it !is StubNode } + .map { it.unwrap() } + .distinct() + .sortedBy { it.id } + } + if (node is CFGNodeWithSubgraphs<*>) { + for (subGraph in node.subGraphs) { + subGraph.collectExitNodes(firTargets, exitNodes) + } + } + } + } + + private fun CFGNode<*>.unwrap(): CFGNode<*> { + var current = this + + while (current.isExitNode()) { + val following = current.followingNodes + if (following.size == 1) { + current = following.first() + } else { + break + } + } + + return current + } + + private fun CFGNode<*>.isExitNode(): Boolean { + return when (this) { + is ExitNodeMarker, is ExitValueParameterNode, is WhenSubjectExpressionExitNode, is AnonymousObjectExpressionExitNode, + is SmartCastExpressionExitNode, is PostponedLambdaExitNode, is DelegateExpressionExitNode, is WhenBranchResultExitNode, + is ElvisExitNode, is ExitSafeCallNode, is LocalClassExitNode, is ElvisLhsExitNode -> { + true + } + else -> { + false + } + } + } + + private operator fun ControlFlowGraph.contains(fir: FirElement): Boolean { + for (node in nodes) { + if (node.fir == fir) { + return true + } + if (node is CFGNodeWithSubgraphs<*> && node.subGraphs.any { fir in it }) { + return true + } + } + + return false + } + + private inner class FirElementCollector : FirDefaultVisitorVoid() { + val hasJumps: Boolean + get() = firReturnTargets.isNotEmpty() || firLoopJumpTargets.isNotEmpty() + + val hasMultipleJumpKinds: Boolean + get() = (firReturnExpressions.size.sign + firBreakExpressions.size.sign + firContinueExpressions.size.sign) > 1 + + val hasMultipleJumpTargets: Boolean + get() = (firReturnTargets.size + firLoopJumpTargets.size) > 1 + + val variableReassignments = mutableListOf() + + val firReturnExpressions = mutableListOf() + val firBreakExpressions = mutableListOf() + val firContinueExpressions = mutableListOf() + + private val firReturnTargets = mutableSetOf() + private val firLoopJumpTargets = mutableSetOf() + + private val firFunctionDeclarations = mutableSetOf() + private val firLoopStatements = mutableSetOf() + + override fun visitElement(element: FirElement) { + element.acceptChildren(this) + } + + override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction) = visitFunction(anonymousFunction) + override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor) = visitFunction(propertyAccessor) + override fun visitSimpleFunction(simpleFunction: FirSimpleFunction) = visitFunction(simpleFunction) + override fun visitErrorFunction(errorFunction: FirErrorFunction) = visitFunction(errorFunction) + override fun visitConstructor(constructor: FirConstructor) = visitFunction(constructor) + override fun visitErrorPrimaryConstructor(errorPrimaryConstructor: FirErrorPrimaryConstructor) = visitFunction(errorPrimaryConstructor) + + override fun visitFunction(function: FirFunction) { + firFunctionDeclarations.add(function) + super.visitFunction(function) + } + + override fun visitLoop(loop: FirLoop) { + firLoopStatements.add(loop) + super.visitLoop(loop) + } + + override fun visitReturnExpression(returnExpression: FirReturnExpression) { + if (returnExpression.target.labeledElement !in firFunctionDeclarations) { + firReturnExpressions.add(returnExpression) + firReturnTargets.add(returnExpression.target.labeledElement) + } + super.visitReturnExpression(returnExpression) + } + + override fun visitBreakExpression(breakExpression: FirBreakExpression) { + if (breakExpression.target.labeledElement !in firLoopStatements) { + firBreakExpressions.add(breakExpression) + firLoopJumpTargets.add(breakExpression.target.labeledElement) + } + super.visitBreakExpression(breakExpression) + } + + override fun visitContinueExpression(continueExpression: FirContinueExpression) { + if (continueExpression.target.labeledElement !in firLoopStatements) { + firContinueExpressions.add(continueExpression) + firLoopJumpTargets.add(continueExpression.target.labeledElement) + } + super.visitContinueExpression(continueExpression) + } + + override fun visitVariableAssignment(variableAssignment: FirVariableAssignment) { + val firVariableSymbol = variableAssignment.lValue.toResolvedCallableSymbol(analysisSession.useSiteSession) + val expression = variableAssignment.psi as? KtExpression + + if (firVariableSymbol is FirVariableSymbol<*> && firVariableSymbol.fir.isLocalMember && expression != null) { + val variableSymbol = analysisSession.firSymbolBuilder.variableLikeBuilder.buildVariableLikeSymbol(firVariableSymbol) + val reassignment = VariableReassignment(expression, variableSymbol, variableAssignment.isAugmented()) + variableReassignments.add(reassignment) + } + + super.visitVariableAssignment(variableAssignment) + } + + private fun FirVariableAssignment.isAugmented(): Boolean { + val targetSource = lValue.source + if (targetSource != null) { + when (targetSource.kind) { + is DesugaredCompoundAssignment, is DesugaredIncrementOrDecrement -> return true + else -> {} + } + } + + return false + } + } + + private fun ConeKotlinType.toKtType(): KtType { + return analysisSession.firSymbolBuilder.typeBuilder.buildKtType(this) + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeDependentAnalysisScriptSourceModuleExitPointSnapshotTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeDependentAnalysisScriptSourceModuleExitPointSnapshotTestGenerated.java new file mode 100644 index 00000000000..c0dbf25661e --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeDependentAnalysisScriptSourceModuleExitPointSnapshotTestGenerated.java @@ -0,0 +1,138 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fir.test.cases.generated.cases.components.dataFlowInfoProvider; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.dataFlowInfoProvider.AbstractExitPointSnapshotTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeDependentAnalysisScriptSourceModuleExitPointSnapshotTestGenerated extends AbstractExitPointSnapshotTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.ScriptSource, + AnalysisSessionMode.Dependent, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInExitPointSnapshot() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow") + @TestDataPath("$PROJECT_ROOT") + public class ControlFlow { + @Test + public void testAllFilesPresentInControlFlow() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps") + @TestDataPath("$PROJECT_ROOT") + public class ConditionalJumps { + @Test + public void testAllFilesPresentInConditionalJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps") + @TestDataPath("$PROJECT_ROOT") + public class DefiniteJumps { + @Test + public void testAllFilesPresentInDefiniteJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets") + @TestDataPath("$PROJECT_ROOT") + public class DifferentTargets { + @Test + public void testAllFilesPresentInDifferentTargets() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence") + @TestDataPath("$PROJECT_ROOT") + public class ExitPointEquivalence { + @Test + public void testAllFilesPresentInExitPointEquivalence() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps") + @TestDataPath("$PROJECT_ROOT") + public class UnconditionalJumps { + @Test + public void testAllFilesPresentInUnconditionalJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues") + @TestDataPath("$PROJECT_ROOT") + public class DefaultValues { + @Test + public void testAllFilesPresentInDefaultValues() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs") + @TestDataPath("$PROJECT_ROOT") + public class LanguageConstructs { + @Test + public void testAllFilesPresentInLanguageConstructs() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables") + @TestDataPath("$PROJECT_ROOT") + public class Variables { + @Test + public void testAllFilesPresentInVariables() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeDependentAnalysisSourceModuleExitPointSnapshotTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeDependentAnalysisSourceModuleExitPointSnapshotTestGenerated.java new file mode 100644 index 00000000000..f669b668be2 --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeDependentAnalysisSourceModuleExitPointSnapshotTestGenerated.java @@ -0,0 +1,594 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fir.test.cases.generated.cases.components.dataFlowInfoProvider; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.dataFlowInfoProvider.AbstractExitPointSnapshotTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeDependentAnalysisSourceModuleExitPointSnapshotTestGenerated extends AbstractExitPointSnapshotTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Dependent, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInExitPointSnapshot() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow") + @TestDataPath("$PROJECT_ROOT") + public class ControlFlow { + @Test + public void testAllFilesPresentInControlFlow() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("breakContinue.kt") + public void testBreakContinue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakContinue.kt"); + } + + @Test + @TestMetadata("breakReturn.kt") + public void testBreakReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn.kt"); + } + + @Test + @TestMetadata("breakReturn2.kt") + public void testBreakReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn2.kt"); + } + + @Test + @TestMetadata("continueReturn.kt") + public void testContinueReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn.kt"); + } + + @Test + @TestMetadata("continueReturn2.kt") + public void testContinueReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn2.kt"); + } + + @Test + @TestMetadata("defaultTryCatch.kt") + public void testDefaultTryCatch() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch.kt"); + } + + @Test + @TestMetadata("defaultTryCatch2.kt") + public void testDefaultTryCatch2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch2.kt"); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps") + @TestDataPath("$PROJECT_ROOT") + public class ConditionalJumps { + @Test + public void testAllFilesPresentInConditionalJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("break.kt") + public void testBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break.kt"); + } + + @Test + @TestMetadata("break2.kt") + public void testBreak2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break2.kt"); + } + + @Test + @TestMetadata("break3.kt") + public void testBreak3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break3.kt"); + } + + @Test + @TestMetadata("break4.kt") + public void testBreak4() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break4.kt"); + } + + @Test + @TestMetadata("break5.kt") + public void testBreak5() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break5.kt"); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return.kt"); + } + + @Test + @TestMetadata("return2.kt") + public void testReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return2.kt"); + } + + @Test + @TestMetadata("return3.kt") + public void testReturn3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return3.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps") + @TestDataPath("$PROJECT_ROOT") + public class DefiniteJumps { + @Test + public void testAllFilesPresentInDefiniteJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return.kt"); + } + + @Test + @TestMetadata("return2.kt") + public void testReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return2.kt"); + } + + @Test + @TestMetadata("return3.kt") + public void testReturn3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return3.kt"); + } + + @Test + @TestMetadata("return4.kt") + public void testReturn4() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return4.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets") + @TestDataPath("$PROJECT_ROOT") + public class DifferentTargets { + @Test + public void testAllFilesPresentInDifferentTargets() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("break.kt") + public void testBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/break.kt"); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/return.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence") + @TestDataPath("$PROJECT_ROOT") + public class ExitPointEquivalence { + @Test + public void testAllFilesPresentInExitPointEquivalence() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("breakAndReturn.kt") + public void testBreakAndReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakAndReturn.kt"); + } + + @Test + @TestMetadata("breakContinueAndDefault.kt") + public void testBreakContinueAndDefault() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakContinueAndDefault.kt"); + } + + @Test + @TestMetadata("continueAndReturn.kt") + public void testContinueAndReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/continueAndReturn.kt"); + } + + @Test + @TestMetadata("defaultAndBreak.kt") + public void testDefaultAndBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndBreak.kt"); + } + + @Test + @TestMetadata("defaultAndContinue.kt") + public void testDefaultAndContinue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndContinue.kt"); + } + + @Test + @TestMetadata("defaultAndReturn.kt") + public void testDefaultAndReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturn.kt"); + } + + @Test + @TestMetadata("defaultAndReturnInWhen.kt") + public void testDefaultAndReturnInWhen() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen.kt"); + } + + @Test + @TestMetadata("defaultAndReturnInWhen2.kt") + public void testDefaultAndReturnInWhen2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen2.kt"); + } + + @Test + @TestMetadata("multipleBreaks.kt") + public void testMultipleBreaks() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/multipleBreaks.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps") + @TestDataPath("$PROJECT_ROOT") + public class UnconditionalJumps { + @Test + public void testAllFilesPresentInUnconditionalJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("break.kt") + public void testBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break.kt"); + } + + @Test + @TestMetadata("break2.kt") + public void testBreak2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break2.kt"); + } + + @Test + @TestMetadata("break3.kt") + public void testBreak3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break3.kt"); + } + + @Test + @TestMetadata("break4.kt") + public void testBreak4() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break4.kt"); + } + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues") + @TestDataPath("$PROJECT_ROOT") + public class DefaultValues { + @Test + public void testAllFilesPresentInDefaultValues() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("anonymousFunction.kt") + public void testAnonymousFunction() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousFunction.kt"); + } + + @Test + @TestMetadata("anonymousObject.kt") + public void testAnonymousObject() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousObject.kt"); + } + + @Test + @TestMetadata("assignmentTarget.kt") + public void testAssignmentTarget() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentTarget.kt"); + } + + @Test + @TestMetadata("assignmentValue.kt") + public void testAssignmentValue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentValue.kt"); + } + + @Test + @TestMetadata("calleeExpression.kt") + public void testCalleeExpression() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/calleeExpression.kt"); + } + + @Test + @TestMetadata("errorDefaultType.kt") + public void testErrorDefaultType() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/errorDefaultType.kt"); + } + + @Test + @TestMetadata("expressionBlock.kt") + public void testExpressionBlock() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/expressionBlock.kt"); + } + + @Test + @TestMetadata("flexibleDefaultType.kt") + public void testFlexibleDefaultType() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/flexibleDefaultType.kt"); + } + + @Test + @TestMetadata("functionBodyBlock.kt") + public void testFunctionBodyBlock() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionBodyBlock.kt"); + } + + @Test + @TestMetadata("functionCall.kt") + public void testFunctionCall() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionCall.kt"); + } + + @Test + @TestMetadata("infixOperator.kt") + public void testInfixOperator() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/infixOperator.kt"); + } + + @Test + @TestMetadata("lambdaExpression.kt") + public void testLambdaExpression() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/lambdaExpression.kt"); + } + + @Test + @TestMetadata("nullableDefaultType.kt") + public void testNullableDefaultType() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/nullableDefaultType.kt"); + } + + @Test + @TestMetadata("packageQualifier.kt") + public void testPackageQualifier() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/packageQualifier.kt"); + } + + @Test + @TestMetadata("singleTypedExpression.kt") + public void testSingleTypedExpression() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/singleTypedExpression.kt"); + } + + @Test + @TestMetadata("suspendFunctionCall.kt") + public void testSuspendFunctionCall() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/suspendFunctionCall.kt"); + } + + @Test + @TestMetadata("typeQualifier.kt") + public void testTypeQualifier() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/typeQualifier.kt"); + } + + @Test + @TestMetadata("variableDeclaration.kt") + public void testVariableDeclaration() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/variableDeclaration.kt"); + } + + @Test + @TestMetadata("while.kt") + public void testWhile() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/while.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs") + @TestDataPath("$PROJECT_ROOT") + public class LanguageConstructs { + @Test + public void testAllFilesPresentInLanguageConstructs() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("arrayLiteral.kt") + public void testArrayLiteral() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/arrayLiteral.kt"); + } + + @Test + @TestMetadata("labeledReturn.kt") + public void testLabeledReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/labeledReturn.kt"); + } + + @Test + @TestMetadata("nonLocalReturn.kt") + public void testNonLocalReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn.kt"); + } + + @Test + @TestMetadata("nonLocalReturn2.kt") + public void testNonLocalReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn2.kt"); + } + + @Test + @TestMetadata("parameter.kt") + public void testParameter() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameter.kt"); + } + + @Test + @TestMetadata("parameterDefaultValue.kt") + public void testParameterDefaultValue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameterDefaultValue.kt"); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/return.kt"); + } + + @Test + @TestMetadata("trailingSemicolon.kt") + public void testTrailingSemicolon() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/trailingSemicolon.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables") + @TestDataPath("$PROJECT_ROOT") + public class Variables { + @Test + public void testAllFilesPresentInVariables() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("arrayElementAugmentedReassignment.kt") + public void testArrayElementAugmentedReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementAugmentedReassignment.kt"); + } + + @Test + @TestMetadata("arrayElementIncrementPostfix.kt") + public void testArrayElementIncrementPostfix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPostfix.kt"); + } + + @Test + @TestMetadata("arrayElementIncrementPrefix.kt") + public void testArrayElementIncrementPrefix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPrefix.kt"); + } + + @Test + @TestMetadata("augmentedReassignment.kt") + public void testAugmentedReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/augmentedReassignment.kt"); + } + + @Test + @TestMetadata("classPropertyReassignment.kt") + public void testClassPropertyReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/classPropertyReassignment.kt"); + } + + @Test + @TestMetadata("conditionalReassignment.kt") + public void testConditionalReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/conditionalReassignment.kt"); + } + + @Test + @TestMetadata("destructuredReassignment.kt") + public void testDestructuredReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/destructuredReassignment.kt"); + } + + @Test + @TestMetadata("errorTargetReassignment.kt") + public void testErrorTargetReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/errorTargetReassignment.kt"); + } + + @Test + @TestMetadata("incrementPostfix.kt") + public void testIncrementPostfix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPostfix.kt"); + } + + @Test + @TestMetadata("incrementPrefix.kt") + public void testIncrementPrefix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPrefix.kt"); + } + + @Test + @TestMetadata("lambdaParameterReassignment.kt") + public void testLambdaParameterReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/lambdaParameterReassignment.kt"); + } + + @Test + @TestMetadata("localVariable.kt") + public void testLocalVariable() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/localVariable.kt"); + } + + @Test + @TestMetadata("parameterReassignment.kt") + public void testParameterReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/parameterReassignment.kt"); + } + + @Test + @TestMetadata("simpleReassignment.kt") + public void testSimpleReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/simpleReassignment.kt"); + } + + @Test + @TestMetadata("topLevelPropertyReassignment.kt") + public void testTopLevelPropertyReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/topLevelPropertyReassignment.kt"); + } + } +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeNormalAnalysisScriptSourceModuleExitPointSnapshotTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeNormalAnalysisScriptSourceModuleExitPointSnapshotTestGenerated.java new file mode 100644 index 00000000000..937883f5461 --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeNormalAnalysisScriptSourceModuleExitPointSnapshotTestGenerated.java @@ -0,0 +1,138 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fir.test.cases.generated.cases.components.dataFlowInfoProvider; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.dataFlowInfoProvider.AbstractExitPointSnapshotTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeNormalAnalysisScriptSourceModuleExitPointSnapshotTestGenerated extends AbstractExitPointSnapshotTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.ScriptSource, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInExitPointSnapshot() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow") + @TestDataPath("$PROJECT_ROOT") + public class ControlFlow { + @Test + public void testAllFilesPresentInControlFlow() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps") + @TestDataPath("$PROJECT_ROOT") + public class ConditionalJumps { + @Test + public void testAllFilesPresentInConditionalJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps") + @TestDataPath("$PROJECT_ROOT") + public class DefiniteJumps { + @Test + public void testAllFilesPresentInDefiniteJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets") + @TestDataPath("$PROJECT_ROOT") + public class DifferentTargets { + @Test + public void testAllFilesPresentInDifferentTargets() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence") + @TestDataPath("$PROJECT_ROOT") + public class ExitPointEquivalence { + @Test + public void testAllFilesPresentInExitPointEquivalence() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps") + @TestDataPath("$PROJECT_ROOT") + public class UnconditionalJumps { + @Test + public void testAllFilesPresentInUnconditionalJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues") + @TestDataPath("$PROJECT_ROOT") + public class DefaultValues { + @Test + public void testAllFilesPresentInDefaultValues() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs") + @TestDataPath("$PROJECT_ROOT") + public class LanguageConstructs { + @Test + public void testAllFilesPresentInLanguageConstructs() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables") + @TestDataPath("$PROJECT_ROOT") + public class Variables { + @Test + public void testAllFilesPresentInVariables() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeNormalAnalysisSourceModuleExitPointSnapshotTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeNormalAnalysisSourceModuleExitPointSnapshotTestGenerated.java new file mode 100644 index 00000000000..ee2c7b0a920 --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirIdeNormalAnalysisSourceModuleExitPointSnapshotTestGenerated.java @@ -0,0 +1,594 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fir.test.cases.generated.cases.components.dataFlowInfoProvider; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.dataFlowInfoProvider.AbstractExitPointSnapshotTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeNormalAnalysisSourceModuleExitPointSnapshotTestGenerated extends AbstractExitPointSnapshotTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInExitPointSnapshot() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow") + @TestDataPath("$PROJECT_ROOT") + public class ControlFlow { + @Test + public void testAllFilesPresentInControlFlow() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("breakContinue.kt") + public void testBreakContinue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakContinue.kt"); + } + + @Test + @TestMetadata("breakReturn.kt") + public void testBreakReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn.kt"); + } + + @Test + @TestMetadata("breakReturn2.kt") + public void testBreakReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn2.kt"); + } + + @Test + @TestMetadata("continueReturn.kt") + public void testContinueReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn.kt"); + } + + @Test + @TestMetadata("continueReturn2.kt") + public void testContinueReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn2.kt"); + } + + @Test + @TestMetadata("defaultTryCatch.kt") + public void testDefaultTryCatch() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch.kt"); + } + + @Test + @TestMetadata("defaultTryCatch2.kt") + public void testDefaultTryCatch2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch2.kt"); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps") + @TestDataPath("$PROJECT_ROOT") + public class ConditionalJumps { + @Test + public void testAllFilesPresentInConditionalJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("break.kt") + public void testBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break.kt"); + } + + @Test + @TestMetadata("break2.kt") + public void testBreak2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break2.kt"); + } + + @Test + @TestMetadata("break3.kt") + public void testBreak3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break3.kt"); + } + + @Test + @TestMetadata("break4.kt") + public void testBreak4() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break4.kt"); + } + + @Test + @TestMetadata("break5.kt") + public void testBreak5() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break5.kt"); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return.kt"); + } + + @Test + @TestMetadata("return2.kt") + public void testReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return2.kt"); + } + + @Test + @TestMetadata("return3.kt") + public void testReturn3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return3.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps") + @TestDataPath("$PROJECT_ROOT") + public class DefiniteJumps { + @Test + public void testAllFilesPresentInDefiniteJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return.kt"); + } + + @Test + @TestMetadata("return2.kt") + public void testReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return2.kt"); + } + + @Test + @TestMetadata("return3.kt") + public void testReturn3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return3.kt"); + } + + @Test + @TestMetadata("return4.kt") + public void testReturn4() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return4.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets") + @TestDataPath("$PROJECT_ROOT") + public class DifferentTargets { + @Test + public void testAllFilesPresentInDifferentTargets() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("break.kt") + public void testBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/break.kt"); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/return.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence") + @TestDataPath("$PROJECT_ROOT") + public class ExitPointEquivalence { + @Test + public void testAllFilesPresentInExitPointEquivalence() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("breakAndReturn.kt") + public void testBreakAndReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakAndReturn.kt"); + } + + @Test + @TestMetadata("breakContinueAndDefault.kt") + public void testBreakContinueAndDefault() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakContinueAndDefault.kt"); + } + + @Test + @TestMetadata("continueAndReturn.kt") + public void testContinueAndReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/continueAndReturn.kt"); + } + + @Test + @TestMetadata("defaultAndBreak.kt") + public void testDefaultAndBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndBreak.kt"); + } + + @Test + @TestMetadata("defaultAndContinue.kt") + public void testDefaultAndContinue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndContinue.kt"); + } + + @Test + @TestMetadata("defaultAndReturn.kt") + public void testDefaultAndReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturn.kt"); + } + + @Test + @TestMetadata("defaultAndReturnInWhen.kt") + public void testDefaultAndReturnInWhen() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen.kt"); + } + + @Test + @TestMetadata("defaultAndReturnInWhen2.kt") + public void testDefaultAndReturnInWhen2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen2.kt"); + } + + @Test + @TestMetadata("multipleBreaks.kt") + public void testMultipleBreaks() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/multipleBreaks.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps") + @TestDataPath("$PROJECT_ROOT") + public class UnconditionalJumps { + @Test + public void testAllFilesPresentInUnconditionalJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("break.kt") + public void testBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break.kt"); + } + + @Test + @TestMetadata("break2.kt") + public void testBreak2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break2.kt"); + } + + @Test + @TestMetadata("break3.kt") + public void testBreak3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break3.kt"); + } + + @Test + @TestMetadata("break4.kt") + public void testBreak4() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break4.kt"); + } + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues") + @TestDataPath("$PROJECT_ROOT") + public class DefaultValues { + @Test + public void testAllFilesPresentInDefaultValues() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("anonymousFunction.kt") + public void testAnonymousFunction() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousFunction.kt"); + } + + @Test + @TestMetadata("anonymousObject.kt") + public void testAnonymousObject() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousObject.kt"); + } + + @Test + @TestMetadata("assignmentTarget.kt") + public void testAssignmentTarget() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentTarget.kt"); + } + + @Test + @TestMetadata("assignmentValue.kt") + public void testAssignmentValue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentValue.kt"); + } + + @Test + @TestMetadata("calleeExpression.kt") + public void testCalleeExpression() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/calleeExpression.kt"); + } + + @Test + @TestMetadata("errorDefaultType.kt") + public void testErrorDefaultType() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/errorDefaultType.kt"); + } + + @Test + @TestMetadata("expressionBlock.kt") + public void testExpressionBlock() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/expressionBlock.kt"); + } + + @Test + @TestMetadata("flexibleDefaultType.kt") + public void testFlexibleDefaultType() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/flexibleDefaultType.kt"); + } + + @Test + @TestMetadata("functionBodyBlock.kt") + public void testFunctionBodyBlock() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionBodyBlock.kt"); + } + + @Test + @TestMetadata("functionCall.kt") + public void testFunctionCall() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionCall.kt"); + } + + @Test + @TestMetadata("infixOperator.kt") + public void testInfixOperator() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/infixOperator.kt"); + } + + @Test + @TestMetadata("lambdaExpression.kt") + public void testLambdaExpression() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/lambdaExpression.kt"); + } + + @Test + @TestMetadata("nullableDefaultType.kt") + public void testNullableDefaultType() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/nullableDefaultType.kt"); + } + + @Test + @TestMetadata("packageQualifier.kt") + public void testPackageQualifier() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/packageQualifier.kt"); + } + + @Test + @TestMetadata("singleTypedExpression.kt") + public void testSingleTypedExpression() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/singleTypedExpression.kt"); + } + + @Test + @TestMetadata("suspendFunctionCall.kt") + public void testSuspendFunctionCall() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/suspendFunctionCall.kt"); + } + + @Test + @TestMetadata("typeQualifier.kt") + public void testTypeQualifier() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/typeQualifier.kt"); + } + + @Test + @TestMetadata("variableDeclaration.kt") + public void testVariableDeclaration() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/variableDeclaration.kt"); + } + + @Test + @TestMetadata("while.kt") + public void testWhile() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/while.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs") + @TestDataPath("$PROJECT_ROOT") + public class LanguageConstructs { + @Test + public void testAllFilesPresentInLanguageConstructs() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("arrayLiteral.kt") + public void testArrayLiteral() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/arrayLiteral.kt"); + } + + @Test + @TestMetadata("labeledReturn.kt") + public void testLabeledReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/labeledReturn.kt"); + } + + @Test + @TestMetadata("nonLocalReturn.kt") + public void testNonLocalReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn.kt"); + } + + @Test + @TestMetadata("nonLocalReturn2.kt") + public void testNonLocalReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn2.kt"); + } + + @Test + @TestMetadata("parameter.kt") + public void testParameter() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameter.kt"); + } + + @Test + @TestMetadata("parameterDefaultValue.kt") + public void testParameterDefaultValue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameterDefaultValue.kt"); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/return.kt"); + } + + @Test + @TestMetadata("trailingSemicolon.kt") + public void testTrailingSemicolon() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/trailingSemicolon.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables") + @TestDataPath("$PROJECT_ROOT") + public class Variables { + @Test + public void testAllFilesPresentInVariables() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("arrayElementAugmentedReassignment.kt") + public void testArrayElementAugmentedReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementAugmentedReassignment.kt"); + } + + @Test + @TestMetadata("arrayElementIncrementPostfix.kt") + public void testArrayElementIncrementPostfix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPostfix.kt"); + } + + @Test + @TestMetadata("arrayElementIncrementPrefix.kt") + public void testArrayElementIncrementPrefix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPrefix.kt"); + } + + @Test + @TestMetadata("augmentedReassignment.kt") + public void testAugmentedReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/augmentedReassignment.kt"); + } + + @Test + @TestMetadata("classPropertyReassignment.kt") + public void testClassPropertyReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/classPropertyReassignment.kt"); + } + + @Test + @TestMetadata("conditionalReassignment.kt") + public void testConditionalReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/conditionalReassignment.kt"); + } + + @Test + @TestMetadata("destructuredReassignment.kt") + public void testDestructuredReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/destructuredReassignment.kt"); + } + + @Test + @TestMetadata("errorTargetReassignment.kt") + public void testErrorTargetReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/errorTargetReassignment.kt"); + } + + @Test + @TestMetadata("incrementPostfix.kt") + public void testIncrementPostfix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPostfix.kt"); + } + + @Test + @TestMetadata("incrementPrefix.kt") + public void testIncrementPrefix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPrefix.kt"); + } + + @Test + @TestMetadata("lambdaParameterReassignment.kt") + public void testLambdaParameterReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/lambdaParameterReassignment.kt"); + } + + @Test + @TestMetadata("localVariable.kt") + public void testLocalVariable() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/localVariable.kt"); + } + + @Test + @TestMetadata("parameterReassignment.kt") + public void testParameterReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/parameterReassignment.kt"); + } + + @Test + @TestMetadata("simpleReassignment.kt") + public void testSimpleReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/simpleReassignment.kt"); + } + + @Test + @TestMetadata("topLevelPropertyReassignment.kt") + public void testTopLevelPropertyReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/topLevelPropertyReassignment.kt"); + } + } +} diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/dataFlowInfoProvider/AbstractExitPointSnapshotTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/dataFlowInfoProvider/AbstractExitPointSnapshotTest.kt new file mode 100644 index 00000000000..57c4f027fc1 --- /dev/null +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/dataFlowInfoProvider/AbstractExitPointSnapshotTest.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.dataFlowInfoProvider + +import com.intellij.openapi.util.TextRange +import com.intellij.psi.PsiElement +import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.kotlin.analysis.api.KtAnalysisNonPublicApi +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.stringRepresentation +import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest +import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.psiUtil.startOffset +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.assertions + +abstract class AbstractExitPointSnapshotTest : AbstractAnalysisApiBasedTest() { + override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) { + val textRange = testServices.expressionMarkerProvider.getSelectedRange(mainFile) + val statements = findStatements(mainFile, textRange) + + @OptIn(KtAnalysisNonPublicApi::class) + val actualText = analyseForTest(mainFile) { + val snapshot = getExitPointSnapshot(statements) + stringRepresentation(snapshot) + } + + testServices.assertions.assertEqualsToTestDataFileSibling(actualText) + } + + private fun findStatements(mainFile: KtFile, textRange: TextRange): List { + var candidate = PsiTreeUtil.findElementOfClassAtOffset(mainFile, textRange.startOffset, KtExpression::class.java, true) + ?: error("Cannot find a starting element in range $textRange") + + while (true) { + val parent = candidate.parent + if (parent is KtExpression && parent.textRange in textRange && parent.startOffset == candidate.startOffset) { + candidate = parent + } else { + break + } + } + + return generateSequence(candidate) { it.nextSibling } + .filterIsInstance() + .filter { it.textRange in textRange } + .toList() + } +} \ No newline at end of file diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirStandaloneNormalAnalysisSourceModuleExitPointSnapshotTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirStandaloneNormalAnalysisSourceModuleExitPointSnapshotTestGenerated.java new file mode 100644 index 00000000000..d68961cb4e8 --- /dev/null +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/dataFlowInfoProvider/FirStandaloneNormalAnalysisSourceModuleExitPointSnapshotTestGenerated.java @@ -0,0 +1,594 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.standalone.fir.test.cases.generated.cases.components.dataFlowInfoProvider; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.standalone.fir.test.configurators.AnalysisApiFirStandaloneModeTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.dataFlowInfoProvider.AbstractExitPointSnapshotTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot") +@TestDataPath("$PROJECT_ROOT") +public class FirStandaloneNormalAnalysisSourceModuleExitPointSnapshotTestGenerated extends AbstractExitPointSnapshotTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirStandaloneModeTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Standalone + ) + ); + } + + @Test + public void testAllFilesPresentInExitPointSnapshot() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow") + @TestDataPath("$PROJECT_ROOT") + public class ControlFlow { + @Test + public void testAllFilesPresentInControlFlow() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("breakContinue.kt") + public void testBreakContinue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakContinue.kt"); + } + + @Test + @TestMetadata("breakReturn.kt") + public void testBreakReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn.kt"); + } + + @Test + @TestMetadata("breakReturn2.kt") + public void testBreakReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn2.kt"); + } + + @Test + @TestMetadata("continueReturn.kt") + public void testContinueReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn.kt"); + } + + @Test + @TestMetadata("continueReturn2.kt") + public void testContinueReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn2.kt"); + } + + @Test + @TestMetadata("defaultTryCatch.kt") + public void testDefaultTryCatch() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch.kt"); + } + + @Test + @TestMetadata("defaultTryCatch2.kt") + public void testDefaultTryCatch2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch2.kt"); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps") + @TestDataPath("$PROJECT_ROOT") + public class ConditionalJumps { + @Test + public void testAllFilesPresentInConditionalJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("break.kt") + public void testBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break.kt"); + } + + @Test + @TestMetadata("break2.kt") + public void testBreak2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break2.kt"); + } + + @Test + @TestMetadata("break3.kt") + public void testBreak3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break3.kt"); + } + + @Test + @TestMetadata("break4.kt") + public void testBreak4() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break4.kt"); + } + + @Test + @TestMetadata("break5.kt") + public void testBreak5() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break5.kt"); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return.kt"); + } + + @Test + @TestMetadata("return2.kt") + public void testReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return2.kt"); + } + + @Test + @TestMetadata("return3.kt") + public void testReturn3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return3.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps") + @TestDataPath("$PROJECT_ROOT") + public class DefiniteJumps { + @Test + public void testAllFilesPresentInDefiniteJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return.kt"); + } + + @Test + @TestMetadata("return2.kt") + public void testReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return2.kt"); + } + + @Test + @TestMetadata("return3.kt") + public void testReturn3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return3.kt"); + } + + @Test + @TestMetadata("return4.kt") + public void testReturn4() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return4.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets") + @TestDataPath("$PROJECT_ROOT") + public class DifferentTargets { + @Test + public void testAllFilesPresentInDifferentTargets() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("break.kt") + public void testBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/break.kt"); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/return.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence") + @TestDataPath("$PROJECT_ROOT") + public class ExitPointEquivalence { + @Test + public void testAllFilesPresentInExitPointEquivalence() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("breakAndReturn.kt") + public void testBreakAndReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakAndReturn.kt"); + } + + @Test + @TestMetadata("breakContinueAndDefault.kt") + public void testBreakContinueAndDefault() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakContinueAndDefault.kt"); + } + + @Test + @TestMetadata("continueAndReturn.kt") + public void testContinueAndReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/continueAndReturn.kt"); + } + + @Test + @TestMetadata("defaultAndBreak.kt") + public void testDefaultAndBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndBreak.kt"); + } + + @Test + @TestMetadata("defaultAndContinue.kt") + public void testDefaultAndContinue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndContinue.kt"); + } + + @Test + @TestMetadata("defaultAndReturn.kt") + public void testDefaultAndReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturn.kt"); + } + + @Test + @TestMetadata("defaultAndReturnInWhen.kt") + public void testDefaultAndReturnInWhen() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen.kt"); + } + + @Test + @TestMetadata("defaultAndReturnInWhen2.kt") + public void testDefaultAndReturnInWhen2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen2.kt"); + } + + @Test + @TestMetadata("multipleBreaks.kt") + public void testMultipleBreaks() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/multipleBreaks.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps") + @TestDataPath("$PROJECT_ROOT") + public class UnconditionalJumps { + @Test + public void testAllFilesPresentInUnconditionalJumps() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("break.kt") + public void testBreak() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break.kt"); + } + + @Test + @TestMetadata("break2.kt") + public void testBreak2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break2.kt"); + } + + @Test + @TestMetadata("break3.kt") + public void testBreak3() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break3.kt"); + } + + @Test + @TestMetadata("break4.kt") + public void testBreak4() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break4.kt"); + } + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues") + @TestDataPath("$PROJECT_ROOT") + public class DefaultValues { + @Test + public void testAllFilesPresentInDefaultValues() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("anonymousFunction.kt") + public void testAnonymousFunction() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousFunction.kt"); + } + + @Test + @TestMetadata("anonymousObject.kt") + public void testAnonymousObject() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousObject.kt"); + } + + @Test + @TestMetadata("assignmentTarget.kt") + public void testAssignmentTarget() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentTarget.kt"); + } + + @Test + @TestMetadata("assignmentValue.kt") + public void testAssignmentValue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentValue.kt"); + } + + @Test + @TestMetadata("calleeExpression.kt") + public void testCalleeExpression() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/calleeExpression.kt"); + } + + @Test + @TestMetadata("errorDefaultType.kt") + public void testErrorDefaultType() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/errorDefaultType.kt"); + } + + @Test + @TestMetadata("expressionBlock.kt") + public void testExpressionBlock() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/expressionBlock.kt"); + } + + @Test + @TestMetadata("flexibleDefaultType.kt") + public void testFlexibleDefaultType() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/flexibleDefaultType.kt"); + } + + @Test + @TestMetadata("functionBodyBlock.kt") + public void testFunctionBodyBlock() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionBodyBlock.kt"); + } + + @Test + @TestMetadata("functionCall.kt") + public void testFunctionCall() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionCall.kt"); + } + + @Test + @TestMetadata("infixOperator.kt") + public void testInfixOperator() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/infixOperator.kt"); + } + + @Test + @TestMetadata("lambdaExpression.kt") + public void testLambdaExpression() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/lambdaExpression.kt"); + } + + @Test + @TestMetadata("nullableDefaultType.kt") + public void testNullableDefaultType() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/nullableDefaultType.kt"); + } + + @Test + @TestMetadata("packageQualifier.kt") + public void testPackageQualifier() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/packageQualifier.kt"); + } + + @Test + @TestMetadata("singleTypedExpression.kt") + public void testSingleTypedExpression() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/singleTypedExpression.kt"); + } + + @Test + @TestMetadata("suspendFunctionCall.kt") + public void testSuspendFunctionCall() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/suspendFunctionCall.kt"); + } + + @Test + @TestMetadata("typeQualifier.kt") + public void testTypeQualifier() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/typeQualifier.kt"); + } + + @Test + @TestMetadata("variableDeclaration.kt") + public void testVariableDeclaration() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/variableDeclaration.kt"); + } + + @Test + @TestMetadata("while.kt") + public void testWhile() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/while.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs") + @TestDataPath("$PROJECT_ROOT") + public class LanguageConstructs { + @Test + public void testAllFilesPresentInLanguageConstructs() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("arrayLiteral.kt") + public void testArrayLiteral() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/arrayLiteral.kt"); + } + + @Test + @TestMetadata("labeledReturn.kt") + public void testLabeledReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/labeledReturn.kt"); + } + + @Test + @TestMetadata("nonLocalReturn.kt") + public void testNonLocalReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn.kt"); + } + + @Test + @TestMetadata("nonLocalReturn2.kt") + public void testNonLocalReturn2() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn2.kt"); + } + + @Test + @TestMetadata("parameter.kt") + public void testParameter() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameter.kt"); + } + + @Test + @TestMetadata("parameterDefaultValue.kt") + public void testParameterDefaultValue() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameterDefaultValue.kt"); + } + + @Test + @TestMetadata("return.kt") + public void testReturn() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/return.kt"); + } + + @Test + @TestMetadata("trailingSemicolon.kt") + public void testTrailingSemicolon() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/trailingSemicolon.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables") + @TestDataPath("$PROJECT_ROOT") + public class Variables { + @Test + public void testAllFilesPresentInVariables() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("arrayElementAugmentedReassignment.kt") + public void testArrayElementAugmentedReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementAugmentedReassignment.kt"); + } + + @Test + @TestMetadata("arrayElementIncrementPostfix.kt") + public void testArrayElementIncrementPostfix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPostfix.kt"); + } + + @Test + @TestMetadata("arrayElementIncrementPrefix.kt") + public void testArrayElementIncrementPrefix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPrefix.kt"); + } + + @Test + @TestMetadata("augmentedReassignment.kt") + public void testAugmentedReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/augmentedReassignment.kt"); + } + + @Test + @TestMetadata("classPropertyReassignment.kt") + public void testClassPropertyReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/classPropertyReassignment.kt"); + } + + @Test + @TestMetadata("conditionalReassignment.kt") + public void testConditionalReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/conditionalReassignment.kt"); + } + + @Test + @TestMetadata("destructuredReassignment.kt") + public void testDestructuredReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/destructuredReassignment.kt"); + } + + @Test + @TestMetadata("errorTargetReassignment.kt") + public void testErrorTargetReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/errorTargetReassignment.kt"); + } + + @Test + @TestMetadata("incrementPostfix.kt") + public void testIncrementPostfix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPostfix.kt"); + } + + @Test + @TestMetadata("incrementPrefix.kt") + public void testIncrementPrefix() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPrefix.kt"); + } + + @Test + @TestMetadata("lambdaParameterReassignment.kt") + public void testLambdaParameterReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/lambdaParameterReassignment.kt"); + } + + @Test + @TestMetadata("localVariable.kt") + public void testLocalVariable() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/localVariable.kt"); + } + + @Test + @TestMetadata("parameterReassignment.kt") + public void testParameterReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/parameterReassignment.kt"); + } + + @Test + @TestMetadata("simpleReassignment.kt") + public void testSimpleReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/simpleReassignment.kt"); + } + + @Test + @TestMetadata("topLevelPropertyReassignment.kt") + public void testTopLevelPropertyReassignment() { + runTest("analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/topLevelPropertyReassignment.kt"); + } + } +} diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt index 49c02c71dd1..10b2768bd27 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt @@ -92,7 +92,8 @@ public abstract class KtAnalysisSession(final override val token: KtLifetimeToke KtResolveExtensionInfoProviderMixIn, KtCompilerFacilityMixIn, KtMetadataCalculatorMixIn, - KtSubstitutorProviderMixIn { + KtSubstitutorProviderMixIn, + KtDataFlowInfoProviderMixin { public abstract val useSiteModule: KtModule @@ -213,6 +214,11 @@ public abstract class KtAnalysisSession(final override val token: KtLifetimeToke internal val substitutorProvider: KtSubstitutorProvider get() = substitutorProviderImpl protected abstract val substitutorProviderImpl: KtSubstitutorProvider + + @KtAnalysisNonPublicApi + internal val dataFlowInfoProvider: KtDataFlowInfoProvider get() = dataFlowInfoProviderImpl + @KtAnalysisNonPublicApi + protected abstract val dataFlowInfoProviderImpl: KtDataFlowInfoProvider } public fun KtAnalysisSession.getModule(element: PsiElement): KtModule { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtDataFlowInfoProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtDataFlowInfoProvider.kt new file mode 100644 index 00000000000..a5cd46a1039 --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtDataFlowInfoProvider.kt @@ -0,0 +1,103 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.components + +import org.jetbrains.kotlin.analysis.api.KtAnalysisNonPublicApi +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol +import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtReturnExpression + +@KtAnalysisNonPublicApi +public abstract class KtDataFlowInfoProvider : KtAnalysisSessionComponent() { + public abstract fun getExitPointSnapshot(statements: List): KtDataFlowExitPointSnapshot +} + +@KtAnalysisNonPublicApi +public interface KtDataFlowInfoProviderMixin : KtAnalysisSessionMixIn { + public fun getExitPointSnapshot(statements: List): KtDataFlowExitPointSnapshot = withValidityAssertion { + return analysisSession.dataFlowInfoProvider.getExitPointSnapshot(statements) + } +} + +@KtAnalysisNonPublicApi +public class KtDataFlowExitPointSnapshot( + /** + * A default expression, if any. + * @see [DefaultExpressionInfo] for more information. + */ + public val defaultExpressionInfo: DefaultExpressionInfo?, + + /** + * A list of [KtReturnExpression]s that return a value. + */ + public val valuedReturnExpressions: List, + + /** + * A common supertype of values returned in [valuedReturnExpressions]. + */ + public val returnValueType: KtType?, + + /** + * `break` and `continue` jump expressions. + * @see [hasJumps] for the definition of jumps. + */ + public val loopJumpExpressions: List, + + /** + * `true` if there are any control-flow statements that jump outside given statements. + * Jumps include both loop jumps (`break` and `continue`) and `return`s. + * Conditional blocks (`if`) and `throw`s are not considered as jumps. + */ + public val hasJumps: Boolean, + + /** + * `true` if next-executed instructions for the potential default expression and jump expressions are different. + */ + public val hasEscapingJumps: Boolean, + + /** + * `true` if there are jumps of different kinds (e.g., there is both a `break` and a `return`). + */ + public val hasMultipleJumpKinds: Boolean, + + /** + * `true` if two or more jumps have different next-executed instructions. Such as, there are both inner and outer loop `break`s. + */ + public val hasMultipleJumpTargets: Boolean, + + /** + * local variable reassignments found in given statements. + */ + public val variableReassignments: List +) { + /** + * Represents a default expression (generally, a last given statement if it has a meaningful result type). + * Expressions that always return [Nothing], such as `return`, `break`, `continue` or `throw`, cannot be default expressions. + */ + public class DefaultExpressionInfo( + /** The default expression. */ + public val expression: KtExpression, + + /** The default expression type. */ + public val type: KtType + ) + + /** + * Represents a local variable reassignment. + */ + public class VariableReassignment( + /** The reassignment expression. */ + public val expression: KtExpression, + + /** Reassigned variable symbol. */ + public val variable: KtVariableLikeSymbol, + + /** `true` if the variable is both read and set (as in `x += y` or `x++`). */ + public val isAugmented: Boolean + ) +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakContinue.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakContinue.kt new file mode 100644 index 00000000000..7a5a88639b5 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakContinue.kt @@ -0,0 +1,16 @@ +fun test() { + while (cond()) { + if (foo() == 5) { + break + } else if (foo() == 6) { + continue + } + consume("foo") + } +} + +fun cond(): Boolean = true + +fun foo(): Int = 0 + +fun consume(text: String?) = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakContinue.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakContinue.txt new file mode 100644 index 00000000000..148c6cd5012 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakContinue.txt @@ -0,0 +1,19 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = if (foo() == 5) { + break + } else if (foo() == 6) { + continue + } + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = true + hasMultipleJumpTargets = false + loopJumpExpressions = [ + break, + continue + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn.kt new file mode 100644 index 00000000000..af5c1cc7480 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn.kt @@ -0,0 +1,16 @@ +fun test() { + while (cond()) { + if (foo() == 5) { + break + } else if (foo() == 6) { + return + } + consume("foo") + } +} + +fun cond(): Boolean = true + +fun foo(): Int = 0 + +fun consume(text: String?) = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn.txt new file mode 100644 index 00000000000..66857a1471f --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn.txt @@ -0,0 +1,18 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = if (foo() == 5) { + break + } else if (foo() == 6) { + return + } + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = true + hasMultipleJumpTargets = true + loopJumpExpressions = [ + break + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn2.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn2.kt new file mode 100644 index 00000000000..7c82efa63aa --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn2.kt @@ -0,0 +1,18 @@ +fun test(): Int { + while (cond()) { + if (foo() == 5) { + return 1 + } else if (foo() == 6) { + break + } + consume("foo") + } + + return 0 +} + +fun cond(): Boolean = true + +fun foo(): Int = 0 + +fun consume(text: String?) = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn2.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn2.txt new file mode 100644 index 00000000000..74d3b05599c --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/breakReturn2.txt @@ -0,0 +1,20 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = if (foo() == 5) { + return 1 + } else if (foo() == 6) { + break + } + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = true + hasMultipleJumpTargets = true + loopJumpExpressions = [ + break + ] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return 1 + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break.kt new file mode 100644 index 00000000000..714893235d4 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break.kt @@ -0,0 +1,10 @@ +// WITH_STDLIB + +fun test(a: Int): Int { + val b: Int = a + 10 + for (n in 1..b) { + if (n > 5) throw Exception("") + if (a + n > b) break + println(b - n) + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break.txt new file mode 100644 index 00000000000..c28ccd54ab7 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break.txt @@ -0,0 +1,14 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = println(b - n) + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [ + break + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break2.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break2.kt new file mode 100644 index 00000000000..320967143d8 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break2.kt @@ -0,0 +1,12 @@ +fun foo(a: Int): Int { + val b: Int = 1 + for (n in 1..a) { + if (a + b > 0) break + consume(a - b) + if (a - b > 0) break + consume(a + b) + } + return 1 +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break2.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break2.txt new file mode 100644 index 00000000000..faa5ad3cb41 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break2.txt @@ -0,0 +1,15 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = consume(a + b) + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [ + break, + break + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break3.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break3.kt new file mode 100644 index 00000000000..9d2f2ebd751 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break3.kt @@ -0,0 +1,15 @@ +fun foo(a: Int): Int { + val b: Int = 1 + for (n in 1..a) { + if (a + b > 0) break + val c: Int + consume(a - b) + if (a - b > 0) break + consume(a + b) + c = 1 + consume(c) + } + return 1 +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break3.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break3.txt new file mode 100644 index 00000000000..faa5ad3cb41 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break3.txt @@ -0,0 +1,15 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = consume(a + b) + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [ + break, + break + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break4.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break4.kt new file mode 100644 index 00000000000..47ecba242b7 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break4.kt @@ -0,0 +1,14 @@ +fun foo(a: Int): Int { + val b: Int = 1 + for (n in 1..a) { + if (a + b > 0) break + else { + consume(a - b) + if (a - b > 0) break else consume(a + b) + } + + } + return 1 +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break4.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break4.txt new file mode 100644 index 00000000000..ad9c33594c8 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break4.txt @@ -0,0 +1,19 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = if (a + b > 0) break + else { + consume(a - b) + if (a - b > 0) break else consume(a + b) + } + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [ + break, + break + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break5.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break5.kt new file mode 100644 index 00000000000..4049a1b05d1 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break5.kt @@ -0,0 +1,13 @@ +fun foo(a: Int): Int { + val b: Int = 1 + for (n in 1..a) { + when { + a + b > 0 -> break + a - b > 0 -> break + else -> consume(0) + } + } + return 1 +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break5.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break5.txt new file mode 100644 index 00000000000..fef8b17c112 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/break5.txt @@ -0,0 +1,19 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = when { + a + b > 0 -> break + a - b > 0 -> break + else -> consume(0) + } + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [ + break, + break + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return.kt new file mode 100644 index 00000000000..17a230d813d --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return.kt @@ -0,0 +1,8 @@ +fun foo(a: Int): Int { + val b: Int = 1 + if (a + b > 0) return 0 + consume(a - b) + return 1 +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return.txt new file mode 100644 index 00000000000..41125373f0e --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return.txt @@ -0,0 +1,14 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = consume(a - b) + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return 0 + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return2.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return2.kt new file mode 100644 index 00000000000..568af1d6a9c --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return2.kt @@ -0,0 +1,12 @@ +fun foo(a: Int): Int { + val b: Int = 1 + when (a + b) { + 0 -> return 0 + 1 -> consume(1) + else -> consume(2) + } + + return 1 +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return2.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return2.txt new file mode 100644 index 00000000000..25b5d962d25 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return2.txt @@ -0,0 +1,18 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = when (a + b) { + 0 -> return 0 + 1 -> consume(1) + else -> consume(2) + } + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return 0 + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return3.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return3.kt new file mode 100644 index 00000000000..97ba9577ae0 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return3.kt @@ -0,0 +1,9 @@ +fun foo(a: Int): Int { + val b: Int = 1 + if (a + b > 0) return 0 + else if (a - b < 0) consume(a - b) + else consume(0) + return 1 +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return3.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return3.txt new file mode 100644 index 00000000000..48d160ca669 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/conditionalJumps/return3.txt @@ -0,0 +1,16 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = if (a + b > 0) return 0 + else if (a - b < 0) consume(a - b) + else consume(0) + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return 0 + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn.kt new file mode 100644 index 00000000000..c9ab83576a4 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn.kt @@ -0,0 +1,16 @@ +fun test() { + while (cond()) { + if (foo() == 5) { + continue + } else if (foo() == 6) { + return + } + consume("foo") + } +} + +fun cond(): Boolean = true + +fun foo(): Int = 0 + +fun consume(text: String?) = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn.txt new file mode 100644 index 00000000000..3b67bf16d43 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn.txt @@ -0,0 +1,18 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = if (foo() == 5) { + continue + } else if (foo() == 6) { + return + } + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = true + hasMultipleJumpTargets = true + loopJumpExpressions = [ + continue + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn2.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn2.kt new file mode 100644 index 00000000000..8508afe5d85 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn2.kt @@ -0,0 +1,18 @@ +fun test(): Int { + while (cond()) { + if (foo() == 5) { + return 1 + } else if (foo() == 6) { + continue + } + consume("foo") + } + + return 0 +} + +fun cond(): Boolean = true + +fun foo(): Int = 0 + +fun consume(text: String?) = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn2.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn2.txt new file mode 100644 index 00000000000..74e211ad5e9 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/continueReturn2.txt @@ -0,0 +1,20 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = if (foo() == 5) { + return 1 + } else if (foo() == 6) { + continue + } + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = true + hasMultipleJumpTargets = true + loopJumpExpressions = [ + continue + ] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return 1 + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch.kt new file mode 100644 index 00000000000..a2c25339fed --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch.kt @@ -0,0 +1,20 @@ +// WITH_STDLIB + +fun test() { + consume(1) + try { + dangerous() + } catch (e: FooException) { + consume(e.message?.length ?: 0) + "error" + } +} + +fun consume(n: Int) {} + +@Throws(FooException::class) +fun dangerous(): String { + return "foo" +} + +class FooException : Exception() \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch.txt new file mode 100644 index 00000000000..50610a646ea --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch.txt @@ -0,0 +1,17 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = try { + dangerous() + } catch (e: FooException) { + consume(e.message?.length ?: 0) + "error" + } + type = kotlin.String + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch2.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch2.kt new file mode 100644 index 00000000000..59de0431234 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch2.kt @@ -0,0 +1,20 @@ +// WITH_STDLIB + +fun test() { + consume(1) + try { + dangerous() + } catch (e: FooException) { + consume(e.message?.length ?: 0) + throw e + } +} + +fun consume(n: Int) {} + +@Throws(FooException::class) +fun dangerous(): String { + return "foo" +} + +class FooException : Exception() \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch2.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch2.txt new file mode 100644 index 00000000000..6eb0457e41e --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/defaultTryCatch2.txt @@ -0,0 +1,17 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = try { + dangerous() + } catch (e: FooException) { + consume(e.message?.length ?: 0) + throw e + } + type = kotlin.String + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return.kt new file mode 100644 index 00000000000..3dae453bc88 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return.kt @@ -0,0 +1,6 @@ +fun foo(a: Int): Int { + val b: Int = 1 + if (a + b > 0) return 1 + else if (a - b < 0) return 2 + else return b +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return.txt new file mode 100644 index 00000000000..24706c50c83 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return.txt @@ -0,0 +1,14 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return 1, + return 2, + return b + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return2.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return2.kt new file mode 100644 index 00000000000..b42f4ff059d --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return2.kt @@ -0,0 +1,8 @@ +fun foo(a: Int): Int { + val b: Int = 1 + when (a + b) { + 0 -> return b + 1 -> return -b + else -> return a - b + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return2.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return2.txt new file mode 100644 index 00000000000..1de2225f70c --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return2.txt @@ -0,0 +1,14 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return b, + return -b, + return a - b + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return3.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return3.kt new file mode 100644 index 00000000000..b6ca0cbdd28 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return3.kt @@ -0,0 +1,6 @@ +fun foo(a: Int): Int { + a.let { + if (it > 0) return it else return@foo -it + } + return 0 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return3.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return3.txt new file mode 100644 index 00000000000..3666b5d6650 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return3.txt @@ -0,0 +1,13 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return it, + return@foo -it + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return4.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return4.kt new file mode 100644 index 00000000000..15d3cc11c62 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return4.kt @@ -0,0 +1,6 @@ +fun foo(a: Int): Int { + a.let { + if (it > 0) return@foo it else return -it + } + return 0 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return4.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return4.txt new file mode 100644 index 00000000000..80bc084d12a --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/definiteJumps/return4.txt @@ -0,0 +1,13 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return@foo it, + return -it + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/break.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/break.kt new file mode 100644 index 00000000000..25c5aaf0de8 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/break.kt @@ -0,0 +1,17 @@ +fun test() { + outer@ while (cond()) { + consume(1) + while (cond()) { + consume(2) + if (cond()) { + break + } else if (cond()) { + break@outer + } + } + } +} + +fun consume(obj: Any?) {} + +fun cond(): Boolean = true \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/break.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/break.txt new file mode 100644 index 00000000000..c20eddb7cbf --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/break.txt @@ -0,0 +1,19 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = if (cond()) { + break + } else if (cond()) { + break@outer + } + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = true + loopJumpExpressions = [ + break, + break@outer + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/return.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/return.kt new file mode 100644 index 00000000000..5599e56c3f5 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/return.kt @@ -0,0 +1,16 @@ +fun test(flag: Boolean): Int { + block { + if (flag) { + return 1 + } + + consume("foo") + return@block + } + + return 0 +} + +inline fun block(block: () -> Unit) {} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/return.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/return.txt new file mode 100644 index 00000000000..cf3077c14d3 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/differentTargets/return.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = true + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return 1 + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakAndReturn.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakAndReturn.kt new file mode 100644 index 00000000000..c760e27dfc6 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakAndReturn.kt @@ -0,0 +1,11 @@ +fun foo(a: Int) { + val b: Int = 1 + for (n in 1..b) { + if (a > 0) throw Exception("") + if (a + b > 0) break + consume(a - b) + return + } +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakAndReturn.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakAndReturn.txt new file mode 100644 index 00000000000..56f8dc3b095 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakAndReturn.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = true + hasMultipleJumpKinds = true + hasMultipleJumpTargets = true + loopJumpExpressions = [ + break + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakContinueAndDefault.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakContinueAndDefault.kt new file mode 100644 index 00000000000..f45cb7d83ad --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakContinueAndDefault.kt @@ -0,0 +1,10 @@ +fun foo(a: Int) { + val b: Int = 1 + loop1@ for (p in 1..b) { + loop2@ for (n in 1..b) { + if (a > 0) throw Exception("") + if (a + b > 0) break@loop2 + if (a - b > 0) continue@loop1 + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakContinueAndDefault.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakContinueAndDefault.txt new file mode 100644 index 00000000000..2850dc95475 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/breakContinueAndDefault.txt @@ -0,0 +1,15 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = if (a - b > 0) continue@loop1 + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = true + hasMultipleJumpTargets = true + loopJumpExpressions = [ + break@loop2, + continue@loop1 + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/continueAndReturn.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/continueAndReturn.kt new file mode 100644 index 00000000000..15ab6258ee6 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/continueAndReturn.kt @@ -0,0 +1,11 @@ +fun foo(a: Int) { + val b: Int = 1 + for (n in 1..b) { + if (a > 0) throw Exception("") + if (a + b > 0) continue + consume(a - b) + return + } +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/continueAndReturn.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/continueAndReturn.txt new file mode 100644 index 00000000000..571e3cd335f --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/continueAndReturn.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = true + hasMultipleJumpTargets = true + loopJumpExpressions = [ + continue + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndBreak.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndBreak.kt new file mode 100644 index 00000000000..530b16b239a --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndBreak.kt @@ -0,0 +1,10 @@ +fun foo(a: Int) { + val b: Int = 1 + for (n in 1..b) { + if (a > 0) throw Exception("") + if (a + b > 0) break + consume(a - b) + } +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndBreak.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndBreak.txt new file mode 100644 index 00000000000..9c173754973 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndBreak.txt @@ -0,0 +1,14 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = consume(a - b) + type = kotlin.Unit + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [ + break + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndContinue.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndContinue.kt new file mode 100644 index 00000000000..5b41c301a2b --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndContinue.kt @@ -0,0 +1,10 @@ +fun foo(a: Int) { + val b: Int = 1 + for (n in 1..b) { + if (a > 0) throw Exception("") + if (a + b > 0) continue + consume(a - b) + } +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndContinue.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndContinue.txt new file mode 100644 index 00000000000..5d193f63f72 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndContinue.txt @@ -0,0 +1,14 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = consume(a - b) + type = kotlin.Unit + hasEscapingJumps = false + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [ + continue + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturn.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturn.kt new file mode 100644 index 00000000000..7b0de4f9ace --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturn.kt @@ -0,0 +1,9 @@ +fun foo(a: Int) { + val b: Int = 1 + + if (a > 0) throw Exception("") + if (b + a > 0) return + consume(a - b) +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturn.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturn.txt new file mode 100644 index 00000000000..8bbe2f05ed5 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturn.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = consume(a - b) + type = kotlin.Unit + hasEscapingJumps = false + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen.kt new file mode 100644 index 00000000000..34044db8706 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen.kt @@ -0,0 +1,16 @@ +fun example(i: Int) { + when (i) { + 1 -> { + if (i > 5) { + consume("true") + } + else { + consume("false") + return + } + consume("!!") + } + } +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen.txt new file mode 100644 index 00000000000..0b3f2467c45 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = consume("!!") + type = kotlin.Unit + hasEscapingJumps = false + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen2.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen2.kt new file mode 100644 index 00000000000..887e73ae276 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen2.kt @@ -0,0 +1,19 @@ +fun example(i: Int) { + when (i) { + 1 -> { + if (i > 5) { + consume("true") + } + else { + consume("false") + return + } + consume("!!") + } + 2 -> { + consume("another") + } + } +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen2.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen2.txt new file mode 100644 index 00000000000..0b3f2467c45 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/defaultAndReturnInWhen2.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = consume("!!") + type = kotlin.Unit + hasEscapingJumps = false + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/multipleBreaks.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/multipleBreaks.kt new file mode 100644 index 00000000000..2d94cd86838 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/multipleBreaks.kt @@ -0,0 +1,13 @@ +fun foo(a: Int) { + val b: Int = 1 + loop1@ for (p in 1..b) { + loop2@ for (n in 1..b) { + if (a > 0) throw Exception("") + if (a + b > 0) break@loop1 + consume(a - b) + break@loop2 + } + } +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/multipleBreaks.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/multipleBreaks.txt new file mode 100644 index 00000000000..2950838c1a5 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/exitPointEquivalence/multipleBreaks.txt @@ -0,0 +1,13 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = true + loopJumpExpressions = [ + break@loop1, + break@loop2 + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break.kt new file mode 100644 index 00000000000..789c1840982 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break.kt @@ -0,0 +1,10 @@ +fun test() { + x@ while (cond()) { + consume(5) + break@x + } +} + +fun cond(): Boolean = true + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break.txt new file mode 100644 index 00000000000..b6ce3e11293 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [ + break@x + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break2.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break2.kt new file mode 100644 index 00000000000..f6988c1e765 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break2.kt @@ -0,0 +1,11 @@ +fun foo(a: Int): Int { + val b: Int = 1 + for (n in 1..a) { + if (a + b > 0) break + consume(a - b) + break + } + return 1 +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break2.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break2.txt new file mode 100644 index 00000000000..56db0ba5d50 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break2.txt @@ -0,0 +1,13 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [ + break, + break + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break3.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break3.kt new file mode 100644 index 00000000000..c08e0d650f7 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break3.kt @@ -0,0 +1,13 @@ +fun foo(a: Int): Int { + val b: Int = 1 + for (n in 1..a) { + if (a + b > 0) break + else { + consume(a - b) + break + } + } + return 1 +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break3.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break3.txt new file mode 100644 index 00000000000..5ed7e1645aa --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break3.txt @@ -0,0 +1,13 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [ + break, + break + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break4.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break4.kt new file mode 100644 index 00000000000..ba0119b5135 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break4.kt @@ -0,0 +1,16 @@ +fun foo(a: Int): Int { + val b: Int = 1 + for (n in 1..a) { + when { + a + b > 0 -> break + a - b > 0 -> break + else -> { + consume(0) + break + } + } + } + return 1 +} + +fun consume(obj: Any?) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break4.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break4.txt new file mode 100644 index 00000000000..7c0b006ad11 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/controlFlow/unconditionalJumps/break4.txt @@ -0,0 +1,14 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [ + break, + break, + break + ] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousFunction.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousFunction.kt new file mode 100644 index 00000000000..4aa3928e76c --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousFunction.kt @@ -0,0 +1,5 @@ +fun test() { + fun(n: Int): Int { + return n + 1 + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousFunction.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousFunction.txt new file mode 100644 index 00000000000..580393f00a4 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousFunction.txt @@ -0,0 +1,14 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = fun(n: Int): Int { + return n + 1 + } + type = kotlin.Function1 + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousObject.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousObject.kt new file mode 100644 index 00000000000..cf203cd8761 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousObject.kt @@ -0,0 +1,5 @@ +fun test() { + object { + fun foo() {} + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousObject.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousObject.txt new file mode 100644 index 00000000000..fc54b1dd79b --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/anonymousObject.txt @@ -0,0 +1,14 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = object { + fun foo() {} + } + type = + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentTarget.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentTarget.kt new file mode 100644 index 00000000000..bd63bfa1c29 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentTarget.kt @@ -0,0 +1,17 @@ +fun test() { + buildFoo { + value = produceString() + } +} + +fun buildFoo(builder: Foo.() -> Unit): Foo { + val foo = Foo() + foo.builder() + return foo +} + +fun Foo { + var value: String? = null +} + +fun produceString(): String = "" \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentTarget.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentTarget.txt new file mode 100644 index 00000000000..c27fb397251 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentTarget.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentValue.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentValue.kt new file mode 100644 index 00000000000..e1956b3657b --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentValue.kt @@ -0,0 +1,17 @@ +fun test() { + buildFoo { + value = produceString() + } +} + +fun buildFoo(builder: Foo.() -> Unit): Foo { + val foo = Foo() + foo.builder() + return foo +} + +fun Foo { + var value: String? = null +} + +fun produceString(): String = "" \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentValue.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentValue.txt new file mode 100644 index 00000000000..0b3b098a684 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/assignmentValue.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = produceString() + type = kotlin.String + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/calleeExpression.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/calleeExpression.kt new file mode 100644 index 00000000000..93e33876eb7 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/calleeExpression.kt @@ -0,0 +1,7 @@ +fun test(foo: Foo) { + foo.bar() +} + +class Foo { + fun bar(): String {} +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/calleeExpression.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/calleeExpression.txt new file mode 100644 index 00000000000..300d6430681 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/calleeExpression.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = bar() + type = kotlin.String + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/errorDefaultType.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/errorDefaultType.kt new file mode 100644 index 00000000000..6058552bc9c --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/errorDefaultType.kt @@ -0,0 +1,7 @@ +fun test() { + call() +} + +fun call(): Foo? { + return null +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/errorDefaultType.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/errorDefaultType.txt new file mode 100644 index 00000000000..dec63c355e1 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/errorDefaultType.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = call() + type = ERROR CLASS: Symbol not found for Foo? + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/expressionBlock.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/expressionBlock.kt new file mode 100644 index 00000000000..328976bdb2c --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/expressionBlock.kt @@ -0,0 +1,9 @@ +fun test(flag: Boolean) { + if (flag) { + consume(1) + } else { + consume(2) + } +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/expressionBlock.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/expressionBlock.txt new file mode 100644 index 00000000000..c27fb397251 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/expressionBlock.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/flexibleDefaultType.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/flexibleDefaultType.kt new file mode 100644 index 00000000000..d9dc217ae29 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/flexibleDefaultType.kt @@ -0,0 +1,9 @@ +// FILE: JavaClass.java +class FooJava { + String call() {} +} + +// FILE: main.kt +fun text(foo: FooJava) { + foo.call() +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/flexibleDefaultType.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/flexibleDefaultType.txt new file mode 100644 index 00000000000..77023f78c69 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/flexibleDefaultType.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = foo.call() + type = kotlin.String! + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionBodyBlock.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionBodyBlock.kt new file mode 100644 index 00000000000..80715dcc56d --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionBodyBlock.kt @@ -0,0 +1,6 @@ +fun test(n: Int) { + consume(1) + consume(n) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionBodyBlock.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionBodyBlock.txt new file mode 100644 index 00000000000..c27fb397251 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionBodyBlock.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionCall.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionCall.kt new file mode 100644 index 00000000000..68c39687e3e --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionCall.kt @@ -0,0 +1,5 @@ +fun test() { + call(1, "foo") +} + +fun call(n: Int, text: String): Int = n \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionCall.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionCall.txt new file mode 100644 index 00000000000..8b3140aa1d6 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/functionCall.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = call(1, "foo") + type = kotlin.Int + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/infixOperator.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/infixOperator.kt new file mode 100644 index 00000000000..2b4d863c59f --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/infixOperator.kt @@ -0,0 +1,7 @@ +fun test(bar: String) { + consume("foo" join bar) +} + +infix fun String.join(other: String): String = this + other + +fun consume(text: String) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/infixOperator.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/infixOperator.txt new file mode 100644 index 00000000000..c27fb397251 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/infixOperator.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/lambdaExpression.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/lambdaExpression.kt new file mode 100644 index 00000000000..9e7dee5ace6 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/lambdaExpression.kt @@ -0,0 +1,3 @@ +fun test() { + { n: Int -> n + 1 } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/lambdaExpression.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/lambdaExpression.txt new file mode 100644 index 00000000000..e13d709c8a3 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/lambdaExpression.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = { n: Int -> n + 1 } + type = kotlin.Function1 + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/nullableDefaultType.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/nullableDefaultType.kt new file mode 100644 index 00000000000..bf562016b43 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/nullableDefaultType.kt @@ -0,0 +1,7 @@ +fun test() { + call() +} + +fun call(): String? { + return null +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/nullableDefaultType.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/nullableDefaultType.txt new file mode 100644 index 00000000000..71c2df0777f --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/nullableDefaultType.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = call() + type = kotlin.String? + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/packageQualifier.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/packageQualifier.kt new file mode 100644 index 00000000000..b042d23db4f --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/packageQualifier.kt @@ -0,0 +1,5 @@ +// WITH_STDLIB + +fun test(): Pair { + return kotlin.Pair("foo", 1) +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/packageQualifier.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/packageQualifier.txt new file mode 100644 index 00000000000..c27fb397251 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/packageQualifier.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/singleTypedExpression.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/singleTypedExpression.kt new file mode 100644 index 00000000000..ebbf1b18b99 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/singleTypedExpression.kt @@ -0,0 +1,5 @@ +fun test(t: T) { + val a = foo(t) +} + +fun foo(obj: T): Int = 0 \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/singleTypedExpression.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/singleTypedExpression.txt new file mode 100644 index 00000000000..107c7853304 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/singleTypedExpression.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = foo(t) + type = kotlin.Int + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/suspendFunctionCall.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/suspendFunctionCall.kt new file mode 100644 index 00000000000..4d512e8a004 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/suspendFunctionCall.kt @@ -0,0 +1,5 @@ +suspend fun test() { + call(1, "foo") +} + +suspend fun call(n: Int, text: String): Int = n \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/suspendFunctionCall.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/suspendFunctionCall.txt new file mode 100644 index 00000000000..8b3140aa1d6 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/suspendFunctionCall.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = call(1, "foo") + type = kotlin.Int + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/typeQualifier.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/typeQualifier.kt new file mode 100644 index 00000000000..2d89853b318 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/typeQualifier.kt @@ -0,0 +1,9 @@ +fun test() { + Foo.Bar().bar() +} + +class Foo { + class Bar { + fun bar() {} + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/typeQualifier.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/typeQualifier.txt new file mode 100644 index 00000000000..c27fb397251 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/typeQualifier.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/variableDeclaration.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/variableDeclaration.kt new file mode 100644 index 00000000000..4403f063594 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/variableDeclaration.kt @@ -0,0 +1,7 @@ +fun test() { + consume(1) + val x = 2 + consume(x) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/variableDeclaration.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/variableDeclaration.txt new file mode 100644 index 00000000000..c27fb397251 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/variableDeclaration.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/while.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/while.kt new file mode 100644 index 00000000000..857f5abee4d --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/while.kt @@ -0,0 +1,11 @@ +fun test() { + var x = 0 + consume(x) + while (cond()) { + consume(++x) + } +} + +fun cond(): Boolean = true + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/while.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/while.txt new file mode 100644 index 00000000000..b9f430958df --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/defaultValues/while.txt @@ -0,0 +1,15 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [ + VariableReassignment: + expression = ++x + isAugmented = true + variable = var x: kotlin.Int + ] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/arrayLiteral.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/arrayLiteral.kt new file mode 100644 index 00000000000..da8228fab1f --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/arrayLiteral.kt @@ -0,0 +1,4 @@ +annotation class Anno(val value: IntArray) + +@Anno(value = [1, 2, 3]) +class Foo \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/arrayLiteral.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/arrayLiteral.txt new file mode 100644 index 00000000000..d5bac273413 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/arrayLiteral.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = [1, 2, 3] + type = kotlin.IntArray + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/labeledReturn.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/labeledReturn.kt new file mode 100644 index 00000000000..ddbbb3afaab --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/labeledReturn.kt @@ -0,0 +1,3 @@ +fun foo(): Int { + return@foo 1 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/labeledReturn.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/labeledReturn.txt new file mode 100644 index 00000000000..91383b196ef --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/labeledReturn.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return@foo 1 + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn.kt new file mode 100644 index 00000000000..a50a6a14f39 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn.kt @@ -0,0 +1,3 @@ +fun foo(): Int { + 1.let { return it + 1 } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn.txt new file mode 100644 index 00000000000..d623707f89b --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return it + 1 + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn2.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn2.kt new file mode 100644 index 00000000000..526fd2345a1 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn2.kt @@ -0,0 +1,3 @@ +fun foo(): Int { + 1.let { return@foo it + 1 } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn2.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn2.txt new file mode 100644 index 00000000000..38c6468183d --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/nonLocalReturn2.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = true + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return@foo it + 1 + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameter.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameter.kt new file mode 100644 index 00000000000..afb8d83ed0c --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameter.kt @@ -0,0 +1,3 @@ +fun test(a: Int = compute()) {} + +fun compute(): Int = 0 \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameter.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameter.txt new file mode 100644 index 00000000000..c27fb397251 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameter.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameterDefaultValue.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameterDefaultValue.kt new file mode 100644 index 00000000000..1c364248346 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameterDefaultValue.kt @@ -0,0 +1,3 @@ +fun test(a: Int = compute()) {} + +fun compute(): Int = 0 \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameterDefaultValue.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameterDefaultValue.txt new file mode 100644 index 00000000000..a9f4641eb02 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/parameterDefaultValue.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = compute() + type = kotlin.Int + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/return.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/return.kt new file mode 100644 index 00000000000..67fab153c84 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/return.kt @@ -0,0 +1,4 @@ +fun foo(a: Int): Int { + val b: Int = 1 + return a + b +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/return.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/return.txt new file mode 100644 index 00000000000..66281c39f48 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/return.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = true + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = kotlin.Int + valuedReturnExpressions = [ + return a + b + ] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/trailingSemicolon.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/trailingSemicolon.kt new file mode 100644 index 00000000000..48ae13deca7 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/trailingSemicolon.kt @@ -0,0 +1,6 @@ +fun test() { + call(1); + call(2) +} + +fun call(n: Int): Int = n \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/trailingSemicolon.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/trailingSemicolon.txt new file mode 100644 index 00000000000..b772beb944e --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/languageConstructs/trailingSemicolon.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = call(1) + type = kotlin.Int + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementAugmentedReassignment.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementAugmentedReassignment.kt new file mode 100644 index 00000000000..81f87c270e0 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementAugmentedReassignment.kt @@ -0,0 +1,7 @@ +fun test() { + var x = intArrayOf(0) + x[0] += 1 + consume(x) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementAugmentedReassignment.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementAugmentedReassignment.txt new file mode 100644 index 00000000000..bdc09ef4ef8 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementAugmentedReassignment.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = x[0] += 1 + type = kotlin.Unit + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPostfix.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPostfix.kt new file mode 100644 index 00000000000..c3ec4a5cd44 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPostfix.kt @@ -0,0 +1,7 @@ +fun test() { + var x = intArrayOf(0) + x[0]++ + consume(x) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPostfix.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPostfix.txt new file mode 100644 index 00000000000..cb4c7518c35 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPostfix.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = x[0]++ + type = kotlin.Unit + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPrefix.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPrefix.kt new file mode 100644 index 00000000000..ea242ba7b3f --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPrefix.kt @@ -0,0 +1,7 @@ +fun test() { + var x = intArrayOf(0) + ++x[0] + consume(x) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPrefix.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPrefix.txt new file mode 100644 index 00000000000..21b8c211c05 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/arrayElementIncrementPrefix.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = ++x[0] + type = kotlin.Unit + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/augmentedReassignment.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/augmentedReassignment.kt new file mode 100644 index 00000000000..5aad3b91097 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/augmentedReassignment.kt @@ -0,0 +1,7 @@ +fun test() { + var x = 0 + x += 1 + consume(x) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/augmentedReassignment.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/augmentedReassignment.txt new file mode 100644 index 00000000000..679f8412fc6 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/augmentedReassignment.txt @@ -0,0 +1,15 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [ + VariableReassignment: + expression = x += 1 + isAugmented = true + variable = var x: kotlin.Int + ] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/classPropertyReassignment.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/classPropertyReassignment.kt new file mode 100644 index 00000000000..8c24c143adb --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/classPropertyReassignment.kt @@ -0,0 +1,7 @@ +class Foo { + var x: Int = 0 + + fun test() { + x = 1 + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/classPropertyReassignment.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/classPropertyReassignment.txt new file mode 100644 index 00000000000..c27fb397251 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/classPropertyReassignment.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/conditionalReassignment.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/conditionalReassignment.kt new file mode 100644 index 00000000000..a6c8b538534 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/conditionalReassignment.kt @@ -0,0 +1,9 @@ +fun test() { + var x = 0 + if (x > 0) { + x = 1 + } + consume(x) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/conditionalReassignment.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/conditionalReassignment.txt new file mode 100644 index 00000000000..8e71d229267 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/conditionalReassignment.txt @@ -0,0 +1,15 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [ + VariableReassignment: + expression = x = 1 + isAugmented = false + variable = var x: kotlin.Int + ] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/destructuredReassignment.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/destructuredReassignment.kt new file mode 100644 index 00000000000..ec1215c85f1 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/destructuredReassignment.kt @@ -0,0 +1,9 @@ +// WITH_STDLIB + +fun test() { + var (x, y) = Pair(1, 2) + x = 1 + consume(x) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/destructuredReassignment.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/destructuredReassignment.txt new file mode 100644 index 00000000000..8e71d229267 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/destructuredReassignment.txt @@ -0,0 +1,15 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [ + VariableReassignment: + expression = x = 1 + isAugmented = false + variable = var x: kotlin.Int + ] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/errorTargetReassignment.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/errorTargetReassignment.kt new file mode 100644 index 00000000000..331c93cecd8 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/errorTargetReassignment.kt @@ -0,0 +1,3 @@ +fun test() { + x = "foo" +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/errorTargetReassignment.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/errorTargetReassignment.txt new file mode 100644 index 00000000000..508623c8f15 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/errorTargetReassignment.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPostfix.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPostfix.kt new file mode 100644 index 00000000000..f55f527e7d1 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPostfix.kt @@ -0,0 +1,7 @@ +fun test() { + var x = 0 + x++ + consume(x) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPostfix.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPostfix.txt new file mode 100644 index 00000000000..088b0526442 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPostfix.txt @@ -0,0 +1,15 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [ + VariableReassignment: + expression = x++ + isAugmented = true + variable = var x: kotlin.Int + ] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPrefix.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPrefix.kt new file mode 100644 index 00000000000..dc595d3fd00 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPrefix.kt @@ -0,0 +1,7 @@ +fun test() { + var x = 0 + ++x + consume(x) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPrefix.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPrefix.txt new file mode 100644 index 00000000000..b9f430958df --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/incrementPrefix.txt @@ -0,0 +1,15 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [ + VariableReassignment: + expression = ++x + isAugmented = true + variable = var x: kotlin.Int + ] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/lambdaParameterReassignment.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/lambdaParameterReassignment.kt new file mode 100644 index 00000000000..d50a1ba1eee --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/lambdaParameterReassignment.kt @@ -0,0 +1,7 @@ +fun test() { + block { n -> + n = 1 + } +} + +fun block(block: (Int) -> Unit) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/lambdaParameterReassignment.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/lambdaParameterReassignment.txt new file mode 100644 index 00000000000..508623c8f15 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/lambdaParameterReassignment.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/localVariable.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/localVariable.kt new file mode 100644 index 00000000000..4cb5c8c472a --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/localVariable.kt @@ -0,0 +1,7 @@ +fun test() { + val x = 0 + consume(1) + consume(x) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/localVariable.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/localVariable.txt new file mode 100644 index 00000000000..9782393301b --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/localVariable.txt @@ -0,0 +1,12 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = DefaultExpressionInfo: + expression = consume(1) + type = kotlin.Unit + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/parameterReassignment.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/parameterReassignment.kt new file mode 100644 index 00000000000..2c34c38455e --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/parameterReassignment.kt @@ -0,0 +1,3 @@ +fun test(n: Int) { + n = 5 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/parameterReassignment.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/parameterReassignment.txt new file mode 100644 index 00000000000..508623c8f15 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/parameterReassignment.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/simpleReassignment.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/simpleReassignment.kt new file mode 100644 index 00000000000..1ab93cd294a --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/simpleReassignment.kt @@ -0,0 +1,7 @@ +fun test() { + var x = 0 + x = 1 + consume(x) +} + +fun consume(n: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/simpleReassignment.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/simpleReassignment.txt new file mode 100644 index 00000000000..8e71d229267 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/simpleReassignment.txt @@ -0,0 +1,15 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [ + VariableReassignment: + expression = x = 1 + isAugmented = false + variable = var x: kotlin.Int + ] \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/topLevelPropertyReassignment.kt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/topLevelPropertyReassignment.kt new file mode 100644 index 00000000000..93c20672e09 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/topLevelPropertyReassignment.kt @@ -0,0 +1,5 @@ +var x: Int = 0 + +fun test() { + x = 1 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/topLevelPropertyReassignment.txt b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/topLevelPropertyReassignment.txt new file mode 100644 index 00000000000..c27fb397251 --- /dev/null +++ b/analysis/analysis-api/testData/components/dataFlowInfoProvider/exitPointSnapshot/variables/topLevelPropertyReassignment.txt @@ -0,0 +1,10 @@ +KtDataFlowExitPointSnapshot: + defaultExpressionInfo = null + hasEscapingJumps = false + hasJumps = false + hasMultipleJumpKinds = false + hasMultipleJumpTargets = false + loopJumpExpressions = [] + returnValueType = null + valuedReturnExpressions = [] + variableReassignments = [] \ No newline at end of file diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt index 9967d15ded8..328b10fcfdc 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.contain import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.containingDeclarationProvider.AbstractContainingDeclarationProviderByPsiTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.containingDeclarationProvider.AbstractContainingDeclarationProviderByReferenceTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.containingDeclarationProvider.AbstractContainingDeclarationProviderForSetterParameterTest +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.dataFlowInfoProvider.AbstractExitPointSnapshotTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.diagnosticProvider.AbstractCodeFragmentCollectDiagnosticsTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.diagnosticProvider.AbstractCollectDiagnosticsTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.diagnosticProvider.AbstractDanglingFileCollectDiagnosticsTest @@ -574,4 +575,10 @@ private fun AnalysisApiTestGroup.generateAnalysisApiComponentsTests() { } } } + + component("dataFlowInfoProvider") { + test(filter = frontendIs(FrontendKind.Fir)) { + model(it, "exitPointSnapshot") + } + } }