Refactor: AnnotationSerializer does not depend on bultins

This commit is contained in:
Pavel V. Talanov
2015-07-17 15:35:03 +03:00
parent 251ebc7ca8
commit aae8ccfd57
8 changed files with 28 additions and 29 deletions
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.codegen;
import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Pair;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.codegen.state.JetTypeMapper; import org.jetbrains.kotlin.codegen.state.JetTypeMapper;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
@@ -46,7 +45,7 @@ import static org.jetbrains.kotlin.codegen.JvmSerializationBindings.*;
public class JvmSerializerExtension extends SerializerExtension { public class JvmSerializerExtension extends SerializerExtension {
private final JvmSerializationBindings bindings; private final JvmSerializationBindings bindings;
private final JetTypeMapper typeMapper; 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) { public JvmSerializerExtension(@NotNull JvmSerializationBindings bindings, @NotNull JetTypeMapper typeMapper) {
this.bindings = bindings; this.bindings = bindings;
@@ -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 // TODO: perform some kind of validation? At the moment not possible because DescriptorValidator is in compiler-tests
// DescriptorValidator.validate(packageView) // DescriptorValidator.validate(packageView)
val serializer = DescriptorSerializer.createTopLevel(BuiltInsSerializerExtension(module)) val serializer = DescriptorSerializer.createTopLevel(BuiltInsSerializerExtension())
val classifierDescriptors = DescriptorSerializer.sort(packageView.memberScope.getDescriptors(DescriptorKindFilter.CLASSIFIERS)) val classifierDescriptors = DescriptorSerializer.sort(packageView.memberScope.getDescriptors(DescriptorKindFilter.CLASSIFIERS))
@@ -52,7 +52,10 @@ import java.math.BigInteger
import java.util.HashMap import java.util.HashMap
import kotlin.platform.platformStatic 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( internal fun resolveAnnotationArguments(
resolvedCall: ResolvedCall<*>, resolvedCall: ResolvedCall<*>,
@@ -82,7 +85,7 @@ public class ConstantExpressionEvaluator(private val builtIns: KotlinBuiltIns) {
if (argumentsAsVararg) { if (argumentsAsVararg) {
if (parameterDescriptor.declaresDefaultValue() && compileTimeConstants.isEmpty()) return null if (parameterDescriptor.declaresDefaultValue() && compileTimeConstants.isEmpty()) return null
return ArrayValue(constants, parameterDescriptor.getType()) return constantValueFactory.createArrayValue(constants, parameterDescriptor.getType())
} }
else { else {
// we should actually get only one element, but just in case of getting many, we take the last one // 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, trace: BindingTrace,
expectedType: JetType? = TypeUtils.NO_EXPECTED_TYPE expectedType: JetType? = TypeUtils.NO_EXPECTED_TYPE
): CompileTimeConstant<*>? { ): CompileTimeConstant<*>? {
val visitor = ConstantExpressionEvaluatorVisitor(this, trace, builtIns) val visitor = ConstantExpressionEvaluatorVisitor(this, trace)
val constant = visitor.evaluate(expression, expectedType) ?: return null val constant = visitor.evaluate(expression, expectedType) ?: return null
return if (!constant.isError) constant else null return if (!constant.isError) constant else null
} }
companion object { companion object {
platformStatic public fun evaluate(expression: JetExpression, trace: BindingTrace, expectedType: JetType? = TypeUtils.NO_EXPECTED_TYPE): CompileTimeConstant<*>? { 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( platformStatic public fun evaluateToConstantValue(
@@ -222,10 +226,10 @@ public class ConstantExpressionEvaluator(private val builtIns: KotlinBuiltIns) {
private class ConstantExpressionEvaluatorVisitor( private class ConstantExpressionEvaluatorVisitor(
private val constantExpressionEvaluator: ConstantExpressionEvaluator, private val constantExpressionEvaluator: ConstantExpressionEvaluator,
private val trace: BindingTrace, private val trace: BindingTrace
private val builtIns: KotlinBuiltIns
) : JetVisitor<CompileTimeConstant<*>?, JetType>() { ) : JetVisitor<CompileTimeConstant<*>?, JetType>() {
private val factory = ConstantValueFactory(builtIns)
private val factory = constantExpressionEvaluator.constantValueFactory
fun evaluate(expression: JetExpression, expectedType: JetType?): CompileTimeConstant<*>? { fun evaluate(expression: JetExpression, expectedType: JetType?): CompileTimeConstant<*>? {
val recordedCompileTimeConstant = ConstantExpressionEvaluator.getPossiblyErrorConstant(expression, trace.getBindingContext()) val recordedCompileTimeConstant = ConstantExpressionEvaluator.getPossiblyErrorConstant(expression, trace.getBindingContext())
@@ -258,7 +262,7 @@ private class ConstantExpressionEvaluatorVisitor(
override fun visitStringTemplateEntryWithExpression(entry: JetStringTemplateEntryWithExpression, data: Nothing?): TypedCompileTimeConstant<String>? { override fun visitStringTemplateEntryWithExpression(entry: JetStringTemplateEntryWithExpression, data: Nothing?): TypedCompileTimeConstant<String>? {
val expression = entry.getExpression() ?: return null val expression = entry.getExpression() ?: return null
return evaluate(expression, builtIns.getStringType())?.let { return evaluate(expression, constantExpressionEvaluator.builtIns.getStringType())?.let {
createStringConstant(it) createStringConstant(it)
} }
} }
@@ -340,7 +344,7 @@ private class ConstantExpressionEvaluatorVisitor(
val operationToken = expression.getOperationToken() val operationToken = expression.getOperationToken()
if (OperatorConventions.BOOLEAN_OPERATIONS.containsKey(operationToken)) { if (OperatorConventions.BOOLEAN_OPERATIONS.containsKey(operationToken)) {
val booleanType = builtIns.getBooleanType() val booleanType = constantExpressionEvaluator.builtIns.getBooleanType()
val leftConstant = evaluate(leftExpression, booleanType) val leftConstant = evaluate(leftExpression, booleanType)
if (leftConstant == null) return null if (leftConstant == null) return null
@@ -572,7 +576,7 @@ private class ConstantExpressionEvaluatorVisitor(
val arguments = call.getValueArguments().values().flatMap { resolveArguments(it.getArguments(), varargType) } 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( wrap(
usesVariableAsConstant = arguments.any { it.usesVariableAsConstant } usesVariableAsConstant = arguments.any { it.usesVariableAsConstant }
) )
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.serialization package org.jetbrains.kotlin.serialization
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationArgumentVisitor import org.jetbrains.kotlin.descriptors.annotations.AnnotationArgumentVisitor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor 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.ErrorUtils
import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.types.JetType
public class AnnotationSerializer(builtIns: KotlinBuiltIns) { public class AnnotationSerializer() {
public fun serializeAnnotation(annotation: AnnotationDescriptor, stringTable: StringTable): ProtoBuf.Annotation { public fun serializeAnnotation(annotation: AnnotationDescriptor, stringTable: StringTable): ProtoBuf.Annotation {
return with(ProtoBuf.Annotation.newBuilder()) { return with(ProtoBuf.Annotation.newBuilder()) {
@@ -59,7 +58,7 @@ public class AnnotationSerializer(builtIns: KotlinBuiltIns) {
override fun visitArrayValue(value: ArrayValue, data: Unit) { override fun visitArrayValue(value: ArrayValue, data: Unit) {
setType(Type.ARRAY) setType(Type.ARRAY)
for (element in value.value) { for (element in value.value) {
addArrayElement(valueProto(element, KotlinBuiltIns.getInstance().getArrayElementType(type), nameTable).build()) addArrayElement(valueProto(element, value.elementType, nameTable).build())
} }
} }
@@ -16,20 +16,14 @@
package org.jetbrains.kotlin.serialization.builtins package org.jetbrains.kotlin.serialization.builtins
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.resolve.constants.NullValue 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.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.serialization.AnnotationSerializer import org.jetbrains.kotlin.serialization.*
import org.jetbrains.kotlin.serialization.DescriptorSerializer
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.SerializerExtension
import org.jetbrains.kotlin.serialization.StringTable
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) { override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder, stringTable: StringTable) {
for (annotation in descriptor.getAnnotations()) { for (annotation in descriptor.getAnnotations()) {
@@ -52,7 +52,7 @@ public class ConstantValueFactory(
fun createArrayValue( fun createArrayValue(
value: List<ConstantValue<*>>, value: List<ConstantValue<*>>,
type: JetType type: JetType
) = ArrayValue(value, type) ) = ArrayValue(value, type, builtins)
fun createAnnotationValue(value: AnnotationDescriptor) = AnnotationValue(value) fun createAnnotationValue(value: AnnotationDescriptor) = AnnotationValue(value)
@@ -46,7 +46,8 @@ public class AnnotationValue(value: AnnotationDescriptor) : ConstantValue<Annota
public class ArrayValue( public class ArrayValue(
value: List<ConstantValue<*>>, value: List<ConstantValue<*>>,
override val type: JetType override val type: JetType,
private val builtIns: KotlinBuiltIns
) : ConstantValue<List<ConstantValue<*>>>(value) { ) : ConstantValue<List<ConstantValue<*>>>(value) {
init { init {
@@ -55,6 +56,9 @@ public class ArrayValue(
override fun <R, D> accept(visitor: AnnotationArgumentVisitor<R, D>, data: D) = visitor.visitArrayValue(this, data) override fun <R, D> accept(visitor: AnnotationArgumentVisitor<R, D>, data: D) = visitor.visitArrayValue(this, data)
public val elementType: JetType
get() = builtIns.getArrayElementType(type)
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true
if (javaClass != other?.javaClass) return false if (javaClass != other?.javaClass) return false
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.serialization.js package org.jetbrains.kotlin.serialization.js
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor
@@ -30,7 +29,7 @@ import org.jetbrains.kotlin.types.JetType
public object KotlinJavascriptSerializerExtension : SerializerExtension() { 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) { override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder, stringTable: StringTable) {
for (annotation in descriptor.getAnnotations()) { for (annotation in descriptor.getAnnotations()) {