FIR: Support top-level constructors

This commit is contained in:
Simon Ogorodnik
2019-03-07 17:48:48 +03:00
parent d817f719a4
commit 307b8a1d4c
6 changed files with 16 additions and 8 deletions
@@ -57,13 +57,14 @@ class FirProviderImpl(val session: FirSession) : FirProvider {
} }
override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration) { override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration) {
val callableId = when (containerFqName) { val callableId = (callableMemberDeclaration.symbol as ConeCallableSymbol).callableId
FqName.ROOT -> CallableId(packageName, callableMemberDeclaration.name)
else -> CallableId(packageName, containerFqName, callableMemberDeclaration.name)
}
callableMap.merge(callableId, listOf(callableMemberDeclaration)) { a, b -> a + b } callableMap.merge(callableId, listOf(callableMemberDeclaration)) { a, b -> a + b }
} }
override fun visitConstructor(constructor: FirConstructor) {
visitCallableMemberDeclaration(constructor)
}
override fun visitNamedFunction(namedFunction: FirNamedFunction) { override fun visitNamedFunction(namedFunction: FirNamedFunction) {
visitCallableMemberDeclaration(namedFunction) visitCallableMemberDeclaration(namedFunction)
} }
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirTopLevelDeclaredMemberScope( class FirTopLevelDeclaredMemberScope(
@@ -24,6 +25,12 @@ class FirTopLevelDeclaredMemberScope(
private val packageFqName = file.packageFqName private val packageFqName = file.packageFqName
override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction { override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction {
val constructors = provider.getCallableSymbols(CallableId(packageFqName, FqName.topLevel(name), name))
for (symbol in constructors) {
if (symbol is ConeFunctionSymbol && !processor(symbol)) {
return STOP
}
}
val symbols = provider.getCallableSymbols(CallableId(packageFqName, name)) val symbols = provider.getCallableSymbols(CallableId(packageFqName, name))
for (symbol in symbols) { for (symbol in symbols) {
if (symbol is ConeFunctionSymbol && !processor(symbol)) { if (symbol is ConeFunctionSymbol && !processor(symbol)) {
+1 -1
View File
@@ -11,5 +11,5 @@ FILE: derivedClass.kt
} }
<T : R|kotlin/Any|> public final function create(x: R|T|): R|Derived<T>| { <T : R|kotlin/Any|> public final function create(x: R|T|): R|Derived<T>| {
return@@@create <Unresolved name: Derived>#(R|<local>/x|) return@@@create R|/Derived.Derived|(R|<local>/x|)
} }
@@ -4,7 +4,7 @@ FILE: explicitReceiver.kt
public final class Foo { public final class Foo {
public constructor(): super<R|kotlin/Any|>() public constructor(): super<R|kotlin/Any|>()
public final property x(val): R|Foo| = <Unresolved name: Foo>#() public final property x(val): R|Foo| = R|/Foo.Foo|()
public get(): R|Foo| public get(): R|Foo|
public final operator function invoke(): R|Foo| { public final operator function invoke(): R|Foo| {
@@ -16,7 +16,7 @@ FILE: explicitReceiver2.kt
return@@@invoke this# return@@@invoke this#
} }
public final property x(val): R|Bar| = <Unresolved name: Bar>#() public final property x(val): R|Bar| = R|/Bar.Bar|()
public get(): R|Bar| public get(): R|Bar|
public final function bar(): R|Foo| { public final function bar(): R|Foo| {
@@ -15,7 +15,7 @@ FILE: simpleFakeOverride.kt
public constructor(): super<R|A<Some>|>() public constructor(): super<R|A<Some>|>()
public final function test(): R|kotlin/Unit| { public final function test(): R|kotlin/Unit| {
R|FakeOverride</A.foo: R|Some|>|(<Unresolved name: Some>#()) R|FakeOverride</A.foo: R|Some|>|(R|/Some.Some|())
} }
} }