diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java index 57d95ebadf3..eac2cd880fb 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java @@ -302,7 +302,7 @@ public class PackageCodegen { } else if (declaration instanceof JetClassOrObject) { JetClassOrObject classOrObject = (JetClassOrObject) declaration; - if (state.getGenerateDeclaredClassFilter().shouldProcessClass(classOrObject)) { + if (state.getGenerateDeclaredClassFilter().shouldGenerateClass(classOrObject)) { generateClassOrObject(classOrObject); } } @@ -310,13 +310,13 @@ public class PackageCodegen { JetScript script = (JetScript) declaration; // SCRIPT: generate script code, should be separate execution branch - if (state.getGenerateDeclaredClassFilter().shouldProcessScript(script)) { + if (state.getGenerateDeclaredClassFilter().shouldGenerateScript(script)) { ScriptCodegen.createScriptCodegen(script, state, packagePartContext).generate(); } } } - if (!generatePackagePart) return null; + if (!generatePackagePart || !state.getGenerateDeclaredClassFilter().shouldGeneratePackagePart(file)) return null; ClassBuilder builder = state.getFactory().newVisitor(PackagePart(file, packageFragment), packagePartType, file); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java index 2881660f6b7..8c18c194f6d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java @@ -207,7 +207,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid { @Override public void visitObjectDeclaration(@NotNull JetObjectDeclaration declaration) { - if (!filter.shouldProcessClass(declaration)) return; + if (!filter.shouldAnnotateClass(declaration)) return; ClassDescriptor classDescriptor = bindingContext.get(CLASS, declaration); // working around a problem with shallow analysis @@ -225,7 +225,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid { @Override public void visitClass(@NotNull JetClass klass) { - if (!filter.shouldProcessClass(klass)) return; + if (!filter.shouldAnnotateClass(klass)) return; ClassDescriptor classDescriptor = bindingContext.get(CLASS, klass); // working around a problem with shallow analysis diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.java index e89902f2c99..e3fdd38d09e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.java @@ -43,17 +43,29 @@ import java.util.List; public class GenerationState { public interface GenerateClassFilter { - boolean shouldProcessClass(JetClassOrObject classOrObject); - boolean shouldProcessScript(JetScript script); + boolean shouldAnnotateClass(JetClassOrObject classOrObject); + boolean shouldGenerateClass(JetClassOrObject classOrObject); + boolean shouldGeneratePackagePart(JetFile jetFile); + boolean shouldGenerateScript(JetScript script); GenerateClassFilter GENERATE_ALL = new GenerateClassFilter() { @Override - public boolean shouldProcessClass(JetClassOrObject classOrObject) { + public boolean shouldAnnotateClass(JetClassOrObject classOrObject) { return true; } @Override - public boolean shouldProcessScript(JetScript script) { + public boolean shouldGenerateClass(JetClassOrObject classOrObject) { + return true; + } + + @Override + public boolean shouldGenerateScript(JetScript script) { + return true; + } + + @Override + public boolean shouldGeneratePackagePart(JetFile jetFile) { return true; } }; diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinJavaFileStubProvider.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinJavaFileStubProvider.java index ca035e3bf93..25e836d50d0 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinJavaFileStubProvider.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinJavaFileStubProvider.java @@ -110,15 +110,26 @@ public class KotlinJavaFileStubProvider> ref = new Ref(); if (!disableInline) { - result = processInlinedDeclarations(jetFile.getProject(), result, Collections.singleton(jetFile), 1); + result = processInlinedDeclarations(jetFile.getProject(), result, Collections.singleton(jetFile), 1, ref); } if (result.isError()) { return printStackTraceToString(result.getError()); } + Set toProcess = new LinkedHashSet(); + toProcess.add(jetFile); + if (ref.get() != null) { + for (JetElement element: ref.get()) { + JetFile file = element.getContainingJetFile(); + toProcess.add(file); + } + } + + GenerationState.GenerateClassFilter generateClassFilter = new GenerationState.GenerateClassFilter() { + + @Override + public boolean shouldGeneratePackagePart(JetFile file) { + return file == jetFile; + } + + @Override + public boolean shouldAnnotateClass(JetClassOrObject classOrObject) { + return true; + } + + @Override + public boolean shouldGenerateClass(JetClassOrObject classOrObject) { + return classOrObject.getContainingJetFile() == jetFile; + } + + @Override + public boolean shouldGenerateScript(JetScript script) { + return script.getContainingJetFile() == jetFile; + } + }; + state = new GenerationState(jetFile.getProject(), ClassBuilderFactories.TEST, Progress.DEAF, result.getModuleDescriptor(), result.getBindingContext(), - Collections.singletonList(jetFile), !enableAssertions.isSelected(), !enableAssertions.isSelected(), - GenerationState.GenerateClassFilter.GENERATE_ALL, + new ArrayList(toProcess), !enableAssertions.isSelected(), !enableAssertions.isSelected(), + generateClassFilter, disableInline, !enableOptimization.isSelected(), null, null, DiagnosticSink.DO_NOTHING, null); KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION); @@ -154,8 +185,15 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { return answer.toString(); } - private AnalysisResult processInlinedDeclarations(Project project, AnalysisResult result, Set originalElements, int deep) { + private AnalysisResult processInlinedDeclarations( + @NotNull Project project, + @NotNull AnalysisResult result, + @NotNull Set originalElements, + int deep, + @NotNull Ref> resultElements + ) { if (deep >= 10 || result.isError()) { + resultElements.set(originalElements); return result; } Set collectedElements = new HashSet(); @@ -177,8 +215,10 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { } if (collectedElements.size() != originalElements.size()) { AnalysisResult newResult = KotlinCacheService.getInstance(project).getAnalysisResults(collectedElements); - return processInlinedDeclarations(project, newResult, collectedElements, deep + 1); + return processInlinedDeclarations(project, newResult, collectedElements, deep + 1, resultElements); } + + resultElements.set(collectedElements); return result; }