diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt index 1a6f7b65494..4c52a57a5f8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirImport import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl @@ -17,13 +18,18 @@ import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName -class FirImportResolveTransformer : FirTransformer() { +class FirImportResolveTransformer() : FirTransformer() { override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { return element.compose() } private lateinit var symbolProvider: FirSymbolProvider + constructor(session: FirSession) : this() { + // TODO: clarify this + symbolProvider = FirSymbolProvider.getInstance(session) + } + override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { symbolProvider = FirSymbolProvider.getInstance(file.session) return file.also { it.transformChildren(this, null) }.compose() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index a7ee3388e69..78a782c8169 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -33,13 +33,15 @@ open class FirTypeResolveTransformer : FirTransformer() { lateinit var scope: FirCompositeScope override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { + val session = file.session scope = FirCompositeScope( mutableListOf( // from high priority to low priority - FirExplicitImportingScope(file.imports), - FirSelfImportingScope(file.packageFqName, file.session), - FirExplicitStarImportingScope(file.imports, file.session), - FirDefaultStarImportingScope(file.session) + FirExplicitSimpleImportingScope(file.imports, session), + FirSelfImportingScope(file.packageFqName, session), + FirDefaultSimpleImportingScope(session), + FirExplicitStarImportingScope(file.imports, session), + FirDefaultStarImportingScope(session) ) ) return super.transformFile(file, data) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractSimpleImportingScope.kt similarity index 71% rename from compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitImportingScope.kt rename to compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractSimpleImportingScope.kt index 43db78923fd..11a342c5e24 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitImportingScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractSimpleImportingScope.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.fir.scopes.impl -import org.jetbrains.kotlin.fir.declarations.FirImport +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.scopes.FirPosition @@ -13,12 +13,9 @@ import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.ConeSymbol import org.jetbrains.kotlin.name.Name -class FirExplicitImportingScope(imports: List) : FirScope { +abstract class FirAbstractSimpleImportingScope(val session: FirSession) : FirScope { - private val simpleImports = - imports.filterIsInstance() - .filter { !it.isAllUnder } - .groupBy { it.aliasName ?: it.resolvedFqName.shortClassName } + protected abstract val simpleImports: Map> override fun processClassifiersByName( name: Name, @@ -27,7 +24,7 @@ class FirExplicitImportingScope(imports: List) : FirScope { ): Boolean { val imports = simpleImports[name] ?: return true if (imports.isEmpty()) return true - val provider = FirSymbolProvider.getInstance(imports.first().session) + val provider = FirSymbolProvider.getInstance(session) for (import in imports) { val symbol = provider.getSymbolByFqName(import.resolvedFqName) ?: continue if (!processor(symbol)) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDefaultSimpleImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDefaultSimpleImportingScope.kt new file mode 100644 index 00000000000..2a371f95b34 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDefaultSimpleImportingScope.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.fir.scopes.impl + +import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.impl.FirImportImpl +import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl +import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer + +class FirDefaultSimpleImportingScope(session: FirSession) : FirAbstractSimpleImportingScope(session) { + + private fun FirImportImpl.resolve(importResolveTransformer: FirImportResolveTransformer) = + importResolveTransformer.transformImport(this, null).single as FirResolvedImportImpl + + override val simpleImports = run { + val importResolveTransformer = FirImportResolveTransformer(session) + session.moduleInfo?.platform?.getDefaultImports(LanguageVersionSettingsImpl.DEFAULT, true) + ?.filter { !it.isAllUnder } + ?.map { + FirImportImpl(session, null, it.fqName, isAllUnder = false, aliasName = null) + .resolve(importResolveTransformer) + }?.groupBy { it.resolvedFqName.shortClassName } ?: emptyMap() + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDefaultStarImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDefaultStarImportingScope.kt index 1d3d8ddd9bd..07af8c35581 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDefaultStarImportingScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirDefaultStarImportingScope.kt @@ -14,10 +14,12 @@ class FirDefaultStarImportingScope(session: FirSession, lookupInFir: Boolean = f FirAbstractStarImportingScope(session, lookupInFir) { // TODO: put languageVersionSettings into FirSession? - override val starImports = session.moduleInfo?.platform?.getDefaultImports(LanguageVersionSettingsImpl.DEFAULT, true)?.map { - FirResolvedPackageStarImport( - FirImportImpl(session, null, it.fqName, isAllUnder = true, aliasName = null), - it.fqName - ) - } ?: emptyList() + override val starImports = session.moduleInfo?.platform?.getDefaultImports(LanguageVersionSettingsImpl.DEFAULT, true) + ?.filter { it.isAllUnder } + ?.map { + FirResolvedPackageStarImport( + FirImportImpl(session, null, it.fqName, isAllUnder = true, aliasName = null), + it.fqName + ) + } ?: emptyList() } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitSimpleImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitSimpleImportingScope.kt new file mode 100644 index 00000000000..85a4183dcbc --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitSimpleImportingScope.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.fir.scopes.impl + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirImport +import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl + +class FirExplicitSimpleImportingScope( + imports: List, + session: FirSession +) : FirAbstractSimpleImportingScope(session) { + + override val simpleImports = + imports.filterIsInstance() + .filter { !it.isAllUnder } + .groupBy { it.aliasName ?: it.resolvedFqName.shortClassName } +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/multifile/ByteArray.1.kt b/compiler/fir/resolve/testData/resolve/multifile/ByteArray.1.kt new file mode 100644 index 00000000000..d7721f6c336 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/multifile/ByteArray.1.kt @@ -0,0 +1,5 @@ +package Test + +interface ByteArray { + val array: ByteArray +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/multifile/ByteArray.kt b/compiler/fir/resolve/testData/resolve/multifile/ByteArray.kt new file mode 100644 index 00000000000..3f207ed688e --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/multifile/ByteArray.kt @@ -0,0 +1,8 @@ +package use + +import test.* + +interface My { + // Should be kotlin.ByteArray + val array: ByteArray +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/multifile/ByteArray.txt b/compiler/fir/resolve/testData/resolve/multifile/ByteArray.txt new file mode 100644 index 00000000000..7910ff182f9 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/multifile/ByteArray.txt @@ -0,0 +1,6 @@ +FILE: ByteArray.kt + public abstract interface My { + public abstract property array(val): R|kotlin/ByteArray| + public get(): R|kotlin/ByteArray| + + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index a06fd9c74bf..b20da977cb5 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -187,6 +187,11 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { runTest("compiler/fir/resolve/testData/resolve/multifile/Annotations.kt"); } + @TestMetadata("ByteArray.kt") + public void testByteArray() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/multifile/ByteArray.kt"); + } + @TestMetadata("NestedSuperType.kt") public void testNestedSuperType() throws Exception { runTest("compiler/fir/resolve/testData/resolve/multifile/NestedSuperType.kt");