提交 216cbf7d 编写于 作者: S Stepan Koltsov

assert error/NonExistentClass is only generated when mode = SIGNATURES

move classBuilderMode to injector and GenerationState from ClassBuilder
上级 4953be7f
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
package org.jetbrains.jet.codegen; package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
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.*;
...@@ -148,7 +147,7 @@ public abstract class ClassBodyCodegen { ...@@ -148,7 +147,7 @@ public abstract class ClassBodyCodegen {
private void generateStaticInitializer() { private void generateStaticInitializer() {
if (staticInitializerChunks.size() > 0) { if (staticInitializerChunks.size() > 0) {
final MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | Opcodes.ACC_STATIC,"<clinit>", "()V", null, null); final MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | Opcodes.ACC_STATIC,"<clinit>", "()V", null, null);
if (v.generateCode() == ClassBuilder.Mode.FULL) { if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
InstructionAdapter v = new InstructionAdapter(mv); InstructionAdapter v = new InstructionAdapter(mv);
......
...@@ -21,27 +21,24 @@ package org.jetbrains.jet.codegen; ...@@ -21,27 +21,24 @@ package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.Nullable; 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 abstract class ClassBuilder {
public static class Concrete extends ClassBuilder { public static class Concrete extends ClassBuilder {
private final ClassVisitor v; private final ClassVisitor v;
private final boolean stubs;
public Concrete(ClassVisitor v, boolean stubs) { public Concrete(ClassVisitor v) {
this.v = v; this.v = v;
this.stubs = stubs;
} }
@Override @Override
public ClassVisitor getVisitor() { public ClassVisitor getVisitor() {
return v; return v;
} }
@Override
public Mode generateCode() {
return stubs ? Mode.STUBS : Mode.FULL;
}
} }
public FieldVisitor newField(@Nullable PsiElement origin, public FieldVisitor newField(@Nullable PsiElement origin,
int access, int access,
...@@ -88,15 +85,4 @@ public abstract class ClassBuilder { ...@@ -88,15 +85,4 @@ public abstract class ClassBuilder {
public void visitInnerClass(String name, String outerName, String innerName, int access) { public void visitInnerClass(String name, String outerName, String innerName, int access) {
getVisitor().visitInnerClass(name, outerName, innerName, 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();
} }
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package org.jetbrains.jet.codegen; package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
import org.objectweb.asm.ClassWriter; import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.util.TraceClassVisitor; import org.objectweb.asm.util.TraceClassVisitor;
...@@ -28,9 +29,15 @@ import java.io.StringWriter; ...@@ -28,9 +29,15 @@ import java.io.StringWriter;
public class ClassBuilderFactories { public class ClassBuilderFactories {
public static ClassBuilderFactory TEXT = new ClassBuilderFactory() { public static ClassBuilderFactory TEXT = new ClassBuilderFactory() {
@NotNull
@Override
public ClassBuilderMode getClassBuilderMode() {
return ClassBuilderMode.FULL;
}
@Override @Override
public ClassBuilder newClassBuilder() { 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 @Override
...@@ -51,6 +58,12 @@ public class ClassBuilderFactories { ...@@ -51,6 +58,12 @@ public class ClassBuilderFactories {
public static ClassBuilderFactory binaries(final boolean stubs) { public static ClassBuilderFactory binaries(final boolean stubs) {
return new ClassBuilderFactory() { return new ClassBuilderFactory() {
@NotNull
@Override
public ClassBuilderMode getClassBuilderMode() {
return stubs ? ClassBuilderMode.STUBS : ClassBuilderMode.FULL;
}
@Override @Override
public ClassBuilder newClassBuilder() { public ClassBuilder newClassBuilder() {
return new ClassBuilder.Concrete(new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS){ return new ClassBuilder.Concrete(new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS){
...@@ -64,7 +77,7 @@ public class ClassBuilderFactories { ...@@ -64,7 +77,7 @@ public class ClassBuilderFactories {
return "java/lang/Object"; return "java/lang/Object";
} }
} }
}, stubs); });
} }
@Override @Override
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package org.jetbrains.jet.codegen; package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
import org.objectweb.asm.ClassWriter; import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.util.TraceClassVisitor; import org.objectweb.asm.util.TraceClassVisitor;
...@@ -26,6 +27,8 @@ import java.io.StringWriter; ...@@ -26,6 +27,8 @@ import java.io.StringWriter;
* @author max * @author max
*/ */
public interface ClassBuilderFactory { public interface ClassBuilderFactory {
@NotNull
ClassBuilderMode getClassBuilderMode();
ClassBuilder newClassBuilder(); ClassBuilder newClassBuilder();
String asText(ClassBuilder builder); String asText(ClassBuilder builder);
byte[] asBytes(ClassBuilder builder); byte[] asBytes(ClassBuilder builder);
......
/*
* 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,
}
...@@ -40,7 +40,7 @@ public class ClassCodegen { ...@@ -40,7 +40,7 @@ public class ClassCodegen {
final CodegenContext contextForInners = context.intoClass(descriptor, OwnerKind.IMPLEMENTATION, state.getInjector().getJetTypeMapper()); 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 // 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); generateImplementation(context, aClass, OwnerKind.IMPLEMENTATION, contextForInners.accessors, classBuilder);
} }
...@@ -54,7 +54,7 @@ public class ClassCodegen { ...@@ -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); generateImplementation(context, aClass, OwnerKind.IMPLEMENTATION, contextForInners.accessors, classBuilder);
} }
......
...@@ -170,10 +170,10 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { ...@@ -170,10 +170,10 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
cv.newField(fun, ACC_PRIVATE | ACC_STATIC | ACC_FINAL, "$instance", classDescr, null, null); 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]); 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); StubCodegen.generateStubCode(mv);
} }
else if (cv.generateCode() == ClassBuilder.Mode.FULL) { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
mv.visitFieldInsn(GETSTATIC, name, "$instance", classDescr); mv.visitFieldInsn(GETSTATIC, name, "$instance", classDescr);
mv.visitInsn(DUP); mv.visitInsn(DUP);
...@@ -211,10 +211,10 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { ...@@ -211,10 +211,10 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
return; return;
final MethodVisitor mv = cv.newMethod(fun, ACC_PUBLIC, "invoke", bridge.getAsmMethod().getDescriptor(), null, new String[0]); 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); StubCodegen.generateStubCode(mv);
} }
if (cv.generateCode() == ClassBuilder.Mode.FULL) { if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
...@@ -296,10 +296,10 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { ...@@ -296,10 +296,10 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
final Method constructor = new Method("<init>", Type.VOID_TYPE, argTypes); final Method constructor = new Method("<init>", Type.VOID_TYPE, argTypes);
final MethodVisitor mv = cv.newMethod(fun, ACC_PUBLIC, "<init>", constructor.getDescriptor(), null, new String[0]); final MethodVisitor mv = cv.newMethod(fun, ACC_PUBLIC, "<init>", constructor.getDescriptor(), null, new String[0]);
if (cv.generateCode() == ClassBuilder.Mode.STUBS) { if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv); StubCodegen.generateStubCode(mv);
} }
else if (cv.generateCode() == ClassBuilder.Mode.FULL) { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
......
...@@ -124,7 +124,7 @@ public class FunctionCodegen { ...@@ -124,7 +124,7 @@ public class FunctionCodegen {
final MethodVisitor mv = v.newMethod(fun, flags, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(), jvmSignature.getGenericsSignature(), null); final MethodVisitor mv = v.newMethod(fun, flags, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(), jvmSignature.getGenericsSignature(), null);
AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(functionDescriptor); AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(functionDescriptor);
if(v.generateCode() != ClassBuilder.Mode.SIGNATURES) { if(state.getClassBuilderMode() != ClassBuilderMode.SIGNATURES) {
int start = 0; int start = 0;
if (needJetAnnotations) { if (needJetAnnotations) {
if (functionDescriptor instanceof PropertyAccessorDescriptor) { if (functionDescriptor instanceof PropertyAccessorDescriptor) {
...@@ -169,12 +169,12 @@ public class FunctionCodegen { ...@@ -169,12 +169,12 @@ public class FunctionCodegen {
} }
} }
if (!isAbstract && v.generateCode() == ClassBuilder.Mode.STUBS) { if (!isAbstract && state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv); StubCodegen.generateStubCode(mv);
} }
if (!isAbstract && v.generateCode() == ClassBuilder.Mode.FULL) { if (!isAbstract && state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
Label methodBegin = new Label(); Label methodBegin = new Label();
...@@ -345,10 +345,10 @@ public class FunctionCodegen { ...@@ -345,10 +345,10 @@ public class FunctionCodegen {
descriptor = descriptor.replace("(","(L" + ownerInternalName + ";"); descriptor = descriptor.replace("(","(L" + ownerInternalName + ";");
final MethodVisitor mv = v.newMethod(null, flags | (isConstructor ? 0 : ACC_STATIC), isConstructor ? "<init>" : jvmSignature.getName() + JvmAbi.DEFAULT_PARAMS_IMPL_SUFFIX, descriptor, null, null); final MethodVisitor mv = v.newMethod(null, flags | (isConstructor ? 0 : ACC_STATIC), isConstructor ? "<init>" : jvmSignature.getName() + JvmAbi.DEFAULT_PARAMS_IMPL_SUFFIX, descriptor, null, null);
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
if (v.generateCode() == ClassBuilder.Mode.STUBS) { if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv); StubCodegen.generateStubCode(mv);
} }
else if (v.generateCode() == ClassBuilder.Mode.FULL) { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
FrameMap frameMap = owner.prepareFrame(state.getInjector().getJetTypeMapper()); FrameMap frameMap = owner.prepareFrame(state.getInjector().getJetTypeMapper());
...@@ -474,10 +474,10 @@ public class FunctionCodegen { ...@@ -474,10 +474,10 @@ public class FunctionCodegen {
int flags = ACC_PUBLIC | ACC_BRIDGE; // TODO. int flags = ACC_PUBLIC | ACC_BRIDGE; // TODO.
final MethodVisitor mv = v.newMethod(null, flags, jvmSignature.getName(), overriden.getDescriptor(), null, null); 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); StubCodegen.generateStubCode(mv);
} }
else if (v.generateCode() == ClassBuilder.Mode.FULL) { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
Type[] argTypes = overriden.getArgumentTypes(); Type[] argTypes = overriden.getArgumentTypes();
...@@ -515,10 +515,10 @@ public class FunctionCodegen { ...@@ -515,10 +515,10 @@ public class FunctionCodegen {
int flags = ACC_PUBLIC | ACC_SYNTHETIC; // TODO. int flags = ACC_PUBLIC | ACC_SYNTHETIC; // TODO.
final MethodVisitor mv = v.newMethod(null, flags, method.getName(), method.getDescriptor(), null, null); 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); StubCodegen.generateStubCode(mv);
} }
else if (v.generateCode() == ClassBuilder.Mode.FULL) { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
Type[] argTypes = method.getArgumentTypes(); Type[] argTypes = method.getArgumentTypes();
......
...@@ -49,6 +49,8 @@ public class GenerationState { ...@@ -49,6 +49,8 @@ public class GenerationState {
private final List<JetFile> files; private final List<JetFile> files;
@NotNull @NotNull
private final InjectorForJvmCodegen injector; private final InjectorForJvmCodegen injector;
@NotNull
private final ClassBuilderMode classBuilderMode;
public GenerationState(Project project, ClassBuilderFactory builderFactory, AnalyzeExhaust analyzeExhaust, List<JetFile> files) { public GenerationState(Project project, ClassBuilderFactory builderFactory, AnalyzeExhaust analyzeExhaust, List<JetFile> files) {
...@@ -61,9 +63,10 @@ public class GenerationState { ...@@ -61,9 +63,10 @@ public class GenerationState {
this.progress = progress; this.progress = progress;
this.analyzeExhaust = exhaust; this.analyzeExhaust = exhaust;
this.files = files; this.files = files;
this.classBuilderMode = builderFactory.getClassBuilderMode();
this.injector = new InjectorForJvmCodegen( this.injector = new InjectorForJvmCodegen(
analyzeExhaust.getStandardLibrary(), analyzeExhaust.getBindingContext(), analyzeExhaust.getStandardLibrary(), analyzeExhaust.getBindingContext(),
this.files, project, compilerSpecialMode, this, builderFactory); this.files, project, compilerSpecialMode, builderFactory.getClassBuilderMode(), this, builderFactory);
} }
@NotNull @NotNull
...@@ -83,6 +86,11 @@ public class GenerationState { ...@@ -83,6 +86,11 @@ public class GenerationState {
return analyzeExhaust.getBindingContext(); return analyzeExhaust.getBindingContext();
} }
@NotNull
public ClassBuilderMode getClassBuilderMode() {
return classBuilderMode;
}
public ClassCodegen forClass() { public ClassCodegen forClass() {
return new ClassCodegen(this); return new ClassCodegen(this);
} }
......
...@@ -296,10 +296,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ...@@ -296,10 +296,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
Type[] argTypes = method.getArgumentTypes(); Type[] argTypes = method.getArgumentTypes();
MethodVisitor mv = v.newMethod(null, ACC_PUBLIC| ACC_BRIDGE| ACC_FINAL, bridge.getName(), method.getDescriptor(), null, null); 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); StubCodegen.generateStubCode(mv);
} }
else if (v.generateCode() == ClassBuilder.Mode.FULL) { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
...@@ -327,10 +327,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ...@@ -327,10 +327,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
Method originalMethod = originalSignature.getJvmMethodSignature().getAsmMethod(); Method originalMethod = originalSignature.getJvmMethodSignature().getAsmMethod();
MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null); 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()); PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature.getPropertyTypeKotlinSignature(), originalSignature.getJvmMethodSignature().getKotlinTypeParameter());
if (v.generateCode() == ClassBuilder.Mode.STUBS) { if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv); StubCodegen.generateStubCode(mv);
} }
else if (v.generateCode() == ClassBuilder.Mode.FULL) { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
...@@ -353,10 +353,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ...@@ -353,10 +353,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
Method originalMethod = originalSignature2.getJvmMethodSignature().getAsmMethod(); Method originalMethod = originalSignature2.getJvmMethodSignature().getAsmMethod();
MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null); 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()); PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature2.getPropertyTypeKotlinSignature(), originalSignature2.getJvmMethodSignature().getKotlinTypeParameter());
if (v.generateCode() == ClassBuilder.Mode.STUBS) { if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv); StubCodegen.generateStubCode(mv);
} }
else if (v.generateCode() == ClassBuilder.Mode.FULL) { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
...@@ -531,7 +531,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ...@@ -531,7 +531,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
int flags = ACC_PUBLIC; // TODO int flags = ACC_PUBLIC; // TODO
final MethodVisitor mv = v.newMethod(myClass, flags, constructorMethod.getName(), constructorMethod.getAsmMethod().getDescriptor(), constructorMethod.getGenericsSignature(), null); 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); AnnotationVisitor jetConstructorVisitor = mv.visitAnnotation(JvmStdlibNames.JET_CONSTRUCTOR.getDescriptor(), true);
if (constructorDescriptor == null) { if (constructorDescriptor == null) {
...@@ -558,7 +558,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ...@@ -558,7 +558,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
} }
} }
if (v.generateCode() == ClassBuilder.Mode.STUBS) { if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv); StubCodegen.generateStubCode(mv);
return; return;
} }
...@@ -733,10 +733,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ...@@ -733,10 +733,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
Method functionOriginal = typeMapper.mapSignature(fun.getName(), fun.getOriginal()).getAsmMethod(); Method functionOriginal = typeMapper.mapSignature(fun.getName(), fun.getOriginal()).getAsmMethod();
final MethodVisitor mv = v.newMethod(myClass, flags, function.getName(), function.getDescriptor(), null, null); 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); StubCodegen.generateStubCode(mv);
} }
else if (v.generateCode() == ClassBuilder.Mode.FULL) { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
codegen.generateThisOrOuter(descriptor); codegen.generateThisOrOuter(descriptor);
...@@ -872,10 +872,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ...@@ -872,10 +872,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
CallableMethod method = typeMapper.mapToCallableMethod(constructorDescriptor, kind, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration())); CallableMethod method = typeMapper.mapToCallableMethod(constructorDescriptor, kind, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration()));
int flags = ACC_PUBLIC; // TODO int flags = ACC_PUBLIC; // TODO
final MethodVisitor mv = v.newMethod(constructor, flags, "<init>", method.getSignature().getAsmMethod().getDescriptor(), null, null); final MethodVisitor mv = v.newMethod(constructor, flags, "<init>", method.getSignature().getAsmMethod().getDescriptor(), null, null);
if (v.generateCode() == ClassBuilder.Mode.STUBS) { if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv); StubCodegen.generateStubCode(mv);
} }
else if (v.generateCode() == ClassBuilder.Mode.FULL) { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
ConstructorFrameMap frameMap = new ConstructorFrameMap(method, constructorDescriptor, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration())); ConstructorFrameMap frameMap = new ConstructorFrameMap(method, constructorDescriptor, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration()));
......
...@@ -65,6 +65,7 @@ public class JetTypeMapper { ...@@ -65,6 +65,7 @@ public class JetTypeMapper {
public BindingContext bindingContext; public BindingContext bindingContext;
private ClosureAnnotator closureAnnotator; private ClosureAnnotator closureAnnotator;
private CompilerSpecialMode compilerSpecialMode; private CompilerSpecialMode compilerSpecialMode;
private ClassBuilderMode classBuilderMode;
@Inject @Inject
...@@ -87,6 +88,11 @@ public class JetTypeMapper { ...@@ -87,6 +88,11 @@ public class JetTypeMapper {
this.compilerSpecialMode = compilerSpecialMode; this.compilerSpecialMode = compilerSpecialMode;
} }
@Inject
public void setClassBuilderMode(ClassBuilderMode classBuilderMode) {
this.classBuilderMode = classBuilderMode;
}
@PostConstruct @PostConstruct
public void init() { public void init() {
initKnownTypes(); initKnownTypes();
...@@ -335,6 +341,9 @@ public class JetTypeMapper { ...@@ -335,6 +341,9 @@ public class JetTypeMapper {
DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor(); DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor();
if (ErrorUtils.isError(descriptor)) { 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"); Type asmType = Type.getObjectType("error/NonExistentClass");
if (signatureVisitor != null) { if (signatureVisitor != null) {
visitAsmType(signatureVisitor, asmType, true); visitAsmType(signatureVisitor, asmType, true);
......
...@@ -92,7 +92,7 @@ public class NamespaceCodegen { ...@@ -92,7 +92,7 @@ public class NamespaceCodegen {
private void generateStaticInitializers(JetFile namespace) { private void generateStaticInitializers(JetFile namespace) {
MethodVisitor mv = v.newMethod(namespace, ACC_PUBLIC | ACC_STATIC, "<clinit>", "()V", null, null); MethodVisitor mv = v.newMethod(namespace, ACC_PUBLIC | ACC_STATIC, "<clinit>", "()V", null, null);
if (v.generateCode() == ClassBuilder.Mode.FULL) { if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
FrameMap frameMap = new FrameMap(); FrameMap frameMap = new FrameMap();
......
...@@ -182,10 +182,10 @@ public class PropertyCodegen { ...@@ -182,10 +182,10 @@ public class PropertyCodegen {
AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(propertyDescriptor.getGetter()); 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) { if(propertyDescriptor.getModality() != Modality.ABSTRACT) {
mv.visitCode(); mv.visitCode();
if (v.generateCode() == ClassBuilder.Mode.STUBS) { if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubThrow(mv); StubCodegen.generateStubThrow(mv);
} }
else { else {
...@@ -266,10 +266,10 @@ public class PropertyCodegen { ...@@ -266,10 +266,10 @@ public class PropertyCodegen {
AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(propertyDescriptor.getSetter()); 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) { if(propertyDescriptor.getModality() != Modality.ABSTRACT) {
mv.visitCode(); mv.visitCode();
if (v.generateCode() == ClassBuilder.Mode.STUBS) { if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubThrow(mv); StubCodegen.generateStubThrow(mv);
} }
else { else {
......
...@@ -23,6 +23,7 @@ import java.util.List; ...@@ -23,6 +23,7 @@ import java.util.List;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.codegen.JetTypeMapper; import org.jetbrains.jet.codegen.JetTypeMapper;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import org.jetbrains.jet.codegen.ClassBuilderMode;
import org.jetbrains.jet.codegen.ClosureAnnotator; import org.jetbrains.jet.codegen.ClosureAnnotator;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
...@@ -42,9 +43,11 @@ public class InjectorForJetTypeMapper { ...@@ -42,9 +43,11 @@ public class InjectorForJetTypeMapper {
) { ) {
this.jetTypeMapper = new JetTypeMapper(); this.jetTypeMapper = new JetTypeMapper();
CompilerSpecialMode compilerSpecialMode = CompilerSpecialMode.REGULAR; CompilerSpecialMode compilerSpecialMode = CompilerSpecialMode.REGULAR;
ClassBuilderMode classBuilderMode = ClassBuilderMode.FULL;
ClosureAnnotator closureAnnotator = new ClosureAnnotator(); ClosureAnnotator closureAnnotator = new ClosureAnnotator();
this.jetTypeMapper.setBindingContext(bindingContext); this.jetTypeMapper.setBindingContext(bindingContext);
this.jetTypeMapper.setClassBuilderMode(classBuilderMode);
this.jetTypeMapper.setClosureAnnotator(closureAnnotator); this.jetTypeMapper.setClosureAnnotator(closureAnnotator);
this.jetTypeMapper.setCompilerSpecialMode(compilerSpecialMode); this.jetTypeMapper.setCompilerSpecialMode(compilerSpecialMode);
this.jetTypeMapper.setStandardLibrary(jetStandardLibrary); this.jetTypeMapper.setStandardLibrary(jetStandardLibrary);
......
...@@ -23,6 +23,7 @@ import java.util.List; ...@@ -23,6 +23,7 @@ import java.util.List;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; 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.GenerationState;
import org.jetbrains.jet.codegen.ClassBuilderFactory; import org.jetbrains.jet.codegen.ClassBuilderFactory;
import org.jetbrains.jet.codegen.JetTypeMapper; import org.jetbrains.jet.codegen.JetTypeMapper;
...@@ -35,6 +36,7 @@ import java.util.List; ...@@ -35,6 +36,7 @@ import java.util.List;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; 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.GenerationState;
import org.jetbrains.jet.codegen.ClassBuilderFactory; import org.jetbrains.jet.codegen.ClassBuilderFactory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
...@@ -54,6 +56,7 @@ public class InjectorForJvmCodegen { ...@@ -54,6 +56,7 @@ public class InjectorForJvmCodegen {
@NotNull List<JetFile> listOfJetFile, @NotNull List<JetFile> listOfJetFile,
@NotNull Project project, @NotNull Project project,
@NotNull CompilerSpecialMode compilerSpecialMode, @NotNull CompilerSpecialMode compilerSpecialMode,
@NotNull ClassBuilderMode classBuilderMode,
@NotNull GenerationState generationState, @NotNull GenerationState generationState,
@NotNull ClassBuilderFactory classBuilderFactory @NotNull ClassBuilderFactory classBuilderFactory
) { ) {
...@@ -65,6 +68,7 @@ public class InjectorForJvmCodegen { ...@@ -65,6 +68,7 @@ public class InjectorForJvmCodegen {
ClosureAnnotator closureAnnotator = new ClosureAnnotator(); ClosureAnnotator closureAnnotator = new ClosureAnnotator();
this.jetTypeMapper.setBindingContext(bindingContext); this.jetTypeMapper.setBindingContext(bindingContext);
this.jetTypeMapper.setClassBuilderMode(classBuilderMode);
this.jetTypeMapper.setClosureAnnotator(closureAnnotator); this.jetTypeMapper.setClosureAnnotator(closureAnnotator);
this.jetTypeMapper.setCompilerSpecialMode(compilerSpecialMode); this.jetTypeMapper.setCompilerSpecialMode(compilerSpecialMode);
this.jetTypeMapper.setStandardLibrary(jetStandardLibrary); this.jetTypeMapper.setStandardLibrary(jetStandardLibrary);
......
...@@ -44,6 +44,7 @@ import org.jetbrains.annotations.NotNull; ...@@ -44,6 +44,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.analyzer.AnalyzeExhaust;
import org.jetbrains.jet.codegen.ClassBuilder; import org.jetbrains.jet.codegen.ClassBuilder;
import org.jetbrains.jet.codegen.ClassBuilderFactory; import org.jetbrains.jet.codegen.ClassBuilderFactory;
import org.jetbrains.jet.codegen.ClassBuilderMode;
import org.jetbrains.jet.codegen.CompilationErrorHandler; import org.jetbrains.jet.codegen.CompilationErrorHandler;
import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
...@@ -141,6 +142,12 @@ public class JetLightClass extends AbstractLightClass implements JetJavaMirrorMa ...@@ -141,6 +142,12 @@ public class JetLightClass extends AbstractLightClass implements JetJavaMirrorMa
final Stack<StubElement> stubStack = new Stack<StubElement>(); final Stack<StubElement> stubStack = new Stack<StubElement>();
final ClassBuilderFactory builderFactory = new ClassBuilderFactory() { final ClassBuilderFactory builderFactory = new ClassBuilderFactory() {
@NotNull
@Override
public ClassBuilderMode getClassBuilderMode() {
return ClassBuilderMode.SIGNATURES;
}
@Override @Override
public ClassBuilder newClassBuilder() { public ClassBuilder newClassBuilder() {
return new StubClassBuilder(stubStack); return new StubClassBuilder(stubStack);
......
...@@ -107,9 +107,4 @@ public class StubClassBuilder extends ClassBuilder { ...@@ -107,9 +107,4 @@ public class StubClassBuilder extends ClassBuilder {
} }
super.done(); super.done();
} }
@Override
public Mode generateCode() {
return Mode.SIGNATURES;
}
} }
...@@ -18,6 +18,7 @@ package org.jetbrains.jet.di; ...@@ -18,6 +18,7 @@ package org.jetbrains.jet.di;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import org.jetbrains.jet.codegen.ClassBuilderFactory; import org.jetbrains.jet.codegen.ClassBuilderFactory;
import org.jetbrains.jet.codegen.ClassBuilderMode;
import org.jetbrains.jet.codegen.ClassFileFactory; import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.codegen.JetTypeMapper; import org.jetbrains.jet.codegen.JetTypeMapper;
...@@ -149,6 +150,7 @@ public class AllInjectorsGenerator { ...@@ -149,6 +150,7 @@ public class AllInjectorsGenerator {
generator.addParameter(DiType.listOf(JetFile.class)); generator.addParameter(DiType.listOf(JetFile.class));
generator.addParameter(Project.class); generator.addParameter(Project.class);
generator.addParameter(CompilerSpecialMode.class); generator.addParameter(CompilerSpecialMode.class);
generator.addParameter(ClassBuilderMode.class);
generator.addPublicParameter(GenerationState.class); generator.addPublicParameter(GenerationState.class);
generator.addParameter(ClassBuilderFactory.class); generator.addParameter(ClassBuilderFactory.class);
generator.addPublicField(JetTypeMapper.class); generator.addPublicField(JetTypeMapper.class);
...@@ -164,6 +166,7 @@ public class AllInjectorsGenerator { ...@@ -164,6 +166,7 @@ public class AllInjectorsGenerator {
generator.addParameter(DiType.listOf(JetFile.class)); generator.addParameter(DiType.listOf(JetFile.class));
generator.addPublicField(JetTypeMapper.class); generator.addPublicField(JetTypeMapper.class);
generator.addField(CompilerSpecialMode.REGULAR); generator.addField(CompilerSpecialMode.REGULAR);
generator.addField(ClassBuilderMode.FULL);
generator.generate("compiler/backend/src", "org.jetbrains.jet.di", "InjectorForJetTypeMapper"); generator.generate("compiler/backend/src", "org.jetbrains.jet.di", "InjectorForJetTypeMapper");
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册