Skip to content

Commit 3667a70

Browse files
Multiline @code Tag Drops Curly Brackets in AST View
The curly brackets inside the multiline @code tag are not represented in the AST view and are effectively eliminated. Fix: #4683
1 parent 8499f8a commit 3667a70

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,8 @@ protected boolean commentParse() {
375375
pushText(this.textStart, textEndPosition);
376376
}
377377
refreshInlineTagPosition(previousPosition);
378+
} else if ((this.source[this.index] == '\n' || this.source[this.index] == '\r') && previousChar == ' ') {
379+
pushText(previousPosition, this.index); // Enables adding closing curly brackets to node elements in Javadoc when the TagElement spans multiple lines
378380
}
379381
if (!isFormatterParser && !treatAsText && (!this.inlineReturn || this.inlineReturnOpenBraces <= 0))
380382
this.textStart = this.index;
@@ -409,6 +411,9 @@ protected boolean commentParse() {
409411
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=206345: count opening braces when ignoring tags
410412
if (considerTagAsPlainText) {
411413
openingBraces++;
414+
if (this.source[this.index] == '\n' || this.source[this.index] == '\r') {
415+
pushText(this.textStart, this.index); // Enables adding opening curly brackets to node elements in Javadoc when the TagElement spans multiple lines
416+
}
412417
} else if (this.inlineTagStarted) {
413418
if (this.tagValue == TAG_RETURN_VALUE) {
414419
this.inlineReturn= true;

org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterJavadocTest.java

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3482,6 +3482,10 @@ public class X {}
34823482
TagElement tagElement = (TagElement) docComment.tags().get(0);
34833483
List<TagElement> listFrag = tagElement.fragments();
34843484
assumeEquals("wrong number of tags", 1, listFrag.size());
3485+
assumeEquals("Invalid content", "{@code public class Example { final int a = 1; } }", listFrag.get(0).toString());
3486+
List<TextElement> textElementFrag = listFrag.get(0).fragments();
3487+
assumeEquals("wrong number of frags", 1, listFrag.size());
3488+
assumeEquals("Invalid content", " public class Example { final int a = 1; } ", textElementFrag.get(0).getText());
34853489
}
34863490

34873491
public void testContentOfCodeParsedOutside4615_02() throws JavaModelException {
@@ -3507,6 +3511,9 @@ public class X {}
35073511
assumeEquals("wrong number of frags", 1, frags.size());
35083512
TagElement problematicTag = (TagElement) frags.get(0);
35093513
assumeEquals("invalid content", "{@code com/{filename:\\w+}.jsp}", problematicTag.toString());
3514+
List<TextElement> textElementFrag = problematicTag.fragments();
3515+
assumeEquals("wrong number of frags", 1, textElementFrag.size());
3516+
assumeEquals("Invalid content", " com/{filename:\\w+}.jsp", textElementFrag.get(0).getText());
35103517
}
35113518

35123519
public void testContentOfCodeParsedOutside4615_03() throws JavaModelException {
@@ -3531,6 +3538,9 @@ public class X {}
35313538
List<TagElement> listFrag = tagElement.fragments();
35323539
assumeEquals("wrong number of tags", 1, listFrag.size());
35333540
assumeEquals("Invalid content", "{@code public class X { void foo() { int x; } } }", listFrag.get(0).toString());
3541+
List<TextElement> textElementFrag = listFrag.get(0).fragments();
3542+
assumeEquals("wrong number of frags", 1, textElementFrag.size());
3543+
assumeEquals("Invalid content", " public class X { void foo() { int x; } } ", textElementFrag.get(0).getText());
35343544
}
35353545

35363546
public void testContentOfCodeParsedOutside4615_04() throws JavaModelException {
@@ -3555,6 +3565,9 @@ public class X {}
35553565
List<TagElement> listFrag = tagElement.fragments();
35563566
assumeEquals("wrong number of tags", 1, listFrag.size());
35573567
assumeEquals("Invalid content", "{@code public class Example { final int sasi; } class B{}}", listFrag.get(0).toString());
3568+
List<TextElement> textElementFrag = listFrag.get(0).fragments();
3569+
assumeEquals("wrong number of frags", 1, textElementFrag.size());
3570+
assumeEquals("Invalid content", " public class Example { final int sasi; } class B{}", textElementFrag.get(0).getText());
35583571
}
35593572

35603573
//code tag in multiple lines
@@ -3582,5 +3595,99 @@ public class X {}
35823595
assumeEquals("wrong number of frags", 1, frags.size());
35833596
TagElement problematicTag = (TagElement) frags.get(0);
35843597
assumeEquals("invalid content", "{@code com/{filename:\\w+}.jsp}", problematicTag.toString());
3598+
List<TextElement> textElementFrag = problematicTag.fragments();
3599+
assumeEquals("wrong number of frags", 2, textElementFrag.size());
3600+
assumeEquals("Invalid first textElement content", " com/{filename:\\w+}", textElementFrag.get(0).getText());
3601+
assumeEquals("Invalid second textElement content", ".jsp", textElementFrag.get(1).getText());
3602+
}
3603+
3604+
public void testMultulineCodeDropCurlyBrackets4683_01() throws JavaModelException {
3605+
this.workingCopies = new ICompilationUnit[1];
3606+
this.astLevel = AST.JLS25;
3607+
this.workingCopies[0] = getWorkingCopy("/Converter25/src/javadoc/Markdown.java",
3608+
"""
3609+
/**
3610+
* Performs:
3611+
* <pre>{@code
3612+
* for (String s : strings) {
3613+
* if (s.equals(value)) {
3614+
* return 0;
3615+
* }
3616+
* if (s.startsWith(value)) {
3617+
* return 1;
3618+
* }
3619+
* }
3620+
* return -1;
3621+
* }</pre>
3622+
*/
3623+
public class Markdown {}
3624+
"""
3625+
);
3626+
CompilationUnit compilUnit = (CompilationUnit) runConversion(this.workingCopies[0], true);
3627+
List unitComments = compilUnit.getCommentList();
3628+
assertEquals("Wrong number of comments", 1, unitComments.size());
3629+
Comment comment = (Comment) unitComments.get(0);
3630+
assertEquals("Comment should be javadoc", comment.getNodeType(), ASTNode.JAVADOC);
3631+
Javadoc docComment = (Javadoc) compilUnit.getCommentList().get(0);
3632+
assumeEquals("wrong number of tags", 1, docComment.tags().size());
3633+
TagElement parentTag = (TagElement) docComment.tags().get(0);
3634+
List<?> frags = parentTag.fragments();
3635+
TagElement thirdTag = (TagElement) frags.get(2);
3636+
List<TextElement> textFrags = thirdTag.fragments();
3637+
assumeEquals("wrong number of TextElements", 9, textFrags.size());
3638+
assumeEquals("Invalid first TextElement content","for (String s : strings) {" , textFrags.get(0).getText());
3639+
assumeEquals("Invalid second TextElement content","if (s.equals(value)) {" , textFrags.get(1).getText());
3640+
assumeEquals("Invalid third TextElement content","return 0;" , textFrags.get(2).getText());
3641+
assumeEquals("Invalid fourth TextElement content","}" , textFrags.get(3).getText());
3642+
assumeEquals("Invalid fifth TextElement content","if (s.startsWith(value)) {" , textFrags.get(4).getText());
3643+
assumeEquals("Invalid sixth TextElement content","return 1;" , textFrags.get(5).getText());
3644+
assumeEquals("Invalid seventh TextElement content","}" , textFrags.get(6).getText());
3645+
assumeEquals("Invalid eighth TextElement content","}" , textFrags.get(7).getText());
3646+
assumeEquals("Invalid nineth TextElement content","return -1;" , textFrags.get(8).getText());
3647+
}
3648+
3649+
public void testMultulineCodeDropCurlyBrackets4683_02() throws JavaModelException {
3650+
this.workingCopies = new ICompilationUnit[1];
3651+
this.astLevel = AST.JLS25;
3652+
this.workingCopies[0] = getWorkingCopy("/Converter25/src/javadoc/Markdown.java",
3653+
"""
3654+
/**
3655+
* Performs:
3656+
* <pre>{@literal
3657+
* for (String s : strings) {
3658+
* if (s.equals(value)) {
3659+
* return 0;
3660+
* }
3661+
* if (s.startsWith(value)) {
3662+
* return 1;
3663+
* }
3664+
* }
3665+
* return -1;
3666+
* }</pre>
3667+
*/
3668+
public class Markdown {}
3669+
"""
3670+
);
3671+
CompilationUnit compilUnit = (CompilationUnit) runConversion(this.workingCopies[0], true);
3672+
List unitComments = compilUnit.getCommentList();
3673+
assertEquals("Wrong number of comments", 1, unitComments.size());
3674+
Comment comment = (Comment) unitComments.get(0);
3675+
assertEquals("Comment should be javadoc", comment.getNodeType(), ASTNode.JAVADOC);
3676+
Javadoc docComment = (Javadoc) compilUnit.getCommentList().get(0);
3677+
assumeEquals("wrong number of tags", 1, docComment.tags().size());
3678+
TagElement parentTag = (TagElement) docComment.tags().get(0);
3679+
List<?> frags = parentTag.fragments();
3680+
TagElement thirdTag = (TagElement) frags.get(2);
3681+
List<TextElement> textFrags = thirdTag.fragments();
3682+
assumeEquals("wrong number of TextElements", 9, textFrags.size());
3683+
assumeEquals("Invalid first TextElement content","for (String s : strings) {" , textFrags.get(0).getText());
3684+
assumeEquals("Invalid second TextElement content","if (s.equals(value)) {" , textFrags.get(1).getText());
3685+
assumeEquals("Invalid third TextElement content","return 0;" , textFrags.get(2).getText());
3686+
assumeEquals("Invalid fourth TextElement content","}" , textFrags.get(3).getText());
3687+
assumeEquals("Invalid fifth TextElement content","if (s.startsWith(value)) {" , textFrags.get(4).getText());
3688+
assumeEquals("Invalid sixth TextElement content","return 1;" , textFrags.get(5).getText());
3689+
assumeEquals("Invalid seventh TextElement content","}" , textFrags.get(6).getText());
3690+
assumeEquals("Invalid eighth TextElement content","}" , textFrags.get(7).getText());
3691+
assumeEquals("Invalid nineth TextElement content","return -1;" , textFrags.get(8).getText());
35853692
}
35863693
}

0 commit comments

Comments
 (0)