From 047bbdd65d56bb18bb5a38a7521894f7b18cda03 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 11 Aug 2010 15:58:19 +0400 Subject: [PATCH] Empty import list placement and comment binding (fixed) --- .../java/stubs/JavaImportListElementType.java | 2 +- .../psi/impl/source/parsing/ParseUtil.java | 51 ++++++++++--------- .../commonParsing/ImportListBug.txt | 4 +- .../class/ExtraOpeningBraceInMethod.txt | 2 +- .../class/IncompleteAnnotation.txt | 2 +- .../commentBinding/BindBeforeClass1.txt | 2 +- .../commentBinding/BindBeforeClass3.txt | 4 +- .../commentBinding/BindBeforeClass4.txt | 4 +- .../commentBinding/BindBeforeClass6.java | 1 + .../commentBinding/BindBeforeClass6.txt | 20 ++++++++ .../declarationParsing/method/Errors0.txt | 4 +- .../parser-partial/files/BindDocComment1.txt | 2 +- .../CommentBindingTest.java | 1 + 13 files changed, 62 insertions(+), 37 deletions(-) create mode 100644 java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass6.java create mode 100644 java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass6.txt diff --git a/java/java-impl/src/com/intellij/psi/impl/java/stubs/JavaImportListElementType.java b/java/java-impl/src/com/intellij/psi/impl/java/stubs/JavaImportListElementType.java index 89866ec8fd04..addf040c23aa 100644 --- a/java/java-impl/src/com/intellij/psi/impl/java/stubs/JavaImportListElementType.java +++ b/java/java-impl/src/com/intellij/psi/impl/java/stubs/JavaImportListElementType.java @@ -32,7 +32,7 @@ import java.io.IOException; public class JavaImportListElementType extends JavaStubElementType { public JavaImportListElementType() { - super("IMPORT_LIST", true); + super("IMPORT_LIST"); } public PsiImportList createPsi(final PsiImportListStub stub) { 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 2875cd7f6705..c0d9cece2e5e 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 @@ -88,19 +88,17 @@ public class ParseUtil extends ParseUtilBase { return treeNext instanceof ModifierListElement; } - private static void moveEmptyImportList(ASTNode root) { - TreeElement first = (TreeElement)root.getFirstChildNode(); - TreeElement next = (TreeElement)TreeUtil.skipElements(first, ElementType.JAVA_COMMENT_OR_WHITESPACE_BIT_SET); - if (next == null) return; + private static final TokenSet BEFORE_IMPORT_BIT_SET = TokenSet.orSet(ElementType.JAVA_COMMENT_OR_WHITESPACE_BIT_SET, + TokenSet.create(JavaElementType.PACKAGE_STATEMENT)); - if (next.getElementType() == JavaElementType.PACKAGE_STATEMENT) { - first = next.getTreeNext(); - next = (TreeElement)TreeUtil.skipElements(first, ElementType.JAVA_COMMENT_OR_WHITESPACE_BIT_SET); - } + private static void moveEmptyImportList(final ASTNode root) { + final TreeElement anImport = (TreeElement)TreeUtil.skipElements(root.getFirstChildNode(), BEFORE_IMPORT_BIT_SET); + if (anImport == null || !isEmptyImportList(anImport)) return; - if (next != null && next != first && isEmptyImportList(next)) { - next.rawRemove(); - first.rawInsertBeforeMe(next); + final TreeElement next = (TreeElement)TreeUtil.skipElements(anImport.getTreeNext(), ElementType.JAVA_COMMENT_OR_WHITESPACE_BIT_SET); + if (next != null && next != anImport) { + anImport.rawRemove(); + next.rawInsertBeforeMe(anImport); } } @@ -124,23 +122,28 @@ public class ParseUtil extends ParseUtilBase { // we'll only bind additional preceding comments in pass 2 when the declaration does not yet have a "doc comment" iterator = comments.listIterator(); while (iterator.hasNext()) { - ASTNode child = iterator.next(); - IElementType type = child.getElementType(); + ASTNode comment = iterator.next(); + IElementType type = comment.getElementType(); if (type == JavaDocElementType.DOC_COMMENT) { - if (bindDocComment((TreeElement)child)) iterator.remove(); + if (bindDocComment((TreeElement)comment)) iterator.remove(); } // bind "trailing comments" (like "int a; // comment") else if (type == JavaTokenType.END_OF_LINE_COMMENT || type == JavaTokenType.C_STYLE_COMMENT) { - if (bindTrailingComment((TreeElement)child)) iterator.remove(); + if (bindTrailingComment((TreeElement)comment)) iterator.remove(); } } // pass 2: bind preceding comments (like "// comment \n void f();") iterator = comments.listIterator(comments.size()); while (iterator.hasPrevious()) { - ASTNode child = iterator.previous(); - TreeElement next = (TreeElement)TreeUtil.skipElements(child.getTreeNext(), ElementType.JAVA_WHITESPACE_BIT_SET); - bindPrecedingComment((TreeElement)child, next); + final ASTNode comment = iterator.previous(); + + TreeElement next = (TreeElement)TreeUtil.skipElements(comment.getTreeNext(), ElementType.JAVA_WHITESPACE_BIT_SET); + if (next != null && isEmptyImportList(next)) { + next = (TreeElement)TreeUtil.skipElements(next.getTreeNext(), ElementType.JAVA_WHITESPACE_BIT_SET); + } + + bindPrecedingComment((TreeElement)comment, next); } } @@ -220,22 +223,22 @@ public class ParseUtil extends ParseUtilBase { TreeElement child = comment; while (child != bindTo) { final TreeElement next = child.getTreeNext(); - child.rawRemove(); - first.rawInsertBeforeMe(child); + if (!isEmptyImportList(child)) { + child.rawRemove(); + first.rawInsertBeforeMe(child); + } child = next; } } private static boolean isBindingComment(final ASTNode comment) { - ASTNode prev = comment.getTreePrev(); - if (isEmptyImportList(prev)) prev = prev.getTreePrev(); + final ASTNode prev = comment.getTreePrev(); final boolean prevOk = prev == null || (prev.getElementType() == TokenType.WHITE_SPACE && prev.textContains('\n')); final ASTNode next = comment.getTreeNext(); final boolean nextOk = next != null && - next.getElementType() == TokenType.WHITE_SPACE && - StringUtil.getLineBreakCount(next.getText()) < 2; + (next.getElementType() != TokenType.WHITE_SPACE || StringUtil.getLineBreakCount(next.getText()) < 2); return prevOk && nextOk; } diff --git a/java/java-tests/testData/psi/parser-full/commonParsing/ImportListBug.txt b/java/java-tests/testData/psi/parser-full/commonParsing/ImportListBug.txt index 1240b05efda3..27e45ed74f16 100644 --- a/java/java-tests/testData/psi/parser-full/commonParsing/ImportListBug.txt +++ b/java/java-tests/testData/psi/parser-full/commonParsing/ImportListBug.txt @@ -1,8 +1,8 @@ PsiJavaFile:ImportListBug.java - PsiImportList - PsiDocComment PsiDocToken:DOC_COMMENT_END('/**/') + PsiImportList + PsiClass:AClass PsiDocComment PsiDocToken:DOC_COMMENT_START('/**') diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/ExtraOpeningBraceInMethod.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/ExtraOpeningBraceInMethod.txt index 4f2592e789a4..c070d1e4522f 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/ExtraOpeningBraceInMethod.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/ExtraOpeningBraceInMethod.txt @@ -7,9 +7,9 @@ PsiJavaFile:ExtraOpeningBraceInMethod.java PsiReferenceParameterList PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n\n') PsiImportList - PsiWhiteSpace('\n\n') PsiClass:Foo PsiModifierList:public PsiKeyword:public('public') diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/IncompleteAnnotation.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/IncompleteAnnotation.txt index ff2223e78f99..55dba34d5ed9 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/IncompleteAnnotation.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/IncompleteAnnotation.txt @@ -7,9 +7,9 @@ PsiJavaFile:IncompleteAnnotation.java PsiReferenceParameterList PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n\n') PsiImportList - PsiWhiteSpace('\n\n') PsiClass:Foo PsiModifierList:public PsiKeyword:public('public') diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass1.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass1.txt index cea6a9fd048b..313cbba303bf 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass1.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass1.txt @@ -7,9 +7,9 @@ PsiJavaFile:BindBeforeClass1.java PsiReferenceParameterList PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n\n') PsiImportList - PsiWhiteSpace('\n\n') PsiClass:A PsiComment(END_OF_LINE_COMMENT)('// comment') PsiWhiteSpace('\n') diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass3.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass3.txt index fb9bfe97a11e..483844eead72 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass3.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass3.txt @@ -1,8 +1,8 @@ PsiJavaFile:BindBeforeClass3.java - PsiImportList - PsiComment(END_OF_LINE_COMMENT)('// comment') PsiWhiteSpace('\n\n') + PsiImportList + PsiClass:A PsiModifierList: diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass4.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass4.txt index dd29e7d71f22..212dd6ae67f6 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass4.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass4.txt @@ -7,10 +7,10 @@ PsiJavaFile:BindBeforeClass4.java PsiReferenceParameterList PsiJavaToken:SEMICOLON(';') + PsiComment(END_OF_LINE_COMMENT)('// comment') + PsiWhiteSpace('\n') PsiImportList - PsiComment(END_OF_LINE_COMMENT)('// comment') - PsiWhiteSpace('\n') PsiClass:A PsiModifierList: diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass6.java b/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass6.java new file mode 100644 index 000000000000..bffac86bb3fa --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass6.java @@ -0,0 +1 @@ +/* comment */class A { } \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass6.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass6.txt new file mode 100644 index 000000000000..032500077226 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/commentBinding/BindBeforeClass6.txt @@ -0,0 +1,20 @@ +PsiJavaFile:BindBeforeClass6.java + PsiImportList + + PsiClass:A + PsiComment(C_STYLE_COMMENT)('/* comment */') + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:A('A') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/method/Errors0.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/method/Errors0.txt index e778448e7665..a18a705db37e 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/method/Errors0.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/method/Errors0.txt @@ -1,8 +1,8 @@ PsiJavaFile:Errors0.java - PsiImportList - PsiComment(END_OF_LINE_COMMENT)('// illegal modifier combinations') PsiWhiteSpace('\n\n') + PsiImportList + PsiClass:a PsiModifierList:abstract public PsiKeyword:abstract('abstract') diff --git a/java/java-tests/testData/psi/parser-partial/files/BindDocComment1.txt b/java/java-tests/testData/psi/parser-partial/files/BindDocComment1.txt index bc038a924357..44939cacd57f 100644 --- a/java/java-tests/testData/psi/parser-partial/files/BindDocComment1.txt +++ b/java/java-tests/testData/psi/parser-partial/files/BindDocComment1.txt @@ -13,9 +13,9 @@ PsiJavaFile:BindDocComment1.java PsiReferenceParameterList PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n') PsiImportList - PsiWhiteSpace('\n') PsiClass:A PsiModifierList: diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/CommentBindingTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/CommentBindingTest.java index 7ba6894f30ea..55b61a535152 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/CommentBindingTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/CommentBindingTest.java @@ -21,4 +21,5 @@ public class CommentBindingTest extends JavaParsingTestCase { public void testBindBeforeClass3() { doTest(true); } public void testBindBeforeClass4() { doTest(true); } public void testBindBeforeClass5() { doTest(true); } + public void testBindBeforeClass6() { doTest(true); } } \ No newline at end of file