From f0e096aba62a1e40754ff655d73c406db821808b Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Sat, 15 Sep 2012 13:44:56 +0300 Subject: [PATCH] genJetAnnotations method extracted --- .../jet/codegen/FunctionCodegen.java | 120 ++++++++++-------- 1 file changed, 67 insertions(+), 53 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index f51a270fa0c..f762f4a420c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -47,12 +47,12 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.*; import static org.jetbrains.asm4.Opcodes.*; -import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_ARRAY_GENERIC_TYPE; -import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; import static org.jetbrains.jet.codegen.CodegenUtil.*; import static org.jetbrains.jet.codegen.binding.CodegenBinding.isLocalFun; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_ARRAY_GENERIC_TYPE; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; /** * @author max @@ -145,58 +145,8 @@ public class FunctionCodegen extends GenerationStateAware { jvmSignature.getGenericsSignature(), null); AnnotationCodegen.forMethod(mv, state.getTypeMapper()).genAnnotations(functionDescriptor); if (state.getClassBuilderMode() != ClassBuilderMode.SIGNATURES) { - int start = 0; if (needJetAnnotations) { - if (functionDescriptor instanceof PropertyAccessorDescriptor) { - PropertyCodegen.generateJetPropertyAnnotation(mv, propertyTypeSignature, jvmSignature.getKotlinTypeParameter(), - ((PropertyAccessorDescriptor) functionDescriptor) - .getCorrespondingProperty(), - functionDescriptor.getVisibility()); - } - else if (functionDescriptor instanceof SimpleFunctionDescriptor) { - if (propertyTypeSignature != null) { - throw new IllegalStateException(); - } - JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv); - BitSet kotlinFlags = getFlagsForVisibility(functionDescriptor.getVisibility()); - if (isInterface(functionDescriptor.getContainingDeclaration()) && modality != Modality.ABSTRACT) { - kotlinFlags.set(modality == Modality.FINAL - ? JvmStdlibNames.FLAG_FORCE_FINAL_BIT - : JvmStdlibNames.FLAG_FORCE_OPEN_BIT); - } - aw.writeFlags(kotlinFlags); - aw.writeKind(DescriptorKindUtils.kindToInt(functionDescriptor.getKind())); - aw.writeNullableReturnType(functionDescriptor.getReturnType().isNullable()); - aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter()); - aw.writeReturnType(jvmSignature.getKotlinReturnType()); - aw.visitEnd(); - } - else { - throw new IllegalStateException(); - } - - if (receiverParameter.exists()) { - 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.writeType(jvmSignature.getKotlinParameterTypes().get(0).getKotlinSignature()); - } - av.visitEnd(); - } - for (int i = 0; i != paramDescrs.size(); ++i) { - ValueParameterDescriptor parameterDescriptor = paramDescrs.get(i); - AnnotationCodegen.forParameter(i, mv, state.getTypeMapper()).genAnnotations(parameterDescriptor); - JetValueParameterAnnotationWriter av = JetValueParameterAnnotationWriter.visitParameterAnnotation(mv, i + start); - av.writeName(parameterDescriptor.getName().getName()); - av.writeHasDefaultValue(parameterDescriptor.declaresDefaultValue()); - av.writeNullable(parameterDescriptor.getType().isNullable()); - if (jvmSignature.getKotlinParameterTypes() != null && jvmSignature.getKotlinParameterTypes().get(i) != null) { - av.writeType(jvmSignature.getKotlinParameterTypes().get(i + start).getKotlinSignature()); - } - av.visitEnd(); - } + genJetAnnotations(state, functionDescriptor, jvmSignature, propertyTypeSignature, mv); } } @@ -350,6 +300,70 @@ public class FunctionCodegen extends GenerationStateAware { generateDefaultIfNeeded(context, state, v, jvmSignature.getAsmMethod(), functionDescriptor, kind); } + public static void genJetAnnotations( + GenerationState state, + FunctionDescriptor functionDescriptor, + JvmMethodSignature jvmSignature, + String propertyTypeSignature, + MethodVisitor mv + ) { + List paramDescrs = functionDescriptor.getValueParameters(); + Modality modality = functionDescriptor.getModality(); + ReceiverDescriptor receiverParameter = functionDescriptor.getReceiverParameter(); + + int start = 0; + if (functionDescriptor instanceof PropertyAccessorDescriptor) { + PropertyCodegen.generateJetPropertyAnnotation(mv, propertyTypeSignature, jvmSignature.getKotlinTypeParameter(), + ((PropertyAccessorDescriptor) functionDescriptor) + .getCorrespondingProperty(), + functionDescriptor.getVisibility()); + } + else if (functionDescriptor instanceof SimpleFunctionDescriptor) { + if (propertyTypeSignature != null) { + throw new IllegalStateException(); + } + JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv); + BitSet kotlinFlags = getFlagsForVisibility(functionDescriptor.getVisibility()); + if (isInterface(functionDescriptor.getContainingDeclaration()) && modality != Modality.ABSTRACT) { + kotlinFlags.set(modality == Modality.FINAL + ? JvmStdlibNames.FLAG_FORCE_FINAL_BIT + : JvmStdlibNames.FLAG_FORCE_OPEN_BIT); + } + aw.writeFlags(kotlinFlags); + aw.writeKind(DescriptorKindUtils.kindToInt(functionDescriptor.getKind())); + aw.writeNullableReturnType(functionDescriptor.getReturnType().isNullable()); + aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter()); + aw.writeReturnType(jvmSignature.getKotlinReturnType()); + aw.visitEnd(); + } + else { + throw new IllegalStateException(); + } + + if (receiverParameter.exists()) { + 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.writeType(jvmSignature.getKotlinParameterTypes().get(0).getKotlinSignature()); + } + av.visitEnd(); + } + for (int i = 0; i != paramDescrs.size(); ++i) { + ValueParameterDescriptor parameterDescriptor = paramDescrs.get(i); + AnnotationCodegen.forParameter(i, mv, state.getTypeMapper()).genAnnotations(parameterDescriptor); + JetValueParameterAnnotationWriter av = JetValueParameterAnnotationWriter.visitParameterAnnotation(mv, i + start); + av.writeName(parameterDescriptor.getName().getName()); + av.writeHasDefaultValue(parameterDescriptor.declaresDefaultValue()); + av.writeNullable(parameterDescriptor.getType().isNullable()); + if (jvmSignature.getKotlinParameterTypes() != null && jvmSignature.getKotlinParameterTypes().get(i) != null) { + av.writeType(jvmSignature.getKotlinParameterTypes().get(i + start).getKotlinSignature()); + } + av.visitEnd(); + } + } + public static void endVisit(MethodVisitor mv, @Nullable String description, @Nullable PsiElement method) { try { mv.visitMaxs(-1, -1);