diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java index 7bc9c7e09bb..d7687db2a7a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java @@ -16,7 +16,9 @@ package org.jetbrains.jet.codegen; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.org.objectweb.asm.ClassWriter; import org.jetbrains.org.objectweb.asm.util.TraceClassVisitor; @@ -33,8 +35,9 @@ public class ClassBuilderFactories { return ClassBuilderMode.FULL; } + @NotNull @Override - public ClassBuilder newClassBuilder() { + public ClassBuilder newClassBuilder(PsiElement forElement, DeclarationDescriptor forDescriptor) { throw new IllegalStateException(); } @@ -57,8 +60,9 @@ public class ClassBuilderFactories { return ClassBuilderMode.FULL; } + @NotNull @Override - public ClassBuilder newClassBuilder() { + public ClassBuilder newClassBuilder(PsiElement forElement, DeclarationDescriptor forDescriptor) { return new TraceBuilder(new BinaryClassWriter()); } @@ -86,8 +90,9 @@ public class ClassBuilderFactories { return ClassBuilderMode.FULL; } + @NotNull @Override - public ClassBuilder newClassBuilder() { + public ClassBuilder newClassBuilder(PsiElement forElement, DeclarationDescriptor forDescriptor) { return new AbstractClassBuilder.Concrete(new BinaryClassWriter()); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java index 961ae5c6ad5..14887470f92 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java @@ -16,13 +16,17 @@ package org.jetbrains.jet.codegen; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; public interface ClassBuilderFactory { @NotNull ClassBuilderMode getClassBuilderMode(); - ClassBuilder newClassBuilder(); + @NotNull + ClassBuilder newClassBuilder(@Nullable PsiElement forElement, @Nullable DeclarationDescriptor forDescriptor); String asText(ClassBuilder builder); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java index 2d5dc3ac8b5..cd178b91c1b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.codegen; import com.google.common.collect.Lists; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; @@ -27,6 +28,7 @@ import org.jetbrains.annotations.TestOnly; import org.jetbrains.jet.OutputFile; import org.jetbrains.jet.OutputFileCollection; import org.jetbrains.jet.codegen.state.GenerationState; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.org.objectweb.asm.Type; @@ -48,16 +50,24 @@ public class ClassFileFactory implements OutputFileCollection { } @NotNull - public ClassBuilder newVisitor(@NotNull Type asmType, @NotNull PsiFile sourceFile) { - return newVisitor(asmType, Collections.singletonList(sourceFile)); + public ClassBuilder newVisitor( + @Nullable PsiElement forElement, + @Nullable DeclarationDescriptor forDescriptor, + @NotNull Type asmType, + @NotNull PsiFile sourceFile) { + return newVisitor(forElement == null ? sourceFile : forElement, forDescriptor, asmType, Collections.singletonList(sourceFile)); } @NotNull - public ClassBuilder newVisitor(@NotNull Type asmType, @NotNull Collection sourceFiles) { + public ClassBuilder newVisitor( + @Nullable PsiElement forElement, + @Nullable DeclarationDescriptor forDescriptor, + @NotNull Type asmType, + @NotNull Collection sourceFiles) { String outputFilePath = asmType.getInternalName() + ".class"; List ioSourceFiles = toIoFilesIgnoringNonPhysical(sourceFiles); state.getProgress().reportOutput(ioSourceFiles, new File(outputFilePath)); - ClassBuilder answer = builderFactory.newClassBuilder(); + ClassBuilder answer = builderFactory.newClassBuilder(forElement, forDescriptor); generators.put(outputFilePath, new ClassBuilderAndSourceFileList(answer, ioSourceFiles)); return answer; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index c49ad69bb54..5cc4a15f69b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -119,7 +119,7 @@ public class ClosureCodegen extends ParentCodegenAware { } public void gen() { - ClassBuilder cv = state.getFactory().newVisitor(asmType, fun.getContainingFile()); + ClassBuilder cv = state.getFactory().newVisitor(fun, funDescriptor, asmType, fun.getContainingFile()); FunctionDescriptor erasedInterfaceFunction; if (samType == null) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index a293a69be08..4dba443ce57 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -171,12 +171,13 @@ public class ExpressionCodegen extends JetVisitor implem public CalculatedClosure generateObjectLiteral(@NotNull JetObjectLiteralExpression literal) { JetObjectDeclaration objectDeclaration = literal.getObjectDeclaration(); - Type asmType = asmTypeForAnonymousClass(bindingContext, objectDeclaration); - ClassBuilder classBuilder = state.getFactory().newVisitor(asmType, literal.getContainingFile()); - ClassDescriptor classDescriptor = bindingContext.get(CLASS, objectDeclaration); assert classDescriptor != null; + Type asmType = asmTypeForAnonymousClass(bindingContext, objectDeclaration); + ClassBuilder classBuilder = state.getFactory().newVisitor(objectDeclaration, classDescriptor, asmType, literal.getContainingFile()); + + ClassContext objectContext = context.intoAnonymousClass(classDescriptor, this); new ImplementationBodyCodegen(objectDeclaration, objectContext, classBuilder, state, getParentCodegen()).generate(); @@ -263,7 +264,7 @@ public class ExpressionCodegen extends JetVisitor implem assert descriptor != null; Type asmType = asmTypeForAnonymousClass(bindingContext, declaration); - ClassBuilder classBuilder = state.getFactory().newVisitor(asmType, declaration.getContainingFile()); + ClassBuilder classBuilder = state.getFactory().newVisitor(declaration, descriptor, asmType, declaration.getContainingFile()); ClassContext objectContext = context.intoAnonymousClass(descriptor, this); new ImplementationBodyCodegen(declaration, objectContext, classBuilder, state, getParentCodegen()).generate(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java index 98e166a6804..379bfaa4fb9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java @@ -162,13 +162,13 @@ public abstract class MemberCodegen { Type className = state.getBindingContext().get(ASM_TYPE, classDescriptorForScript); assert className != null; - ClassBuilder builder = state.getFactory().newVisitor(className, declaration.getContainingFile()); + ClassBuilder builder = state.getFactory().newVisitor(declaration, classDescriptorForScript, className, declaration.getContainingFile()); List earlierScripts = state.getEarlierScriptsForReplInterpreter(); ScriptContext scriptContext = parentContext.intoScript( scriptDescriptor, diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java index a46069ec341..e47975477b5 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java @@ -297,7 +297,7 @@ public class AnonymousObjectTransformer { @NotNull private ClassBuilder createClassBuilder() { - ClassBuilder classBuilder = state.getFactory().newVisitor(newLambdaType, inliningContext.getRoot().callElement.getContainingFile()); + ClassBuilder classBuilder = state.getFactory().newVisitor(null, null, newLambdaType, inliningContext.getRoot().callElement.getContainingFile()); return new RemappingClassBuilder(classBuilder, new TypeRemapper(inliningContext.typeMapping)); } diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassBuilderFactory.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassBuilderFactory.java index faab7c463f8..845caeda6c5 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassBuilderFactory.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassBuilderFactory.java @@ -16,12 +16,14 @@ package org.jetbrains.jet.asJava; +import com.intellij.psi.PsiElement; import com.intellij.psi.stubs.StubElement; import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.codegen.ClassBuilder; import org.jetbrains.jet.codegen.ClassBuilderFactory; import org.jetbrains.jet.codegen.ClassBuilderMode; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; /*package*/ class KotlinLightClassBuilderFactory implements ClassBuilderFactory { private final Stack stubStack; @@ -36,8 +38,9 @@ import org.jetbrains.jet.codegen.ClassBuilderMode; return ClassBuilderMode.LIGHT_CLASSES; } + @NotNull @Override - public ClassBuilder newClassBuilder() { + public ClassBuilder newClassBuilder(PsiElement forElement, DeclarationDescriptor forDescriptor) { return new StubClassBuilder(stubStack); }