From 90c5a66362e7a01f880775e7b3fd533208423bc1 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 16 Jun 2011 19:04:35 +0200 Subject: [PATCH] allow namespace-qualified references; generate nested namespaces --- .../src/org/jetbrains/jet/codegen/ExpressionCodegen.java | 2 +- idea/src/org/jetbrains/jet/codegen/NamespaceCodegen.java | 9 ++++++--- idea/testData/codegen/namespaceQualifiedMethod.jet | 7 +++++++ .../org/jetbrains/jet/codegen/NamespaceGenTest.java | 4 ++++ 4 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 idea/testData/codegen/namespaceQualifiedMethod.jet diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 6b3650925f0..8c74d403175 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -615,7 +615,7 @@ public class ExpressionCodegen extends JetVisitor { myStack.push(iValue); } } - else { + else if (!(descriptor instanceof NamespaceDescriptor)) { throw new UnsupportedOperationException("don't know how to generate reference " + descriptor); } } diff --git a/idea/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/idea/src/org/jetbrains/jet/codegen/NamespaceCodegen.java index 8f7b3489733..80d5e22c87e 100644 --- a/idea/src/org/jetbrains/jet/codegen/NamespaceCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/NamespaceCodegen.java @@ -38,9 +38,8 @@ public class NamespaceCodegen { } public void generate(JetNamespace namespace) { - BindingContext bindingContext1 = AnalyzingUtils.analyzeNamespace(namespace, JetControlFlowDataTraceFactory.EMPTY); - AnalyzingUtils.applyHandler(ErrorHandler.THROW_EXCEPTION, bindingContext1); - BindingContext bindingContext = bindingContext1; + BindingContext bindingContext = AnalyzingUtils.analyzeNamespace(namespace, JetControlFlowDataTraceFactory.EMPTY); + AnalyzingUtils.applyHandler(ErrorHandler.THROW_EXCEPTION, bindingContext); final JetStandardLibrary standardLibrary = JetStandardLibrary.getJetStandardLibrary(project); final FunctionCodegen functionCodegen = new FunctionCodegen(namespace, v, standardLibrary, bindingContext); @@ -65,6 +64,10 @@ public class NamespaceCodegen { else if (declaration instanceof JetClassOrObject) { classCodegen.generate((JetClassOrObject) declaration); } + else if (declaration instanceof JetNamespace) { + JetNamespace childNamespace = (JetNamespace) declaration; + codegens.forNamespace(childNamespace).generate(childNamespace); + } } } diff --git a/idea/testData/codegen/namespaceQualifiedMethod.jet b/idea/testData/codegen/namespaceQualifiedMethod.jet new file mode 100644 index 00000000000..b532836e3e2 --- /dev/null +++ b/idea/testData/codegen/namespaceQualifiedMethod.jet @@ -0,0 +1,7 @@ +namespace Foo { + fun bar() = 610 +} + +fun box(): String { + return if (Foo.bar() == 610) "OK" else "fail" +} diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index 95093596439..cc597b51ca2 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -400,4 +400,8 @@ public class NamespaceGenTest extends CodegenTestCase { final StringBuilder sb = new StringBuilder("x"); assertEquals('x', ((Character) main.invoke(null, sb)).charValue()); } + + public void testNamespaceQualifiedMethod() throws Exception { + blackBoxFile("namespaceQualifiedMethod.jet"); + } }