FIR: add default simple importing scope to support kotlin.ByteArray etc

This commit is contained in:
Mikhail Glukhikh
2018-04-10 13:47:44 +03:00
parent 6e369e156d
commit f0c9a3daa2
10 changed files with 98 additions and 18 deletions
@@ -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()
@@ -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)
@@ -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)) {
@@ -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()
}
}
@@ -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()
}
@@ -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|
}
@@ -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");