read class data: hide methods
hide inherited Object and jet.JetObject methods, and special static methods
This commit is contained in:
@@ -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.constants.CompileTimeConstant;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaClassDescriptor;
|
import org.jetbrains.jet.lang.resolve.java.JavaClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaNamespaceDescriptor;
|
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.java.JvmStdlibNames;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver;
|
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 (CodegenUtil.hasTypeInfoField(defaultType)) {
|
||||||
if(!(context instanceof CodegenContext.ConstructorContext)) {
|
if(!(context instanceof CodegenContext.ConstructorContext)) {
|
||||||
v.load(0, TYPE_OBJECT);
|
v.load(0, TYPE_OBJECT);
|
||||||
v.getfield(ownerType.getInternalName(), "$typeInfo", "Ljet/TypeInfo;");
|
v.getfield(ownerType.getInternalName(), JvmAbi.TYPE_INFO_FIELD, "Ljet/TypeInfo;");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
v.load(((ConstructorFrameMap)myFrameMap).getTypeInfoIndex(), TYPE_OBJECT);
|
v.load(((ConstructorFrameMap)myFrameMap).getTypeInfoIndex(), TYPE_OBJECT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
v.getstatic(ownerType.getInternalName(), "$typeInfo", "Ljet/TypeInfo;");
|
v.getstatic(ownerType.getInternalName(), JvmAbi.TYPE_INFO_FIELD, "Ljet/TypeInfo;");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -2677,7 +2678,7 @@ If finally block is present, its last expression is the value of try expression.
|
|||||||
v.load(0, TYPE_OBJECT);
|
v.load(0, TYPE_OBJECT);
|
||||||
while(descriptor != containingDeclaration) {
|
while(descriptor != containingDeclaration) {
|
||||||
descriptor = CodegenUtil.getOuterClassDescriptor(descriptor);
|
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;");
|
v.invokeinterface(TYPE_JET_OBJECT.getInternalName(), JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD, "()Ljet/TypeInfo;");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import org.jetbrains.jet.lang.psi.*;
|
|||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
import org.jetbrains.jet.lang.resolve.OverridingUtil;
|
import org.jetbrains.jet.lang.resolve.OverridingUtil;
|
||||||
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
|
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.resolve.java.JvmStdlibNames;
|
||||||
import org.jetbrains.jet.lang.types.JetType;
|
import org.jetbrains.jet.lang.types.JetType;
|
||||||
import org.jetbrains.jet.lang.types.TypeProjection;
|
import org.jetbrains.jet.lang.types.TypeProjection;
|
||||||
@@ -540,18 +541,18 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
iv.putfield(classname, fieldName, interfaceDesc);
|
iv.putfield(classname, fieldName, interfaceDesc);
|
||||||
|
|
||||||
Type outerType = typeMapper.mapType(outerDescriptor.getDefaultType());
|
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.visitCode();
|
||||||
outer.visitVarInsn(Opcodes.ALOAD, 0);
|
outer.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
outer.visitFieldInsn(Opcodes.GETFIELD, classname, "this$0", outerType.getDescriptor());
|
outer.visitFieldInsn(Opcodes.GETFIELD, classname, "this$0", outerType.getDescriptor());
|
||||||
outer.visitInsn(Opcodes.ARETURN);
|
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) {
|
if (CodegenUtil.requireTypeInfoConstructorArg(descriptor.getDefaultType()) && kind == OwnerKind.IMPLEMENTATION) {
|
||||||
iv.load(0, JetTypeMapper.TYPE_OBJECT);
|
iv.load(0, JetTypeMapper.TYPE_OBJECT);
|
||||||
iv.load(frameMap.getTypeInfoIndex(), 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) {
|
if(closure != null) {
|
||||||
@@ -887,7 +888,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
JetType defaultType = descriptor.getDefaultType();
|
JetType defaultType = descriptor.getDefaultType();
|
||||||
if(CodegenUtil.requireTypeInfoConstructorArg(defaultType)) {
|
if(CodegenUtil.requireTypeInfoConstructorArg(defaultType)) {
|
||||||
if(!CodegenUtil.hasDerivedTypeInfoField(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);
|
MethodVisitor mv = v.newMethod(myClass, Opcodes.ACC_PUBLIC, JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD, "()Ljet/TypeInfo;", null, null);
|
||||||
if (v.generateCode()) {
|
if (v.generateCode()) {
|
||||||
@@ -895,21 +896,21 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
InstructionAdapter iv = new InstructionAdapter(mv);
|
InstructionAdapter iv = new InstructionAdapter(mv);
|
||||||
String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName();
|
String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName();
|
||||||
iv.load(0, JetTypeMapper.TYPE_OBJECT);
|
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);
|
iv.areturn(JetTypeMapper.TYPE_TYPEINFO);
|
||||||
FunctionCodegen.endVisit(iv, JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD, myClass);
|
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()) {
|
if (v.generateCode()) {
|
||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
InstructionAdapter iv = new InstructionAdapter(mv);
|
InstructionAdapter iv = new InstructionAdapter(mv);
|
||||||
String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName();
|
String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName();
|
||||||
iv.load(0, JetTypeMapper.TYPE_OBJECT);
|
iv.load(0, JetTypeMapper.TYPE_OBJECT);
|
||||||
iv.load(1, 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);
|
mv.visitInsn(Opcodes.RETURN);
|
||||||
FunctionCodegen.endVisit(iv, "$setTypeInfo", myClass);
|
FunctionCodegen.endVisit(iv, JvmAbi.SET_TYPE_INFO_METHOD, myClass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ public class NamespaceCodegen {
|
|||||||
DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor();
|
DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor();
|
||||||
if(!jetType.equals(root) && jetType.getArguments().size() == 0 && !(declarationDescriptor instanceof JavaClassDescriptor) && !JetStandardClasses.getAny().equals(declarationDescriptor)) {
|
if(!jetType.equals(root) && jetType.getArguments().size() == 0 && !(declarationDescriptor instanceof JavaClassDescriptor) && !JetStandardClasses.getAny().equals(declarationDescriptor)) {
|
||||||
// TODO: we need some better checks here
|
// 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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+21
@@ -1219,6 +1219,27 @@ public class JavaDescriptorResolver {
|
|||||||
return null;
|
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;
|
DeclarationDescriptor classDescriptor;
|
||||||
final List<TypeParameterDescriptor> classTypeParameters;
|
final List<TypeParameterDescriptor> classTypeParameters;
|
||||||
if (method.isStatic()) {
|
if (method.isStatic()) {
|
||||||
|
|||||||
@@ -9,4 +9,6 @@ public class JvmAbi {
|
|||||||
public static final String GETTER_PREFIX = "get";
|
public static final String GETTER_PREFIX = "get";
|
||||||
public static final String SETTER_PREFIX = "set";
|
public static final String SETTER_PREFIX = "set";
|
||||||
public static final String PACKAGE_CLASS = "namespace";
|
public static final String PACKAGE_CLASS = "namespace";
|
||||||
|
public static final String SET_TYPE_INFO_METHOD = "$setTypeInfo";
|
||||||
|
public static final String TYPE_INFO_FIELD = "$typeInfo";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ public class JvmStdlibNames {
|
|||||||
public static final JvmClassName JET_OBJECT = new JvmClassName("jet.JetObject");
|
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_TYPEINFO_METHOD = "getTypeInfo";
|
||||||
|
public static final String JET_OBJECT_GET_OUTER_OBJECT_METHOD = "getOuterObject";
|
||||||
|
|
||||||
|
|
||||||
private JvmStdlibNames() {
|
private JvmStdlibNames() {
|
||||||
|
|||||||
@@ -24,4 +24,8 @@ public class PsiMemberWrapper {
|
|||||||
return psiMember.hasModifierProperty(PsiModifier.PRIVATE);
|
return psiMember.hasModifierProperty(PsiModifier.PRIVATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return psiMember.getName();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -232,17 +232,6 @@ public class ReadClassDataTest extends TestCaseWithTmpdir {
|
|||||||
|
|
||||||
JetScope memberScope = klass.getMemberScope(typeArguments);
|
JetScope memberScope = klass.getMemberScope(typeArguments);
|
||||||
for (DeclarationDescriptor member : memberScope.getAllDescriptors()) {
|
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();
|
StringBuilder memberSb = new StringBuilder();
|
||||||
new Serializer(memberSb).serialize(member);
|
new Serializer(memberSb).serialize(member);
|
||||||
memberStrings.add(memberSb.toString());
|
memberStrings.add(memberSb.toString());
|
||||||
|
|||||||
Reference in New Issue
Block a user