diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index 51cdb852c23..23ffb8cccee 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -118,6 +118,12 @@ public class Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exte runTest("analysis/analysis-api/testData/referenceResolve/ClassReferenceInImport.kt"); } + @Test + @TestMetadata("CollectionStream.kt") + public void testCollectionStream() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CollectionStream.kt"); + } + @Test @TestMetadata("CompanionObjectWithName1.kt") public void testCompanionObjectWithName1() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java index 9513847bc21..a07bf102082 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -118,6 +118,12 @@ public class FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated ex runTest("analysis/analysis-api/testData/referenceResolve/ClassReferenceInImport.kt"); } + @Test + @TestMetadata("CollectionStream.kt") + public void testCollectionStream() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CollectionStream.kt"); + } + @Test @TestMetadata("CompanionObjectWithName1.kt") public void testCompanionObjectWithName1() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java index e4a769b03ad..c7e879b94ba 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java @@ -118,6 +118,12 @@ public class FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerate runTest("analysis/analysis-api/testData/referenceResolve/ClassReferenceInImport.kt"); } + @Test + @TestMetadata("CollectionStream.kt") + public void testCollectionStream() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CollectionStream.kt"); + } + @Test @TestMetadata("CompanionObjectWithName1.kt") public void testCompanionObjectWithName1() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index 1604a1505d6..890f68305eb 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -118,6 +118,12 @@ public class FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exten runTest("analysis/analysis-api/testData/referenceResolve/ClassReferenceInImport.kt"); } + @Test + @TestMetadata("CollectionStream.kt") + public void testCollectionStream() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CollectionStream.kt"); + } + @Test @TestMetadata("CompanionObjectWithName1.kt") public void testCompanionObjectWithName1() throws Exception { diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceResolveTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceResolveTest.kt index 0f908e84887..3f9c4f66202 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceResolveTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceResolveTest.kt @@ -78,8 +78,9 @@ abstract class AbstractReferenceResolveTest : AbstractAnalysisApiBasedTest() { val resolvedTo = analyzeReferenceElement(ktReferences.first().element, mainModule) { val symbols = ktReferences.flatMap { it.resolveToSymbols() } checkReferenceResultForValidity(ktReferences, mainModule, testServices, symbols) - renderResolvedTo(symbols, renderingOptions) { getAdditionalSymbolInfo(it) } - } + val renderPsiClassName = Directives.RENDER_PSI_CLASS_NAME in mainModule.directives + renderResolvedTo(symbols, renderPsiClassName, renderingOptions) { getAdditionalSymbolInfo(it) } + } if (Directives.UNRESOLVED_REFERENCE in mainModule.directives) { return @@ -119,6 +120,10 @@ abstract class AbstractReferenceResolveTest : AbstractAnalysisApiBasedTest() { val UNRESOLVED_REFERENCE by directive( "Reference should be unresolved", ) + + val RENDER_PSI_CLASS_NAME by directive( + "Render also PSI class name for resolved reference" + ) } private val renderingOptions = KtDeclarationRendererForDebug.WITH_QUALIFIED_NAMES.with { diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/TestReferenceResolveResultRenderer.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/TestReferenceResolveResultRenderer.kt index c85610dd03e..5ba40e9d217 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/TestReferenceResolveResultRenderer.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/TestReferenceResolveResultRenderer.kt @@ -17,16 +17,18 @@ import org.jetbrains.kotlin.types.Variance object TestReferenceResolveResultRenderer { fun KtAnalysisSession.renderResolvedTo( symbols: List, + renderPsiClassName: Boolean = false, renderer: KtDeclarationRenderer = KtDeclarationRendererForDebug.WITH_QUALIFIED_NAMES, additionalInfo: KtAnalysisSession.(KtSymbol) -> String? = { null } ) = - symbols.map { renderResolveResult(it, renderer, additionalInfo) } + symbols.map { renderResolveResult(it, renderPsiClassName, renderer, additionalInfo) } .sorted() .withIndex() .joinToString(separator = "\n") { "${it.index}: ${it.value}" } private fun KtAnalysisSession.renderResolveResult( symbol: KtSymbol, + renderPsiClassName: Boolean, renderer: KtDeclarationRenderer, additionalInfo: KtAnalysisSession.(KtSymbol) -> String? ): String { @@ -35,7 +37,12 @@ object TestReferenceResolveResultRenderer { append("(in $fqName) ") } when (symbol) { - is KtDeclarationSymbol -> append(symbol.render(renderer)) + is KtDeclarationSymbol -> { + append(symbol.render(renderer)) + if (renderPsiClassName) { + append(" (psi: ${symbol.psi?.let { it::class.simpleName }})") + } + } is KtPackageSymbol -> append("package ${symbol.fqName}") is KtReceiverParameterSymbol -> { append("extension receiver with type ") diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index 171dbd62714..4f0d6e0ee69 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -118,6 +118,12 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerate runTest("analysis/analysis-api/testData/referenceResolve/ClassReferenceInImport.kt"); } + @Test + @TestMetadata("CollectionStream.kt") + public void testCollectionStream() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CollectionStream.kt"); + } + @Test @TestMetadata("CompanionObjectWithName1.kt") public void testCompanionObjectWithName1() throws Exception { diff --git a/analysis/analysis-api/testData/referenceResolve/CollectionStream.kt b/analysis/analysis-api/testData/referenceResolve/CollectionStream.kt new file mode 100644 index 00000000000..827726b60f7 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/CollectionStream.kt @@ -0,0 +1,9 @@ +// ISSUE: KT-64044 +// IGNORE_FE10 +// (stream call is unresolved for some reason) +// FULL_JDK +// RENDER_PSI_CLASS_NAME + +fun f(collection: Collection) { + collection.stream() +} diff --git a/analysis/analysis-api/testData/referenceResolve/CollectionStream.txt b/analysis/analysis-api/testData/referenceResolve/CollectionStream.txt new file mode 100644 index 00000000000..0213bf1d277 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/CollectionStream.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in kotlin.collections.Collection) fun stream(): java.util.stream.Stream (psi: ClsMethodImpl) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt index 2fb46062f97..1e15922ce4d 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt @@ -223,6 +223,7 @@ class JvmMappedScope( newDispatchReceiverType = kotlinDispatchReceiverType, newParameterTypes = oldFunction.valueParameters.map { substitutor.substituteOrSelf(it.returnTypeRef.coneType) }, newReturnType = substitutor.substituteOrSelf(oldFunction.returnTypeRef.coneType), + newSource = symbol.fir.source, ).apply { if (jdkMemberStatus == JDKMemberStatus.HIDDEN) { isHiddenEverywhereBesideSuperCalls = true @@ -295,7 +296,8 @@ class JvmMappedScope( newTypeParameters = null, newContextReceiverTypes = emptyList(), isExpect = false, - callableCopySubstitutionForTypeUpdater = null + callableCopySubstitutionForTypeUpdater = null, + newSource = oldConstructor.source, ) return newSymbol } diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt index bb870e24025..09a341f26e3 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt @@ -120,8 +120,9 @@ object FirFakeOverrideGenerator { newModality: Modality? = null, newVisibility: Visibility? = null, callableCopySubstitutionForTypeUpdater: CallableCopySubstitution? = null, + newSource: KtSourceElement? = null, ): FirSimpleFunction = buildSimpleFunction { - source = derivedClassLookupTag?.toSymbol(session)?.source ?: baseFunction.source + source = newSource ?: derivedClassLookupTag?.toSymbol(session)?.source ?: baseFunction.source moduleData = session.nullableModuleData ?: baseFunction.moduleData this.origin = origin name = baseFunction.name @@ -153,11 +154,12 @@ object FirFakeOverrideGenerator { newTypeParameters: List?, isExpect: Boolean, callableCopySubstitutionForTypeUpdater: CallableCopySubstitution?, + newSource: KtSourceElement? = null, ): FirConstructor = buildConstructor { // TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl // As second alternative, we can invent some light-weight kind of FirRegularClass annotations += baseConstructor.annotations - source = derivedClassLookupTag?.toSymbol(session)?.source ?: baseConstructor.source + source = newSource ?: derivedClassLookupTag?.toSymbol(session)?.source ?: baseConstructor.source moduleData = session.nullableModuleData ?: baseConstructor.moduleData this.origin = origin receiverParameter = baseConstructor.receiverParameter?.let { receiverParameter ->