more di in jvm backend

This commit is contained in:
Stepan Koltsov
2012-05-21 19:20:32 +04:00
parent 99cc26866e
commit fdb2b98b0c
2 changed files with 19 additions and 6 deletions
@@ -21,6 +21,7 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import javax.inject.Inject;
import java.util.HashMap; import java.util.HashMap;
/** /**
@@ -28,17 +29,26 @@ import java.util.HashMap;
* @author alex.tkachman * @author alex.tkachman
*/ */
public class ClassCodegen { public class ClassCodegen {
private final GenerationState state; private GenerationState state;
private JetTypeMapper jetTypeMapper;
public ClassCodegen(GenerationState state) {
@Inject
public void setState(GenerationState state) {
this.state = state; this.state = state;
} }
@Inject
public void setJetTypeMapper(JetTypeMapper jetTypeMapper) {
this.jetTypeMapper = jetTypeMapper;
}
public void generate(CodegenContext context, JetClassOrObject aClass) { public void generate(CodegenContext context, JetClassOrObject aClass) {
ClassDescriptor descriptor = state.getBindingContext().get(BindingContext.CLASS, aClass); ClassDescriptor descriptor = state.getBindingContext().get(BindingContext.CLASS, aClass);
ClassBuilder classBuilder = state.forClassImplementation(descriptor); ClassBuilder classBuilder = state.forClassImplementation(descriptor);
final CodegenContext contextForInners = context.intoClass(descriptor, OwnerKind.IMPLEMENTATION, state.getInjector().getJetTypeMapper()); final CodegenContext contextForInners = context.intoClass(descriptor, OwnerKind.IMPLEMENTATION, jetTypeMapper);
if (state.getClassBuilderMode() == ClassBuilderMode.SIGNATURES) { if (state.getClassBuilderMode() == ClassBuilderMode.SIGNATURES) {
// Outer class implementation must happen prior inner classes so we get proper scoping tree in JetLightClass's delegate // Outer class implementation must happen prior inner classes so we get proper scoping tree in JetLightClass's delegate
@@ -63,13 +73,13 @@ public class ClassCodegen {
private void generateImplementation(CodegenContext context, JetClassOrObject aClass, OwnerKind kind, HashMap<DeclarationDescriptor, DeclarationDescriptor> accessors, ClassBuilder classBuilder) { private void generateImplementation(CodegenContext context, JetClassOrObject aClass, OwnerKind kind, HashMap<DeclarationDescriptor, DeclarationDescriptor> accessors, ClassBuilder classBuilder) {
ClassDescriptor descriptor = state.getBindingContext().get(BindingContext.CLASS, aClass); ClassDescriptor descriptor = state.getBindingContext().get(BindingContext.CLASS, aClass);
CodegenContext classContext = context.intoClass(descriptor, kind, state.getInjector().getJetTypeMapper()); CodegenContext classContext = context.intoClass(descriptor, kind, jetTypeMapper);
classContext.copyAccessors(accessors); classContext.copyAccessors(accessors);
new ImplementationBodyCodegen(aClass, classContext, classBuilder, state).generate(); new ImplementationBodyCodegen(aClass, classContext, classBuilder, state).generate();
if(aClass instanceof JetClass && ((JetClass)aClass).isTrait()) { if(aClass instanceof JetClass && ((JetClass)aClass).isTrait()) {
ClassBuilder traitBuilder = state.forTraitImplementation(descriptor); ClassBuilder traitBuilder = state.forTraitImplementation(descriptor);
new TraitImplBodyCodegen(aClass, context.intoClass(descriptor, OwnerKind.TRAIT_IMPL, state.getInjector().getJetTypeMapper()), traitBuilder, state).generate(); new TraitImplBodyCodegen(aClass, context.intoClass(descriptor, OwnerKind.TRAIT_IMPL, jetTypeMapper), traitBuilder, state).generate();
traitBuilder.done(); traitBuilder.done();
} }
} }
@@ -79,7 +79,7 @@ public class InjectorForJvmCodegen {
this.generationState = generationState; this.generationState = generationState;
this.classBuilderFactory = classBuilderFactory; this.classBuilderFactory = classBuilderFactory;
this.jetTypeMapper = new JetTypeMapper(); this.jetTypeMapper = new JetTypeMapper();
this.classCodegen = new ClassCodegen(getGenerationState()); this.classCodegen = new ClassCodegen();
this.intrinsics = new IntrinsicMethods(); this.intrinsics = new IntrinsicMethods();
this.classFileFactory = new ClassFileFactory(); this.classFileFactory = new ClassFileFactory();
this.closureAnnotator = new ClosureAnnotator(); this.closureAnnotator = new ClosureAnnotator();
@@ -90,6 +90,9 @@ public class InjectorForJvmCodegen {
this.jetTypeMapper.setCompilerSpecialMode(compilerSpecialMode); this.jetTypeMapper.setCompilerSpecialMode(compilerSpecialMode);
this.jetTypeMapper.setStandardLibrary(jetStandardLibrary); this.jetTypeMapper.setStandardLibrary(jetStandardLibrary);
this.classCodegen.setJetTypeMapper(jetTypeMapper);
this.classCodegen.setState(generationState);
this.intrinsics.setMyProject(project); this.intrinsics.setMyProject(project);
this.intrinsics.setMyStdLib(jetStandardLibrary); this.intrinsics.setMyStdLib(jetStandardLibrary);