[FIR2IR] Take callables from scope in external declaration generator

This commit fixes 2 more unmuted BB tests
This commit is contained in:
Mikhail Glukhikh
2020-05-13 14:50:45 +03:00
parent 12c0cbee94
commit 6beee004a3
@@ -185,28 +185,55 @@ class Fir2IrDeclarationStorage(
// due to BE optimizations (for lowering) that use their first / last / step members // due to BE optimizations (for lowering) that use their first / last / step members
// TODO: think how to refactor this piece of code and/or merge it with similar Fir2IrVisitor fragment // TODO: think how to refactor this piece of code and/or merge it with similar Fir2IrVisitor fragment
val processedNames = mutableSetOf<Name>() val processedNames = mutableSetOf<Name>()
// NB: it's necessary to take all callables from scope,
// e.g. to avoid accessing un-enhanced Java declarations with FirJavaTypeRef etc. inside
val scope = regularClass.buildUseSiteMemberScope(session, scopeSession)!!
scope.processDeclaredConstructors {
irClass.declarations += createIrConstructor(it.fir, irClass)
}
for (declaration in regularClass.declarations) { for (declaration in regularClass.declarations) {
irClass.declarations += when (declaration) { when (declaration) {
is FirSimpleFunction -> { is FirSimpleFunction -> {
if (declaration.name !in processedNames) {
processedNames += declaration.name processedNames += declaration.name
createIrFunction(declaration, irClass) scope.processFunctionsByName(declaration.name) {
if (it is FirNamedFunctionSymbol) {
if (!it.isFakeOverride) {
irClass.declarations += createIrFunction(it.fir, irClass)
} else {
val fakeOverrideSymbol =
FirClassSubstitutionScope.createFakeOverrideFunction(session, it.fir, it)
classifierStorage.preCacheTypeParameters(it.fir)
irClass.declarations += createIrFunction(fakeOverrideSymbol.fir, irClass)
}
}
}
}
} }
is FirProperty -> { is FirProperty -> {
if (declaration.name !in processedNames) {
processedNames += declaration.name processedNames += declaration.name
createIrProperty(declaration, irClass) scope.processPropertiesByName(declaration.name) {
if (it is FirPropertySymbol) {
if (!it.isFakeOverride) {
irClass.declarations += createIrProperty(it.fir, irClass)
} else {
val fakeOverrideSymbol =
FirClassSubstitutionScope.createFakeOverrideProperty(session, it.fir, it)
classifierStorage.preCacheTypeParameters(it.fir)
irClass.declarations += createIrProperty(fakeOverrideSymbol.fir, irClass)
}
}
}
} }
is FirConstructor -> {
createIrConstructor(declaration, irClass)
} }
is FirRegularClass -> { is FirRegularClass -> {
classifierStorage.createIrClass(declaration, irClass) irClass.declarations += classifierStorage.createIrClass(declaration, irClass)
} }
else -> continue else -> continue
} }
} }
val allNames = regularClass.collectCallableNamesFromSupertypes(session) val allNames = regularClass.collectCallableNamesFromSupertypes(session)
val scope = regularClass.buildUseSiteMemberScope(session, scopeSession)
if (scope != null) {
for (name in allNames) { for (name in allNames) {
if (name in processedNames) continue if (name in processedNames) continue
processedNames += name processedNames += name
@@ -227,7 +254,6 @@ class Fir2IrDeclarationStorage(
} }
} }
} }
}
for (irDeclaration in irClass.declarations) { for (irDeclaration in irClass.declarations) {
irDeclaration.parent = irClass irDeclaration.parent = irClass
} }