FIR: add default simple importing scope to support kotlin.ByteArray etc
This commit is contained in:
+7
-1
@@ -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<Nothing?>() {
|
||||
class FirImportResolveTransformer() : FirTransformer<Nothing?>() {
|
||||
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
|
||||
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<FirFile> {
|
||||
symbolProvider = FirSymbolProvider.getInstance(file.session)
|
||||
return file.also { it.transformChildren(this, null) }.compose()
|
||||
|
||||
+6
-4
@@ -33,13 +33,15 @@ open class FirTypeResolveTransformer : FirTransformer<Nothing?>() {
|
||||
lateinit var scope: FirCompositeScope
|
||||
|
||||
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
|
||||
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)
|
||||
|
||||
+4
-7
@@ -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<FirImport>) : FirScope {
|
||||
abstract class FirAbstractSimpleImportingScope(val session: FirSession) : FirScope {
|
||||
|
||||
private val simpleImports =
|
||||
imports.filterIsInstance<FirResolvedImportImpl>()
|
||||
.filter { !it.isAllUnder }
|
||||
.groupBy { it.aliasName ?: it.resolvedFqName.shortClassName }
|
||||
protected abstract val simpleImports: Map<Name, List<FirResolvedImportImpl>>
|
||||
|
||||
override fun processClassifiersByName(
|
||||
name: Name,
|
||||
@@ -27,7 +24,7 @@ class FirExplicitImportingScope(imports: List<FirImport>) : 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)) {
|
||||
+28
@@ -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()
|
||||
}
|
||||
}
|
||||
+8
-6
@@ -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()
|
||||
}
|
||||
+21
@@ -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<FirImport>,
|
||||
session: FirSession
|
||||
) : FirAbstractSimpleImportingScope(session) {
|
||||
|
||||
override val simpleImports =
|
||||
imports.filterIsInstance<FirResolvedImportImpl>()
|
||||
.filter { !it.isAllUnder }
|
||||
.groupBy { it.aliasName ?: it.resolvedFqName.shortClassName }
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package Test
|
||||
|
||||
interface ByteArray {
|
||||
val array: ByteArray
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package use
|
||||
|
||||
import test.*
|
||||
|
||||
interface My {
|
||||
// Should be kotlin.ByteArray
|
||||
val array: ByteArray
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
FILE: ByteArray.kt
|
||||
public abstract interface My {
|
||||
public abstract property array(val): R|kotlin/ByteArray|
|
||||
public get(): R|kotlin/ByteArray|
|
||||
|
||||
}
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user