fix prop modality reading from class files

This commit is contained in:
Stepan Koltsov
2012-03-02 23:18:50 +04:00
parent 25ed7018a4
commit 16917dea4f
37 changed files with 66 additions and 37 deletions
@@ -160,6 +160,10 @@ public class PropertyCodegen {
if(isTrait && !(kind instanceof OwnerKind.DelegateKind)) if(isTrait && !(kind instanceof OwnerKind.DelegateKind))
flags |= Opcodes.ACC_ABSTRACT; flags |= Opcodes.ACC_ABSTRACT;
if (propertyDescriptor.getModality() == Modality.FINAL) {
flags |= Opcodes.ACC_FINAL;
}
JvmPropertyAccessorSignature signature = state.getTypeMapper().mapGetterSignature(propertyDescriptor, kind); JvmPropertyAccessorSignature signature = state.getTypeMapper().mapGetterSignature(propertyDescriptor, kind);
final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor(); final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor();
String getterName = getterName(propertyDescriptor.getName()); String getterName = getterName(propertyDescriptor.getName());
@@ -231,6 +235,10 @@ public class PropertyCodegen {
if(isTrait && !(kind instanceof OwnerKind.DelegateKind)) if(isTrait && !(kind instanceof OwnerKind.DelegateKind))
flags |= Opcodes.ACC_ABSTRACT; flags |= Opcodes.ACC_ABSTRACT;
if (propertyDescriptor.getModality() == Modality.FINAL) {
flags |= Opcodes.ACC_FINAL;
}
JvmPropertyAccessorSignature signature = state.getTypeMapper().mapSetterSignature(propertyDescriptor, kind); JvmPropertyAccessorSignature signature = state.getTypeMapper().mapSetterSignature(propertyDescriptor, kind);
final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor(); final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor();
MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, null, null); MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, null, null);
@@ -1158,7 +1158,9 @@ public class JavaDescriptorResolver {
} }
boolean isFinal; boolean isFinal;
if (members.setter == null && members.getter == null) { if (!scopeData.kotlin) {
isFinal = true;
} else if (members.setter == null && members.getter == null) {
isFinal = false; isFinal = false;
} else if (members.getter != null) { } else if (members.getter != null) {
isFinal = members.getter.getMember().isFinal(); isFinal = members.getter.getMember().isFinal();
@@ -1185,11 +1187,20 @@ public class JavaDescriptorResolver {
} else { } else {
isVar = members.setter != null; isVar = members.setter != null;
} }
Modality modality;
if (isFinal) {
modality = Modality.FINAL;
}
else {
modality = anyMember.getMember().isAbstract() ? Modality.ABSTRACT : Modality.OPEN;
}
PropertyDescriptor propertyDescriptor = new PropertyDescriptor( PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
owner, owner,
Collections.<AnnotationDescriptor>emptyList(), Collections.<AnnotationDescriptor>emptyList(),
isFinal && !staticMembers ? Modality.FINAL : Modality.OPEN, // TODO: abstract modality,
resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember), resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
isVar, isVar,
false, false,
@@ -36,4 +36,9 @@ public class PsiFieldWrapper extends PsiMemberWrapper {
public PsiType getType() { public PsiType getType() {
return getPsiField().getType(); return getPsiField().getType();
} }
@Override
public boolean isAbstract() {
return false;
}
} }
@@ -49,6 +49,8 @@ public abstract class PsiMemberWrapper {
return psiMember.hasModifierProperty(PsiModifier.FINAL); return psiMember.hasModifierProperty(PsiModifier.FINAL);
} }
public abstract boolean isAbstract();
public String getName() { public String getName() {
return psiMember.getName(); return psiMember.getName();
} }
@@ -2,5 +2,5 @@ namespace test
final class test.FieldAsVar : jet.Any { final class test.FieldAsVar : jet.Any {
final /*constructor*/ fun <init>(): test.FieldAsVar final /*constructor*/ fun <init>(): test.FieldAsVar
var f: jet.Int final var f: jet.Int
} }
@@ -2,5 +2,5 @@ namespace test
open class test.FieldOfArrayType : jet.Any { open class test.FieldOfArrayType : jet.Any {
final /*constructor*/ fun <init>(): test.FieldOfArrayType final /*constructor*/ fun <init>(): test.FieldOfArrayType
var files: jet.Array<java.io.File?>? final var files: jet.Array<java.io.File?>?
} }
@@ -2,5 +2,5 @@ namespace test
final class test.FinalFieldAsVal : jet.Any { final class test.FinalFieldAsVal : jet.Any {
final /*constructor*/ fun <init>(): test.FinalFieldAsVal final /*constructor*/ fun <init>(): test.FinalFieldAsVal
val f: jet.Int final val f: jet.Int
} }
@@ -2,6 +2,6 @@ namespace test
final class test.TwoFields : jet.Any { final class test.TwoFields : jet.Any {
final /*constructor*/ fun <init>(): test.TwoFields final /*constructor*/ fun <init>(): test.TwoFields
var a: jet.Int final var a: jet.Int
var b: jet.Short final var b: jet.Short
} }
@@ -2,5 +2,5 @@ namespace test
open class test.NotNullField : jet.Any { open class test.NotNullField : jet.Any {
final /*constructor*/ fun <init>(): test.NotNullField final /*constructor*/ fun <init>(): test.NotNullField
var hi: jet.String final var hi: jet.String
} }
@@ -4,6 +4,6 @@ final class test.ClassObjectDeclaresProperty : jet.Any {
final /*constructor*/ fun <init>(): test.ClassObjectDeclaresProperty final /*constructor*/ fun <init>(): test.ClassObjectDeclaresProperty
final object test.ClassObjectDeclaresProperty.<no name provided> : jet.Any { final object test.ClassObjectDeclaresProperty.<no name provided> : jet.Any {
final /*constructor*/ fun <init>(): test.ClassObjectDeclaresProperty.<no name provided> final /*constructor*/ fun <init>(): test.ClassObjectDeclaresProperty.<no name provided>
val i: jet.Int final val i: jet.Int
} }
} }
@@ -4,6 +4,6 @@ final class test.ClassObjectDeclaresProperty : jet.Any {
final /*constructor*/ fun <init>(): test.ClassObjectDeclaresProperty final /*constructor*/ fun <init>(): test.ClassObjectDeclaresProperty
final object test.ClassObjectDeclaresProperty.<no name provided> : jet.Any { final object test.ClassObjectDeclaresProperty.<no name provided> : jet.Any {
final /*constructor*/ fun <init>(): test.ClassObjectDeclaresProperty.<no name provided> final /*constructor*/ fun <init>(): test.ClassObjectDeclaresProperty.<no name provided>
var s: jet.String final var s: jet.String
} }
} }
@@ -2,5 +2,5 @@ namespace test
final class test.TestingKotlinCollections : jet.Any { final class test.TestingKotlinCollections : jet.Any {
final /*constructor*/ fun <init>(/*0*/ arguments: java.util.Collection<jet.String>): test.TestingKotlinCollections final /*constructor*/ fun <init>(/*0*/ arguments: java.util.Collection<jet.String>): test.TestingKotlinCollections
val arguments: java.util.Collection<jet.String> final val arguments: java.util.Collection<jet.String>
} }
@@ -2,5 +2,5 @@ namespace test
final class test.ClassVal : jet.Any { final class test.ClassVal : jet.Any {
final /*constructor*/ fun <init>(): test.ClassVal final /*constructor*/ fun <init>(): test.ClassVal
val aa: jet.Int final val aa: jet.Int
} }
@@ -1,6 +1,6 @@
namespace test namespace test
abstract class test.ClassValAbstract : jet.Any { abstract class test.ClassValAbstract : jet.Any {
abstract val a: jet.Int
final /*constructor*/ fun <init>(): test.ClassValAbstract final /*constructor*/ fun <init>(): test.ClassValAbstract
val a: jet.Int
} }
@@ -2,5 +2,5 @@ namespace test
final class test.ClassVar : jet.Any { final class test.ClassVar : jet.Any {
final /*constructor*/ fun <init>(): test.ClassVar final /*constructor*/ fun <init>(): test.ClassVar
var aa: jet.Int final var aa: jet.Int
} }
@@ -1,3 +1,3 @@
namespace test namespace test
val java.util.Collection<out jet.Any?>.anotherSize: jet.Int final val java.util.Collection<out jet.Any?>.anotherSize: jet.Int
@@ -1,3 +1,3 @@
namespace test namespace test
val </*0,r*/ P : jet.Any?> /*0,r*/ P : jet.Any?.anotherJavaClass: java.lang.Class</*0,r*/ P : jet.Any?> final val </*0,r*/ P : jet.Any?> /*0,r*/ P : jet.Any?.anotherJavaClass: java.lang.Class</*0,r*/ P : jet.Any?>
@@ -2,5 +2,5 @@ namespace test
final class test.ExtPropInClass : jet.Any { final class test.ExtPropInClass : jet.Any {
final /*constructor*/ fun <init>(): test.ExtPropInClass final /*constructor*/ fun <init>(): test.ExtPropInClass
val jet.Int.itIs: jet.Int final val jet.Int.itIs: jet.Int
} }
@@ -1,3 +1,3 @@
namespace test namespace test
val jet.Int.itIs: jet.Int final val jet.Int.itIs: jet.Int
@@ -1,3 +1,3 @@
namespace test namespace test
val jet.Int.ggg: jet.CharSequence final val jet.Int.ggg: jet.CharSequence
@@ -1,3 +1,3 @@
namespace test namespace test
val jet.Int.ggg: jet.CharSequence? final val jet.Int.ggg: jet.CharSequence?
@@ -2,5 +2,5 @@ namespace test
final class test.ExtValInClass : jet.Any { final class test.ExtValInClass : jet.Any {
final /*constructor*/ fun <init>(): test.ExtValInClass final /*constructor*/ fun <init>(): test.ExtValInClass
val jet.Int.asas: java.util.List<jet.Int>? final val jet.Int.asas: java.util.List<jet.Int>?
} }
@@ -2,5 +2,5 @@ namespace test
final class test.ExtValInClass</*0,r*/ T : jet.Any?> : jet.Any { final class test.ExtValInClass</*0,r*/ T : jet.Any?> : jet.Any {
final /*constructor*/ fun </*0,r*/ T : jet.Any?><init>(): test.ExtValInClass</*0,r*/ T : jet.Any?> final /*constructor*/ fun </*0,r*/ T : jet.Any?><init>(): test.ExtValInClass</*0,r*/ T : jet.Any?>
val jet.Int.asas: /*0,r*/ T : jet.Any? final val jet.Int.asas: /*0,r*/ T : jet.Any?
} }
@@ -2,5 +2,5 @@ namespace test
final class test.ExtValInClass</*0,r*/ P : jet.Any?> : jet.Any { final class test.ExtValInClass</*0,r*/ P : jet.Any?> : jet.Any {
final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValInClass</*0,r*/ P : jet.Any?> final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValInClass</*0,r*/ P : jet.Any?>
val jet.Int.asas: /*0,r*/ P : jet.Any?? final val jet.Int.asas: /*0,r*/ P : jet.Any??
} }
@@ -2,5 +2,5 @@ namespace test
final class test.ExtValPIntInClass</*0,r*/ P : jet.Any?> : jet.Any { final class test.ExtValPIntInClass</*0,r*/ P : jet.Any?> : jet.Any {
final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValPIntInClass</*0,r*/ P : jet.Any?> final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValPIntInClass</*0,r*/ P : jet.Any?>
val /*0,r*/ P : jet.Any?.asas: jet.Int final val /*0,r*/ P : jet.Any?.asas: jet.Int
} }
@@ -1,3 +1,3 @@
namespace test namespace test
var </*0,r*/ P : jet.Any?> /*0,r*/ P : jet.Any?.anotherJavaClass: java.lang.Class</*0,r*/ P : jet.Any?> final var </*0,r*/ P : jet.Any?> /*0,r*/ P : jet.Any?.anotherJavaClass: java.lang.Class</*0,r*/ P : jet.Any?>
@@ -2,5 +2,5 @@ namespace test
final class test.ExtPropInClass : jet.Any { final class test.ExtPropInClass : jet.Any {
final /*constructor*/ fun <init>(): test.ExtPropInClass final /*constructor*/ fun <init>(): test.ExtPropInClass
var jet.Int.itIs: jet.Int final var jet.Int.itIs: jet.Int
} }
@@ -1,3 +1,3 @@
namespace test namespace test
var jet.Int.ggg: jet.Int final var jet.Int.ggg: jet.Int
@@ -2,5 +2,5 @@ namespace test
final class test.ExtValInClass</*0,r*/ P : jet.Any?> : jet.Any { final class test.ExtValInClass</*0,r*/ P : jet.Any?> : jet.Any {
final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValInClass</*0,r*/ P : jet.Any?> final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValInClass</*0,r*/ P : jet.Any?>
var jet.Int.asas: /*0,r*/ P : jet.Any? final var jet.Int.asas: /*0,r*/ P : jet.Any?
} }
@@ -2,5 +2,5 @@ namespace test
final class test.ExtValInClass</*0,r*/ P : jet.Any?> : jet.Any { final class test.ExtValInClass</*0,r*/ P : jet.Any?> : jet.Any {
final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValInClass</*0,r*/ P : jet.Any?> final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValInClass</*0,r*/ P : jet.Any?>
var jet.Int.asas: /*0,r*/ P : jet.Any?? final var jet.Int.asas: /*0,r*/ P : jet.Any??
} }
@@ -1,3 +1,3 @@
namespace test namespace test
var </*0,r*/ P : jet.Any?, /*1,r*/ Q : jet.Any?> java.util.Map</*0,r*/ P : jet.Any?, /*1,r*/ Q : jet.Any?>.asas: jet.Int final var </*0,r*/ P : jet.Any?, /*1,r*/ Q : jet.Any?> java.util.Map</*0,r*/ P : jet.Any?, /*1,r*/ Q : jet.Any?>.asas: jet.Int
@@ -2,5 +2,5 @@ namespace test
final class test.ExtValPIntInClass</*0,r*/ P : jet.Any?> : jet.Any { final class test.ExtValPIntInClass</*0,r*/ P : jet.Any?> : jet.Any {
final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValPIntInClass</*0,r*/ P : jet.Any?> final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValPIntInClass</*0,r*/ P : jet.Any?>
var /*0,r*/ P : jet.Any?.asas: jet.Int final var /*0,r*/ P : jet.Any?.asas: jet.Int
} }
@@ -2,5 +2,5 @@ namespace test
final class test.ExtValPIntInClass</*0,r*/ P : jet.Any?> : jet.Any { final class test.ExtValPIntInClass</*0,r*/ P : jet.Any?> : jet.Any {
final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValPIntInClass</*0,r*/ P : jet.Any?> final /*constructor*/ fun </*0,r*/ P : jet.Any?><init>(): test.ExtValPIntInClass</*0,r*/ P : jet.Any?>
var /*0,r*/ P : jet.Any??.asas: jet.Int final var /*0,r*/ P : jet.Any??.asas: jet.Int
} }
@@ -1,4 +1,4 @@
namespace test namespace test
val jet.String.junk: jet.Int final val jet.String.junk: jet.Int
var jet.Int.junk: jet.Short final var jet.Int.junk: jet.Short
@@ -1,3 +1,3 @@
namespace test namespace test
val nsVal: jet.Int final val nsVal: jet.Int
@@ -1,3 +1,3 @@
namespace test namespace test
var nsVal: jet.Int final var nsVal: jet.Int
@@ -258,6 +258,9 @@ class NamespaceComparator {
} }
public void serialize(PropertyDescriptor prop) { public void serialize(PropertyDescriptor prop) {
serialize(prop.getModality());
sb.append(" ");
if (!prop.getAnnotations().isEmpty()) { if (!prop.getAnnotations().isEmpty()) {
new Serializer(sb).serializeSeparated(prop.getAnnotations(), " "); new Serializer(sb).serializeSeparated(prop.getAnnotations(), " ");
sb.append(" "); sb.append(" ");