FIR IDE: fix local class containing file search
This commit is contained in:
@@ -30,10 +30,10 @@ abstract class FirProvider : FirSymbolProvider() {
|
|||||||
|
|
||||||
abstract fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile?
|
abstract fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile?
|
||||||
|
|
||||||
fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile =
|
open fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile =
|
||||||
getFirClassifierContainerFile(symbol.classId)
|
getFirClassifierContainerFile(symbol.classId)
|
||||||
|
|
||||||
fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? =
|
open fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? =
|
||||||
getFirClassifierContainerFileIfAny(symbol.classId)
|
getFirClassifierContainerFileIfAny(symbol.classId)
|
||||||
|
|
||||||
abstract fun getFirCallableContainerFile(symbol: FirCallableSymbol<*>): FirFile?
|
abstract fun getFirCallableContainerFile(symbol: FirCallableSymbol<*>): FirFile?
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
object A {
|
||||||
|
val x : Int = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
open class Foo {
|
||||||
|
fun foo() : Int = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
A.x
|
||||||
|
val b = object : Foo() {
|
||||||
|
}
|
||||||
|
b.foo()
|
||||||
|
|
||||||
|
object B {
|
||||||
|
fun foo() {}
|
||||||
|
}
|
||||||
|
B.foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
val bb = <!UNRESOLVED_REFERENCE!>B<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
FILE: localObjects.kt
|
||||||
|
public final object A : R|kotlin/Any| {
|
||||||
|
private constructor(): R|A| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = Int(0)
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
public open class Foo : R|kotlin/Any| {
|
||||||
|
public constructor(): R|Foo| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final fun foo(): R|kotlin/Int| {
|
||||||
|
^foo Int(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final fun test(): R|kotlin/Unit| {
|
||||||
|
Q|A|.R|/A.x|
|
||||||
|
lval b: R|anonymous| = object : R|Foo| {
|
||||||
|
private constructor(): R|Foo| {
|
||||||
|
super<R|Foo|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
R|<local>/b|.R|/Foo.foo|()
|
||||||
|
local final object B : R|kotlin/Any| {
|
||||||
|
private constructor(): R|B| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final fun foo(): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Q|B|.R|/B.foo|()
|
||||||
|
}
|
||||||
|
public final val bb: <ERROR TYPE REF: Unresolved name: foo> = <Unresolved name: B>#.<Unresolved name: foo>#()
|
||||||
|
public get(): <ERROR TYPE REF: Unresolved name: foo>
|
||||||
+5
@@ -489,6 +489,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest {
|
|||||||
runTest("compiler/fir/resolve/testData/resolve/expresssions/localInnerClass.kt");
|
runTest("compiler/fir/resolve/testData/resolve/expresssions/localInnerClass.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("localObjects.kt")
|
||||||
|
public void testLocalObjects() throws Exception {
|
||||||
|
runTest("compiler/fir/resolve/testData/resolve/expresssions/localObjects.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("localScopes.kt")
|
@TestMetadata("localScopes.kt")
|
||||||
public void testLocalScopes() throws Exception {
|
public void testLocalScopes() throws Exception {
|
||||||
runTest("compiler/fir/resolve/testData/resolve/expresssions/localScopes.kt");
|
runTest("compiler/fir/resolve/testData/resolve/expresssions/localScopes.kt");
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirSession
|
|||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
|
import org.jetbrains.kotlin.fir.psi
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl
|
import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl
|
||||||
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.idea.stubindex.*
|
|||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
class IdeFirProvider(
|
class IdeFirProvider(
|
||||||
@@ -81,6 +83,20 @@ class IdeFirProvider(
|
|||||||
return cacheProvider.getFirClassifierContainerFileIfAny(fqName)
|
return cacheProvider.getFirClassifierContainerFileIfAny(fqName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile {
|
||||||
|
return getFirClassifierContainerFileIfAny(symbol)
|
||||||
|
?: error("Couldn't find container for ${symbol.classId}")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? {
|
||||||
|
val psi = symbol.fir.source?.psi
|
||||||
|
if (psi is KtClassOrObject && psi.isLocal) {
|
||||||
|
val ktFile = psi.containingKtFile
|
||||||
|
return getOrBuildFile(ktFile)
|
||||||
|
}
|
||||||
|
return getFirClassifierContainerFileIfAny(symbol.classId)
|
||||||
|
}
|
||||||
|
|
||||||
override fun getFirCallableContainerFile(symbol: FirCallableSymbol<*>): FirFile? {
|
override fun getFirCallableContainerFile(symbol: FirCallableSymbol<*>): FirFile? {
|
||||||
return cacheProvider.getFirCallableContainerFile(symbol)
|
return cacheProvider.getFirCallableContainerFile(symbol)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user