Fixed visibility generated by backend for internal members. Now they are public in JVM, but have special flag in annotation.

This commit is contained in:
Evgeny Gerashchenko
2012-06-14 20:00:10 +04:00
parent 221e412ba7
commit 9f45e7cc08
6 changed files with 37 additions and 9 deletions
@@ -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());
@@ -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());
@@ -958,6 +958,9 @@ public class JetTypeMapper {
}
return ACC_PRIVATE;
}
else if (p.getVisibility() == Visibilities.INTERNAL) {
return ACC_PUBLIC;
}
else {
return defaultFlags;
}
@@ -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();
@@ -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");
@@ -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"
}
}