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:
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user