Stable classnames for object declarations whose type is exposed to java clients.

This commit is contained in:
Maxim Shafirov
2011-12-20 10:28:47 +03:00
parent c9959a10f9
commit c27885b74f
@@ -1,5 +1,6 @@
package org.jetbrains.jet.codegen; package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import jet.JetObject; import jet.JetObject;
import jet.typeinfo.TypeInfo; import jet.typeinfo.TypeInfo;
@@ -180,7 +181,39 @@ public class JetTypeMapper {
} }
private HashMap<DeclarationDescriptor,Map<DeclarationDescriptor,String>> naming = new HashMap<DeclarationDescriptor, Map<DeclarationDescriptor, String>>(); private HashMap<DeclarationDescriptor,Map<DeclarationDescriptor,String>> naming = new HashMap<DeclarationDescriptor, Map<DeclarationDescriptor, String>>();
private String getStableNameForObject(JetObjectDeclaration object, DeclarationDescriptor descriptor) {
String local = getLocalNameForObject(object);
if (local == null) return null;
DeclarationDescriptor containingClass = getContainingClass(descriptor);
if (containingClass != null) {
return getFQName(containingClass) + "$" + local;
}
else {
return getFQName(getContainingNamespace(descriptor)) + "/" + local;
}
}
private static String getLocalNameForObject(JetObjectDeclaration object) {
PsiElement parent = object.getParent();
if (parent instanceof JetObjectLiteralExpression) {
PsiElement expressionParent = parent.getParent();
if (expressionParent instanceof JetProperty) {
JetProperty property = (JetProperty) expressionParent;
if (property.getInitializer() == parent) {
return property.getName();
}
}
}
else if (parent instanceof JetClassObject) {
return "$ClassObject";
}
return null;
}
public String getFQName(DeclarationDescriptor descriptor) { public String getFQName(DeclarationDescriptor descriptor) {
descriptor = descriptor.getOriginal(); descriptor = descriptor.getOriginal();
@@ -200,7 +233,17 @@ public class JetTypeMapper {
name = map.get(descriptor); name = map.get(descriptor);
if(name == null) { if(name == null) {
name = getFQName(container) + "$" + (map.size()+1); PsiElement declaration = bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor);
if (declaration instanceof JetObjectDeclaration) {
String stable = getStableNameForObject((JetObjectDeclaration) declaration, descriptor);
if (stable != null) {
name = stable;
}
}
if (name == null) {
name = getFQName(container) + "$" + (map.size()+1);
}
map.put(descriptor, name); map.put(descriptor, name);
} }
return name; return name;
@@ -222,7 +265,19 @@ public class JetTypeMapper {
return name; return name;
} }
private static ClassDescriptor getContainingClass(DeclarationDescriptor descriptor) {
DeclarationDescriptor parent = descriptor.getContainingDeclaration();
if (parent == null || parent instanceof ClassDescriptor) return (ClassDescriptor) parent;
return getContainingClass(parent);
}
private static NamespaceDescriptor getContainingNamespace(DeclarationDescriptor descriptor) {
DeclarationDescriptor parent = descriptor.getContainingDeclaration();
if (parent == null || parent instanceof NamespaceDescriptor) return (NamespaceDescriptor) parent;
return getContainingNamespace(parent);
}
@NotNull public Type mapType(final JetType jetType) { @NotNull public Type mapType(final JetType jetType) {
return mapType(jetType, (BothSignatureWriter) null); return mapType(jetType, (BothSignatureWriter) null);
} }