From 3f1e63cd263ccd62fb1de4ead20d25efc9e9e415 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 2 Mar 2012 20:43:42 +0400 Subject: [PATCH] JetValueParameterAnnotationWriter --- .../jet/codegen/FunctionCodegen.java | 27 +++---- .../codegen/ImplementationBodyCodegen.java | 9 ++- .../JetValueParameterAnnotationWriter.java | 70 +++++++++++++++++++ 3 files changed, 85 insertions(+), 21 deletions(-) create mode 100644 compiler/backend/src/org/jetbrains/jet/codegen/signature/kotlin/JetValueParameterAnnotationWriter.java diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index a0989cd7e16..b7a3ec1aba1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -20,6 +20,7 @@ import com.intellij.psi.PsiElement; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.codegen.signature.kotlin.JetMethodAnnotationWriter; import org.jetbrains.jet.codegen.signature.JvmMethodSignature; +import org.jetbrains.jet.codegen.signature.kotlin.JetValueParameterAnnotationWriter; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -137,29 +138,23 @@ public class FunctionCodegen { } if(receiverParameter.exists()) { - AnnotationVisitor av = mv.visitParameterAnnotation(start++, JvmStdlibNames.JET_VALUE_PARAMETER.getDescriptor(), true); - av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_NAME_FIELD, "this$receiver"); - if(receiverParameter.getType().isNullable()) { - av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_NULLABLE_FIELD, true); - } - av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_RECEIVER_FIELD, true); + JetValueParameterAnnotationWriter av = JetValueParameterAnnotationWriter.visitParameterAnnotation(mv, start++); + av.writeName("this$receiver"); + av.writeNullable(receiverParameter.getType().isNullable()); + av.writeReceiver(); if (jvmSignature.getKotlinParameterTypes() != null && jvmSignature.getKotlinParameterTypes().get(0) != null) { - av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_TYPE_FIELD, jvmSignature.getKotlinParameterTypes().get(0).getKotlinSignature()); + av.writeType(jvmSignature.getKotlinParameterTypes().get(0).getKotlinSignature()); } av.visitEnd(); } for(int i = 0; i != paramDescrs.size(); ++i) { - AnnotationVisitor av = mv.visitParameterAnnotation(i + start, JvmStdlibNames.JET_VALUE_PARAMETER.getDescriptor(), true); + JetValueParameterAnnotationWriter av = JetValueParameterAnnotationWriter.visitParameterAnnotation(mv, i + start); ValueParameterDescriptor parameterDescriptor = paramDescrs.get(i); - av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_NAME_FIELD, parameterDescriptor.getName()); - if(parameterDescriptor.hasDefaultValue()) { - av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_HAS_DEFAULT_VALUE_FIELD, true); - } - if(parameterDescriptor.getType().isNullable()) { - av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_NULLABLE_FIELD, true); - } + av.writeName(parameterDescriptor.getName()); + av.writeHasDefaultValue(parameterDescriptor.hasDefaultValue()); + av.writeNullable(parameterDescriptor.getType().isNullable()); if (jvmSignature.getKotlinParameterTypes() != null && jvmSignature.getKotlinParameterTypes().get(i) != null) { - av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_TYPE_FIELD, jvmSignature.getKotlinParameterTypes().get(i + start).getKotlinSignature()); + av.writeType(jvmSignature.getKotlinParameterTypes().get(i + start).getKotlinSignature()); } av.visitEnd(); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 6d3ec313a29..dbf357ba540 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.codegen.signature.JvmMethodParameterKind; import org.jetbrains.jet.codegen.signature.JvmMethodParameterSignature; import org.jetbrains.jet.codegen.signature.JvmMethodSignature; import org.jetbrains.jet.codegen.signature.JvmPropertyAccessorSignature; +import org.jetbrains.jet.codegen.signature.kotlin.JetValueParameterAnnotationWriter; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -515,11 +516,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } for (ValueParameterDescriptor valueParameter : constructorDescriptor.getValueParameters()) { - AnnotationVisitor jetValueParameterAnnotation = - mv.visitParameterAnnotation(i++, JvmStdlibNames.JET_VALUE_PARAMETER.getDescriptor(), true); - jetValueParameterAnnotation.visit(JvmStdlibNames.JET_VALUE_PARAMETER_NAME_FIELD, valueParameter.getName()); - if(valueParameter.hasDefaultValue()) - jetValueParameterAnnotation.visit(JvmStdlibNames.JET_VALUE_PARAMETER_HAS_DEFAULT_VALUE_FIELD, Boolean.TRUE); + JetValueParameterAnnotationWriter jetValueParameterAnnotation = JetValueParameterAnnotationWriter.visitParameterAnnotation(mv, i++); + jetValueParameterAnnotation.writeName(valueParameter.getName()); + jetValueParameterAnnotation.writeHasDefaultValue(valueParameter.hasDefaultValue()); jetValueParameterAnnotation.visitEnd(); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/signature/kotlin/JetValueParameterAnnotationWriter.java b/compiler/backend/src/org/jetbrains/jet/codegen/signature/kotlin/JetValueParameterAnnotationWriter.java new file mode 100644 index 00000000000..af892bca17a --- /dev/null +++ b/compiler/backend/src/org/jetbrains/jet/codegen/signature/kotlin/JetValueParameterAnnotationWriter.java @@ -0,0 +1,70 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.codegen.signature.kotlin; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; +import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.MethodVisitor; + +/** + * @author Stepan Koltsov + */ +public class JetValueParameterAnnotationWriter { + private final AnnotationVisitor av; + + private JetValueParameterAnnotationWriter(AnnotationVisitor av) { + this.av = av; + } + + public void writeName(@NotNull String name) { + if (name.length() > 0) { + av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_NAME_FIELD, name); + } + } + + public static JetValueParameterAnnotationWriter visitParameterAnnotation(MethodVisitor mv, int n) { + return new JetValueParameterAnnotationWriter( + mv.visitParameterAnnotation(n, JvmStdlibNames.JET_VALUE_PARAMETER.getDescriptor(), true)); + } + + public void writeNullable(boolean nullable) { + if (nullable) { + av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_NULLABLE_FIELD, true); + } + } + + public void writeReceiver() { + av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_RECEIVER_FIELD, true); + } + + public void writeType(@NotNull String kotlinSignature) { + if (kotlinSignature.length() > 0) { + av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_TYPE_FIELD, kotlinSignature); + } + } + + public void visitEnd() { + av.visitEnd(); + } + + public void writeHasDefaultValue(boolean hasDefaultValue) { + if (hasDefaultValue) { + av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_HAS_DEFAULT_VALUE_FIELD, true); + } + } +}