diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt index 0bb6004dda0..1733af8e5d8 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt @@ -125,7 +125,8 @@ internal fun PsiElement.getNonLocalContainingOrThisDeclaration(predicate: (KtDec parent is KtCallableDeclaration && !notNullCandidate.isPartOf(parent) || parent is KtClassInitializer || - parent is KtObjectLiteralExpression + parent is KtObjectLiteralExpression || + parent is KtCallElement ) { // Candidate turned out to be local. Let's find another one. candidate = null diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideAnnotationCall.kt b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideAnnotationCall.kt new file mode 100644 index 00000000000..4ead4d799fb --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideAnnotationCall.kt @@ -0,0 +1,8 @@ +package one + +annotation class Anno(val s: String) + +@Anno(fun(): String { + +}()) +class TopLevelClass \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideAnnotationCall.txt b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideAnnotationCall.txt new file mode 100644 index 00000000000..cf0bde1cbc6 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideAnnotationCall.txt @@ -0,0 +1,293 @@ +RAW_FIR: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +IMPORTS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +COMPILER_REQUIRED_ANNOTATIONS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +COMPANION_GENERATION: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +SUPER_TYPES: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +TYPES: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +STATUS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +EXPECT_ACTUAL_MATCHING: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +ARGUMENTS_OF_ANNOTATIONS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +CONTRACTS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +IMPLICIT_TYPES_BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +ANNOTATIONS_ARGUMENTS_MAPPING: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(RAW_FIR)] annotations container + public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] constructor([ResolvedTo(STATUS)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + LAZY_super + } + + public final [ResolvedTo(STATUS)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } + +FILE RAW TO BODY: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideAnnotationCall.kt + [ResolvedTo(BODY_RESOLVE)] annotations container + public final [ResolvedTo(BODY_RESOLVE)] annotation class Anno : R|kotlin/Annotation| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Anno] constructor([ResolvedTo(BODY_RESOLVE)] [CorrespondingProperty=one/Anno.s] s: R|kotlin/String|): R|one/Anno| { + super() + } + + public final [ResolvedTo(BODY_RESOLVE)] [IsFromPrimaryConstructor=true] val s: R|kotlin/String| = R|/s| + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Anno] get(): R|kotlin/String| + + } + @R|one/Anno|[Types](s = [ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + } + .R|SubstitutionOverride|()) public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super() + } + + } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideFunctionLiteral.kt b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideFunctionLiteral.kt new file mode 100644 index 00000000000..73f2fd3f5e8 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideFunctionLiteral.kt @@ -0,0 +1,8 @@ +package one + +open class ClassWithParameter(i: () -> Unit) + +class TopLevelClass : ClassWithParameter({ + fun foo(param: String) { + } +}) \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideFunctionLiteral.txt b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideFunctionLiteral.txt new file mode 100644 index 00000000000..9ea19a66b70 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideFunctionLiteral.txt @@ -0,0 +1,293 @@ +RAW_FIR: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +IMPORTS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +COMPILER_REQUIRED_ANNOTATIONS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +COMPANION_GENERATION: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +SUPER_TYPES: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +TYPES: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +STATUS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +EXPECT_ACTUAL_MATCHING: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +ARGUMENTS_OF_ANNOTATIONS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +CONTRACTS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +IMPLICIT_TYPES_BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +ANNOTATIONS_ARGUMENTS_MAPPING: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } + +FILE RAW TO BODY: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideFunctionLiteral.kt + [ResolvedTo(BODY_RESOLVE)] annotations container + public open [ResolvedTo(BODY_RESOLVE)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(BODY_RESOLVE)] i: R|() -> kotlin/Unit|): R|one/ClassWithParameter| { + super() + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super([ResolvedTo(RAW_FIR)] fun (): R|kotlin/Unit| { + local final [ResolvedTo(RAW_FIR)] fun foo([ResolvedTo(RAW_FIR)] param: R|kotlin/String|): R|kotlin/Unit| { + } + + } + ) + } + + } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideLambdaCallInsideStringTemplate.kt b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideLambdaCallInsideStringTemplate.kt new file mode 100644 index 00000000000..9ff4c19d378 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideLambdaCallInsideStringTemplate.kt @@ -0,0 +1,10 @@ +package one + +open class ClassWithParameter(s: String) + +class TopLevelClass : ClassWithParameter("${ + { + fun str(): String = 42 + str() + }() +}") \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideLambdaCallInsideStringTemplate.txt b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideLambdaCallInsideStringTemplate.txt new file mode 100644 index 00000000000..7c24a531a1c --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideLambdaCallInsideStringTemplate.txt @@ -0,0 +1,321 @@ +RAW_FIR: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +IMPORTS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +COMPILER_REQUIRED_ANNOTATIONS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +COMPANION_GENERATION: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +SUPER_TYPES: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +TYPES: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +STATUS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +EXPECT_ACTUAL_MATCHING: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +ARGUMENTS_OF_ANNOTATIONS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +CONTRACTS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +IMPLICIT_TYPES_BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +ANNOTATIONS_ARGUMENTS_MAPPING: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } + +FILE RAW TO BODY: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideLambdaCallInsideStringTemplate.kt + [ResolvedTo(BODY_RESOLVE)] annotations container + public open [ResolvedTo(BODY_RESOLVE)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|one/ClassWithParameter| { + super() + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + local final [ResolvedTo(RAW_FIR)] fun str(): R|kotlin/String| { + ^str Int(42) + } + + ^ R|/str|() + } + .R|SubstitutionOverride|())) + } + + } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideStringTemplate.kt b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideStringTemplate.kt new file mode 100644 index 00000000000..bded533cdeb --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideStringTemplate.kt @@ -0,0 +1,9 @@ +package one + +open class ClassWithParameter(s: String) + +class TopLevelClass : ClassWithParameter("${ + fun(): String { + return "" + }() +}") \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideStringTemplate.txt b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideStringTemplate.txt new file mode 100644 index 00000000000..9d3fb470a63 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideStringTemplate.txt @@ -0,0 +1,265 @@ +RAW_FIR: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +IMPORTS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +COMPILER_REQUIRED_ANNOTATIONS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +COMPANION_GENERATION: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +SUPER_TYPES: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +TYPES: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +STATUS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +EXPECT_ACTUAL_MATCHING: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +ARGUMENTS_OF_ANNOTATIONS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +CONTRACTS: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +IMPLICIT_TYPES_BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +ANNOTATIONS_ARGUMENTS_MAPPING: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(RAW_FIR)] annotations container + public open [ResolvedTo(STATUS)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(STATUS)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(STATUS)] s: R|kotlin/String|): R|one/ClassWithParameter| { + LAZY_super + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } + +FILE RAW TO BODY: +FILE: [ResolvedTo(IMPORTS)] localFunctionInsideStringTemplate.kt + [ResolvedTo(BODY_RESOLVE)] annotations container + public open [ResolvedTo(BODY_RESOLVE)] class ClassWithParameter : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=ClassWithParameter] constructor([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|one/ClassWithParameter| { + super() + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class TopLevelClass : R|one/ClassWithParameter| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=TopLevelClass] constructor(): R|one/TopLevelClass| { + super(([ResolvedTo(RAW_FIR)] fun (): R|kotlin/String| { + ^ String() + } + .R|SubstitutionOverride|())) + } + + } diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/classWithMembers.kt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/classWithMembers.kt new file mode 100644 index 00000000000..9e1ed549da9 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/classWithMembers.kt @@ -0,0 +1,17 @@ +package one + +class A constructor(a: Int) { + fun boo() { + fun bar() { + + } + } + + val i: Int = 42 + + init { + fun foo() { + + } + } +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/classWithMembers.txt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/classWithMembers.txt new file mode 100644 index 00000000000..7d0ccb0d4be --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/classWithMembers.txt @@ -0,0 +1,17 @@ +package one + +/* anchor --> */class A /* anchor --> */constructor(/* anchor --> */a: Int/* <-- */)/* <-- */ { + /* anchor --> */fun boo() { + fun bar() { + + } + }/* <-- */ + + /* anchor --> */val i: Int = 42/* <-- */ + + /* anchor --> */init { + fun foo() { + + } + }/* <-- */ +}/* <-- */ diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideAnnotationCall.kt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideAnnotationCall.kt new file mode 100644 index 00000000000..f3376b1552d --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideAnnotationCall.kt @@ -0,0 +1,8 @@ +package one + +annotation class Anno(val s: String) + +@Anno(fun(): String { + +}()) +class TopLevelClass \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideAnnotationCall.txt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideAnnotationCall.txt new file mode 100644 index 00000000000..ecb829e8292 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideAnnotationCall.txt @@ -0,0 +1,8 @@ +package one + +/* anchor --> */annotation class Anno/* anchor --> */(/* anchor --> */val s: String/* <-- */)/* <-- *//* <-- */ + +/* anchor --> */@Anno(fun(): String { + +}()) +class TopLevelClass/* <-- */ diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideFunctionLiteral.kt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideFunctionLiteral.kt new file mode 100644 index 00000000000..34b03352790 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideFunctionLiteral.kt @@ -0,0 +1,8 @@ +package one + +open class ClassWithParameter(i: () -> Unit) + +class TopLevelClass : ClassWithParameter({ + fun foo(param: String) { + } +}) \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideFunctionLiteral.txt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideFunctionLiteral.txt new file mode 100644 index 00000000000..79b5527ab7a --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideFunctionLiteral.txt @@ -0,0 +1,8 @@ +package one + +/* anchor --> */open class ClassWithParameter/* anchor --> */(/* anchor --> */i: () -> Unit/* <-- */)/* <-- *//* <-- */ + +/* anchor --> */class TopLevelClass : ClassWithParameter({ + fun foo(param: String) { + } +})/* <-- */ diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideLambdaCallInsideStringTemplate.kt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideLambdaCallInsideStringTemplate.kt new file mode 100644 index 00000000000..2fab52a5a06 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideLambdaCallInsideStringTemplate.kt @@ -0,0 +1,10 @@ +package one + +open class ClassWithParameter(s: String) + +class TopLevelClass : ClassWithParameter("${ + { + fun str(): String = 42 + str() + }() +}") \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideLambdaCallInsideStringTemplate.txt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideLambdaCallInsideStringTemplate.txt new file mode 100644 index 00000000000..a04153fd6ae --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideLambdaCallInsideStringTemplate.txt @@ -0,0 +1,10 @@ +package one + +/* anchor --> */open class ClassWithParameter/* anchor --> */(/* anchor --> */s: String/* <-- */)/* <-- *//* <-- */ + +/* anchor --> */class TopLevelClass : ClassWithParameter("${ + { + fun str(): String = 42 + str() + }() +}")/* <-- */ diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideStringTemplate.kt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideStringTemplate.kt new file mode 100644 index 00000000000..b64c2d3648f --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideStringTemplate.kt @@ -0,0 +1,9 @@ +package one + +open class ClassWithParameter(s: String) + +class TopLevelClass : ClassWithParameter("${ + fun(): String { + return "" + }() +}") \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideStringTemplate.txt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideStringTemplate.txt new file mode 100644 index 00000000000..34b881363ae --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideStringTemplate.txt @@ -0,0 +1,9 @@ +package one + +/* anchor --> */open class ClassWithParameter/* anchor --> */(/* anchor --> */s: String/* <-- */)/* <-- *//* <-- */ + +/* anchor --> */class TopLevelClass : ClassWithParameter("${ + fun(): String { + return "" + }() +}")/* <-- */ diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideSuperEntryCall.kt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideSuperEntryCall.kt new file mode 100644 index 00000000000..6ff20504d9c --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideSuperEntryCall.kt @@ -0,0 +1,12 @@ +package one + +interface Interface { + fun foo(param: String) +} + +open class ClassWithParameter(i: Interface) + +class TopLevelClass : ClassWithParameter(object : Interface { + override fun foo(param: String) { + } +}) \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideSuperEntryCall.txt b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideSuperEntryCall.txt new file mode 100644 index 00000000000..3bd50deffff --- /dev/null +++ b/analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideSuperEntryCall.txt @@ -0,0 +1,12 @@ +package one + +/* anchor --> */interface Interface { + /* anchor --> */fun foo(/* anchor --> */param: String/* <-- */)/* <-- */ +}/* <-- */ + +/* anchor --> */open class ClassWithParameter/* anchor --> */(/* anchor --> */i: Interface/* <-- */)/* <-- *//* <-- */ + +/* anchor --> */class TopLevelClass : ClassWithParameter(object : Interface { + override fun foo(param: String) { + } +})/* <-- */ diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirNonLocalDeclarationAnchorTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirNonLocalDeclarationAnchorTest.kt new file mode 100644 index 00000000000..835695799ad --- /dev/null +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirNonLocalDeclarationAnchorTest.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2010-2023 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.low.level.api.fir + +import com.intellij.psi.PsiComment +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiElementVisitor +import com.intellij.psi.impl.source.tree.LeafPsiElement +import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration +import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest +import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType +import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder +import org.jetbrains.kotlin.test.directives.ConfigurationDirectives +import org.jetbrains.kotlin.test.services.TestModuleStructure +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.assertions + +abstract class AbstractFirNonLocalDeclarationAnchorTest : AbstractLowLevelApiSingleFileTest() { + override val configurator: AnalysisApiTestConfigurator = AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false) + + override fun doTestByFileStructure(ktFile: KtFile, moduleStructure: TestModuleStructure, testServices: TestServices) { + val anchors = hashSetOf() + ktFile.forEachDescendantOfType { + it.getNonLocalContainingOrThisDeclaration()?.let(anchors::add) + } + + val text = buildString { + ktFile.accept(object : PsiElementVisitor() { + override fun visitElement(element: PsiElement) { + val isAnchor = element in anchors + if (isAnchor) { + append("/* anchor --> */") + } + + if (element is LeafPsiElement) { + append(element.text) + } + + element.acceptChildren(this) + if (isAnchor) { + append("/* <-- */") + } + } + + override fun visitComment(comment: PsiComment) {} + }) + } + + testServices.assertions.assertEqualsToTestDataFileSibling(text) + } + + override fun configureTest(builder: TestConfigurationBuilder) { + super.configureTest(builder) + with(builder) { + defaultDirectives { + +ConfigurationDirectives.WITH_STDLIB + } + } + } +} diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirNonLocalDeclarationAnchorTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirNonLocalDeclarationAnchorTestGenerated.java new file mode 100644 index 00000000000..25d5eeab7e8 --- /dev/null +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirNonLocalDeclarationAnchorTestGenerated.java @@ -0,0 +1,62 @@ +/* + * Copyright 2010-2023 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.low.level.api.fir; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +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/low-level-api-fir/testdata/nonLocalDeclarationAnchors") +@TestDataPath("$PROJECT_ROOT") +public class FirNonLocalDeclarationAnchorTestGenerated extends AbstractFirNonLocalDeclarationAnchorTest { + @Test + public void testAllFilesPresentInNonLocalDeclarationAnchors() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("classWithMembers.kt") + public void testClassWithMembers() throws Exception { + runTest("analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/classWithMembers.kt"); + } + + @Test + @TestMetadata("localFunctionInsideAnnotationCall.kt") + public void testLocalFunctionInsideAnnotationCall() throws Exception { + runTest("analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideAnnotationCall.kt"); + } + + @Test + @TestMetadata("localFunctionInsideFunctionLiteral.kt") + public void testLocalFunctionInsideFunctionLiteral() throws Exception { + runTest("analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideFunctionLiteral.kt"); + } + + @Test + @TestMetadata("localFunctionInsideLambdaCallInsideStringTemplate.kt") + public void testLocalFunctionInsideLambdaCallInsideStringTemplate() throws Exception { + runTest("analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideLambdaCallInsideStringTemplate.kt"); + } + + @Test + @TestMetadata("localFunctionInsideStringTemplate.kt") + public void testLocalFunctionInsideStringTemplate() throws Exception { + runTest("analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideStringTemplate.kt"); + } + + @Test + @TestMetadata("localFunctionInsideSuperEntryCall.kt") + public void testLocalFunctionInsideSuperEntryCall() throws Exception { + runTest("analysis/low-level-api-fir/testdata/nonLocalDeclarationAnchors/localFunctionInsideSuperEntryCall.kt"); + } +} diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java index a8e2f7644ef..ac294ff10f2 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java @@ -210,6 +210,30 @@ public class FirOutOfContentRootLazyDeclarationResolveTestGenerated extends Abst runTest("analysis/low-level-api-fir/testdata/lazyResolve/localConstructor.kt"); } + @Test + @TestMetadata("localFunctionInsideAnnotationCall.kt") + public void testLocalFunctionInsideAnnotationCall() throws Exception { + runTest("analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideAnnotationCall.kt"); + } + + @Test + @TestMetadata("localFunctionInsideFunctionLiteral.kt") + public void testLocalFunctionInsideFunctionLiteral() throws Exception { + runTest("analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideFunctionLiteral.kt"); + } + + @Test + @TestMetadata("localFunctionInsideLambdaCallInsideStringTemplate.kt") + public void testLocalFunctionInsideLambdaCallInsideStringTemplate() throws Exception { + runTest("analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideLambdaCallInsideStringTemplate.kt"); + } + + @Test + @TestMetadata("localFunctionInsideStringTemplate.kt") + public void testLocalFunctionInsideStringTemplate() throws Exception { + runTest("analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideStringTemplate.kt"); + } + @Test @TestMetadata("localFunctionInsideSuperEntryCall.kt") public void testLocalFunctionInsideSuperEntryCall() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java index 971b56e8725..d15e6608bac 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java @@ -210,6 +210,30 @@ public class FirSourceLazyDeclarationResolveTestGenerated extends AbstractFirSou runTest("analysis/low-level-api-fir/testdata/lazyResolve/localConstructor.kt"); } + @Test + @TestMetadata("localFunctionInsideAnnotationCall.kt") + public void testLocalFunctionInsideAnnotationCall() throws Exception { + runTest("analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideAnnotationCall.kt"); + } + + @Test + @TestMetadata("localFunctionInsideFunctionLiteral.kt") + public void testLocalFunctionInsideFunctionLiteral() throws Exception { + runTest("analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideFunctionLiteral.kt"); + } + + @Test + @TestMetadata("localFunctionInsideLambdaCallInsideStringTemplate.kt") + public void testLocalFunctionInsideLambdaCallInsideStringTemplate() throws Exception { + runTest("analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideLambdaCallInsideStringTemplate.kt"); + } + + @Test + @TestMetadata("localFunctionInsideStringTemplate.kt") + public void testLocalFunctionInsideStringTemplate() throws Exception { + runTest("analysis/low-level-api-fir/testdata/lazyResolve/localFunctionInsideStringTemplate.kt"); + } + @Test @TestMetadata("localFunctionInsideSuperEntryCall.kt") public void testLocalFunctionInsideSuperEntryCall() throws Exception { diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt index 49f9df7cc4c..fd6fc25f76b 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt @@ -95,6 +95,10 @@ internal fun TestGroupSuite.generateFirLowLevelApiTests() { testClass { model("fileBasedDeclarationProvider", pattern = TestGeneratorUtil.KT_OR_KTS) } + + testClass { + model("nonLocalDeclarationAnchors") + } } testGroup(