From 9f45e7cc08dd062eb7bdf353ad03d3d3ebe70d36 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 14 Jun 2012 20:00:10 +0400 Subject: [PATCH] Fixed visibility generated by backend for internal members. Now they are public in JVM, but have special flag in annotation. --- .../jetbrains/jet/codegen/FunctionCodegen.java | 9 ++++++++- .../jet/codegen/ImplementationBodyCodegen.java | 10 ++++++++-- .../org/jetbrains/jet/codegen/JetTypeMapper.java | 3 +++ .../jetbrains/jet/codegen/PropertyCodegen.java | 16 +++++++++++++--- .../jet/lang/resolve/java/JvmStdlibNames.java | 4 +++- compiler/testData/codegen/regressions/kt1482.kt | 4 ++-- 6 files changed, 37 insertions(+), 9 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 728ad6b3efa..0d3c816c41b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -132,7 +132,8 @@ public class FunctionCodegen { if (functionDescriptor instanceof PropertyAccessorDescriptor) { PropertyCodegen.generateJetPropertyAnnotation(mv, propertyTypeSignature, jvmSignature.getKotlinTypeParameter(), ((PropertyAccessorDescriptor) functionDescriptor) - .getCorrespondingProperty()); + .getCorrespondingProperty(), + functionDescriptor.getVisibility()); } else if (functionDescriptor instanceof SimpleFunctionDescriptor) { if (propertyTypeSignature != null) { @@ -145,6 +146,12 @@ public class FunctionCodegen { ? JvmStdlibNames.JET_METHOD_FLAG_FORCE_FINAL_BIT : JvmStdlibNames.JET_METHOD_FLAG_FORCE_OPEN_BIT); } + if (functionDescriptor.getVisibility() == Visibilities.INTERNAL) { + kotlinFlags.set(JvmStdlibNames.JET_METHOD_FLAG_INTERNAL_BIT); + } + else if (functionDescriptor.getVisibility() == Visibilities.PRIVATE) { + kotlinFlags.set(JvmStdlibNames.JET_METHOD_FLAG_PRIVATE_BIT); + } aw.writeFlags(kotlinFlags); aw.writeNullableReturnType(functionDescriptor.getReturnType().isNullable()); aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index ed5994399ca..3b538c58c59 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -338,7 +338,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null); PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature.getPropertyTypeKotlinSignature(), originalSignature.getJvmMethodSignature().getKotlinTypeParameter(), - original); + original, ((PropertyDescriptor) entry.getValue()).getGetter().getVisibility()); if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } @@ -366,7 +366,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null); PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature2.getPropertyTypeKotlinSignature(), originalSignature2.getJvmMethodSignature().getKotlinTypeParameter(), - original); + original, ((PropertyDescriptor) entry.getValue()).getSetter().getVisibility()); if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } @@ -777,6 +777,12 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { JvmMethodSignature jvmSignature = typeMapper.mapToCallableMethod(inheritedFun, false, OwnerKind.IMPLEMENTATION).getSignature(); JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv); BitSet kotlinFlags = new BitSet(); + if (fun.getVisibility() == Visibilities.INTERNAL) { + kotlinFlags.set(JvmStdlibNames.JET_METHOD_FLAG_INTERNAL_BIT); + } + else if (fun.getVisibility() == Visibilities.PRIVATE) { + kotlinFlags.set(JvmStdlibNames.JET_METHOD_FLAG_PRIVATE_BIT); + } if (fun instanceof PropertyAccessorDescriptor) { kotlinFlags.set(JvmStdlibNames.JET_METHOD_FLAG_PROPERTY_BIT); aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index add8b892eac..f352065cbe2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -958,6 +958,9 @@ public class JetTypeMapper { } return ACC_PRIVATE; } + else if (p.getVisibility() == Visibilities.INTERNAL) { + return ACC_PUBLIC; + } else { return defaultFlags; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index 89ccd6af79f..78ac7004e41 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -179,7 +179,10 @@ public class PropertyCodegen { String getterName = getterName(propertyDescriptor.getName()); MethodVisitor mv = v.newMethod(origin, flags, getterName, descriptor, null, null); generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(), - signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor); + signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor, + propertyDescriptor.getGetter() == null + ? propertyDescriptor.getVisibility() + : propertyDescriptor.getGetter().getVisibility()); if (propertyDescriptor.getGetter() != null) { assert !propertyDescriptor.getGetter().hasBody(); @@ -223,7 +226,7 @@ public class PropertyCodegen { } public static void generateJetPropertyAnnotation(MethodVisitor mv, @NotNull String kotlinType, @NotNull String typeParameters, - @NotNull PropertyDescriptor propertyDescriptor) { + @NotNull PropertyDescriptor propertyDescriptor, @NotNull Visibility visibility) { JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv); Modality modality = propertyDescriptor.getModality(); BitSet flags = new BitSet(); @@ -233,6 +236,12 @@ public class PropertyCodegen { ? JvmStdlibNames.JET_METHOD_FLAG_FORCE_FINAL_BIT : JvmStdlibNames.JET_METHOD_FLAG_FORCE_OPEN_BIT); } + if (visibility == Visibilities.INTERNAL) { + flags.set(JvmStdlibNames.JET_METHOD_FLAG_INTERNAL_BIT); + } + else if (visibility == Visibilities.PRIVATE) { + flags.set(JvmStdlibNames.JET_METHOD_FLAG_PRIVATE_BIT); + } aw.writeFlags(flags); aw.writeTypeParameters(typeParameters); aw.writePropertyType(kotlinType); @@ -275,7 +284,8 @@ public class PropertyCodegen { final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor(); MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, null, null); generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(), - signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor); + signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor, + propertyDescriptor.getSetter().getVisibility()); if (propertyDescriptor.getSetter() != null) { assert !propertyDescriptor.getSetter().hasBody(); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java index b3386bff8ca..7341978b307 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java @@ -49,10 +49,12 @@ public class JvmStdlibNames { public static final String JET_METHOD_PROPERTY_TYPE_FIELD = "propertyType"; public static final int JET_METHOD_FLAGS_DEFAULT_VALUE = 0; - public static final int JET_METHOD_FLAGS_BITS = 3; + public static final int JET_METHOD_FLAGS_BITS = 5; public static final int JET_METHOD_FLAG_PROPERTY_BIT = 0; public static final int JET_METHOD_FLAG_FORCE_OPEN_BIT = 1; public static final int JET_METHOD_FLAG_FORCE_FINAL_BIT = 2; + public static final int JET_METHOD_FLAG_PRIVATE_BIT = 3; + public static final int JET_METHOD_FLAG_INTERNAL_BIT = 4; public static final JvmClassName JET_CONSTRUCTOR = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetConstructor"); diff --git a/compiler/testData/codegen/regressions/kt1482.kt b/compiler/testData/codegen/regressions/kt1482.kt index d93739f5227..b8c3a98e42f 100644 --- a/compiler/testData/codegen/regressions/kt1482.kt +++ b/compiler/testData/codegen/regressions/kt1482.kt @@ -9,11 +9,11 @@ abstract class ClassValAbstract { fun box() : String { for(m in ClassValAbstract.methods) { if(m.sure().getName() == "getA") { - if(m.sure().getModifiers() != 1024) + if(m.sure().getModifiers() != 1025) return "get failed" } if(m.sure().getName() == "setA") { - if(m.sure().getModifiers() != 1024) + if(m.sure().getModifiers() != 1025) return "set failed" } }