prepare anonymous classes also when generating namespace
This commit is contained in:
@@ -17,7 +17,7 @@ public class ClassCodegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void generate(JetClassOrObject aClass) {
|
public void generate(JetClassOrObject aClass) {
|
||||||
prepareAnonymousClasses(aClass);
|
state.prepareAnonymousClasses((JetElement) aClass);
|
||||||
|
|
||||||
if (aClass instanceof JetObjectDeclaration) {
|
if (aClass instanceof JetObjectDeclaration) {
|
||||||
generateImplementation(aClass, OwnerKind.IMPLEMENTATION);
|
generateImplementation(aClass, OwnerKind.IMPLEMENTATION);
|
||||||
@@ -35,21 +35,6 @@ public class ClassCodegen {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void prepareAnonymousClasses(JetClassOrObject aClass) {
|
|
||||||
aClass.acceptChildren(new JetVisitor() {
|
|
||||||
@Override
|
|
||||||
public void visitJetElement(JetElement element) {
|
|
||||||
super.visitJetElement(element);
|
|
||||||
element.acceptChildren(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitObjectLiteralExpression(JetObjectLiteralExpression expression) {
|
|
||||||
state.getTypeMapper().classNameForAnonymousClass(expression.getObjectDeclaration());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateInterface(JetClassOrObject aClass) {
|
private void generateInterface(JetClassOrObject aClass) {
|
||||||
final ClassVisitor visitor = state.forClassInterface(state.getBindingContext().getClassDescriptor(aClass));
|
final ClassVisitor visitor = state.forClassInterface(state.getBindingContext().getClassDescriptor(aClass));
|
||||||
new InterfaceBodyCodegen(aClass, visitor, state).generate();
|
new InterfaceBodyCodegen(aClass, visitor, state).generate();
|
||||||
|
|||||||
@@ -116,4 +116,19 @@ public class GenerationState {
|
|||||||
final ClosureCodegen top = closureContexts.peek();
|
final ClosureCodegen top = closureContexts.peek();
|
||||||
return top != null ? top.lookupInContext(d) : null;
|
return top != null ? top.lookupInContext(d) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void prepareAnonymousClasses(JetElement aClass) {
|
||||||
|
aClass.acceptChildren(new JetVisitor() {
|
||||||
|
@Override
|
||||||
|
public void visitJetElement(JetElement element) {
|
||||||
|
super.visitJetElement(element);
|
||||||
|
element.acceptChildren(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitObjectLiteralExpression(JetObjectLiteralExpression expression) {
|
||||||
|
getTypeMapper().classNameForAnonymousClass(expression.getObjectDeclaration());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package org.jetbrains.jet.codegen;
|
|||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
|
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.types.JetStandardLibrary;
|
|
||||||
import org.objectweb.asm.ClassVisitor;
|
import org.objectweb.asm.ClassVisitor;
|
||||||
import org.objectweb.asm.MethodVisitor;
|
import org.objectweb.asm.MethodVisitor;
|
||||||
import org.objectweb.asm.Opcodes;
|
import org.objectweb.asm.Opcodes;
|
||||||
@@ -34,11 +33,12 @@ public class NamespaceCodegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void generate(JetNamespace namespace) {
|
public void generate(JetNamespace namespace) {
|
||||||
final JetStandardLibrary standardLibrary = JetStandardLibrary.getJetStandardLibrary(project);
|
|
||||||
final FunctionCodegen functionCodegen = new FunctionCodegen(namespace, v, state);
|
final FunctionCodegen functionCodegen = new FunctionCodegen(namespace, v, state);
|
||||||
final PropertyCodegen propertyCodegen = new PropertyCodegen(v, functionCodegen, state);
|
final PropertyCodegen propertyCodegen = new PropertyCodegen(v, functionCodegen, state);
|
||||||
final ClassCodegen classCodegen = state.forClass();
|
final ClassCodegen classCodegen = state.forClass();
|
||||||
|
|
||||||
|
state.prepareAnonymousClasses(namespace);
|
||||||
|
|
||||||
if (hasNonConstantPropertyInitializers(namespace)) {
|
if (hasNonConstantPropertyInitializers(namespace)) {
|
||||||
generateStaticInitializers(namespace);
|
generateStaticInitializers(namespace);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user