From dbaf4a2d5e7af7c38148e687989675cab04ff190 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Tue, 7 Nov 2023 17:06:31 +0100 Subject: [PATCH] [FIR] resolve type annotations on implicit return type of local property This still doesn't work for unresolved delegate (see analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/localDelegatedPropertyWithPropagatedType.out_of_src_roots.txt) ^KT-63042 --- .../localDelegatedPropertyWithPropagatedType.txt | 10 +++++----- .../localPropertyWithPropagatedType.txt | 10 +++++----- .../body/resolve/FirDeclarationsResolveTransformer.kt | 6 +++++- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/localDelegatedPropertyWithPropagatedType.txt b/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/localDelegatedPropertyWithPropagatedType.txt index bbf151de023..7e8ee2604d4 100644 --- a/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/localDelegatedPropertyWithPropagatedType.txt +++ b/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/localDelegatedPropertyWithPropagatedType.txt @@ -3,7 +3,7 @@ FIR element: FirPropertyImpl FIR source kind: KtRealSourceElementKind FIR element rendered: -@R|foo/Anno|[Types](position = (String(property ), R|foo/secondConstant|)) [ResolvedTo(BODY_RESOLVE)] lval localProperty: R|@R|foo/Anno|((String(return type: ), constant#)) kotlin/collections/List<@R|foo/Anno|((String(nested return type: ), constant#)) kotlin/collections/Collection<@R|foo/Anno|((String(nested nested return type: ), constant#)) kotlin/String>>|by R|kotlin/lazy|(String(return type: ), constant#)) kotlin/collections/List<@R|foo/Anno|((String(nested return type: ), constant#)) kotlin/collections/Collection<@R|foo/Anno|((String(nested nested return type: ), constant#)) kotlin/String>>|>( = [ResolvedTo(BODY_RESOLVE)] [MatchingParameterFunctionTypeKey=kotlin/Function0] lazy@fun (): R|@R|foo/Anno|((String(return type: ), constant#)) kotlin/collections/List<@R|foo/Anno|((String(nested return type: ), constant#)) kotlin/collections/Collection<@R|foo/Anno|((String(nested nested return type: ), constant#)) kotlin/String>>| { +@R|foo/Anno|[Types](position = (String(property ), R|foo/secondConstant|)) [ResolvedTo(BODY_RESOLVE)] lval localProperty: R|@R|foo/Anno|(position = (String(return type: ), R|foo/constant|)) kotlin/collections/List<@R|foo/Anno|(position = (String(nested return type: ), R|foo/constant|)) kotlin/collections/Collection<@R|foo/Anno|(position = (String(nested nested return type: ), R|foo/constant|)) kotlin/String>>|by R|kotlin/lazy|(String(return type: ), R|foo/constant|)) kotlin/collections/List<@R|foo/Anno|(position = (String(nested return type: ), R|foo/constant|)) kotlin/collections/Collection<@R|foo/Anno|(position = (String(nested nested return type: ), R|foo/constant|)) kotlin/String>>|>( = [ResolvedTo(BODY_RESOLVE)] [MatchingParameterFunctionTypeKey=kotlin/Function0] lazy@fun (): R|@R|foo/Anno|(position = (String(return type: ), R|foo/constant|)) kotlin/collections/List<@R|foo/Anno|(position = (String(nested return type: ), R|foo/constant|)) kotlin/collections/Collection<@R|foo/Anno|(position = (String(nested nested return type: ), R|foo/constant|)) kotlin/String>>| { ^ R|foo/explicitType|() } ) @@ -21,13 +21,13 @@ FILE: [ResolvedTo(IMPORTS)] localDelegatedPropertyWithPropagatedType.kt public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| } - public? final? const [ResolvedTo(RAW_FIR)] val constant: = LAZY_EXPRESSION - public? [ResolvedTo(RAW_FIR)] get(): - public final [ResolvedTo(CONTRACTS)] fun explicitType(): R|@R|foo/Anno|((String(return type: ), constant#)) kotlin/collections/List<@R|foo/Anno|((String(nested return type: ), constant#)) kotlin/collections/Collection<@R|foo/Anno|((String(nested nested return type: ), constant#)) kotlin/String>>| { + public final const [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] val constant: R|kotlin/Int| = Int(0) + public [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] get(): R|kotlin/Int| + public final [ResolvedTo(CONTRACTS)] fun explicitType(): R|@R|foo/Anno|(position = (String(return type: ), R|foo/constant|)) kotlin/collections/List<@R|foo/Anno|(position = (String(nested return type: ), R|foo/constant|)) kotlin/collections/Collection<@R|foo/Anno|(position = (String(nested nested return type: ), R|foo/constant|)) kotlin/String>>| { ^explicitType IntegerLiteral(0) } public final [ResolvedTo(BODY_RESOLVE)] fun resolveMe(): R|kotlin/Unit| { - @R|foo/Anno|[Types](position = (String(property ), R|foo/secondConstant|)) [ResolvedTo(BODY_RESOLVE)] lval localProperty: R|@R|foo/Anno|((String(return type: ), constant#)) kotlin/collections/List<@R|foo/Anno|((String(nested return type: ), constant#)) kotlin/collections/Collection<@R|foo/Anno|((String(nested nested return type: ), constant#)) kotlin/String>>|by R|kotlin/lazy|(String(return type: ), constant#)) kotlin/collections/List<@R|foo/Anno|((String(nested return type: ), constant#)) kotlin/collections/Collection<@R|foo/Anno|((String(nested nested return type: ), constant#)) kotlin/String>>|>( = [ResolvedTo(BODY_RESOLVE)] [MatchingParameterFunctionTypeKey=kotlin/Function0] lazy@fun (): R|@R|foo/Anno|((String(return type: ), constant#)) kotlin/collections/List<@R|foo/Anno|((String(nested return type: ), constant#)) kotlin/collections/Collection<@R|foo/Anno|((String(nested nested return type: ), constant#)) kotlin/String>>| { + @R|foo/Anno|[Types](position = (String(property ), R|foo/secondConstant|)) [ResolvedTo(BODY_RESOLVE)] lval localProperty: R|@R|foo/Anno|(position = (String(return type: ), R|foo/constant|)) kotlin/collections/List<@R|foo/Anno|(position = (String(nested return type: ), R|foo/constant|)) kotlin/collections/Collection<@R|foo/Anno|(position = (String(nested nested return type: ), R|foo/constant|)) kotlin/String>>|by R|kotlin/lazy|(String(return type: ), R|foo/constant|)) kotlin/collections/List<@R|foo/Anno|(position = (String(nested return type: ), R|foo/constant|)) kotlin/collections/Collection<@R|foo/Anno|(position = (String(nested nested return type: ), R|foo/constant|)) kotlin/String>>|>( = [ResolvedTo(BODY_RESOLVE)] [MatchingParameterFunctionTypeKey=kotlin/Function0] lazy@fun (): R|@R|foo/Anno|(position = (String(return type: ), R|foo/constant|)) kotlin/collections/List<@R|foo/Anno|(position = (String(nested return type: ), R|foo/constant|)) kotlin/collections/Collection<@R|foo/Anno|(position = (String(nested nested return type: ), R|foo/constant|)) kotlin/String>>| { ^ R|foo/explicitType|() } ) diff --git a/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/localPropertyWithPropagatedType.txt b/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/localPropertyWithPropagatedType.txt index 1456d953ad6..132a5231fb4 100644 --- a/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/localPropertyWithPropagatedType.txt +++ b/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/localPropertyWithPropagatedType.txt @@ -3,7 +3,7 @@ FIR element: FirPropertyImpl FIR source kind: KtRealSourceElementKind FIR element rendered: -@R|foo/Anno|[Types](position = (String(property ), R|foo/secondConstant|)) [ResolvedTo(BODY_RESOLVE)] lval localProperty: R|@R|foo/Anno|((String(return type: ), constant#)) kotlin/collections/List<@R|foo/Anno|((String(nested return type: ), constant#)) kotlin/collections/Collection<@R|foo/Anno|((String(nested nested return type: ), constant#)) kotlin/String>>| = R|foo/explicitType|() +@R|foo/Anno|[Types](position = (String(property ), R|foo/secondConstant|)) [ResolvedTo(BODY_RESOLVE)] lval localProperty: R|@R|foo/Anno|(position = (String(return type: ), R|foo/constant|)) kotlin/collections/List<@R|foo/Anno|(position = (String(nested return type: ), R|foo/constant|)) kotlin/collections/Collection<@R|foo/Anno|(position = (String(nested nested return type: ), R|foo/constant|)) kotlin/String>>| = R|foo/explicitType|() FIR FILE: FILE: [ResolvedTo(IMPORTS)] localPropertyWithPropagatedType.kt @@ -18,13 +18,13 @@ FILE: [ResolvedTo(IMPORTS)] localPropertyWithPropagatedType.kt public [ResolvedTo(STATUS)] [ContainingClassKey=Anno] get(): R|kotlin/String| } - public? final? const [ResolvedTo(RAW_FIR)] val constant: = LAZY_EXPRESSION - public? [ResolvedTo(RAW_FIR)] get(): - public final [ResolvedTo(CONTRACTS)] fun explicitType(): R|@R|foo/Anno|((String(return type: ), constant#)) kotlin/collections/List<@R|foo/Anno|((String(nested return type: ), constant#)) kotlin/collections/Collection<@R|foo/Anno|((String(nested nested return type: ), constant#)) kotlin/String>>| { + public final const [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] val constant: R|kotlin/Int| = Int(0) + public [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] get(): R|kotlin/Int| + public final [ResolvedTo(CONTRACTS)] fun explicitType(): R|@R|foo/Anno|(position = (String(return type: ), R|foo/constant|)) kotlin/collections/List<@R|foo/Anno|(position = (String(nested return type: ), R|foo/constant|)) kotlin/collections/Collection<@R|foo/Anno|(position = (String(nested nested return type: ), R|foo/constant|)) kotlin/String>>| { ^explicitType IntegerLiteral(0) } public final [ResolvedTo(BODY_RESOLVE)] fun resolveMe(): R|kotlin/Unit| { - @R|foo/Anno|[Types](position = (String(property ), R|foo/secondConstant|)) [ResolvedTo(BODY_RESOLVE)] lval localProperty: R|@R|foo/Anno|((String(return type: ), constant#)) kotlin/collections/List<@R|foo/Anno|((String(nested return type: ), constant#)) kotlin/collections/Collection<@R|foo/Anno|((String(nested nested return type: ), constant#)) kotlin/String>>| = R|foo/explicitType|() + @R|foo/Anno|[Types](position = (String(property ), R|foo/secondConstant|)) [ResolvedTo(BODY_RESOLVE)] lval localProperty: R|@R|foo/Anno|(position = (String(return type: ), R|foo/constant|)) kotlin/collections/List<@R|foo/Anno|(position = (String(nested return type: ), R|foo/constant|)) kotlin/collections/Collection<@R|foo/Anno|(position = (String(nested nested return type: ), R|foo/constant|)) kotlin/String>>| = R|foo/explicitType|() } public final const [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] val secondConstant: R|kotlin/String| = String(str) public [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] get(): R|kotlin/String| \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 7aa2ead5346..7f5fd8d78da 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -523,7 +523,11 @@ open class FirDeclarationsResolveTransformer( variable.transformBackingField(transformer, withExpectedType(variable.returnTypeRef)) variable.transformAccessors() } - variable.transformOtherChildren(transformer, ResolutionMode.ContextIndependent) + + // We need this return type transformation to resolve annotations from an implicit type + variable.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent) + .transformOtherChildren(transformer, ResolutionMode.ContextIndependent) + context.storeVariable(variable, session) dataFlowAnalyzer.exitLocalVariableDeclaration(variable, hadExplicitType) return variable