diff --git a/grammar/src/expressions.grm b/grammar/src/expressions.grm index 426ff6b7a21..2f84e826f94 100644 --- a/grammar/src/expressions.grm +++ b/grammar/src/expressions.grm @@ -95,6 +95,7 @@ atomicExpression : jump : loop : SimpleName + : "namespace" // foo the root namespace ; literalConstant diff --git a/grammar/src/types.grm b/grammar/src/types.grm index c0eaa8e6b28..02e830d8726 100644 --- a/grammar/src/types.grm +++ b/grammar/src/types.grm @@ -14,7 +14,7 @@ type ; userType - : simpleUserType{"."} + : ("namespace" ".")? simpleUserType{"."} ; simpleUserType diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index 841233e1530..cabdc22451a 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -101,6 +101,7 @@ public interface JetNodeTypes { JetNodeType PATTERN = new JetNodeType("PATTERN"); JetNodeType TUPLE_PATTERN = new JetNodeType("TUPLE_PATTERN"); JetNodeType OBJECT_LITERAL = new JetNodeType("OBJECT_LITERAL"); + JetNodeType ROOT_NAMESPACE = new JetNodeType("ROOT_NAMESPACE"); IElementType NAMESPACE_NAME = new JetNodeType("NAMESPACE_NAME"); } diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index c2cd70cc42d..96501a2bf44 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -269,17 +269,19 @@ public class JetExpressionParsing extends AbstractJetParsing { * : functionLiteral * : declaration * : SimpleName + * : "namespace" // foo the root namespace * ; */ private void parseAtomicExpression() { - - // TODO: namespace.a.b.C // System.out.println("atom at " + myBuilder.getTokenText()); if (at(LPAR)) { parseParenthesizedExpressionOrTuple(); } + else if (at(NAMESPACE_KEYWORD)) { + parseOneTokenExpression(ROOT_NAMESPACE); + } else if (at(THIS_KEYWORD)) { parseThisExpression(); } @@ -438,7 +440,7 @@ public class JetExpressionParsing extends AbstractJetParsing { private void parsePattern() { PsiBuilder.Marker pattern = mark(); - if (at(IDENTIFIER)) { + if (at(IDENTIFIER) || at(NAMESPACE_KEYWORD)) { myJetParsing.parseUserType(); if (at(LPAR)) { parseTuplePattern(); diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java index 9511fb7a84f..85d91891824 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java @@ -1210,7 +1210,7 @@ public class JetParsing extends AbstractJetParsing { parseAttributeList(); - if (at(IDENTIFIER)) { + if (at(IDENTIFIER) || at(NAMESPACE_KEYWORD)) { parseUserType(); } else if (at(LBRACE)) { @@ -1229,10 +1229,14 @@ public class JetParsing extends AbstractJetParsing { /* * userType - * : simpleUserType{"."} + * : ("namespace" ".")? simpleUserType{"."} * ; */ public void parseUserType() { + if (at(NAMESPACE_KEYWORD)) { + advance(); // NAMESPACE_KEYWORD + expect(DOT, "Expecting '.'", TokenSet.create(IDENTIFIER)); + } while (true) { parseSimpleUserType(); if (!at(DOT)) break; diff --git a/idea/testData/psi/RootNamespace.jet b/idea/testData/psi/RootNamespace.jet new file mode 100644 index 00000000000..a69aa910531 --- /dev/null +++ b/idea/testData/psi/RootNamespace.jet @@ -0,0 +1,13 @@ +namespace foo.bar; + +class X + +namespace foo.bar { + fun foo() { + namespace.foo.bar.X + new namespace.foo.bar.X() + e match { + case namespace.foo.bar.X(x) => {} + } + } +} \ No newline at end of file diff --git a/idea/testData/psi/RootNamespace.txt b/idea/testData/psi/RootNamespace.txt new file mode 100644 index 00000000000..54b77b8984e --- /dev/null +++ b/idea/testData/psi/RootNamespace.txt @@ -0,0 +1,112 @@ +JetFile: RootNamespace.jet + NAMESPACE + PsiElement(namespace)('namespace') + PsiWhiteSpace(' ') + NAMESPACE_NAME + PsiElement(IDENTIFIER)('foo') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('bar') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n\n') + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('X') + PsiWhiteSpace('\n\n') + TYPE_PARAMETER_LIST + + NAMESPACE + PsiElement(namespace)('namespace') + PsiWhiteSpace(' ') + NAMESPACE_NAME + PsiElement(IDENTIFIER)('foo') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('bar') + PsiWhiteSpace(' ') + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + NAMESPACE_BODY + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + TYPE_PARAMETER_LIST + + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + DOT_QIALIFIED_EXPRESSION + DOT_QIALIFIED_EXPRESSION + DOT_QIALIFIED_EXPRESSION + ROOT_NAMESPACE + PsiElement(namespace)('namespace') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('foo') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('bar') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('X') + PsiWhiteSpace('\n ') + NEW + PsiElement(new)('new') + PsiWhiteSpace(' ') + TYPE_REFERENCE + PsiElement(namespace)('namespace') + PsiElement(DOT)('.') + USER_TYPE + PsiElement(IDENTIFIER)('foo') + PsiElement(DOT)('.') + USER_TYPE + PsiElement(IDENTIFIER)('bar') + PsiElement(DOT)('.') + USER_TYPE + PsiElement(IDENTIFIER)('X') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('e') + PsiWhiteSpace(' ') + PsiElement(match)('match') + PsiWhiteSpace(' ') + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + MATCH_ENTRY + PsiElement(case)('case') + PsiWhiteSpace(' ') + PATTERN + PsiElement(namespace)('namespace') + PsiElement(DOT)('.') + USER_TYPE + PsiElement(IDENTIFIER)('foo') + PsiElement(DOT)('.') + USER_TYPE + PsiElement(IDENTIFIER)('bar') + PsiElement(DOT)('.') + USER_TYPE + PsiElement(IDENTIFIER)('X') + TUPLE_PATTERN + PsiElement(LPAR)('(') + PATTERN + USER_TYPE + PsiElement(IDENTIFIER)('x') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(DOUBLE_ARROW)('=>') + PsiWhiteSpace(' ') + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BODY + + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file