diff --git a/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaDocLexer.java b/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaDocLexer.java index 0592f9e916d8..000c1160ab45 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaDocLexer.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaDocLexer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,8 +32,7 @@ public class JavaDocLexer extends MergingLexerAdapter { } private JavaDocLexer(DocCommentTokenTypes tokenTypes, boolean isJdk15Enabled) { - super(new AsteriskStripperLexer(new _JavaDocLexer(isJdk15Enabled, tokenTypes), tokenTypes), - tokenTypes.spaceCommentsTokenSet()); + super(new AsteriskStripperLexer(new _JavaDocLexer(isJdk15Enabled, tokenTypes), tokenTypes), tokenTypes.spaceCommentsTokenSet()); } private static class AsteriskStripperLexer extends LexerBase { @@ -56,7 +55,7 @@ public class JavaDocLexer extends MergingLexerAdapter { @Override public final void start(@NotNull CharSequence buffer, int startOffset, int endOffset, int initialState) { myBuffer = buffer; - myBufferIndex = startOffset; + myBufferIndex = startOffset; myBufferEndOffset = endOffset; myTokenType = null; myTokenEndOffset = startOffset; @@ -97,7 +96,6 @@ public class JavaDocLexer extends MergingLexerAdapter { return myTokenEndOffset; } - @Override public final void advance() { locateToken(); @@ -154,18 +152,20 @@ public class JavaDocLexer extends MergingLexerAdapter { } if (myBufferIndex < myTokenEndOffset) { - myTokenType = lf || state == _JavaDocLexer.PARAM_TAG_SPACE || state == _JavaDocLexer.TAG_DOC_SPACE || state == _JavaDocLexer.INLINE_TAG_NAME || state == _JavaDocLexer.DOC_TAG_VALUE_IN_PAREN - ? myTokenTypes.space() - : myTokenTypes.commentData(); - + myTokenType = lf || + state == _JavaDocLexer.PARAM_TAG_SPACE || state == _JavaDocLexer.TAG_DOC_SPACE || + state == _JavaDocLexer.INLINE_TAG_NAME || state == _JavaDocLexer.DOC_TAG_VALUE_IN_PAREN + ? myTokenTypes.space() : myTokenTypes.commentData(); + return; } } - + flexLocateToken(); } private void flexLocateToken() { + //noinspection Duplicates try { myState = myFlex.yystate(); myFlex.goTo(myBufferIndex); @@ -177,4 +177,4 @@ public class JavaDocLexer extends MergingLexerAdapter { } } } -} +} \ No newline at end of file diff --git a/java/java-psi-impl/src/com/intellij/lang/java/lexer/_JavaDocLexer.flex b/java/java-psi-impl/src/com/intellij/lang/java/lexer/_JavaDocLexer.flex index b2a94e26f240..0d8ee74db1fc 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/lexer/_JavaDocLexer.flex +++ b/java/java-psi-impl/src/com/intellij/lang/java/lexer/_JavaDocLexer.flex @@ -19,8 +19,8 @@ import com.intellij.psi.tree.IElementType; } public boolean checkAhead(char c) { - if (zzMarkedPos >= zzBuffer.length()) return false; - return zzBuffer.charAt(zzMarkedPos) == c; + if (zzMarkedPos >= zzBuffer.length()) return false; + return zzBuffer.charAt(zzMarkedPos) == c; } public void goTo(int offset) { @@ -58,8 +58,8 @@ INLINE_TAG_IDENTIFIER=[^\ \t\f\n\r\}]+ "/**" { yybegin(COMMENT_DATA_START); return myTokenTypes.commentStart(); } {WHITE_DOC_SPACE_CHAR}+ { return myTokenTypes.space(); } - {WHITE_DOC_SPACE_NO_LR}+ { return myTokenTypes.commentData(); } - [\n\r]+{WHITE_DOC_SPACE_CHAR}* { return myTokenTypes.space(); } + {WHITE_DOC_SPACE_NO_LR}+ { return myTokenTypes.commentData(); } + [\n\r]+{WHITE_DOC_SPACE_CHAR}* { return myTokenTypes.space(); } {WHITE_DOC_SPACE_CHAR}+ { yybegin(COMMENT_DATA); return myTokenTypes.space(); } ({ALPHA}|[_0-9\."$"\[\]])+ { return myTokenTypes.tagValueToken(); } @@ -70,7 +70,7 @@ INLINE_TAG_IDENTIFIER=[^\ \t\f\n\r\}]+ {WHITE_DOC_SPACE_CHAR}+ { return myTokenTypes.space(); } "@param" { yybegin(PARAM_TAG_SPACE); return myTokenTypes.tagName(); } - {WHITE_DOC_SPACE_CHAR}+ {yybegin(DOC_TAG_VALUE); return myTokenTypes.space();} + {WHITE_DOC_SPACE_CHAR}+ {yybegin(DOC_TAG_VALUE); return myTokenTypes.space(); } [\<] { if (myJdk15Enabled) { yybegin(DOC_TAG_VALUE_IN_LTGT); @@ -90,11 +90,12 @@ INLINE_TAG_IDENTIFIER=[^\ \t\f\n\r\}]+ yybegin(INLINE_TAG_NAME); return myTokenTypes.inlineTagStart(); } - else{ + else { yybegin(COMMENT_DATA); return myTokenTypes.inlineTagStart(); } } + "@code" { yybegin(CODE_TAG_SPACE); return myTokenTypes.tagName(); } "@literal" { yybegin(CODE_TAG_SPACE); return myTokenTypes.tagName(); } "@"{INLINE_TAG_IDENTIFIER} { yybegin(TAG_DOC_SPACE); return myTokenTypes.tagName(); } @@ -102,19 +103,16 @@ INLINE_TAG_IDENTIFIER=[^\ \t\f\n\r\}]+ . { yybegin(COMMENT_DATA); return myTokenTypes.commentData(); } . { yybegin(CODE_TAG); return myTokenTypes.commentData(); } - "@"{TAG_IDENTIFIER} { yybegin(TAG_DOC_SPACE); return myTokenTypes.tagName(); } + "@"{TAG_IDENTIFIER} { yybegin(TAG_DOC_SPACE); return myTokenTypes.tagName(); } - {WHITE_DOC_SPACE_CHAR}+ { + {WHITE_DOC_SPACE_CHAR}+ { if (checkAhead('<') || checkAhead('\"')) yybegin(COMMENT_DATA); - else if (checkAhead('\u007b') ) yybegin(COMMENT_DATA); // lbrace - there's a error in JLex when typing lbrace directly + else if (checkAhead('\u007b')) yybegin(COMMENT_DATA); // lbrace - there's a error in JLex when typing lbrace directly else yybegin(DOC_TAG_VALUE); return myTokenTypes.space(); } - {WHITE_DOC_SPACE_CHAR}+ { - yybegin(CODE_TAG); - return myTokenTypes.space(); -} + {WHITE_DOC_SPACE_CHAR}+ { yybegin(CODE_TAG); return myTokenTypes.space(); } "*"+"/" { return myTokenTypes.commentEnd(); } [^] { return myTokenTypes.badCharacter(); } diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/JavadocParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/JavadocParser.java index 7a5020cc856c..fb696518cfac 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/JavadocParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/JavadocParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,6 @@ import com.intellij.psi.TokenType; import com.intellij.psi.impl.source.tree.JavaDocElementType; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -38,24 +37,24 @@ public class JavadocParser { public static final TokenSet SKIP_TOKENS = TokenSet.create(JavaDocTokenType.DOC_COMMENT_LEADING_ASTERISKS); - @NonNls private static final String SEE_TAG = "@see"; - @NonNls private static final String LINK_TAG = "@link"; - @NonNls private static final String LINK_PLAIN_TAG = "@linkplain"; - @NonNls private static final String THROWS_TAG = "@throws"; - @NonNls private static final String EXCEPTION_TAG = "@exception"; - @NonNls private static final String PARAM_TAG = "@param"; - @NonNls private static final String VALUE_TAG = "@value"; + private static final String SEE_TAG = "@see"; + private static final String LINK_TAG = "@link"; + private static final String LINK_PLAIN_TAG = "@linkplain"; + private static final String THROWS_TAG = "@throws"; + private static final String EXCEPTION_TAG = "@exception"; + private static final String PARAM_TAG = "@param"; + private static final String VALUE_TAG = "@value"; - private static final Key BRACE_SCOPE_KEY = Key.create("Javadoc.Parser.Brace.Scope"); + private static Key BRACE_SCOPE_KEY = Key.create("Javadoc.Parser.Brace.Scope"); private JavadocParser() { } - public static void parseJavadocReference(@NotNull final PsiBuilder builder) { + public static void parseJavadocReference(@NotNull PsiBuilder builder) { JavaParser.INSTANCE.getReferenceParser().parseJavaCodeReference(builder, true, true, false, false); swallowTokens(builder); } - public static void parseJavadocType(@NotNull final PsiBuilder builder) { + public static void parseJavadocType(@NotNull PsiBuilder builder) { JavaParser.INSTANCE.getReferenceParser().parseType(builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.ELLIPSIS | ReferenceParser.WILDCARD); swallowTokens(builder); } @@ -64,11 +63,11 @@ public class JavadocParser { while (!builder.eof()) builder.advanceLexer(); } - public static void parseDocCommentText(@NotNull final PsiBuilder builder) { + public static void parseDocCommentText(@NotNull PsiBuilder builder) { builder.enforceCommentTokens(SKIP_TOKENS); while (!builder.eof()) { - final IElementType tokenType = getTokenType(builder); + IElementType tokenType = getTokenType(builder); if (tokenType == JavaDocTokenType.DOC_TAG_NAME) { parseTag(builder); } @@ -78,19 +77,19 @@ public class JavadocParser { } } - private static void parseTag(@NotNull final PsiBuilder builder) { - final String tagName = builder.getTokenText(); - final PsiBuilder.Marker tag = builder.mark(); + private static void parseTag(PsiBuilder builder) { + String tagName = builder.getTokenText(); + PsiBuilder.Marker tag = builder.mark(); builder.advanceLexer(); while (true) { - final IElementType tokenType = getTokenType(builder); + IElementType tokenType = getTokenType(builder); if (tokenType == null || tokenType == JavaDocTokenType.DOC_TAG_NAME || tokenType == JavaDocTokenType.DOC_COMMENT_END) break; parseDataItem(builder, tagName, false); } tag.done(JavaDocElementType.DOC_TAG); } - private static void parseDataItem(@NotNull final PsiBuilder builder, @Nullable final String tagName, final boolean isInline) { + private static void parseDataItem(PsiBuilder builder, @Nullable String tagName, boolean isInline) { IElementType tokenType = getTokenType(builder); if (tokenType == JavaDocTokenType.DOC_INLINE_TAG_START) { int braceScope = getBraceScope(builder); @@ -101,7 +100,7 @@ public class JavadocParser { return; } - final PsiBuilder.Marker tag = builder.mark(); + PsiBuilder.Marker tag = builder.mark(); builder.advanceLexer(); tokenType = getTokenType(builder); @@ -136,30 +135,24 @@ public class JavadocParser { } else if (TAG_VALUES_SET.contains(tokenType)) { if (SEE_TAG.equals(tagName) && !isInline || - LINK_TAG.equals(tagName) && isInline) { + LINK_TAG.equals(tagName) && isInline || + JavaParserUtil.getLanguageLevel(builder).isAtLeast(LanguageLevel.JDK_1_4) && LINK_PLAIN_TAG.equals(tagName) && isInline) { parseSeeTagValue(builder, false); } + else if (!isInline && (THROWS_TAG.equals(tagName) || EXCEPTION_TAG.equals(tagName))) { + PsiBuilder.Marker tagValue = builder.mark(); + builder.remapCurrentToken(JavaDocElementType.DOC_REFERENCE_HOLDER); + builder.advanceLexer(); + tagValue.done(JavaDocElementType.DOC_TAG_VALUE_ELEMENT); + } + else if (!isInline && tagName != null && tagName.equals(PARAM_TAG)) { + parseSimpleTagValue(builder, true); + } + else if (JavaParserUtil.getLanguageLevel(builder).isAtLeast(LanguageLevel.JDK_1_5) && VALUE_TAG.equals(tagName) && isInline) { + parseSeeTagValue(builder, true); + } else { - if (JavaParserUtil.getLanguageLevel(builder).isAtLeast(LanguageLevel.JDK_1_4) && LINK_PLAIN_TAG.equals(tagName) && isInline) { - parseSeeTagValue(builder, false); - } - else if (!isInline && (THROWS_TAG.equals(tagName) || EXCEPTION_TAG.equals(tagName))) { - final PsiBuilder.Marker tagValue = builder.mark(); - builder.remapCurrentToken(JavaDocElementType.DOC_REFERENCE_HOLDER); - builder.advanceLexer(); - tagValue.done(JavaDocElementType.DOC_TAG_VALUE_ELEMENT); - } - else if (!isInline && tagName != null && tagName.equals(PARAM_TAG)) { - parseSimpleTagValue(builder, true); - } - else { - if (JavaParserUtil.getLanguageLevel(builder).isAtLeast(LanguageLevel.JDK_1_5) && VALUE_TAG.equals(tagName) && isInline) { - parseSeeTagValue(builder, true); - } - else { - parseSimpleTagValue(builder, false); - } - } + parseSimpleTagValue(builder, false); } } else { @@ -167,13 +160,13 @@ public class JavadocParser { } } - private static void parseSeeTagValue(@NotNull final PsiBuilder builder, boolean allowBareFieldReference) { - final IElementType tokenType = getTokenType(builder); + private static void parseSeeTagValue(PsiBuilder builder, boolean allowBareFieldReference) { + IElementType tokenType = getTokenType(builder); if (tokenType == JavaDocTokenType.DOC_TAG_VALUE_SHARP_TOKEN) { parseMethodRef(builder, builder.mark()); } else if (tokenType == JavaDocTokenType.DOC_TAG_VALUE_TOKEN) { - final PsiBuilder.Marker refStart = builder.mark(); + PsiBuilder.Marker refStart = builder.mark(); builder.remapCurrentToken(JavaDocElementType.DOC_REFERENCE_HOLDER); builder.advanceLexer(); @@ -190,13 +183,13 @@ public class JavadocParser { } } else { - final PsiBuilder.Marker tagValue = builder.mark(); + PsiBuilder.Marker tagValue = builder.mark(); builder.advanceLexer(); tagValue.done(JavaDocElementType.DOC_TAG_VALUE_ELEMENT); } } - private static void parseMethodRef(@NotNull final PsiBuilder builder, @NotNull final PsiBuilder.Marker refStart) { + private static void parseMethodRef(PsiBuilder builder, PsiBuilder.Marker refStart) { if (getTokenType(builder) == JavaDocTokenType.DOC_TAG_VALUE_SHARP_TOKEN) { builder.advanceLexer(); } @@ -209,7 +202,7 @@ public class JavadocParser { if (getTokenType(builder) == JavaDocTokenType.DOC_TAG_VALUE_LPAREN) { builder.advanceLexer(); - final PsiBuilder.Marker subValue = builder.mark(); + PsiBuilder.Marker subValue = builder.mark(); IElementType tokenType; while (TAG_VALUES_SET.contains(tokenType = getTokenType(builder))) { @@ -239,8 +232,8 @@ public class JavadocParser { refStart.done(JavaDocElementType.DOC_METHOD_OR_FIELD_REF); } - private static void parseSimpleTagValue(@NotNull final PsiBuilder builder, final boolean parameter) { - final PsiBuilder.Marker tagValue = builder.mark(); + private static void parseSimpleTagValue(PsiBuilder builder, boolean parameter) { + PsiBuilder.Marker tagValue = builder.mark(); while (TAG_VALUES_SET.contains(getTokenType(builder))) { builder.advanceLexer(); } @@ -248,7 +241,7 @@ public class JavadocParser { } @Nullable - private static IElementType getTokenType(@NotNull final PsiBuilder builder) { + private static IElementType getTokenType(PsiBuilder builder) { IElementType tokenType; while ((tokenType = builder.getTokenType()) == JavaDocTokenType.DOC_SPACE) { builder.remapCurrentToken(TokenType.WHITE_SPACE); @@ -257,19 +250,19 @@ public class JavadocParser { return tokenType; } - private static int getBraceScope(@NotNull final PsiBuilder builder) { - final Integer braceScope = builder.getUserDataUnprotected(BRACE_SCOPE_KEY); + private static int getBraceScope(PsiBuilder builder) { + Integer braceScope = builder.getUserDataUnprotected(BRACE_SCOPE_KEY); return braceScope != null ? braceScope : 0; } - private static void setBraceScope(@NotNull final PsiBuilder builder, final int braceScope) { + private static void setBraceScope(PsiBuilder builder, int braceScope) { builder.putUserDataUnprotected(BRACE_SCOPE_KEY, braceScope); } - private static void remapAndAdvance(@NotNull final PsiBuilder builder) { + private static void remapAndAdvance(PsiBuilder builder) { if (INLINE_TAG_BORDERS_SET.contains(builder.getTokenType()) && getBraceScope(builder) != 1) { builder.remapCurrentToken(JavaDocTokenType.DOC_COMMENT_DATA); } builder.advanceLexer(); } -} +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/javadocParsing/Exception0.java b/java/java-tests/testData/psi/parser-full/javadocParsing/Exception0.java index 55caef79cc60..0dd0f2cada9c 100644 --- a/java/java-tests/testData/psi/parser-full/javadocParsing/Exception0.java +++ b/java/java-tests/testData/psi/parser-full/javadocParsing/Exception0.java @@ -1,6 +1,6 @@ class Test { /** - * @throws java.lang.Exception + * @throws java.lang.Exception an exception */ - public void foo() {} + public void foo() {} } \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/javadocParsing/Exception0.txt b/java/java-tests/testData/psi/parser-full/javadocParsing/Exception0.txt index b3935666fc28..6bdb832b362f 100644 --- a/java/java-tests/testData/psi/parser-full/javadocParsing/Exception0.txt +++ b/java/java-tests/testData/psi/parser-full/javadocParsing/Exception0.txt @@ -21,7 +21,7 @@ PsiJavaFile:Exception0.java PsiDocToken:DOC_COMMENT_START('/**') PsiWhiteSpace('\n ') PsiDocToken:DOC_COMMENT_LEADING_ASTERISKS('*') - PsiDocToken:DOC_COMMENT_DATA(' ') + PsiDocToken:DOC_COMMENT_DATA(' ') PsiDocTag:@throws PsiDocToken:DOC_TAG_NAME('@throws') PsiWhiteSpace(' ') @@ -41,9 +41,11 @@ PsiJavaFile:Exception0.java PsiIdentifier:Exception('Exception') PsiReferenceParameterList + PsiWhiteSpace(' ') + PsiDocToken:DOC_COMMENT_DATA('an exception') PsiWhiteSpace('\n ') PsiDocToken:DOC_COMMENT_END('*/') - PsiWhiteSpace('\n ') + PsiWhiteSpace('\n ') PsiModifierList:public PsiKeyword:public('public') PsiTypeParameterList