write InnerClasses attribute

This commit is contained in:
Stepan Koltsov
2012-01-15 18:56:45 +04:00
parent 3ce345b06b
commit 669ea44c1a
2 changed files with 18 additions and 0 deletions
@@ -65,6 +65,10 @@ public abstract class ClassBuilder {
getVisitor().visitOuterClass(owner, name, desc);
}
public void visitInnerClass(String name, String outerName, String innerName, int access) {
getVisitor().visitInnerClass(name, outerName, innerName, access);
}
public boolean generateCode() {
return true;
}
@@ -95,6 +95,20 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
v.visitOuterClass(typeMapper.mapType(container.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), null, null);
}
for (ClassDescriptor innerClass : descriptor.getInnerClassesAndObjects()) {
// TODO: proper access
int innerClassAccess = Opcodes.ACC_PUBLIC;
if (innerClass.getModality() == Modality.FINAL) {
innerClassAccess |= Opcodes.ACC_FINAL;
} else if (innerClass.getModality() == Modality.ABSTRACT) {
innerClassAccess |= Opcodes.ACC_ABSTRACT;
}
// TODO: cache internal names
String outerClassInernalName = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName();
String innerClassInternalName = typeMapper.mapType(innerClass.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName();
v.visitInnerClass(innerClassInternalName, outerClassInernalName, innerClass.getName(), innerClassAccess);
}
if(myClass instanceof JetClass && signature.getKotlinGenericSignature() != null) {
AnnotationVisitor annotationVisitor = v.newAnnotation(myClass, JvmStdlibNames.JET_CLASS.getDescriptor(), true);
annotationVisitor.visit(JvmStdlibNames.JET_CLASS_SIGNATURE, signature.getKotlinGenericSignature());