fix(JDoc): Formatting and inspections issues

GitOrigin-RevId: 910e9b3335fa7c3967fb79893ecba7c69595a201
This commit is contained in:
Mathias Boulay
2024-08-14 18:24:38 +00:00
committed by intellij-monorepo-bot
parent 4766dcb03a
commit abd7b1dded
15 changed files with 254 additions and 153 deletions
@@ -850,40 +850,45 @@ class _JavaDocLexer implements FlexLexer {
case 43: break;
case 4:
{ yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.sharp();
}
return myTokenTypes.commentData();
}
// fall through
case 44: break;
case 5:
{ yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.leftParenthesis();
}
return myTokenTypes.commentData();
}
// fall through
case 45: break;
case 6:
{ yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.rightParenthesis();
}
return myTokenTypes.commentData();
}
// fall through
case 46: break;
case 7:
{ yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.leftBracket();
}
return myTokenTypes.commentData();
}
// fall through
case 47: break;
case 8:
{ yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.rightBracket();
}
return myTokenTypes.commentData();
}
// fall through
@@ -996,8 +1001,9 @@ class _JavaDocLexer implements FlexLexer {
// fall through
case 66: break;
case 27:
{ if (myMarkdownMode)
{ if (myMarkdownMode) {
return myTokenTypes.commentData();
}
return myTokenTypes.commentLeadingAsterisks();
}
// fall through
@@ -1029,8 +1035,9 @@ class _JavaDocLexer implements FlexLexer {
// fall through
case 71: break;
case 32:
{ if(myMarkdownMode)
{ if(myMarkdownMode) {
return myTokenTypes.commentData();
}
return myTokenTypes.commentEnd();
}
// fall through
@@ -1041,8 +1048,9 @@ class _JavaDocLexer implements FlexLexer {
// fall through
case 73: break;
case 34:
{ if(myMarkdownMode)
{ if(myMarkdownMode) {
return myTokenTypes.badCharacter();
}
yybegin(COMMENT_DATA_START);
return myTokenTypes.commentStart();
}
@@ -1059,15 +1067,17 @@ class _JavaDocLexer implements FlexLexer {
case 75: break;
case 36:
{ yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.codeFence();
}
return myTokenTypes.commentData();
}
// fall through
case 76: break;
case 37:
{ if (myMarkdownMode)
{ if (myMarkdownMode) {
return myTokenTypes.commentLeadingAsterisks();
}
return myTokenTypes.commentData();
}
// fall through
@@ -79,8 +79,9 @@ LEADING_TOKEN_MARKDOWN="///"
%%
<YYINITIAL> {START_COMMENT_HTML} {
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.badCharacter();
}
yybegin(COMMENT_DATA_START);
return myTokenTypes.commentStart();
}
@@ -123,8 +124,9 @@ LEADING_TOKEN_MARKDOWN="///"
<COMMENT_DATA_START, COMMENT_DATA> {
{CODE_FENCE} {
yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.codeFence();
}
return myTokenTypes.commentData();
}
@@ -136,33 +138,38 @@ LEADING_TOKEN_MARKDOWN="///"
"#" {
yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.sharp();
}
return myTokenTypes.commentData();
}
\[ {
yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.leftBracket();
}
return myTokenTypes.commentData();
}
\] {
yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.rightBracket();
}
return myTokenTypes.commentData();
}
\( {
yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.leftParenthesis();
}
return myTokenTypes.commentData();
}
\) {
yybegin(COMMENT_DATA);
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.rightParenthesis();
}
return myTokenTypes.commentData();
}
}
@@ -209,13 +216,15 @@ SNIPPET_ATTRIBUTE_VALUE_SINGLE_QUOTES, SNIPPET_TAG_COMMENT_DATA_UNTIL_COLON> "}"
: { yybegin(SNIPPET_TAG_BODY_DATA); return myTokenTypes.tagValueColon(); }
{LEADING_TOKEN_HTML} {
if (myMarkdownMode)
if (myMarkdownMode) {
return myTokenTypes.commentData();
}
return myTokenTypes.commentLeadingAsterisks();
}
{LEADING_TOKEN_MARKDOWN} {
if (myMarkdownMode)
if (myMarkdownMode) {
return myTokenTypes.commentLeadingAsterisks();
}
return myTokenTypes.commentData();
}
@@ -250,8 +259,9 @@ SNIPPET_ATTRIBUTE_VALUE_SINGLE_QUOTES, SNIPPET_TAG_COMMENT_DATA_UNTIL_COLON> "}"
<CODE_TAG, CODE_TAG_SPACE> {WHITE_DOC_SPACE_CHAR}+ { yybegin(CODE_TAG); return myTokenTypes.space(); }
"*"+"/" {
if(myMarkdownMode)
if(myMarkdownMode) {
return myTokenTypes.commentData();
}
return myTokenTypes.commentEnd();
}
[^] { return myTokenTypes.badCharacter(); }
@@ -163,116 +163,124 @@ public final class BasicJavaDocParser {
}
}
else if (tokenType == JavaDocTokenType.DOC_CODE_FENCE) {
if (getBraceScope(builder) > 0) {
builder.remapCurrentToken(JavaDocTokenType.DOC_COMMENT_DATA);
builder.advanceLexer();
return;
}
char fenceStart = builder.getOriginalText().charAt(builder.getCurrentOffset());
PsiBuilder.Marker tag = builder.mark();
while (!builder.eof()) {
builder.advanceLexer();
if (getTokenType(builder) == JavaDocTokenType.DOC_CODE_FENCE &&
builder.getOriginalText().charAt(builder.getCurrentOffset()) == fenceStart) {
break;
}
else {
builder.remapCurrentToken(JavaDocTokenType.DOC_COMMENT_DATA);
}
}
if (!builder.eof()) {
builder.advanceLexer();
}
tag.done(javaDocElementTypeContainer.DOC_MARKDOWN_CODE_BLOCK);
parseCodeBlock(builder, javaDocElementTypeContainer);
}
else if (tokenType == JavaDocTokenType.DOC_LBRACKET) {
builder.setDebugMode(true);
boolean hasLabel = true;
PsiBuilder.Marker tag = builder.mark();
// Step 1 ensure that we have a label
int leftBracketCount = 1;
int rightBracketCount = 0;
int startLabelOffset = builder.getCurrentOffset();
int endLabelOffset;
while (!builder.eof()) {
IElementType token = findInlineToken(builder, JavaDocTokenType.DOC_RBRACKET, JavaDocTokenType.DOC_LBRACKET, true);
if (token == JavaDocTokenType.DOC_LBRACKET) {
leftBracketCount++;
continue;
}
if (token == JavaDocTokenType.DOC_RBRACKET) {
rightBracketCount++;
if (leftBracketCount == rightBracketCount) break;
}
}
endLabelOffset = builder.getCurrentOffset();
boolean isShortRefEmpty = endLabelOffset - startLabelOffset <= 1;
if (leftBracketCount != rightBracketCount || isShortRefEmpty) {
tag.rollbackTo();
builder.advanceLexer();
return;
}
IElementType firstReferenceToken = findInlineToken(builder, JavaDocTokenType.DOC_LBRACKET, JavaDocTokenType.DOC_SPACE, false);
if (firstReferenceToken != JavaDocTokenType.DOC_LBRACKET) {
if (leftBracketCount > 1 || firstReferenceToken == JavaDocTokenType.DOC_LPAREN) {
tag.rollbackTo();
builder.advanceLexer();
return;
}
hasLabel = false;
}
// Step 2 get the reference for full reference link
if (hasLabel) {
if (findInlineToken(builder, JavaDocTokenType.DOC_RBRACKET, JavaDocTokenType.DOC_LBRACKET, true) != JavaDocTokenType.DOC_RBRACKET) {
if (leftBracketCount > 1) {
tag.rollbackTo();
builder.advanceLexer();
return;
}
hasLabel = false;
}
}
// Step 3, parse the content
tag.rollbackTo();
tag = builder.mark();
if (hasLabel) {
while (!builder.eof()) {
builder.advanceLexer();
if (builder.getCurrentOffset() < endLabelOffset) {
builder.remapCurrentToken(JavaDocTokenType.DOC_COMMENT_DATA);
}
else {
break;
}
}
builder.advanceLexer();
}
// Parse the reference itself
builder.advanceLexer();
parseMarkdownReference(builder, javaDocElementTypeContainer);
builder.advanceLexer();
tag.done(javaDocElementTypeContainer.DOC_MARKDOWN_REFERENCE_LINK);
parseMarkdownReferenceChecked(builder, javaDocElementTypeContainer);
}
else {
remapAndAdvance(builder);
}
}
private static void parseCodeBlock(PsiBuilder builder,
AbstractBasicJavaDocElementTypeFactory.@NotNull JavaDocElementTypeContainer javaDocElementTypeContainer) {
if (getBraceScope(builder) > 0) {
builder.remapCurrentToken(JavaDocTokenType.DOC_COMMENT_DATA);
builder.advanceLexer();
return;
}
// Store the fence type, a fenced code block can only be closed by the same fence type
char fenceStart = builder.getTokenText().charAt(0);
PsiBuilder.Marker tag = builder.mark();
// Look for the nearest closing code fence, converting everything inside as comment data
while (!builder.eof()) {
builder.advanceLexer();
if (getTokenType(builder) == JavaDocTokenType.DOC_CODE_FENCE && builder.getTokenText().charAt(0) == fenceStart) {
break;
}
builder.remapCurrentToken(JavaDocTokenType.DOC_COMMENT_DATA);
}
if (!builder.eof()) {
builder.advanceLexer();
}
tag.done(javaDocElementTypeContainer.DOC_MARKDOWN_CODE_BLOCK);
}
/** Ensure a reference link is good before parsing it */
private static void parseMarkdownReferenceChecked(PsiBuilder builder, @NotNull AbstractBasicJavaDocElementTypeFactory.JavaDocElementTypeContainer javaDocElementTypeContainer) {
boolean hasLabel = true;
PsiBuilder.Marker tag = builder.mark();
// Step 1 ensure that we have a label
int leftBracketCount = 1;
int rightBracketCount = 0;
int startLabelOffset = builder.getCurrentOffset();
int endLabelOffset;
// Labels are allowed balanced brackets, count each side
while (!builder.eof()) {
IElementType token = findInlineToken(builder, JavaDocTokenType.DOC_RBRACKET, JavaDocTokenType.DOC_LBRACKET, true);
if (token == JavaDocTokenType.DOC_LBRACKET) {
leftBracketCount++;
continue;
}
if (token == JavaDocTokenType.DOC_RBRACKET) {
rightBracketCount++;
if (leftBracketCount == rightBracketCount) break;
}
}
endLabelOffset = builder.getCurrentOffset();
boolean isShortRefEmpty = endLabelOffset - startLabelOffset <= 1;
if (leftBracketCount != rightBracketCount || isShortRefEmpty) {
// Stop if unbalanced brackets/empty reference
tag.rollbackTo();
builder.advanceLexer();
return;
}
IElementType firstReferenceToken = findInlineToken(builder, JavaDocTokenType.DOC_LBRACKET, JavaDocTokenType.DOC_SPACE, false);
if (firstReferenceToken != JavaDocTokenType.DOC_LBRACKET) {
hasLabel = false;
// The label is actually a reference, verify brackets balance or if we have a normal markdown link
if (leftBracketCount > 1 || firstReferenceToken == JavaDocTokenType.DOC_LPAREN) {
tag.rollbackTo();
builder.advanceLexer();
return;
}
}
// Step 2 get the reference for full reference link
if (hasLabel) {
if (findInlineToken(builder, JavaDocTokenType.DOC_RBRACKET, JavaDocTokenType.DOC_LBRACKET, true) != JavaDocTokenType.DOC_RBRACKET) {
hasLabel = false;
// The label is actually a reference, verify brackets balance
if (leftBracketCount > 1) {
tag.rollbackTo();
builder.advanceLexer();
return;
}
}
}
// Step 3, validity ensured, parse the link
tag.rollbackTo();
tag = builder.mark();
if (hasLabel) {
// Label range already known, mark it as comment data
while (!builder.eof()) {
builder.advanceLexer();
if (builder.getCurrentOffset() < endLabelOffset) {
builder.remapCurrentToken(JavaDocTokenType.DOC_COMMENT_DATA);
continue;
}
break;
}
builder.advanceLexer();
}
// Parse the reference itself
builder.advanceLexer();
parseMarkdownReference(builder, javaDocElementTypeContainer);
builder.advanceLexer();
tag.done(javaDocElementTypeContainer.DOC_MARKDOWN_REFERENCE_LINK);
}
private static void parseMarkdownReference(@NotNull PsiBuilder builder,
@NotNull AbstractBasicJavaDocElementTypeFactory.JavaDocElementTypeContainer javaDocElementTypeContainer) {
PsiBuilder.Marker refStart = builder.mark();
@@ -320,12 +328,18 @@ public final class BasicJavaDocParser {
refStart.drop();
}
/** Look for the token provided by `needle`, taking into account markdown line break rules */
/**
* Look for the token provided by `needle`, taking into account markdown line break rules
* @param travelToken The token that is either allowed or disallowed to encounter while looking for the `needle`
* @param isTravelTokenDisallowed When `true`, the `travelToken` will abort the search
* When `false`, encountering something other than `travelToken` or `needle` will abort the search
* @return The last token encountered during the search.
*/
@Contract(mutates = "param1")
private static @Nullable IElementType findInlineToken(@NotNull PsiBuilder builder,
IElementType needle,
IElementType travelToken,
boolean areDisallowed) {
boolean isTravelTokenDisallowed) {
IElementType token = null;
IElementType previousToken;
while (!builder.eof()) {
@@ -336,7 +350,7 @@ public final class BasicJavaDocParser {
return token;
}
boolean travelTokenFound = travelToken == token;
if ((areDisallowed && travelTokenFound) || (!areDisallowed && !travelTokenFound)) {
if ((isTravelTokenDisallowed && travelTokenFound) || (!isTravelTokenDisallowed && !travelTokenFound)) {
break;
}
@@ -525,7 +539,8 @@ public final class BasicJavaDocParser {
refStart.done(javaDocElementTypeContainer.DOC_METHOD_OR_FIELD_REF);
}
private static void parseParameterRef(@NotNull PsiBuilder builder, @NotNull AbstractBasicJavaDocElementTypeFactory.JavaDocElementTypeContainer javaDocElementTypeContainer) {
private static void parseParameterRef(@NotNull PsiBuilder builder,
@NotNull AbstractBasicJavaDocElementTypeFactory.JavaDocElementTypeContainer javaDocElementTypeContainer) {
PsiBuilder.Marker tagValue = builder.mark();
while (TAG_VALUES_SET.contains(getTokenType(builder))) builder.advanceLexer();
tagValue.done(javaDocElementTypeContainer.DOC_PARAMETER_REF);