Skip to content

Commit 2b6d3b7

Browse files
dimonchik0036Space Team
authored andcommitted
[LL] ContextCollector: dump context only for real source elements
Some fake sources might be traversed and cached before the real element, so an incorrect result might be returned. That was the case for enum classes. They have a synthetic super type reference with the fake (`EnumSuperTypeRef`) source which contains the class psi. As a result, the incorrect context was captured and returned for the class ^KT-79653 Fixed
1 parent 302e67c commit 2b6d3b7

File tree

20 files changed

+86
-552
lines changed

20 files changed

+86
-552
lines changed

analysis/analysis-api/testData/components/referenceShortener/shortenRange/nestedClasses/classHeaderPositions/constructorParameterVsTopLevelProperty_noConflict.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,20 @@ with default settings:
1414
[qualifier] test.bigProperty
1515
[qualifier] test.bigProperty
1616
[qualifier] test.bigProperty
17+
[qualifier] test.bigProperty
1718
with DO_NOT_SHORTEN:
1819
with SHORTEN_IF_ALREADY_IMPORTED:
1920
[qualifier] test.bigProperty
2021
[qualifier] test.bigProperty
2122
[qualifier] test.bigProperty
23+
[qualifier] test.bigProperty
2224
with SHORTEN_AND_IMPORT:
2325
[qualifier] test.bigProperty
2426
[qualifier] test.bigProperty
2527
[qualifier] test.bigProperty
28+
[qualifier] test.bigProperty
2629
with SHORTEN_AND_STAR_IMPORT:
2730
[qualifier] test.bigProperty
2831
[qualifier] test.bigProperty
2932
[qualifier] test.bigProperty
33+
[qualifier] test.bigProperty

analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/ContextCollector.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,22 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLPartialBody
1313
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.partialBodyAnalysisState
1414
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDesignationEntry
1515
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration
16+
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.isAutonomousElement
17+
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.FirElementsRecorder.Companion.anchorPsi
1618
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.LLPartialBodyElementMapper
1719
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession
18-
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.isAutonomousElement
1920
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ContextCollector.Context
2021
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ContextCollector.ContextKind
2122
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ContextCollector.FilterResponse
2223
import org.jetbrains.kotlin.fir.FirElement
24+
import org.jetbrains.kotlin.fir.SessionAndScopeSessionHolder
2325
import org.jetbrains.kotlin.fir.declarations.*
2426
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
27+
import org.jetbrains.kotlin.fir.declarations.utils.isScriptTopLevelDeclaration
2528
import org.jetbrains.kotlin.fir.declarations.utils.memberDeclarationNameOrNull
2629
import org.jetbrains.kotlin.fir.expressions.*
27-
import org.jetbrains.kotlin.fir.psi
28-
import org.jetbrains.kotlin.fir.realPsi
29-
import org.jetbrains.kotlin.fir.SessionAndScopeSessionHolder
30-
import org.jetbrains.kotlin.fir.declarations.utils.isScriptTopLevelDeclaration
3130
import org.jetbrains.kotlin.fir.extensions.scriptResolutionHacksComponent
31+
import org.jetbrains.kotlin.fir.realPsi
3232
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
3333
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitValue
3434
import org.jetbrains.kotlin.fir.resolve.dfa.DataFlowAnalyzerContext
@@ -143,7 +143,7 @@ object ContextCollector {
143143
private fun partiallyResolveTargetElementIfPossible(
144144
resolutionFacade: LLResolutionFacade,
145145
designation: FirDesignation?,
146-
targetElement: PsiElement
146+
targetElement: PsiElement,
147147
): Boolean {
148148
val declaration = designation?.target?.realPsi as? KtDeclaration ?: return false
149149

@@ -291,7 +291,7 @@ private class ContextCollectorVisitor(
291291
return
292292
}
293293

294-
val psi = fir.psi ?: return
294+
val psi = fir.anchorPsi ?: return
295295

296296
val key = ContextKey(psi, kind)
297297
if (key in result) {
@@ -1087,7 +1087,7 @@ private class ContextCollectorVisitor(
10871087
private inner class FilteringVisitor(
10881088
val delegate: FirVisitorVoid,
10891089
val elementsToSkip: Set<FirElement>,
1090-
val checkIsActive: Boolean
1090+
val checkIsActive: Boolean,
10911091
) : FirVisitorVoid() {
10921092
override fun visitElement(element: FirElement) {
10931093
if (checkIsActive && !isActive) {

analysis/low-level-api-fir/testData/contextCollector/enumClass.body.copy.txt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,35 @@ Tower Data Context:
1111
Scope: FirPackageMemberScope
1212
Element 5
1313
Scope: FirExplicitSimpleImportingScope
14+
Element 6
15+
Implicit receiver:
16+
FirRegularClassSymbol public final companion object Companion : R|kotlin/Any|
17+
Type: kotlin.Enum.Companion
18+
Element 7
19+
Scope: FirNestedClassifierScopeWithSubstitution
20+
Classifiers:
21+
FirRegularClassSymbol public final companion object Companion : R|kotlin/Any|
22+
Static scope owner symbol: FirRegularClassSymbol public abstract class Enum<E : R|kotlin/Enum<E>|> : R|kotlin/Comparable<E>|, R|java/io/Serializable|
23+
Element 8
24+
Scope: FirNestedClassifierScopeImpl
25+
Classifiers:
26+
FirRegularClassSymbol public final? inner class InnerClass : R|kotlin/Any|
27+
FirRegularClassSymbol public final? class NestedClass : R|kotlin/Any|
28+
FirRegularClassSymbol public final? object NestedObject : R|kotlin/Any|
29+
Scope: FirNameAwareOnlyCallablesScope
30+
Functions
31+
FirNamedFunctionSymbol public final static fun valueOf(value: R|kotlin/String|): R|foo/MyEnumClass|
32+
FirNamedFunctionSymbol public final static fun values(): R|kotlin/Array<foo/MyEnumClass>|
33+
Properties:
34+
FirEnumEntrySymbol public final static enum entry ENTRY1: R|foo/MyEnumClass|
35+
FirEnumEntrySymbol public final static enum entry ENTRY2: R|foo/MyEnumClass|
36+
FirEnumEntrySymbol public final static enum entry ENTRY3: R|foo/MyEnumClass|
37+
FirRegularPropertySymbol public final static val entries: R|kotlin/enums/EnumEntries<foo/MyEnumClass>|
38+
public get(): R|kotlin/enums/EnumEntries<foo/MyEnumClass>|
39+
Element 9
40+
Implicit receiver:
41+
FirRegularClassSymbol public final enum class MyEnumClass : R|kotlin/Enum<foo/MyEnumClass>|
42+
Type: foo.MyEnumClass
1443

1544
FILE: [ResolvedTo(IMPORTS)] enumClass.kt
1645
public final [ResolvedTo(STATUS)] enum class MyEnumClass : R|kotlin/Enum<foo/MyEnumClass>| {

analysis/low-level-api-fir/testData/contextCollector/enumClass.body.txt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,35 @@ Tower Data Context:
1111
Scope: FirPackageMemberScope
1212
Element 5
1313
Scope: FirExplicitSimpleImportingScope
14+
Element 6
15+
Implicit receiver:
16+
FirRegularClassSymbol public final companion object Companion : R|kotlin/Any|
17+
Type: kotlin.Enum.Companion
18+
Element 7
19+
Scope: FirNestedClassifierScopeWithSubstitution
20+
Classifiers:
21+
FirRegularClassSymbol public final companion object Companion : R|kotlin/Any|
22+
Static scope owner symbol: FirRegularClassSymbol public abstract class Enum<E : R|kotlin/Enum<E>|> : R|kotlin/Comparable<E>|, R|java/io/Serializable|
23+
Element 8
24+
Scope: FirNestedClassifierScopeImpl
25+
Classifiers:
26+
FirRegularClassSymbol public final? inner class InnerClass : R|kotlin/Any|
27+
FirRegularClassSymbol public final? class NestedClass : R|kotlin/Any|
28+
FirRegularClassSymbol public final? object NestedObject : R|kotlin/Any|
29+
Scope: FirNameAwareOnlyCallablesScope
30+
Functions
31+
FirNamedFunctionSymbol public final static fun valueOf(value: R|kotlin/String|): R|foo/MyEnumClass|
32+
FirNamedFunctionSymbol public final static fun values(): R|kotlin/Array<foo/MyEnumClass>|
33+
Properties:
34+
FirEnumEntrySymbol public final static enum entry ENTRY1: R|foo/MyEnumClass|
35+
FirEnumEntrySymbol public final static enum entry ENTRY2: R|foo/MyEnumClass|
36+
FirEnumEntrySymbol public final static enum entry ENTRY3: R|foo/MyEnumClass|
37+
FirRegularPropertySymbol public final static val entries: R|kotlin/enums/EnumEntries<foo/MyEnumClass>|
38+
public get(): R|kotlin/enums/EnumEntries<foo/MyEnumClass>|
39+
Element 9
40+
Implicit receiver:
41+
FirRegularClassSymbol public final enum class MyEnumClass : R|kotlin/Enum<foo/MyEnumClass>|
42+
Type: foo.MyEnumClass
1443

1544
FILE: [ResolvedTo(IMPORTS)] enumClass.kt
1645
public final [ResolvedTo(STATUS)] enum class MyEnumClass : R|kotlin/Enum<foo/MyEnumClass>| {

analysis/low-level-api-fir/testData/contextCollector/enumValuePropertyAccessor.body.copy.txt

Lines changed: 0 additions & 79 deletions
This file was deleted.

analysis/low-level-api-fir/testData/contextCollector/enumValuePropertyAccessor.body.txt

Lines changed: 0 additions & 79 deletions
This file was deleted.

analysis/low-level-api-fir/testData/contextCollector/enumValuePropertyAccessor.copy.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ Tower Data Context:
4040
Scope: FirLocalScope
4141
Properties:
4242
FirBackingFieldSymbol private final backing field field: R|kotlin/Int|
43+
Element 11
44+
Scope: FirLocalScope
4345

4446
FILE: [ResolvedTo(IMPORTS)] enumValuePropertyAccessor.kt
4547
public final? [ResolvedTo(RAW_FIR)] enum class Direction : R|kotlin/Enum<Direction>| {

analysis/low-level-api-fir/testData/contextCollector/enumValuePropertyAccessor.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ Tower Data Context:
4040
Scope: FirLocalScope
4141
Properties:
4242
FirBackingFieldSymbol private final backing field field: R|kotlin/Int|
43+
Element 11
44+
Scope: FirLocalScope
4345

4446
FILE: [ResolvedTo(IMPORTS)] enumValuePropertyAccessor.kt
4547
public final [ResolvedTo(STATUS)] enum class Direction : R|kotlin/Enum<Direction>| {

analysis/low-level-api-fir/testData/contextCollector/scripts/statement.body.copy.txt

Lines changed: 0 additions & 66 deletions
This file was deleted.

0 commit comments

Comments
 (0)