diff --git a/grammar/src/toplevel.grm b/grammar/src/toplevel.grm index 14a90d2e5b0..ca6ee518d7c 100644 --- a/grammar/src/toplevel.grm +++ b/grammar/src/toplevel.grm @@ -11,7 +11,7 @@ preamble ; namespaceHeader - : "namespace" SimpleName{"."} SEMI? + : modifiers "namespace" SimpleName{"."} SEMI? ; import diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index 903ce544f36..8b15d831cc0 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -337,7 +337,7 @@ public class JetExpressionParsing extends AbstractJetParsing { parseFunctionLiteral(); } else if (!parseLiteralConstant()) { - // TODO + // TODO: betters recovery if FIRST(expression) did not match errorAndAdvance("Expecting an expression"); } } diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java index 7349144873d..ea80263059e 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java @@ -110,16 +110,21 @@ public class JetParsing extends AbstractJetParsing { private void parsePreamble() { /* * namespaceHeader - * : "namespace" SimpleName{"."} SEMI? + * : modifiers "namespace" SimpleName{"."} SEMI? * ; */ + PsiBuilder.Marker firstEntry = mark(); + parseModifierList(); + if (at(NAMESPACE_KEYWORD)) { - // TODO: Modifiers + firstEntry.drop(); advance(); // NAMESPACE_KEYWORD parseNamespaceName(); consumeIf(SEMICOLON); + } else { + firstEntry.rollbackTo(); } while (at(IMPORT_KEYWORD)) { @@ -384,7 +389,6 @@ public class JetParsing extends AbstractJetParsing { * ; */ private JetNodeType parseNamespaceBlock() { - // TODO: Modifiers assert _at(NAMESPACE_KEYWORD); advance(); // NAMESPACE_KEYWORD diff --git a/idea/testData/psi/NamespaceModifiers.jet b/idea/testData/psi/NamespaceModifiers.jet new file mode 100644 index 00000000000..c842220ebe8 --- /dev/null +++ b/idea/testData/psi/NamespaceModifiers.jet @@ -0,0 +1,9 @@ +public [a] namespace name; + +[a] namespace a { + val foo + + private namespace b { + + } +} \ No newline at end of file diff --git a/idea/testData/psi/NamespaceModifiers.txt b/idea/testData/psi/NamespaceModifiers.txt new file mode 100644 index 00000000000..23cbae7711d --- /dev/null +++ b/idea/testData/psi/NamespaceModifiers.txt @@ -0,0 +1,56 @@ +JetFile: NamespaceModifiers.jet + NAMESPACE + MODIFIER_LIST + PsiElement(public)('public') + PsiWhiteSpace(' ') + ATTRIBUTE_ANNOTATION + PsiElement(LBRACKET)('[') + ATTRIBUTE + USER_TYPE + PsiElement(IDENTIFIER)('a') + PsiElement(RBRACKET)(']') + PsiWhiteSpace(' ') + PsiElement(namespace)('namespace') + PsiWhiteSpace(' ') + NAMESPACE_NAME + PsiElement(IDENTIFIER)('name') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n\n') + NAMESPACE + MODIFIER_LIST + ATTRIBUTE_ANNOTATION + PsiElement(LBRACKET)('[') + ATTRIBUTE + USER_TYPE + PsiElement(IDENTIFIER)('a') + PsiElement(RBRACKET)(']') + PsiWhiteSpace(' ') + PsiElement(namespace)('namespace') + PsiWhiteSpace(' ') + NAMESPACE_NAME + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + NAMESPACE_BODY + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + PsiWhiteSpace('\n\n ') + NAMESPACE + MODIFIER_LIST + PsiElement(private)('private') + PsiWhiteSpace(' ') + PsiElement(namespace)('namespace') + PsiWhiteSpace(' ') + NAMESPACE_NAME + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n\n ') + NAMESPACE_BODY + + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file