From f11767319a68c60835b5e4bfdb61e5cb4988aec6 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sat, 9 Jun 2012 23:25:40 +0400 Subject: [PATCH] repl: fix two anonymous functions --- .../org/jetbrains/jet/codegen/ClosureAnnotator.java | 8 ++++++-- .../org/jetbrains/jet/codegen/GenerationState.java | 12 +++++++++--- .../jetbrains/jet/di/InjectorForJetTypeMapper.java | 2 -- .../org/jetbrains/jet/di/InjectorForJvmCodegen.java | 2 -- .../jetbrains/jet/resolve/DescriptorRenderer.java | 1 + compiler/testData/repl/twoClosures.repl | 4 ++++ .../org/jetbrains/jet/repl/ReplInterpreterTest.java | 5 +++++ 7 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/repl/twoClosures.repl diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureAnnotator.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureAnnotator.java index 85ba3d82cab..0c0886e651f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureAnnotator.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureAnnotator.java @@ -62,7 +62,6 @@ public class ClosureAnnotator { this.files = files; } - @PostConstruct public void init() { mapFilesToNamespaces(files); prepareAnonymousClasses(); @@ -241,7 +240,12 @@ public class ClosureAnnotator { @Override public void visitJetFile(JetFile file) { - nameStack.push(JetPsiUtil.getFQName(file).getFqName().replace('.', '/')); + if (file.isScript()) { + nameStack.push(classNameForScriptPsi(file.getScript()).getInternalName()); + } + else { + nameStack.push(JetPsiUtil.getFQName(file).getFqName().replace('.', '/')); + } file.acceptChildren(this); nameStack.pop(); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java index 18ee8ee8978..eb87d6d6ab8 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java @@ -135,9 +135,13 @@ public class GenerationState { return getFactory().forNamespace(fqName, namespace); } - public void compileCorrectFiles(@NotNull CompilationErrorHandler errorHandler) { + private void beforeCompile() { markUsed(); + injector.getClosureAnnotator().init(); + } + + public void compileCorrectFiles(@NotNull CompilationErrorHandler errorHandler) { for (JetFile file : this.files) { if (file.isScript()) { injector.getClosureAnnotator().registerClassNameForScript(file.getScript(), ScriptCodegen.SCRIPT_DEFAULT_CLASS_NAME); @@ -146,6 +150,8 @@ public class GenerationState { injector.getScriptCodegen().registerEarlierScripts(Collections.>emptyList()); + beforeCompile(); + MultiMap namespaceGrouping = new MultiMap(); for (JetFile file : this.files) { if (file == null) throw new IllegalArgumentException("A null file given for compilation"); @@ -162,12 +168,12 @@ public class GenerationState { @NotNull JvmClassName className, @NotNull List> earlierScripts, @NotNull CompilationErrorHandler errorHandler) { - markUsed(); injector.getScriptCodegen().registerEarlierScripts(earlierScripts); - injector.getClosureAnnotator().registerClassNameForScript(script, className); + beforeCompile(); + generateNamespace( JetPsiUtil.getFQName((JetFile) script.getContainingFile()), Collections.singleton((JetFile) script.getContainingFile()), diff --git a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java index 0d0ec20975d..efa21cb0528 100644 --- a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java @@ -67,8 +67,6 @@ public class InjectorForJetTypeMapper { jetTypeMapper.init(); - closureAnnotator.init(); - } @PreDestroy diff --git a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java index 80e49e5f616..4cb6fca73a4 100644 --- a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java @@ -121,8 +121,6 @@ public class InjectorForJvmCodegen { intrinsics.init(); - closureAnnotator.init(); - } @PreDestroy diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index 3b1ad94a30f..72423cfb1fa 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -249,6 +249,7 @@ public class DescriptorRenderer implements Renderer { declarationDescriptor.accept(rootVisitor, stringBuilder); if (stringBuilder.length() == 0) { + // don't use toString here because render may be called from toString stringBuilder.append(declarationDescriptor.getClass().getName() + "@" + System.identityHashCode(declarationDescriptor)); } diff --git a/compiler/testData/repl/twoClosures.repl b/compiler/testData/repl/twoClosures.repl new file mode 100644 index 00000000000..91fb32a2381 --- /dev/null +++ b/compiler/testData/repl/twoClosures.repl @@ -0,0 +1,4 @@ +>>> { -> }; 21 +21 +>>> { -> }; 22 +22 diff --git a/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTest.java b/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTest.java index e72db4a2b56..7f602efd14d 100644 --- a/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTest.java +++ b/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTest.java @@ -87,5 +87,10 @@ public class ReplInterpreterTest { testFile("functionReferencesPrev.repl"); } + @Test + public void twoClosures() { + testFile("twoClosures.repl"); + } + }