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
|
package org.jetbrains.kotlin.fir.resolve.transformers
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
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.FirFile
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirImport
|
import org.jetbrains.kotlin.fir.declarations.FirImport
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
|
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.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
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> {
|
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
|
||||||
return element.compose()
|
return element.compose()
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var symbolProvider: FirSymbolProvider
|
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> {
|
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
|
||||||
symbolProvider = FirSymbolProvider.getInstance(file.session)
|
symbolProvider = FirSymbolProvider.getInstance(file.session)
|
||||||
return file.also { it.transformChildren(this, null) }.compose()
|
return file.also { it.transformChildren(this, null) }.compose()
|
||||||
|
|||||||
+6
-4
@@ -33,13 +33,15 @@ open class FirTypeResolveTransformer : FirTransformer<Nothing?>() {
|
|||||||
lateinit var scope: FirCompositeScope
|
lateinit var scope: FirCompositeScope
|
||||||
|
|
||||||
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
|
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
|
||||||
|
val session = file.session
|
||||||
scope = FirCompositeScope(
|
scope = FirCompositeScope(
|
||||||
mutableListOf(
|
mutableListOf(
|
||||||
// from high priority to low priority
|
// from high priority to low priority
|
||||||
FirExplicitImportingScope(file.imports),
|
FirExplicitSimpleImportingScope(file.imports, session),
|
||||||
FirSelfImportingScope(file.packageFqName, file.session),
|
FirSelfImportingScope(file.packageFqName, session),
|
||||||
FirExplicitStarImportingScope(file.imports, file.session),
|
FirDefaultSimpleImportingScope(session),
|
||||||
FirDefaultStarImportingScope(file.session)
|
FirExplicitStarImportingScope(file.imports, session),
|
||||||
|
FirDefaultStarImportingScope(session)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return super.transformFile(file, data)
|
return super.transformFile(file, data)
|
||||||
|
|||||||
+4
-7
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.scopes.impl
|
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.declarations.impl.FirResolvedImportImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
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.fir.symbols.ConeSymbol
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
class FirExplicitImportingScope(imports: List<FirImport>) : FirScope {
|
abstract class FirAbstractSimpleImportingScope(val session: FirSession) : FirScope {
|
||||||
|
|
||||||
private val simpleImports =
|
protected abstract val simpleImports: Map<Name, List<FirResolvedImportImpl>>
|
||||||
imports.filterIsInstance<FirResolvedImportImpl>()
|
|
||||||
.filter { !it.isAllUnder }
|
|
||||||
.groupBy { it.aliasName ?: it.resolvedFqName.shortClassName }
|
|
||||||
|
|
||||||
override fun processClassifiersByName(
|
override fun processClassifiersByName(
|
||||||
name: Name,
|
name: Name,
|
||||||
@@ -27,7 +24,7 @@ class FirExplicitImportingScope(imports: List<FirImport>) : FirScope {
|
|||||||
): Boolean {
|
): Boolean {
|
||||||
val imports = simpleImports[name] ?: return true
|
val imports = simpleImports[name] ?: return true
|
||||||
if (imports.isEmpty()) return true
|
if (imports.isEmpty()) return true
|
||||||
val provider = FirSymbolProvider.getInstance(imports.first().session)
|
val provider = FirSymbolProvider.getInstance(session)
|
||||||
for (import in imports) {
|
for (import in imports) {
|
||||||
val symbol = provider.getSymbolByFqName(import.resolvedFqName) ?: continue
|
val symbol = provider.getSymbolByFqName(import.resolvedFqName) ?: continue
|
||||||
if (!processor(symbol)) {
|
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) {
|
FirAbstractStarImportingScope(session, lookupInFir) {
|
||||||
|
|
||||||
// TODO: put languageVersionSettings into FirSession?
|
// TODO: put languageVersionSettings into FirSession?
|
||||||
override val starImports = session.moduleInfo?.platform?.getDefaultImports(LanguageVersionSettingsImpl.DEFAULT, true)?.map {
|
override val starImports = session.moduleInfo?.platform?.getDefaultImports(LanguageVersionSettingsImpl.DEFAULT, true)
|
||||||
FirResolvedPackageStarImport(
|
?.filter { it.isAllUnder }
|
||||||
FirImportImpl(session, null, it.fqName, isAllUnder = true, aliasName = null),
|
?.map {
|
||||||
it.fqName
|
FirResolvedPackageStarImport(
|
||||||
)
|
FirImportImpl(session, null, it.fqName, isAllUnder = true, aliasName = null),
|
||||||
} ?: emptyList()
|
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");
|
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")
|
@TestMetadata("NestedSuperType.kt")
|
||||||
public void testNestedSuperType() throws Exception {
|
public void testNestedSuperType() throws Exception {
|
||||||
runTest("compiler/fir/resolve/testData/resolve/multifile/NestedSuperType.kt");
|
runTest("compiler/fir/resolve/testData/resolve/multifile/NestedSuperType.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user