FIR: split default importing scopes into low/high priority ones
This fixes resolve of StringBuilder(), AssertionError(), etc.
This commit is contained in:
@@ -24,9 +24,11 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
fun MutableList<FirScope>.addImportingScopes(file: FirFile, session: FirSession) {
|
||||
this += listOf(
|
||||
// from low priority to high priority
|
||||
FirDefaultStarImportingScope(session),
|
||||
FirDefaultStarImportingScope(session, priority = DefaultImportPriority.LOW),
|
||||
FirDefaultStarImportingScope(session, priority = DefaultImportPriority.HIGH),
|
||||
FirExplicitStarImportingScope(file.imports, session),
|
||||
FirDefaultSimpleImportingScope(session),
|
||||
FirDefaultSimpleImportingScope(session, priority = DefaultImportPriority.LOW),
|
||||
FirDefaultSimpleImportingScope(session, priority = DefaultImportPriority.HIGH),
|
||||
FirSelfImportingScope(file.packageFqName, session),
|
||||
// TODO: explicit simple importing scope should have highest priority (higher than inner scopes added in process)
|
||||
FirExplicitSimpleImportingScope(file.imports, session)
|
||||
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* 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.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.resolve.ImportPath
|
||||
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
|
||||
|
||||
enum class DefaultImportPriority {
|
||||
HIGH {
|
||||
override fun getAllDefaultImports(
|
||||
platformDependentAnalyzerServices: PlatformDependentAnalyzerServices?,
|
||||
languageVersionSettings: LanguageVersionSettings
|
||||
): List<ImportPath>? =
|
||||
platformDependentAnalyzerServices?.getDefaultImports(languageVersionSettings, includeLowPriorityImports = false)
|
||||
},
|
||||
LOW {
|
||||
override fun getAllDefaultImports(
|
||||
platformDependentAnalyzerServices: PlatformDependentAnalyzerServices?,
|
||||
languageVersionSettings: LanguageVersionSettings
|
||||
): List<ImportPath>? =
|
||||
platformDependentAnalyzerServices?.defaultLowPriorityImports
|
||||
};
|
||||
|
||||
abstract fun getAllDefaultImports(
|
||||
platformDependentAnalyzerServices: PlatformDependentAnalyzerServices?,
|
||||
languageVersionSettings: LanguageVersionSettings
|
||||
): List<ImportPath>?
|
||||
}
|
||||
+4
-2
@@ -11,14 +11,16 @@ 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) {
|
||||
class FirDefaultSimpleImportingScope(session: FirSession, priority: DefaultImportPriority) : 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?.analyzerServices?.getDefaultImports(LanguageVersionSettingsImpl.DEFAULT, true)
|
||||
val analyzerServices = session.moduleInfo?.analyzerServices
|
||||
val allDefaultImports = priority.getAllDefaultImports(analyzerServices, LanguageVersionSettingsImpl.DEFAULT)
|
||||
allDefaultImports
|
||||
?.filter { !it.isAllUnder }
|
||||
?.map {
|
||||
FirImportImpl(null, it.fqName, isAllUnder = false, aliasName = null)
|
||||
|
||||
+14
-10
@@ -10,17 +10,21 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirImportImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
|
||||
|
||||
class FirDefaultStarImportingScope(session: FirSession, lookupInFir: Boolean = false) :
|
||||
class FirDefaultStarImportingScope(session: FirSession, priority: DefaultImportPriority, lookupInFir: Boolean = false) :
|
||||
FirAbstractStarImportingScope(session, lookupInFir) {
|
||||
|
||||
// TODO: put languageVersionSettings into FirSession?
|
||||
override val starImports = session.moduleInfo?.analyzerServices?.getDefaultImports(LanguageVersionSettingsImpl.DEFAULT, true)
|
||||
?.filter { it.isAllUnder }
|
||||
?.map {
|
||||
FirResolvedImportImpl(
|
||||
FirImportImpl(null, it.fqName, isAllUnder = true, aliasName = null),
|
||||
it.fqName,
|
||||
null
|
||||
)
|
||||
} ?: emptyList()
|
||||
override val starImports = run {
|
||||
val analyzerServices = session.moduleInfo?.analyzerServices
|
||||
val allDefaultImports = priority.getAllDefaultImports(analyzerServices, LanguageVersionSettingsImpl.DEFAULT)
|
||||
allDefaultImports
|
||||
?.filter { it.isAllUnder }
|
||||
?.map {
|
||||
FirResolvedImportImpl(
|
||||
FirImportImpl(null, it.fqName, isAllUnder = true, aliasName = null),
|
||||
it.fqName,
|
||||
null
|
||||
)
|
||||
} ?: emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ FILE: initBlock.kt
|
||||
|
||||
init {
|
||||
lval x: R|kotlin/Int| = Int(1)
|
||||
throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()
|
||||
throw R|java/lang/Exception.Exception|()
|
||||
lval y: R|kotlin/Int| = Int(2)
|
||||
}
|
||||
|
||||
|
||||
@@ -91,8 +91,8 @@ digraph propertiesAndInitBlocks_kt {
|
||||
27 [label="Const: Int(1)"];
|
||||
28 [label="Function call: Int(1).R|kotlin/Int.plus|(Int(1))"];
|
||||
29 [label="Variable declaration: lval c: R|kotlin/Int|"];
|
||||
30 [label="Function call: <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()"];
|
||||
31 [label="Throw: throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()"];
|
||||
30 [label="Function call: R|java/lang/Exception.Exception|()"];
|
||||
31 [label="Throw: throw R|java/lang/Exception.Exception|()"];
|
||||
32 [label="Stub" style="filled" fillcolor=gray];
|
||||
33 [label="Exit block" style="filled" fillcolor=gray];
|
||||
}
|
||||
@@ -125,8 +125,8 @@ digraph propertiesAndInitBlocks_kt {
|
||||
subgraph cluster_12 {
|
||||
color=blue
|
||||
38 [label="Enter block"];
|
||||
39 [label="Function call: <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()"];
|
||||
40 [label="Throw: throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()"];
|
||||
39 [label="Function call: R|java/lang/Exception.Exception|()"];
|
||||
40 [label="Throw: throw R|java/lang/Exception.Exception|()"];
|
||||
41 [label="Stub" style="filled" fillcolor=gray];
|
||||
42 [label="Exit block" style="filled" fillcolor=gray];
|
||||
}
|
||||
@@ -168,8 +168,8 @@ digraph propertiesAndInitBlocks_kt {
|
||||
subgraph cluster_17 {
|
||||
color=blue
|
||||
51 [label="Enter block"];
|
||||
52 [label="Function call: <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()"];
|
||||
53 [label="Throw: throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()"];
|
||||
52 [label="Function call: R|java/lang/Exception.Exception|()"];
|
||||
53 [label="Throw: throw R|java/lang/Exception.Exception|()"];
|
||||
54 [label="Stub" style="filled" fillcolor=gray];
|
||||
55 [label="Const: Int(1)" style="filled" fillcolor=gray];
|
||||
56 [label="Exit block" style="filled" fillcolor=gray];
|
||||
@@ -185,8 +185,8 @@ digraph propertiesAndInitBlocks_kt {
|
||||
subgraph cluster_20 {
|
||||
color=blue
|
||||
60 [label="Enter block"];
|
||||
61 [label="Function call: <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()"];
|
||||
62 [label="Throw: throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()"];
|
||||
61 [label="Function call: R|java/lang/Exception.Exception|()"];
|
||||
62 [label="Throw: throw R|java/lang/Exception.Exception|()"];
|
||||
63 [label="Stub" style="filled" fillcolor=gray];
|
||||
64 [label="Exit block" style="filled" fillcolor=gray];
|
||||
}
|
||||
@@ -195,7 +195,7 @@ digraph propertiesAndInitBlocks_kt {
|
||||
66 [label="Function call: R|/run|(<L> = run@fun <anonymous>(): R|kotlin/Unit| <kind=EXACTLY_ONCE> {
|
||||
local final fun foo(): R|kotlin/Unit| {
|
||||
lval c: R|kotlin/Int| = Int(1).R|kotlin/Int.plus|(Int(1))
|
||||
throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()
|
||||
throw R|java/lang/Exception.Exception|()
|
||||
}
|
||||
|
||||
local final class LocalClass : R|kotlin/Any| {
|
||||
@@ -204,13 +204,13 @@ digraph propertiesAndInitBlocks_kt {
|
||||
}
|
||||
|
||||
init {
|
||||
throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()
|
||||
throw R|java/lang/Exception.Exception|()
|
||||
Int(1)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()
|
||||
throw R|java/lang/Exception.Exception|()
|
||||
}
|
||||
)" style="filled" fillcolor=gray];
|
||||
67 [label="Exit property" style="filled" fillcolor=red];
|
||||
|
||||
@@ -14,7 +14,7 @@ FILE: propertiesAndInitBlocks.kt
|
||||
public final val x3: R|kotlin/Unit| = R|/run|(<L> = run@fun <anonymous>(): R|kotlin/Unit| <kind=EXACTLY_ONCE> {
|
||||
local final fun foo(): R|kotlin/Unit| {
|
||||
lval c: R|kotlin/Int| = Int(1).R|kotlin/Int.plus|(Int(1))
|
||||
throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()
|
||||
throw R|java/lang/Exception.Exception|()
|
||||
}
|
||||
|
||||
local final class LocalClass : R|kotlin/Any| {
|
||||
@@ -23,13 +23,13 @@ FILE: propertiesAndInitBlocks.kt
|
||||
}
|
||||
|
||||
init {
|
||||
throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()
|
||||
throw R|java/lang/Exception.Exception|()
|
||||
Int(1)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()
|
||||
throw R|java/lang/Exception.Exception|()
|
||||
}
|
||||
)
|
||||
public get(): R|kotlin/Unit| {
|
||||
@@ -39,7 +39,7 @@ FILE: propertiesAndInitBlocks.kt
|
||||
}
|
||||
|
||||
init {
|
||||
throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#()
|
||||
throw R|java/lang/Exception.Exception|()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ FILE: exception.kt
|
||||
public final fun main(args: R|kotlin/Array<kotlin/String>|): R|kotlin/Unit| {
|
||||
when () {
|
||||
==(R|/box|(), String(OK)) -> {
|
||||
throw <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#(String(Hello))
|
||||
throw R|java/lang/Exception.Exception|(String(Hello))
|
||||
}
|
||||
else -> {
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
FILE: problems.kt
|
||||
public final val sb: <ERROR TYPE REF: Ambiguity: StringBuilder, [java/lang/StringBuilder.StringBuilder, java/lang/StringBuilder.StringBuilder]> = <Ambiguity: StringBuilder, [java/lang/StringBuilder.StringBuilder, java/lang/StringBuilder.StringBuilder]>#()
|
||||
public get(): <ERROR TYPE REF: Ambiguity: StringBuilder, [java/lang/StringBuilder.StringBuilder, java/lang/StringBuilder.StringBuilder]>
|
||||
public final val sb: R|java/lang/StringBuilder| = R|java/lang/StringBuilder.StringBuilder|()
|
||||
public get(): R|java/lang/StringBuilder|
|
||||
public final val o: R|kotlin/Any| = object : R|kotlin/Any| {
|
||||
private constructor(): R|kotlin/Any| {
|
||||
super<R|kotlin/Any|>()
|
||||
@@ -55,7 +55,7 @@ FILE: problems.kt
|
||||
}
|
||||
public final val xx: <ERROR TYPE REF: Inapplicable(WRONG_RECEIVER): [kotlin/plus, kotlin/plus, kotlin/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/sequences/plus, kotlin/sequences/plus, kotlin/sequences/plus, kotlin/sequences/plus, kotlin/text/plus]> = R|/Derived.Derived|().R|/Base.x|.<Inapplicable(WRONG_RECEIVER): [kotlin/plus, kotlin/plus, kotlin/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/sequences/plus, kotlin/sequences/plus, kotlin/sequences/plus, kotlin/sequences/plus, kotlin/text/plus]>#(Int(1))
|
||||
public get(): <ERROR TYPE REF: Inapplicable(WRONG_RECEIVER): [kotlin/plus, kotlin/plus, kotlin/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/sequences/plus, kotlin/sequences/plus, kotlin/sequences/plus, kotlin/sequences/plus, kotlin/text/plus]>
|
||||
public final val t: R|kotlin/Nothing| = throw <Ambiguity: AssertionError, [java/lang/AssertionError.AssertionError, java/lang/AssertionError.AssertionError]>#(String())
|
||||
public final val t: R|kotlin/Nothing| = throw R|java/lang/AssertionError.AssertionError|(String())
|
||||
public get(): R|kotlin/Nothing|
|
||||
public abstract interface A : R|kotlin/Any| {
|
||||
}
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ FILE fqName:<root> fileName:/kt30796.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun magic <T> (): T of <root>.magic declared in <root>'
|
||||
THROW type=kotlin.Nothing
|
||||
ERROR_CALL 'Unresolved reference: <Ambiguity: Exception, [java/lang/Exception.Exception, java/lang/Exception.Exception]>#' type=IrErrorType
|
||||
CONSTRUCTOR_CALL 'public constructor <init> () declared in java.lang.Exception' type=java.lang.Exception origin=null
|
||||
FUN name:test visibility:public modality:FINAL <T> (value:T of <root>.test, value2:T of <root>.test) returnType:kotlin.Unit
|
||||
TYPE_PARAMETER name:T index:0 variance: superTypes:[]
|
||||
VALUE_PARAMETER name:value index:0 type:T of <root>.test
|
||||
|
||||
Reference in New Issue
Block a user