Extract static initializers of inner classes

This commit is contained in:
Tony Torralba
2022-03-21 14:13:52 +01:00
committed by Ian Lynagh
parent 8c50e857e4
commit 1f812f856c
3 changed files with 17 additions and 14 deletions

View File

@@ -97,7 +97,7 @@ class ExternalDeclExtractor(val logger: FileLogger, val invocationTrapFile: Stri
ftw.writeHasLocation(ftw.fileId, ftw.getWholeFileLocation())
ftw.writeCupackage(ftw.fileId, pkgId)
fileExtractor.extractClassSource(irDecl, !irDecl.isFileClass)
fileExtractor.extractClassSource(irDecl, !irDecl.isFileClass, false)
} else {
fileExtractor.extractDeclaration(irDecl)
}

View File

@@ -76,7 +76,7 @@ open class KotlinFileExtractor(
}
file.declarations.map { extractDeclaration(it) }
extractStaticInitializer(file)
extractStaticInitializer(file, null)
CommentExtractor(this, file, tw.fileId).extract()
}
}
@@ -99,7 +99,7 @@ open class KotlinFileExtractor(
if (isExternalDeclaration(declaration)) {
extractExternalClassLater(declaration)
} else {
extractClassSource(declaration, true)
extractClassSource(declaration, true, true)
}
}
is IrFunction -> {
@@ -328,7 +328,7 @@ open class KotlinFileExtractor(
private fun extractLocalTypeDeclStmt(c: IrClass, callable: Label<out DbCallable>, parent: Label<out DbStmtparent>, idx: Int) {
@Suppress("UNCHECKED_CAST")
val id = extractClassSource(c, true) as Label<out DbClass>
val id = extractClassSource(c, true, true) as Label<out DbClass>
extractLocalTypeDeclStmt(id, c, callable, parent, idx)
}
@@ -340,7 +340,7 @@ open class KotlinFileExtractor(
tw.writeHasLocation(stmtId, locId)
}
fun extractClassSource(c: IrClass, extractDeclarations: Boolean): Label<out DbClassorinterface> {
fun extractClassSource(c: IrClass, extractDeclarations: Boolean, extractStaticInitializer: Boolean): Label<out DbClassorinterface> {
with("class source", c) {
DeclarationStackAdjuster(c).use {
@@ -376,8 +376,11 @@ open class KotlinFileExtractor(
extractEnclosingClass(c, id, locId, listOf())
c.typeParameters.mapIndexed { idx, it -> extractTypeParameter(it, idx) }
if (extractDeclarations)
if (extractDeclarations) {
c.declarations.map { extractDeclaration(it) }
if (extractStaticInitializer)
extractStaticInitializer(c, id)
}
if (c.isNonCompanionObject) {
// For `object MyObject { ... }`, the .class has an
// automatically-generated `public static final MyObject INSTANCE`
@@ -501,12 +504,12 @@ open class KotlinFileExtractor(
return type
}
private fun extractStaticInitializer(file: IrFile) {
with("static initializer extraction", file) {
extractDeclInitializers(file.declarations, true) {
val parentId = extractFileClass(file)
private fun extractStaticInitializer(container: IrDeclarationContainer, classLabel: Label<out DbClassorinterface>?) {
with("static initializer extraction", container) {
extractDeclInitializers(container.declarations, true) {
val parentId = classLabel ?: extractFileClass(container as IrFile)
val clinitLabel = getFunctionLabel(
file,
container,
parentId,
"<clinit>",
listOf(),