diff --git a/java/java-impl/src/com/intellij/lang/java/parser/JavaParser.java b/java/java-impl/src/com/intellij/lang/java/parser/JavaParser.java index dbe1ab0f5121..3bd61235b27d 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/JavaParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/JavaParser.java @@ -19,6 +19,7 @@ import com.intellij.lang.ASTNode; import com.intellij.lang.PsiBuilder; import com.intellij.lang.PsiParser; import com.intellij.pom.java.LanguageLevel; +import com.intellij.psi.impl.source.parsing.ParseUtil; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; @@ -40,6 +41,8 @@ public class JavaParser implements PsiParser { FileParser.parse(builder); root.done(rootType); - return builder.getTreeBuilt(); + final ASTNode rootNode = builder.getTreeBuilt(); + ParseUtil.bindComments(rootNode); + return rootNode; } } diff --git a/java/java-impl/src/com/intellij/psi/impl/source/parsing/ParseUtil.java b/java/java-impl/src/com/intellij/psi/impl/source/parsing/ParseUtil.java index e9dcb883e58a..f83d78af0022 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/parsing/ParseUtil.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/parsing/ParseUtil.java @@ -52,6 +52,9 @@ public class ParseUtil extends ParseUtilBase { inserter.invoke(); } + public static void bindComments(final ASTNode root) { + JavaMissingTokenInserter.bindComments(root); + } private static class JavaMissingTokenInserter extends MissingTokenInserter { diff --git a/java/java-tests/testData/psi/parser-partial/files/BindDocComment0.txt b/java/java-tests/testData/psi/parser-partial/files/BindDocComment0.txt new file mode 100644 index 000000000000..5b7bf585429d --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/files/BindDocComment0.txt @@ -0,0 +1,25 @@ +PsiJavaFile:BindDocComment0.java + PsiImportList + + PsiClass:A + PsiDocComment + PsiDocToken:DOC_COMMENT_START('/**') + PsiWhiteSpace(' ') + PsiDocToken:DOC_COMMENT_DATA('class comment ') + PsiDocToken:DOC_COMMENT_END('*/') + PsiWhiteSpace('\n') + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:A('A') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/files/BindDocComment1.txt b/java/java-tests/testData/psi/parser-partial/files/BindDocComment1.txt new file mode 100644 index 000000000000..8219d2f3b5f0 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/files/BindDocComment1.txt @@ -0,0 +1,34 @@ +PsiJavaFile:BindDocComment1.java + PsiDocComment + PsiDocToken:DOC_COMMENT_START('/**') + PsiWhiteSpace(' ') + PsiDocToken:DOC_COMMENT_DATA('file comment ') + PsiDocToken:DOC_COMMENT_END('*/') + PsiWhiteSpace('\n') + PsiPackageStatement:a + PsiKeyword:package('package') + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:a + PsiIdentifier:a('a') + PsiReferenceParameterList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n') + PsiImportList + + PsiClass:A + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:A('A') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/files/BindDocComment2.txt b/java/java-tests/testData/psi/parser-partial/files/BindDocComment2.txt new file mode 100644 index 000000000000..e1e81ce07537 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/files/BindDocComment2.txt @@ -0,0 +1,33 @@ +PsiJavaFile:BindDocComment2.java + PsiDocComment + PsiDocToken:DOC_COMMENT_START('/**') + PsiWhiteSpace(' ') + PsiDocToken:DOC_COMMENT_DATA('file comment ') + PsiDocToken:DOC_COMMENT_END('*/') + PsiWhiteSpace('\n') + PsiImportList + PsiImportStatement + PsiKeyword:import('import') + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:a + PsiIdentifier:a('a') + PsiReferenceParameterList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n') + PsiClass:A + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:A('A') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/files/BindDocComment3.txt b/java/java-tests/testData/psi/parser-partial/files/BindDocComment3.txt new file mode 100644 index 000000000000..8800962b9d84 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/files/BindDocComment3.txt @@ -0,0 +1,34 @@ +PsiJavaFile:BindDocComment3.java + PsiImportList + + PsiClass:A + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:A('A') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiField:f + PsiDocComment + PsiDocToken:DOC_COMMENT_START('/**') + PsiWhiteSpace(' ') + PsiDocToken:DOC_COMMENT_DATA('field comment ') + PsiDocToken:DOC_COMMENT_END('*/') + PsiWhiteSpace('\n ') + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:f('f') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testData/psi/parser-partial/files/BindDocComment4.txt b/java/java-tests/testData/psi/parser-partial/files/BindDocComment4.txt new file mode 100644 index 000000000000..1beefcc8f3c7 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/files/BindDocComment4.txt @@ -0,0 +1,36 @@ +PsiJavaFile:BindDocComment4.java + PsiImportList + + PsiClass:A + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:A('A') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiField:f + PsiDocComment + PsiDocToken:DOC_COMMENT_START('/**') + PsiWhiteSpace(' ') + PsiDocToken:DOC_COMMENT_DATA('field comment ') + PsiDocToken:DOC_COMMENT_END('*/') + PsiWhiteSpace('\n') + PsiComment(END_OF_LINE_COMMENT)('// field comment') + PsiWhiteSpace('\n ') + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:f('f') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java index 57512efdd42e..19377ff570f7 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java @@ -28,6 +28,7 @@ import com.intellij.psi.PsiManager; import com.intellij.psi.SingleRootFileViewProvider; import com.intellij.psi.impl.DebugUtil; import com.intellij.psi.impl.source.PsiJavaFileImpl; +import com.intellij.psi.impl.source.parsing.ParseUtil; import com.intellij.psi.impl.source.tree.FileElement; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.IFileElementType; @@ -78,7 +79,9 @@ public abstract class JavaParsingTestCase extends ParsingTestCase { } root.done(this); - return builder.getTreeBuilt().getFirstChildNode(); + final ASTNode rootNode = builder.getTreeBuilt(); + ParseUtil.bindComments(rootNode); + return rootNode.getFirstChildNode(); } }; @@ -102,7 +105,7 @@ public abstract class JavaParsingTestCase extends ParsingTestCase { private static PsiBuilder createBuilder(final ASTNode chameleon) { final Project project = chameleon.getPsi().getProject(); final PsiBuilderFactory factory = PsiBuilderFactory.getInstance(); - final PsiBuilder builder = factory.createBuilder(project, chameleon, null, chameleon.getElementType().getLanguage(), chameleon.getChars()); + final PsiBuilder builder = factory.createBuilder(project, chameleon, chameleon.getElementType().getLanguage(), chameleon.getChars()); builder.setDebugMode(true); diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/FileParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/FileParserTest.java index 78ec9bec02ce..52c831ee661e 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/FileParserTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/FileParserTest.java @@ -20,7 +20,6 @@ import com.intellij.lang.java.parser.FileParser; import com.intellij.lang.java.parser.JavaParsingTestCase; -// todo: fix comment binding, uncomment tests public class FileParserTest extends JavaParsingTestCase { public FileParserTest() { super("parser-partial/files"); @@ -46,13 +45,17 @@ public class FileParserTest extends JavaParsingTestCase { "public class C { }\n" + "class D { }"); } - //public void testBindBefore0() { doParserTest("class A{\n // comment\n int field;\n}"); } + public void testBindBefore0() { doParserTest("class A{\n // comment\n int field;\n}"); } public void testBindBefore1() { doParserTest("class A{\n // comment\n\n int field;\n}"); } public void testBindBefore2() { doParserTest("class A{ // comment\n int field;\n}"); } public void testBindBefore3() { doParserTest("class A{// comment\n int field;\n}"); } - //public void testBindBefore4() { doParserTest("class A{\n // comment 1\n // comment 2\n // comment 3\n int field;\n}"); } + public void testBindBefore4() { doParserTest("class A{\n // comment 1\n // comment 2\n // comment 3\n int field;\n}"); } - // todo: doc comment binding tests + public void testBindDocComment0() { doParserTest("/** class comment */\nclass A { }"); } + public void testBindDocComment1() { doParserTest("/** file comment */\npackage a;\nclass A { }"); } + public void testBindDocComment2() { doParserTest("/** file comment */\nimport a;\nclass A { }"); } + public void testBindDocComment3() { doParserTest("class A {\n /** field comment */\n int f;\n}"); } + public void testBindDocComment4() { doParserTest("class A {\n /** field comment */\n// field comment\n int f;\n}"); } private void doParserTest(final String text) { doParserTest(text, new TestParser() {