diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index eacfd2e3308..2313d6f59e4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -16,6 +16,7 @@ import org.jetbrains.jet.lang.resolve.calls.*; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.java.JavaClassDescriptor; import org.jetbrains.jet.lang.resolve.java.JavaNamespaceDescriptor; +import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; @@ -2658,14 +2659,14 @@ If finally block is present, its last expression is the value of try expression. if (CodegenUtil.hasTypeInfoField(defaultType)) { if(!(context instanceof CodegenContext.ConstructorContext)) { v.load(0, TYPE_OBJECT); - v.getfield(ownerType.getInternalName(), "$typeInfo", "Ljet/TypeInfo;"); + v.getfield(ownerType.getInternalName(), JvmAbi.TYPE_INFO_FIELD, "Ljet/TypeInfo;"); } else { v.load(((ConstructorFrameMap)myFrameMap).getTypeInfoIndex(), TYPE_OBJECT); } } else { - v.getstatic(ownerType.getInternalName(), "$typeInfo", "Ljet/TypeInfo;"); + v.getstatic(ownerType.getInternalName(), JvmAbi.TYPE_INFO_FIELD, "Ljet/TypeInfo;"); } } else { @@ -2677,7 +2678,7 @@ If finally block is present, its last expression is the value of try expression. v.load(0, TYPE_OBJECT); while(descriptor != containingDeclaration) { descriptor = CodegenUtil.getOuterClassDescriptor(descriptor); - v.invokeinterface(TYPE_JET_OBJECT.getInternalName(), "getOuterObject", "()Ljet/JetObject;"); + v.invokeinterface(TYPE_JET_OBJECT.getInternalName(), JvmStdlibNames.JET_OBJECT_GET_OUTER_OBJECT_METHOD, "()Ljet/JetObject;"); } v.invokeinterface(TYPE_JET_OBJECT.getInternalName(), JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD, "()Ljet/TypeInfo;"); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index fbbb9cf5279..401ff37777b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -7,6 +7,7 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.OverridingUtil; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; +import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeProjection; @@ -540,18 +541,18 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { iv.putfield(classname, fieldName, interfaceDesc); Type outerType = typeMapper.mapType(outerDescriptor.getDefaultType()); - MethodVisitor outer = v.newMethod(myClass, Opcodes.ACC_PUBLIC, "getOuterObject", "()Ljet/JetObject;", null, null); + MethodVisitor outer = v.newMethod(myClass, Opcodes.ACC_PUBLIC, JvmStdlibNames.JET_OBJECT_GET_OUTER_OBJECT_METHOD, "()Ljet/JetObject;", null, null); outer.visitCode(); outer.visitVarInsn(Opcodes.ALOAD, 0); outer.visitFieldInsn(Opcodes.GETFIELD, classname, "this$0", outerType.getDescriptor()); outer.visitInsn(Opcodes.ARETURN); - FunctionCodegen.endVisit(outer, "getOuterObject", myClass); + FunctionCodegen.endVisit(outer, JvmStdlibNames.JET_OBJECT_GET_OUTER_OBJECT_METHOD, myClass); } if (CodegenUtil.requireTypeInfoConstructorArg(descriptor.getDefaultType()) && kind == OwnerKind.IMPLEMENTATION) { iv.load(0, JetTypeMapper.TYPE_OBJECT); iv.load(frameMap.getTypeInfoIndex(), JetTypeMapper.TYPE_OBJECT); - iv.invokevirtual(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), "$setTypeInfo", "(Ljet/TypeInfo;)V"); + iv.invokevirtual(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), JvmAbi.SET_TYPE_INFO_METHOD, "(Ljet/TypeInfo;)V"); } if(closure != null) { @@ -887,7 +888,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { JetType defaultType = descriptor.getDefaultType(); if(CodegenUtil.requireTypeInfoConstructorArg(defaultType)) { if(!CodegenUtil.hasDerivedTypeInfoField(defaultType)) { - v.newField(myClass, Opcodes.ACC_PROTECTED, "$typeInfo", "Ljet/TypeInfo;", null, null); + v.newField(myClass, Opcodes.ACC_PROTECTED, JvmAbi.TYPE_INFO_FIELD, "Ljet/TypeInfo;", null, null); MethodVisitor mv = v.newMethod(myClass, Opcodes.ACC_PUBLIC, JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD, "()Ljet/TypeInfo;", null, null); if (v.generateCode()) { @@ -895,21 +896,21 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { InstructionAdapter iv = new InstructionAdapter(mv); String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(); iv.load(0, JetTypeMapper.TYPE_OBJECT); - iv.getfield(owner, "$typeInfo", "Ljet/TypeInfo;"); + iv.getfield(owner, JvmAbi.TYPE_INFO_FIELD, "Ljet/TypeInfo;"); iv.areturn(JetTypeMapper.TYPE_TYPEINFO); FunctionCodegen.endVisit(iv, JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD, myClass); } - mv = v.newMethod(myClass, Opcodes.ACC_PROTECTED | Opcodes.ACC_FINAL, "$setTypeInfo", "(Ljet/TypeInfo;)V", null, null); + mv = v.newMethod(myClass, Opcodes.ACC_PROTECTED | Opcodes.ACC_FINAL, JvmAbi.SET_TYPE_INFO_METHOD, "(Ljet/TypeInfo;)V", null, null); if (v.generateCode()) { mv.visitCode(); InstructionAdapter iv = new InstructionAdapter(mv); String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(); iv.load(0, JetTypeMapper.TYPE_OBJECT); iv.load(1, JetTypeMapper.TYPE_OBJECT); - iv.putfield(owner, "$typeInfo", "Ljet/TypeInfo;"); + iv.putfield(owner, JvmAbi.TYPE_INFO_FIELD, "Ljet/TypeInfo;"); mv.visitInsn(Opcodes.RETURN); - FunctionCodegen.endVisit(iv, "$setTypeInfo", myClass); + FunctionCodegen.endVisit(iv, JvmAbi.SET_TYPE_INFO_METHOD, myClass); } } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java index 31bc00c6667..2361f62b992 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java @@ -154,7 +154,7 @@ public class NamespaceCodegen { DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor(); if(!jetType.equals(root) && jetType.getArguments().size() == 0 && !(declarationDescriptor instanceof JavaClassDescriptor) && !JetStandardClasses.getAny().equals(declarationDescriptor)) { // TODO: we need some better checks here - v.getstatic(typeMapper.mapType(jetType, OwnerKind.IMPLEMENTATION).getInternalName(), "$typeInfo", "Ljet/TypeInfo;"); + v.getstatic(typeMapper.mapType(jetType, OwnerKind.IMPLEMENTATION).getInternalName(), JvmAbi.TYPE_INFO_FIELD, "Ljet/TypeInfo;"); return; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index eb58b956aac..cd59eecbb31 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1219,6 +1219,27 @@ public class JavaDescriptorResolver { return null; } + if (kotlin) { + // TODO: unless maybe class explicitly extends Object + String ownerClassName = method.getPsiMethod().getContainingClass().getQualifiedName(); + if (ownerClassName.equals("java.lang.Object")) { + return null; + } + + if (method.getName().equals(JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD) && method.getParameters().size() == 0) { + return null; + } + + if (method.getName().equals(JvmStdlibNames.JET_OBJECT_GET_OUTER_OBJECT_METHOD) && method.getParameters().size() == 0) { + return null; + } + + // TODO: check signature + if (method.getName().equals(JvmAbi.SET_TYPE_INFO_METHOD)) { + return null; + } + } + DeclarationDescriptor classDescriptor; final List classTypeParameters; if (method.isStatic()) { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java index 28ec4c6a71a..0c4c96315e0 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java @@ -9,4 +9,6 @@ public class JvmAbi { public static final String GETTER_PREFIX = "get"; public static final String SETTER_PREFIX = "set"; public static final String PACKAGE_CLASS = "namespace"; + public static final String SET_TYPE_INFO_METHOD = "$setTypeInfo"; + public static final String TYPE_INFO_FIELD = "$typeInfo"; } 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 48ac6e69141..66d5ebf2677 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 @@ -50,6 +50,7 @@ public class JvmStdlibNames { public static final JvmClassName JET_OBJECT = new JvmClassName("jet.JetObject"); public static final String JET_OBJECT_GET_TYPEINFO_METHOD = "getTypeInfo"; + public static final String JET_OBJECT_GET_OUTER_OBJECT_METHOD = "getOuterObject"; private JvmStdlibNames() { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiMemberWrapper.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiMemberWrapper.java index 9e382597382..9e94bcd4169 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiMemberWrapper.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiMemberWrapper.java @@ -23,5 +23,9 @@ public class PsiMemberWrapper { public boolean isPrivate() { return psiMember.hasModifierProperty(PsiModifier.PRIVATE); } + + public String getName() { + return psiMember.getName(); + } } diff --git a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java index 22af0adfb4f..2fd0b21c07a 100644 --- a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java +++ b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java @@ -232,17 +232,6 @@ public class ReadClassDataTest extends TestCaseWithTmpdir { JetScope memberScope = klass.getMemberScope(typeArguments); for (DeclarationDescriptor member : memberScope.getAllDescriptors()) { - // TODO - if (member.getName().equals("equals") || member.getName().equals("hashCode") - || member.getName().equals("wait") || member.getName().equals("notify") || member.getName().equals("notifyAll") - || member.getName().equals("toString") || member.getName().equals("getClass") - || member.getName().equals("clone") || member.getName().equals("finalize") - || member.getName().equals("getTypeInfo") || member.getName().equals("$setTypeInfo") || member.getName().equals("$typeInfo") - || member.getName().equals("getOuterObject") - ) - { - continue; - } StringBuilder memberSb = new StringBuilder(); new Serializer(memberSb).serialize(member); memberStrings.add(memberSb.toString());