[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,46 +185,72 @@ 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 -> {
processedNames += declaration.name if (declaration.name !in processedNames) {
createIrFunction(declaration, irClass) processedNames += declaration.name
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 -> {
processedNames += declaration.name if (declaration.name !in processedNames) {
createIrProperty(declaration, irClass) processedNames += declaration.name
} scope.processPropertiesByName(declaration.name) {
is FirConstructor -> { if (it is FirPropertySymbol) {
createIrConstructor(declaration, irClass) 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 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) for (name in allNames) {
if (scope != null) { if (name in processedNames) continue
for (name in allNames) { processedNames += name
if (name in processedNames) continue scope.processFunctionsByName(name) { functionSymbol ->
processedNames += name if (functionSymbol is FirNamedFunctionSymbol) {
scope.processFunctionsByName(name) { functionSymbol -> val fakeOverrideSymbol =
if (functionSymbol is FirNamedFunctionSymbol) { FirClassSubstitutionScope.createFakeOverrideFunction(session, functionSymbol.fir, functionSymbol)
val fakeOverrideSymbol = classifierStorage.preCacheTypeParameters(functionSymbol.fir)
FirClassSubstitutionScope.createFakeOverrideFunction(session, functionSymbol.fir, functionSymbol) irClass.declarations += createIrFunction(fakeOverrideSymbol.fir, irClass)
classifierStorage.preCacheTypeParameters(functionSymbol.fir)
irClass.declarations += createIrFunction(fakeOverrideSymbol.fir, irClass)
}
} }
scope.processPropertiesByName(name) { propertySymbol -> }
if (propertySymbol is FirPropertySymbol) { scope.processPropertiesByName(name) { propertySymbol ->
val fakeOverrideSymbol = if (propertySymbol is FirPropertySymbol) {
FirClassSubstitutionScope.createFakeOverrideProperty(session, propertySymbol.fir, propertySymbol) val fakeOverrideSymbol =
classifierStorage.preCacheTypeParameters(propertySymbol.fir) FirClassSubstitutionScope.createFakeOverrideProperty(session, propertySymbol.fir, propertySymbol)
irClass.declarations += createIrProperty(fakeOverrideSymbol.fir, irClass) classifierStorage.preCacheTypeParameters(propertySymbol.fir)
} irClass.declarations += createIrProperty(fakeOverrideSymbol.fir, irClass)
} }
} }
} }