From 25edf64daf63f6559e1f96ec6a5b940192ba9312 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 20 Dec 2021 22:19:46 +0100 Subject: [PATCH] Psi2ir: support mode without generation of bodies This is needed for kapt + JVM IR. #KT-49682 --- .../kotlin/codegen/CodegenFactory.kt | 4 +- .../compiler/KotlinToJVMBytecodeCompiler.kt | 3 +- .../kotlin/backend/jvm/JvmIrCodegenFactory.kt | 9 +- .../MoveCompanionObjectFieldsLowering.kt | 2 +- .../kotlin/psi2ir/Psi2IrConfiguration.kt | 8 +- .../generators/DelegatedPropertyGenerator.kt | 4 +- .../psi2ir/generators/FunctionGenerator.kt | 17 +- .../psi2ir/generators/PropertyGenerator.kt | 5 +- .../testData/converter/enumInCompanion.kt | 2 - .../testData/converter/enumInCompanion_ir.txt | 179 ++++++++++++++++++ .../converter/genericRawSignatures.kt | 2 - .../testData/converter/kt14996.kt | 2 - .../testData/converter/kt18377.kt | 2 - .../converter/methodParameterNames.kt | 2 - .../converter/methodPropertySignatureClash.kt | 2 - .../testData/converter/nestedClasses.kt | 2 - .../testData/converter/suspendArgName.kt | 2 - .../testData/converter/suspendArgName_ir.txt | 35 ++++ .../testData/kotlinRunner/Simple.kt | 2 - 19 files changed, 250 insertions(+), 34 deletions(-) create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/enumInCompanion_ir.txt create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/suspendArgName_ir.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFactory.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFactory.kt index da4e7ca164f..04b941d1051 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFactory.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFactory.kt @@ -53,12 +53,14 @@ interface CodegenFactory { val bindingContext: BindingContext, val languageVersionSettings: LanguageVersionSettings, val ignoreErrors: Boolean, + val skipBodies: Boolean, ) { companion object { fun fromGenerationState(state: GenerationState): IrConversionInput = with(state) { IrConversionInput( - project, files, configuration, module, originalFrontendBindingContext, languageVersionSettings, ignoreErrors + project, files, configuration, module, originalFrontendBindingContext, languageVersionSettings, ignoreErrors, + skipBodies = !state.classBuilderMode.generateBodies ) } } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt index 8eb600838fa..75e0f0c7df5 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt @@ -269,7 +269,8 @@ object KotlinToJVMBytecodeCompiler { result.moduleDescriptor, result.bindingContext, configuration.languageVersionSettings, - false, + ignoreErrors = false, + skipBodies = false, ) val performanceManager = environment.configuration[CLIConfigurationKeys.PERF_MANAGER] diff --git a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt index e283f0f26d4..ffc5a4bd5d5 100644 --- a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt +++ b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt @@ -88,7 +88,14 @@ open class JvmIrCodegenFactory( val symbolTable = SymbolTable(signaturer, IrFactoryImpl) mangler to symbolTable } - val psi2ir = Psi2IrTranslator(input.languageVersionSettings, Psi2IrConfiguration(input.ignoreErrors)) + val psi2ir = Psi2IrTranslator( + input.languageVersionSettings, + Psi2IrConfiguration( + input.ignoreErrors, + allowUnboundSymbols = false, + input.skipBodies, + ) + ) val messageLogger = input.configuration[IrMessageLogger.IR_MESSAGE_LOGGER] ?: IrMessageLogger.None val psi2irContext = psi2ir.createGeneratorContext( input.module, diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt index 67dc6bf1ace..85160aff583 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt @@ -121,7 +121,7 @@ private class MoveOrCopyCompanionObjectFieldsLowering(val context: JvmBackendCon parent = newParent correspondingPropertySymbol = property.symbol annotations += oldField.annotations - initializer = with(oldField.initializer!!) { + initializer = oldField.initializer?.run { IrExpressionBodyImpl(startOffset, endOffset, (expression as IrConst<*>).shallowCopy()) } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrConfiguration.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrConfiguration.kt index b6e11621604..e3568b4c18e 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrConfiguration.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrConfiguration.kt @@ -18,5 +18,9 @@ package org.jetbrains.kotlin.psi2ir class Psi2IrConfiguration( val ignoreErrors: Boolean = false, - val allowUnboundSymbols: Boolean = false -) + val allowUnboundSymbols: Boolean = false, + val skipBodies: Boolean = false, +) { + val generateBodies: Boolean + get() = !skipBodies +} diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt index 9db0cf2f792..b2c95585f4b 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt @@ -104,7 +104,9 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D accessorDescriptor ).buildWithScope { irAccessor -> FunctionGenerator(declarationGenerator).generateFunctionParameterDeclarationsAndReturnType(irAccessor, ktProperty, null, emptyList()) - irAccessor.body = generateBody(irAccessor) + if (context.configuration.generateBodies) { + irAccessor.body = generateBody(irAccessor) + } } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt index f45d20a94b6..3334601159d 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt @@ -54,7 +54,8 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio origin, getOrFail(BindingContext.FUNCTION, ktFunction) ) { - ktFunction.bodyExpression?.let { generateFunctionBody(it) } + if (context.configuration.skipBodies) null + else ktFunction.bodyExpression?.let { generateFunctionBody(it) } } fun generateLambdaFunctionDeclaration(ktFunction: KtFunctionLiteral): IrSimpleFunction { @@ -131,12 +132,14 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio irAccessor, ktAccessor ?: ktProperty, ktProperty.receiverTypeReference, ktProperty.contextReceivers.mapNotNull { it.typeReference() } ) - val ktBodyExpression = ktAccessor?.bodyExpression - irAccessor.body = - if (ktBodyExpression != null) - createBodyGenerator(irAccessor.symbol).generateFunctionBody(ktBodyExpression) - else - generateDefaultAccessorBody(descriptor, irAccessor) + if (context.configuration.generateBodies) { + val ktBodyExpression = ktAccessor?.bodyExpression + irAccessor.body = + if (ktBodyExpression != null) + createBodyGenerator(irAccessor.symbol).generateFunctionBody(ktBodyExpression) + else + generateDefaultAccessorBody(descriptor, irAccessor) + } } fun generateDefaultAccessorForPrimaryConstructorParameter( diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt index 89d5ce3d330..61fe0e8bf07 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt @@ -76,7 +76,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio ): IrProperty { val irPropertyType = propertyDescriptor.type.toIrType() return generateSyntheticPropertyWithInitializer(ktDeclarationContainer, propertyDescriptor, generateSyntheticAccessors) { - if (irValueParameter == null) null + if (irValueParameter == null || context.configuration.skipBodies) null else { context.irFactory.createExpressionBody( IrGetValueImpl( @@ -205,7 +205,8 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio } } - declarationGenerator.generateInitializerBody(irField.symbol, ktInitializer) + if (context.configuration.skipBodies) null + else declarationGenerator.generateInitializerBody(irField.symbol, ktInitializer) } } else diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/enumInCompanion.kt b/plugins/kapt3/kapt3-compiler/testData/converter/enumInCompanion.kt index 0ac34788c28..5e92b9d5402 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/enumInCompanion.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/enumInCompanion.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR - class Test { private val foo = Example.FOO diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/enumInCompanion_ir.txt b/plugins/kapt3/kapt3-compiler/testData/converter/enumInCompanion_ir.txt new file mode 100644 index 00000000000..7ec0e2619d9 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/enumInCompanion_ir.txt @@ -0,0 +1,179 @@ +import java.lang.System; + +@kotlin.Metadata() +public final class Test { + @org.jetbrains.annotations.NotNull() + private final Test.Companion.Example foo; + @org.jetbrains.annotations.NotNull() + public static final Test.Companion Companion = null; + + public Test() { + super(); + } + + @kotlin.Metadata() + public static final class Companion { + + private Companion() { + super(); + } + + @kotlin.Metadata() + public static enum Example { + /*public static final*/ FOO /* = new Example() */; + + Example() { + } + } + } +} + +//////////////////// + + +import java.lang.System; + +@kotlin.Metadata() +public final class Test2 { + @org.jetbrains.annotations.NotNull() + private final Test2.Amigo.Example foo; + @org.jetbrains.annotations.NotNull() + public static final Test2.Amigo Amigo = null; + + public Test2() { + super(); + } + + @kotlin.Metadata() + public static final class Amigo { + + private Amigo() { + super(); + } + + @kotlin.Metadata() + public static enum Example { + /*public static final*/ FOO /* = new Example() */; + + Example() { + } + } + } +} + +//////////////////// + + +import java.lang.System; + +@kotlin.Metadata() +public final class Test3 { + @org.jetbrains.annotations.NotNull() + private final Test3.Amigo.Example foo = null; + + public Test3() { + super(); + } + + @kotlin.Metadata() + public static final class Amigo { + @org.jetbrains.annotations.NotNull() + public static final Test3.Amigo INSTANCE = null; + + private Amigo() { + super(); + } + + @kotlin.Metadata() + public static enum Example { + /*public static final*/ FOO /* = new Example() */; + + Example() { + } + } + } +} + +//////////////////// + + +import java.lang.System; + +@kotlin.Metadata() +public final class Test4 { + private final int foo = 0; + @org.jetbrains.annotations.NotNull() + public static final Test4.Companion Companion = null; + + public Test4() { + super(); + } + + @kotlin.Metadata() + public static final class Companion { + + private Companion() { + super(); + } + + @kotlin.Metadata() + public static final class Foo { + public static final int constProperty = 1; + @org.jetbrains.annotations.NotNull() + public static final Test4.Companion.Foo INSTANCE = null; + + private Foo() { + super(); + } + } + } +} + +//////////////////// + + +import java.lang.System; + +@kotlin.Metadata() +public final class Test5 { + @org.jetbrains.annotations.NotNull() + private final Test5.Amigos.Companion.Goo.Example foo; + + public Test5() { + super(); + } + + @kotlin.Metadata() + public static final class Amigos { + @org.jetbrains.annotations.NotNull() + public static final Test5.Amigos.Companion Companion = null; + + public Amigos() { + super(); + } + + @kotlin.Metadata() + public static final class Companion { + + private Companion() { + super(); + } + + @kotlin.Metadata() + public static final class Goo { + + public Goo() { + super(); + } + + @kotlin.Metadata() + public static enum Example { + /*public static final*/ FOO /* = new Example() */; + + Example() { + } + } + } + } + } +} diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/genericRawSignatures.kt b/plugins/kapt3/kapt3-compiler/testData/converter/genericRawSignatures.kt index f7ce3a4089f..9dd90ac6960 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/genericRawSignatures.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/genericRawSignatures.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR - class GenericRawSignatures { fun genericFun(): T? = null fun nonGenericFun(): String? = null diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/kt14996.kt b/plugins/kapt3/kapt3-compiler/testData/converter/kt14996.kt index cfc5b8707a9..2929f193af7 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/kt14996.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/kt14996.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR - fun crashMe(values: List): String { throw UnsupportedOperationException() } diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/kt18377.kt b/plugins/kapt3/kapt3-compiler/testData/converter/kt18377.kt index 86b02cbc65a..622a483f351 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/kt18377.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/kt18377.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR - import java.util.Date fun Date(double: Double): Date = Date(double.times(1000).toLong()) diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/methodParameterNames.kt b/plugins/kapt3/kapt3-compiler/testData/converter/methodParameterNames.kt index b2bd227ea4c..e85e72e6005 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/methodParameterNames.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/methodParameterNames.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR - interface Intf { fun foo(abc: String) diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/methodPropertySignatureClash.kt b/plugins/kapt3/kapt3-compiler/testData/converter/methodPropertySignatureClash.kt index 5052dd83304..0bd75639e0f 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/methodPropertySignatureClash.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/methodPropertySignatureClash.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR - class CrashMe { val resources = 1 diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/nestedClasses.kt b/plugins/kapt3/kapt3-compiler/testData/converter/nestedClasses.kt index 72edaf489c3..91d76e5b175 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/nestedClasses.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/nestedClasses.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR - class Test { class Nested { class NestedNested diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/suspendArgName.kt b/plugins/kapt3/kapt3-compiler/testData/converter/suspendArgName.kt index bb6e78c2766..619a93fb5ea 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/suspendArgName.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/suspendArgName.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR - open class Test { open fun getTestNoSuspend(text: String): String { diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/suspendArgName_ir.txt b/plugins/kapt3/kapt3-compiler/testData/converter/suspendArgName_ir.txt new file mode 100644 index 00000000000..247bc978f10 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/suspendArgName_ir.txt @@ -0,0 +1,35 @@ +import java.lang.System; + +@kotlin.Metadata() +public class Test { + + public Test() { + super(); + } + + @org.jetbrains.annotations.NotNull() + public java.lang.String getTestNoSuspend(@org.jetbrains.annotations.NotNull() + java.lang.String text) { + return null; + } + + @org.jetbrains.annotations.Nullable() + public java.lang.Object getTest(@org.jetbrains.annotations.NotNull() + java.lang.String text, @org.jetbrains.annotations.NotNull() + kotlin.coroutines.Continuation $completion) { + return null; + } + + @org.jetbrains.annotations.NotNull() + public java.lang.String getTestNoSuspendInvalid(@org.jetbrains.annotations.NotNull() + java.lang.String p0_55085957) { + return null; + } + + @org.jetbrains.annotations.Nullable() + public java.lang.Object getTestInvalid(@org.jetbrains.annotations.NotNull() + java.lang.String p0_55085957, @org.jetbrains.annotations.NotNull() + kotlin.coroutines.Continuation $completion) { + return null; + } +} diff --git a/plugins/kapt3/kapt3-compiler/testData/kotlinRunner/Simple.kt b/plugins/kapt3/kapt3-compiler/testData/kotlinRunner/Simple.kt index 993aa8cb7eb..e7af2fab98d 100644 --- a/plugins/kapt3/kapt3-compiler/testData/kotlinRunner/Simple.kt +++ b/plugins/kapt3/kapt3-compiler/testData/kotlinRunner/Simple.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR - package test /**