FIR: split default importing scopes into low/high priority ones

This fixes resolve of StringBuilder(), AssertionError(), etc.
This commit is contained in:
Mikhail Glukhikh
2019-08-29 17:51:19 +03:00
parent 044dfd14ce
commit 5741ff5d86
10 changed files with 75 additions and 35 deletions
@@ -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)
@@ -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>?
}
@@ -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)
@@ -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
View File
@@ -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|()
}
}
+1 -1
View File
@@ -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 -> {
}
+3 -3
View File
@@ -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
View File
@@ -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