diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java index 89eddf97855..ea431b29b9b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java @@ -16,7 +16,6 @@ package org.jetbrains.jet.codegen; -import com.intellij.psi.PsiElement; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.psi.*; @@ -148,7 +147,7 @@ public abstract class ClassBodyCodegen { private void generateStaticInitializer() { if (staticInitializerChunks.size() > 0) { final MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | Opcodes.ACC_STATIC,"", "()V", null, null); - if (v.generateCode() == ClassBuilder.Mode.FULL) { + if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); InstructionAdapter v = new InstructionAdapter(mv); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java index 4fda5422ef4..12b51fe7ef7 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java @@ -21,27 +21,24 @@ package org.jetbrains.jet.codegen; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.Nullable; -import org.objectweb.asm.*; +import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; public abstract class ClassBuilder { public static class Concrete extends ClassBuilder { private final ClassVisitor v; - private final boolean stubs; - public Concrete(ClassVisitor v, boolean stubs) { + public Concrete(ClassVisitor v) { this.v = v; - this.stubs = stubs; } @Override public ClassVisitor getVisitor() { return v; } - - @Override - public Mode generateCode() { - return stubs ? Mode.STUBS : Mode.FULL; - } } public FieldVisitor newField(@Nullable PsiElement origin, int access, @@ -88,15 +85,4 @@ public abstract class ClassBuilder { public void visitInnerClass(String name, String outerName, String innerName, int access) { getVisitor().visitInnerClass(name, outerName, innerName, access); } - - public enum Mode { - /** Full function bodies */ - FULL, - /** Only function signatures */ - SIGNATURES, - /** Function with stub bodies: just throw exception */ - STUBS, - } - - public abstract Mode generateCode(); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java index 06604f797ba..485c049037b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.codegen; +import org.jetbrains.annotations.NotNull; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.util.TraceClassVisitor; @@ -28,9 +29,15 @@ import java.io.StringWriter; public class ClassBuilderFactories { public static ClassBuilderFactory TEXT = new ClassBuilderFactory() { + @NotNull + @Override + public ClassBuilderMode getClassBuilderMode() { + return ClassBuilderMode.FULL; + } + @Override public ClassBuilder newClassBuilder() { - return new ClassBuilder.Concrete(new TraceClassVisitor(new PrintWriter(new StringWriter())), false); + return new ClassBuilder.Concrete(new TraceClassVisitor(new PrintWriter(new StringWriter()))); } @Override @@ -51,6 +58,12 @@ public class ClassBuilderFactories { public static ClassBuilderFactory binaries(final boolean stubs) { return new ClassBuilderFactory() { + @NotNull + @Override + public ClassBuilderMode getClassBuilderMode() { + return stubs ? ClassBuilderMode.STUBS : ClassBuilderMode.FULL; + } + @Override public ClassBuilder newClassBuilder() { return new ClassBuilder.Concrete(new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS){ @@ -64,7 +77,7 @@ public class ClassBuilderFactories { return "java/lang/Object"; } } - }, stubs); + }); } @Override diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java index e46d50c4fe2..9806778934b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.codegen; +import org.jetbrains.annotations.NotNull; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.util.TraceClassVisitor; @@ -26,6 +27,8 @@ import java.io.StringWriter; * @author max */ public interface ClassBuilderFactory { + @NotNull + ClassBuilderMode getClassBuilderMode(); ClassBuilder newClassBuilder(); String asText(ClassBuilder builder); byte[] asBytes(ClassBuilder builder); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderMode.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderMode.java new file mode 100644 index 00000000000..096391c2be8 --- /dev/null +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderMode.java @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.codegen; + +/** +* @author Stepan Koltsov +*/ +public enum ClassBuilderMode { + /** Full function bodies */ + FULL, + /** Only function signatures */ + SIGNATURES, + /** Function with stub bodies: just throw exception */ + STUBS, +} diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java index f596669dff8..a585ef6b737 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java @@ -40,7 +40,7 @@ public class ClassCodegen { final CodegenContext contextForInners = context.intoClass(descriptor, OwnerKind.IMPLEMENTATION, state.getInjector().getJetTypeMapper()); - if (classBuilder.generateCode() == ClassBuilder.Mode.SIGNATURES) { + if (state.getClassBuilderMode() == ClassBuilderMode.SIGNATURES) { // Outer class implementation must happen prior inner classes so we get proper scoping tree in JetLightClass's delegate generateImplementation(context, aClass, OwnerKind.IMPLEMENTATION, contextForInners.accessors, classBuilder); } @@ -54,7 +54,7 @@ public class ClassCodegen { } } - if (classBuilder.generateCode() != ClassBuilder.Mode.SIGNATURES) { + if (state.getClassBuilderMode() != ClassBuilderMode.SIGNATURES) { generateImplementation(context, aClass, OwnerKind.IMPLEMENTATION, contextForInners.accessors, classBuilder); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 8f4c2bdd3f3..46fa697d5cb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -170,10 +170,10 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { cv.newField(fun, ACC_PRIVATE | ACC_STATIC | ACC_FINAL, "$instance", classDescr, null, null); MethodVisitor mv = cv.newMethod(fun, ACC_PUBLIC | ACC_STATIC, "$getInstance", "()" + classDescr, null, new String[0]); - if (cv.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - else if (cv.generateCode() == ClassBuilder.Mode.FULL) { + else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); mv.visitFieldInsn(GETSTATIC, name, "$instance", classDescr); mv.visitInsn(DUP); @@ -211,10 +211,10 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { return; final MethodVisitor mv = cv.newMethod(fun, ACC_PUBLIC, "invoke", bridge.getAsmMethod().getDescriptor(), null, new String[0]); - if (cv.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - if (cv.generateCode() == ClassBuilder.Mode.FULL) { + if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); InstructionAdapter iv = new InstructionAdapter(mv); @@ -296,10 +296,10 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { final Method constructor = new Method("", Type.VOID_TYPE, argTypes); final MethodVisitor mv = cv.newMethod(fun, ACC_PUBLIC, "", constructor.getDescriptor(), null, new String[0]); - if (cv.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - else if (cv.generateCode() == ClassBuilder.Mode.FULL) { + else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); InstructionAdapter iv = new InstructionAdapter(mv); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 7238ed6bbb3..0a828995516 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -124,7 +124,7 @@ public class FunctionCodegen { final MethodVisitor mv = v.newMethod(fun, flags, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(), jvmSignature.getGenericsSignature(), null); AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(functionDescriptor); - if(v.generateCode() != ClassBuilder.Mode.SIGNATURES) { + if(state.getClassBuilderMode() != ClassBuilderMode.SIGNATURES) { int start = 0; if (needJetAnnotations) { if (functionDescriptor instanceof PropertyAccessorDescriptor) { @@ -169,12 +169,12 @@ public class FunctionCodegen { } } - if (!isAbstract && v.generateCode() == ClassBuilder.Mode.STUBS) { + if (!isAbstract && state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - if (!isAbstract && v.generateCode() == ClassBuilder.Mode.FULL) { + if (!isAbstract && state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); Label methodBegin = new Label(); @@ -345,10 +345,10 @@ public class FunctionCodegen { descriptor = descriptor.replace("(","(L" + ownerInternalName + ";"); final MethodVisitor mv = v.newMethod(null, flags | (isConstructor ? 0 : ACC_STATIC), isConstructor ? "" : jvmSignature.getName() + JvmAbi.DEFAULT_PARAMS_IMPL_SUFFIX, descriptor, null, null); InstructionAdapter iv = new InstructionAdapter(mv); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - else if (v.generateCode() == ClassBuilder.Mode.FULL) { + else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); FrameMap frameMap = owner.prepareFrame(state.getInjector().getJetTypeMapper()); @@ -474,10 +474,10 @@ public class FunctionCodegen { int flags = ACC_PUBLIC | ACC_BRIDGE; // TODO. final MethodVisitor mv = v.newMethod(null, flags, jvmSignature.getName(), overriden.getDescriptor(), null, null); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - else if (v.generateCode() == ClassBuilder.Mode.FULL) { + else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); Type[] argTypes = overriden.getArgumentTypes(); @@ -515,10 +515,10 @@ public class FunctionCodegen { int flags = ACC_PUBLIC | ACC_SYNTHETIC; // TODO. final MethodVisitor mv = v.newMethod(null, flags, method.getName(), method.getDescriptor(), null, null); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - else if (v.generateCode() == ClassBuilder.Mode.FULL) { + else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); Type[] argTypes = method.getArgumentTypes(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java index fd583a67fee..33bb005af93 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java @@ -49,6 +49,8 @@ public class GenerationState { private final List files; @NotNull private final InjectorForJvmCodegen injector; + @NotNull + private final ClassBuilderMode classBuilderMode; public GenerationState(Project project, ClassBuilderFactory builderFactory, AnalyzeExhaust analyzeExhaust, List files) { @@ -61,9 +63,10 @@ public class GenerationState { this.progress = progress; this.analyzeExhaust = exhaust; this.files = files; + this.classBuilderMode = builderFactory.getClassBuilderMode(); this.injector = new InjectorForJvmCodegen( analyzeExhaust.getStandardLibrary(), analyzeExhaust.getBindingContext(), - this.files, project, compilerSpecialMode, this, builderFactory); + this.files, project, compilerSpecialMode, builderFactory.getClassBuilderMode(), this, builderFactory); } @NotNull @@ -83,6 +86,11 @@ public class GenerationState { return analyzeExhaust.getBindingContext(); } + @NotNull + public ClassBuilderMode getClassBuilderMode() { + return classBuilderMode; + } + public ClassCodegen forClass() { return new ClassCodegen(this); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 71719b9a217..7a7b2cd023d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -296,10 +296,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { Type[] argTypes = method.getArgumentTypes(); MethodVisitor mv = v.newMethod(null, ACC_PUBLIC| ACC_BRIDGE| ACC_FINAL, bridge.getName(), method.getDescriptor(), null, null); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - else if (v.generateCode() == ClassBuilder.Mode.FULL) { + else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); InstructionAdapter iv = new InstructionAdapter(mv); @@ -327,10 +327,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { Method originalMethod = originalSignature.getJvmMethodSignature().getAsmMethod(); MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null); PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature.getPropertyTypeKotlinSignature(), originalSignature.getJvmMethodSignature().getKotlinTypeParameter()); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - else if (v.generateCode() == ClassBuilder.Mode.FULL) { + else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); InstructionAdapter iv = new InstructionAdapter(mv); @@ -353,10 +353,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { Method originalMethod = originalSignature2.getJvmMethodSignature().getAsmMethod(); MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null); PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature2.getPropertyTypeKotlinSignature(), originalSignature2.getJvmMethodSignature().getKotlinTypeParameter()); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - else if (v.generateCode() == ClassBuilder.Mode.FULL) { + else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); InstructionAdapter iv = new InstructionAdapter(mv); @@ -531,7 +531,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { int flags = ACC_PUBLIC; // TODO final MethodVisitor mv = v.newMethod(myClass, flags, constructorMethod.getName(), constructorMethod.getAsmMethod().getDescriptor(), constructorMethod.getGenericsSignature(), null); - if (v.generateCode() == ClassBuilder.Mode.SIGNATURES) return; + if (state.getClassBuilderMode() == ClassBuilderMode.SIGNATURES) return; AnnotationVisitor jetConstructorVisitor = mv.visitAnnotation(JvmStdlibNames.JET_CONSTRUCTOR.getDescriptor(), true); if (constructorDescriptor == null) { @@ -558,7 +558,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } } - if (v.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); return; } @@ -733,10 +733,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { Method functionOriginal = typeMapper.mapSignature(fun.getName(), fun.getOriginal()).getAsmMethod(); final MethodVisitor mv = v.newMethod(myClass, flags, function.getName(), function.getDescriptor(), null, null); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - else if (v.generateCode() == ClassBuilder.Mode.FULL) { + else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); codegen.generateThisOrOuter(descriptor); @@ -872,10 +872,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { CallableMethod method = typeMapper.mapToCallableMethod(constructorDescriptor, kind, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration())); int flags = ACC_PUBLIC; // TODO final MethodVisitor mv = v.newMethod(constructor, flags, "", method.getSignature().getAsmMethod().getDescriptor(), null, null); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); } - else if (v.generateCode() == ClassBuilder.Mode.FULL) { + else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); ConstructorFrameMap frameMap = new ConstructorFrameMap(method, constructorDescriptor, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration())); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 3508bb9eb03..c19b4e25aa9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -65,6 +65,7 @@ public class JetTypeMapper { public BindingContext bindingContext; private ClosureAnnotator closureAnnotator; private CompilerSpecialMode compilerSpecialMode; + private ClassBuilderMode classBuilderMode; @Inject @@ -87,6 +88,11 @@ public class JetTypeMapper { this.compilerSpecialMode = compilerSpecialMode; } + @Inject + public void setClassBuilderMode(ClassBuilderMode classBuilderMode) { + this.classBuilderMode = classBuilderMode; + } + @PostConstruct public void init() { initKnownTypes(); @@ -335,6 +341,9 @@ public class JetTypeMapper { DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor(); if (ErrorUtils.isError(descriptor)) { + if (classBuilderMode != ClassBuilderMode.SIGNATURES) { + throw new IllegalStateException("error types are not allowed when classBuilderMode = " + classBuilderMode); + } Type asmType = Type.getObjectType("error/NonExistentClass"); if (signatureVisitor != null) { visitAsmType(signatureVisitor, asmType, true); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java index ca2fe73e250..2a3338c7510 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java @@ -92,7 +92,7 @@ public class NamespaceCodegen { private void generateStaticInitializers(JetFile namespace) { MethodVisitor mv = v.newMethod(namespace, ACC_PUBLIC | ACC_STATIC, "", "()V", null, null); - if (v.generateCode() == ClassBuilder.Mode.FULL) { + if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); FrameMap frameMap = new FrameMap(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index f8070e10c35..d9d4e9f9373 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -182,10 +182,10 @@ public class PropertyCodegen { AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(propertyDescriptor.getGetter()); } - if (v.generateCode() != ClassBuilder.Mode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) { + if (state.getClassBuilderMode() != ClassBuilderMode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) { if(propertyDescriptor.getModality() != Modality.ABSTRACT) { mv.visitCode(); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubThrow(mv); } else { @@ -266,10 +266,10 @@ public class PropertyCodegen { AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(propertyDescriptor.getSetter()); } - if (v.generateCode() != ClassBuilder.Mode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) { + if (state.getClassBuilderMode() != ClassBuilderMode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) { if(propertyDescriptor.getModality() != Modality.ABSTRACT) { mv.visitCode(); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubThrow(mv); } else { diff --git a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java index ddbaad7230d..30a4db600be 100644 --- a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java @@ -23,6 +23,7 @@ import java.util.List; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.codegen.JetTypeMapper; import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; +import org.jetbrains.jet.codegen.ClassBuilderMode; import org.jetbrains.jet.codegen.ClosureAnnotator; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -42,9 +43,11 @@ public class InjectorForJetTypeMapper { ) { this.jetTypeMapper = new JetTypeMapper(); CompilerSpecialMode compilerSpecialMode = CompilerSpecialMode.REGULAR; + ClassBuilderMode classBuilderMode = ClassBuilderMode.FULL; ClosureAnnotator closureAnnotator = new ClosureAnnotator(); this.jetTypeMapper.setBindingContext(bindingContext); + this.jetTypeMapper.setClassBuilderMode(classBuilderMode); this.jetTypeMapper.setClosureAnnotator(closureAnnotator); this.jetTypeMapper.setCompilerSpecialMode(compilerSpecialMode); this.jetTypeMapper.setStandardLibrary(jetStandardLibrary); diff --git a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java index 626c27bbf54..e54bef57e52 100644 --- a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java @@ -23,6 +23,7 @@ import java.util.List; import org.jetbrains.jet.lang.psi.JetFile; import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; +import org.jetbrains.jet.codegen.ClassBuilderMode; import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.codegen.ClassBuilderFactory; import org.jetbrains.jet.codegen.JetTypeMapper; @@ -35,6 +36,7 @@ import java.util.List; import org.jetbrains.jet.lang.psi.JetFile; import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; +import org.jetbrains.jet.codegen.ClassBuilderMode; import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.codegen.ClassBuilderFactory; import org.jetbrains.annotations.NotNull; @@ -54,6 +56,7 @@ public class InjectorForJvmCodegen { @NotNull List listOfJetFile, @NotNull Project project, @NotNull CompilerSpecialMode compilerSpecialMode, + @NotNull ClassBuilderMode classBuilderMode, @NotNull GenerationState generationState, @NotNull ClassBuilderFactory classBuilderFactory ) { @@ -65,6 +68,7 @@ public class InjectorForJvmCodegen { ClosureAnnotator closureAnnotator = new ClosureAnnotator(); this.jetTypeMapper.setBindingContext(bindingContext); + this.jetTypeMapper.setClassBuilderMode(classBuilderMode); this.jetTypeMapper.setClosureAnnotator(closureAnnotator); this.jetTypeMapper.setCompilerSpecialMode(compilerSpecialMode); this.jetTypeMapper.setStandardLibrary(jetStandardLibrary); diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java index 0108405be00..ba04aeacfba 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java @@ -44,6 +44,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.codegen.ClassBuilder; import org.jetbrains.jet.codegen.ClassBuilderFactory; +import org.jetbrains.jet.codegen.ClassBuilderMode; import org.jetbrains.jet.codegen.CompilationErrorHandler; import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.lang.psi.JetFile; @@ -141,6 +142,12 @@ public class JetLightClass extends AbstractLightClass implements JetJavaMirrorMa final Stack stubStack = new Stack(); final ClassBuilderFactory builderFactory = new ClassBuilderFactory() { + @NotNull + @Override + public ClassBuilderMode getClassBuilderMode() { + return ClassBuilderMode.SIGNATURES; + } + @Override public ClassBuilder newClassBuilder() { return new StubClassBuilder(stubStack); diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/StubClassBuilder.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/StubClassBuilder.java index 3939934acdd..f9b40f80121 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/StubClassBuilder.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/StubClassBuilder.java @@ -107,9 +107,4 @@ public class StubClassBuilder extends ClassBuilder { } super.done(); } - - @Override - public Mode generateCode() { - return Mode.SIGNATURES; - } } diff --git a/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java b/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java index ccf3d1e2420..4ab6505c257 100644 --- a/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java +++ b/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.di; import com.intellij.openapi.project.Project; import org.jetbrains.jet.codegen.ClassBuilderFactory; +import org.jetbrains.jet.codegen.ClassBuilderMode; import org.jetbrains.jet.codegen.ClassFileFactory; import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.codegen.JetTypeMapper; @@ -149,6 +150,7 @@ public class AllInjectorsGenerator { generator.addParameter(DiType.listOf(JetFile.class)); generator.addParameter(Project.class); generator.addParameter(CompilerSpecialMode.class); + generator.addParameter(ClassBuilderMode.class); generator.addPublicParameter(GenerationState.class); generator.addParameter(ClassBuilderFactory.class); generator.addPublicField(JetTypeMapper.class); @@ -164,6 +166,7 @@ public class AllInjectorsGenerator { generator.addParameter(DiType.listOf(JetFile.class)); generator.addPublicField(JetTypeMapper.class); generator.addField(CompilerSpecialMode.REGULAR); + generator.addField(ClassBuilderMode.FULL); generator.generate("compiler/backend/src", "org.jetbrains.jet.di", "InjectorForJetTypeMapper"); }