From aae8ccfd5794f76799717091d3167d4484e6018c Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 17 Jul 2015 15:35:03 +0300 Subject: [PATCH] Refactor: AnnotationSerializer does not depend on bultins --- .../codegen/JvmSerializerExtension.java | 3 +-- .../builtins/BuiltInsSerializer.kt | 2 +- .../evaluate/ConstantExpressionEvaluator.kt | 24 +++++++++++-------- .../serialization/AnnotationSerializer.kt | 5 ++-- .../builtins/BuiltInsSerializerExtension.kt | 12 +++------- .../resolve/constants/ConstantValueFactory.kt | 2 +- .../resolve/constants/constantValues.kt | 6 ++++- .../js/KotlinJavascriptSerializerExtension.kt | 3 +-- 8 files changed, 28 insertions(+), 29 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmSerializerExtension.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmSerializerExtension.java index 5c30d9271c2..566e5b9426b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmSerializerExtension.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmSerializerExtension.java @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.codegen; import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.codegen.state.JetTypeMapper; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; @@ -46,7 +45,7 @@ import static org.jetbrains.kotlin.codegen.JvmSerializationBindings.*; public class JvmSerializerExtension extends SerializerExtension { private final JvmSerializationBindings bindings; private final JetTypeMapper typeMapper; - private final AnnotationSerializer annotationSerializer = new AnnotationSerializer(KotlinBuiltIns.getInstance()); + private final AnnotationSerializer annotationSerializer = new AnnotationSerializer(); public JvmSerializerExtension(@NotNull JvmSerializationBindings bindings, @NotNull JetTypeMapper typeMapper) { this.bindings = bindings; diff --git a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt index 49b048795e6..cbb9c3cbcf7 100644 --- a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt +++ b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt @@ -113,7 +113,7 @@ public class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) { // TODO: perform some kind of validation? At the moment not possible because DescriptorValidator is in compiler-tests // DescriptorValidator.validate(packageView) - val serializer = DescriptorSerializer.createTopLevel(BuiltInsSerializerExtension(module)) + val serializer = DescriptorSerializer.createTopLevel(BuiltInsSerializerExtension()) val classifierDescriptors = DescriptorSerializer.sort(packageView.memberScope.getDescriptors(DescriptorKindFilter.CLASSIFIERS)) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt index c09f3bae657..f51e8a89030 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt @@ -52,7 +52,10 @@ import java.math.BigInteger import java.util.HashMap import kotlin.platform.platformStatic -public class ConstantExpressionEvaluator(private val builtIns: KotlinBuiltIns) { +public class ConstantExpressionEvaluator( + internal val constantValueFactory: ConstantValueFactory, + internal val builtIns: KotlinBuiltIns +) { internal fun resolveAnnotationArguments( resolvedCall: ResolvedCall<*>, @@ -82,7 +85,7 @@ public class ConstantExpressionEvaluator(private val builtIns: KotlinBuiltIns) { if (argumentsAsVararg) { if (parameterDescriptor.declaresDefaultValue() && compileTimeConstants.isEmpty()) return null - return ArrayValue(constants, parameterDescriptor.getType()) + return constantValueFactory.createArrayValue(constants, parameterDescriptor.getType()) } else { // we should actually get only one element, but just in case of getting many, we take the last one @@ -191,14 +194,15 @@ public class ConstantExpressionEvaluator(private val builtIns: KotlinBuiltIns) { trace: BindingTrace, expectedType: JetType? = TypeUtils.NO_EXPECTED_TYPE ): CompileTimeConstant<*>? { - val visitor = ConstantExpressionEvaluatorVisitor(this, trace, builtIns) + val visitor = ConstantExpressionEvaluatorVisitor(this, trace) val constant = visitor.evaluate(expression, expectedType) ?: return null return if (!constant.isError) constant else null } companion object { platformStatic public fun evaluate(expression: JetExpression, trace: BindingTrace, expectedType: JetType? = TypeUtils.NO_EXPECTED_TYPE): CompileTimeConstant<*>? { - return ConstantExpressionEvaluator(KotlinBuiltIns.getInstance()).evaluateExpression(expression, trace, expectedType) + val builtIns = KotlinBuiltIns.getInstance() + return ConstantExpressionEvaluator(ConstantValueFactory(builtIns), builtIns).evaluateExpression(expression, trace, expectedType) } platformStatic public fun evaluateToConstantValue( @@ -222,10 +226,10 @@ public class ConstantExpressionEvaluator(private val builtIns: KotlinBuiltIns) { private class ConstantExpressionEvaluatorVisitor( private val constantExpressionEvaluator: ConstantExpressionEvaluator, - private val trace: BindingTrace, - private val builtIns: KotlinBuiltIns + private val trace: BindingTrace ) : JetVisitor?, JetType>() { - private val factory = ConstantValueFactory(builtIns) + + private val factory = constantExpressionEvaluator.constantValueFactory fun evaluate(expression: JetExpression, expectedType: JetType?): CompileTimeConstant<*>? { val recordedCompileTimeConstant = ConstantExpressionEvaluator.getPossiblyErrorConstant(expression, trace.getBindingContext()) @@ -258,7 +262,7 @@ private class ConstantExpressionEvaluatorVisitor( override fun visitStringTemplateEntryWithExpression(entry: JetStringTemplateEntryWithExpression, data: Nothing?): TypedCompileTimeConstant? { val expression = entry.getExpression() ?: return null - return evaluate(expression, builtIns.getStringType())?.let { + return evaluate(expression, constantExpressionEvaluator.builtIns.getStringType())?.let { createStringConstant(it) } } @@ -340,7 +344,7 @@ private class ConstantExpressionEvaluatorVisitor( val operationToken = expression.getOperationToken() if (OperatorConventions.BOOLEAN_OPERATIONS.containsKey(operationToken)) { - val booleanType = builtIns.getBooleanType() + val booleanType = constantExpressionEvaluator.builtIns.getBooleanType() val leftConstant = evaluate(leftExpression, booleanType) if (leftConstant == null) return null @@ -572,7 +576,7 @@ private class ConstantExpressionEvaluatorVisitor( val arguments = call.getValueArguments().values().flatMap { resolveArguments(it.getArguments(), varargType) } - return ArrayValue(arguments.map { it.toConstantValue(varargType) }, resultingDescriptor.getReturnType()!!). + return factory.createArrayValue(arguments.map { it.toConstantValue(varargType) }, resultingDescriptor.getReturnType()!!). wrap( usesVariableAsConstant = arguments.any { it.usesVariableAsConstant } ) diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/AnnotationSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/AnnotationSerializer.kt index e47482a3466..fb56b522f35 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/AnnotationSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/AnnotationSerializer.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.serialization -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationArgumentVisitor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor @@ -26,7 +25,7 @@ import org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.Argument.Value.Typ import org.jetbrains.kotlin.types.ErrorUtils import org.jetbrains.kotlin.types.JetType -public class AnnotationSerializer(builtIns: KotlinBuiltIns) { +public class AnnotationSerializer() { public fun serializeAnnotation(annotation: AnnotationDescriptor, stringTable: StringTable): ProtoBuf.Annotation { return with(ProtoBuf.Annotation.newBuilder()) { @@ -59,7 +58,7 @@ public class AnnotationSerializer(builtIns: KotlinBuiltIns) { override fun visitArrayValue(value: ArrayValue, data: Unit) { setType(Type.ARRAY) for (element in value.value) { - addArrayElement(valueProto(element, KotlinBuiltIns.getInstance().getArrayElementType(type), nameTable).build()) + addArrayElement(valueProto(element, value.elementType, nameTable).build()) } } diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerExtension.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerExtension.kt index 73f22d9608e..623a46d10ed 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerExtension.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerExtension.kt @@ -16,20 +16,14 @@ package org.jetbrains.kotlin.serialization.builtins -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.resolve.constants.NullValue -import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.serialization.AnnotationSerializer -import org.jetbrains.kotlin.serialization.DescriptorSerializer -import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.serialization.SerializerExtension -import org.jetbrains.kotlin.serialization.StringTable +import org.jetbrains.kotlin.serialization.* -public class BuiltInsSerializerExtension(module: ModuleDescriptor) : SerializerExtension() { +public class BuiltInsSerializerExtension() : SerializerExtension() { - private val annotationSerializer = AnnotationSerializer(module.builtIns) + private val annotationSerializer = AnnotationSerializer() override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder, stringTable: StringTable) { for (annotation in descriptor.getAnnotations()) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/ConstantValueFactory.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/ConstantValueFactory.kt index fddef729080..6fab30172fb 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/ConstantValueFactory.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/ConstantValueFactory.kt @@ -52,7 +52,7 @@ public class ConstantValueFactory( fun createArrayValue( value: List>, type: JetType - ) = ArrayValue(value, type) + ) = ArrayValue(value, type, builtins) fun createAnnotationValue(value: AnnotationDescriptor) = AnnotationValue(value) diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/constantValues.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/constantValues.kt index aa46776f23f..3122f021ebe 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/constantValues.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/constantValues.kt @@ -46,7 +46,8 @@ public class AnnotationValue(value: AnnotationDescriptor) : ConstantValue>, - override val type: JetType + override val type: JetType, + private val builtIns: KotlinBuiltIns ) : ConstantValue>>(value) { init { @@ -55,6 +56,9 @@ public class ArrayValue( override fun accept(visitor: AnnotationArgumentVisitor, data: D) = visitor.visitArrayValue(this, data) + public val elementType: JetType + get() = builtIns.getArrayElementType(type) + override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt index 2f7271c7281..1d260058e72 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.serialization.js -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor @@ -30,7 +29,7 @@ import org.jetbrains.kotlin.types.JetType public object KotlinJavascriptSerializerExtension : SerializerExtension() { - private val annotationSerializer = AnnotationSerializer(KotlinBuiltIns.getInstance()) + private val annotationSerializer = AnnotationSerializer() override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder, stringTable: StringTable) { for (annotation in descriptor.getAnnotations()) {