New Java parser (comment binding)

This commit is contained in:
Roman Shevchenko
2010-08-04 12:23:35 +04:00
parent 99ee144985
commit 8c12653b0f
9 changed files with 181 additions and 7 deletions
@@ -0,0 +1,25 @@
PsiJavaFile:BindDocComment0.java
PsiImportList
<empty list>
PsiClass:A
PsiDocComment
PsiDocToken:DOC_COMMENT_START('/**')
PsiWhiteSpace(' ')
PsiDocToken:DOC_COMMENT_DATA('class comment ')
PsiDocToken:DOC_COMMENT_END('*/')
PsiWhiteSpace('\n')
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -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
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiImportList
<empty list>
PsiClass:A
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -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
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiClass:A
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,34 @@
PsiJavaFile:BindDocComment3.java
PsiImportList
<empty list>
PsiClass:A
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
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:
<empty list>
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:f('f')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,36 @@
PsiJavaFile:BindDocComment4.java
PsiImportList
<empty list>
PsiClass:A
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
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:
<empty list>
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:f('f')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiJavaToken:RBRACE('}')
@@ -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);
@@ -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() {