diff --git a/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/KDoc.flex b/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/KDoc.flex index 7a1cbd60f21..923e60e53be 100644 --- a/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/KDoc.flex +++ b/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/KDoc.flex @@ -4,6 +4,7 @@ import com.intellij.lexer.FlexLexer; import com.intellij.psi.TokenType; import com.intellij.psi.tree.IElementType; import com.intellij.util.text.CharArrayUtil; +import java.lang.Character; %% @@ -16,13 +17,21 @@ import com.intellij.util.text.CharArrayUtil; this((java.io.Reader)null); } - private final boolean isLastToken() { + private boolean isLastToken() { return zzMarkedPos == zzBuffer.length(); } - private final Boolean yytextContainLineBreaks() { + private Boolean yytextContainLineBreaks() { return CharArrayUtil.containLineBreaks(zzBuffer, zzStartRead, zzMarkedPos); } + + private boolean nextIsNotWhitespace() { + return zzMarkedPos <= zzBuffer.length() && !Character.isWhitespace(zzBuffer.charAt(zzMarkedPos + 1)); + } + + private boolean prevIsNotWhitespace() { + return zzMarkedPos != 0 && !Character.isWhitespace(zzBuffer.charAt(zzMarkedPos - 1)); + } %} %function advance @@ -31,12 +40,21 @@ import com.intellij.util.text.CharArrayUtil; return; %eof} -%state CONTENTS %state LINE_BEGINNING +%state CONTENTS_BEGINNING +%state CONTENTS +%state CODE +%state CODE2 WHITE_SPACE_CHAR =[\ \t\f\n\r] NOT_WHITE_SPACE_CHAR=[^\ \t\f\n\r] +DIGIT=[0-9] +ALPHA=[:jletter:] +TAG_NAME={ALPHA}({ALPHA}|{DIGIT})* + +MARKDOWN_EMPHASIS=[\*_] + %% @@ -45,22 +63,33 @@ NOT_WHITE_SPACE_CHAR=[^\ \t\f\n\r] "*"+ "/" { if (isLastToken()) return KDocTokens.END; else return KDocTokens.TEXT; } - "*"+ { yybegin(CONTENTS); + "*"+ { yybegin(CONTENTS_BEGINNING); return KDocTokens.LEADING_ASTERISK; } - { + "@"{TAG_NAME} { yybegin(CONTENTS); + return KDocTokens.TAG_NAME; } + + { {WHITE_SPACE_CHAR}+ { if (yytextContainLineBreaks()) { yybegin(LINE_BEGINNING); return TokenType.WHITE_SPACE; } else { - yybegin(CONTENTS); + yybegin(yystate() == CONTENTS_BEGINNING? CONTENTS_BEGINNING:CONTENTS); return KDocTokens.TEXT; // internal white space } } - . { yybegin(CONTENTS); - return KDocTokens.TEXT; } + "\\"[\[\]] { yybegin(CONTENTS); + return KDocTokens.MARKDOWN_ESCAPED_CHAR; } + + "[[" { yybegin(CONTENTS); + return KDocTokens.WIKI_LINK_OPEN; } + "]]" { yybegin(CONTENTS); + return KDocTokens.WIKI_LINK_CLOSE; } + + . { yybegin(CONTENTS); + return KDocTokens.TEXT; } } . { return TokenType.BAD_CHARACTER; } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/KDocTokens.java b/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/KDocTokens.java index 92bdb3cbb86..da637335958 100644 --- a/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/KDocTokens.java +++ b/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/KDocTokens.java @@ -23,6 +23,7 @@ import com.intellij.lang.PsiParser; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.ILazyParseableElementType; +import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.kdoc.parser.KDocParser; import org.jetbrains.jet.kdoc.psi.impl.KDocImpl; @@ -53,4 +54,11 @@ public interface KDocTokens { KDocToken LEADING_ASTERISK = new KDocToken("KDOC_LEADING_ASTERISK"); KDocToken TEXT = new KDocToken("KDOC_TEXT"); + KDocToken TAG_NAME = new KDocToken("KDOC_TAG_NAME"); + KDocToken WIKI_LINK_OPEN = new KDocToken("KDOC_WIKI_LINK_OPEN"); + KDocToken WIKI_LINK_CLOSE = new KDocToken("KDOC_WIKI_LINK_CLOSE"); + + KDocToken MARKDOWN_ESCAPED_CHAR = new KDocToken("KDOC_MARKDOWN_ESCAPED_CHAR"); + + TokenSet CONTENT_TOKENS = TokenSet.create(START, END, LEADING_ASTERISK, TEXT, WIKI_LINK_OPEN, WIKI_LINK_CLOSE, MARKDOWN_ESCAPED_CHAR); } diff --git a/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/_KDocLexer.java b/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/_KDocLexer.java index c813e40dc93..373b9284e9a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/_KDocLexer.java +++ b/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/_KDocLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 25.05.13 15:08 */ +/* The following code was generated by JFlex 1.4.3 on 25.05.13 16:39 */ package org.jetbrains.jet.kdoc.lexer; @@ -11,7 +11,7 @@ import com.intellij.util.text.CharArrayUtil; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 25.05.13 15:08 from the specification file + * on 25.05.13 16:39 from the specification file * /Users/factitious/Documents/kotlin/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/KDoc.flex */ class _KDocLexer implements FlexLexer { @@ -19,11 +19,12 @@ class _KDocLexer implements FlexLexer { private static final int ZZ_BUFFERSIZE = 16384; /** lexical states */ - public static final int LINE_BEGINNING = 8; - public static final int STRONG_CONTENTS = 6; - public static final int CONTENTS = 2; + public static final int CODE = 8; + public static final int CONTENTS_BEGINNING = 4; + public static final int CODE2 = 10; + public static final int LINE_BEGINNING = 2; + public static final int CONTENTS = 6; public static final int YYINITIAL = 0; - public static final int EMPHASIS_CONTENTS = 4; /** * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l @@ -32,15 +33,74 @@ class _KDocLexer implements FlexLexer { * l is of the form l = 2*k, k a non negative integer */ private static final int ZZ_LEXSTATE[] = { - 0, 0, 1, 1, 1, 1, 1, 1, 2, 2 + 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4 }; /** * Translates characters to character classes */ private static final String ZZ_CMAP_PACKED = - "\11\0\1\1\1\4\1\0\2\1\22\0\1\1\11\0\1\3\4\0"+ - "\1\2\uffd0\0"; + "\11\0\1\1\1\12\1\0\2\1\22\0\1\1\3\0\1\3\5\0"+ + "\1\4\4\0\1\5\12\2\6\0\1\6\32\3\1\11\1\7\1\10"+ + "\1\0\1\3\1\0\32\3\47\0\4\3\4\0\1\3\12\0\1\3"+ + "\4\0\1\3\5\0\27\3\1\0\37\3\1\0\u013f\3\31\0\162\3"+ + "\4\0\14\3\16\0\5\3\11\0\1\3\213\0\1\3\13\0\1\3"+ + "\1\0\3\3\1\0\1\3\1\0\24\3\1\0\54\3\1\0\46\3"+ + "\1\0\5\3\4\0\202\3\10\0\105\3\1\0\46\3\2\0\2\3"+ + "\6\0\20\3\41\0\46\3\2\0\1\3\7\0\47\3\110\0\33\3"+ + "\5\0\3\3\56\0\32\3\5\0\13\3\43\0\2\3\1\0\143\3"+ + "\1\0\1\3\17\0\2\3\7\0\2\3\12\0\3\3\2\0\1\3"+ + "\20\0\1\3\1\0\36\3\35\0\3\3\60\0\46\3\13\0\1\3"+ + "\u0152\0\66\3\3\0\1\3\22\0\1\3\7\0\12\3\43\0\10\3"+ + "\2\0\2\3\2\0\26\3\1\0\7\3\1\0\1\3\3\0\4\3"+ + "\3\0\1\3\36\0\2\3\1\0\3\3\16\0\4\3\21\0\6\3"+ + "\4\0\2\3\2\0\26\3\1\0\7\3\1\0\2\3\1\0\2\3"+ + "\1\0\2\3\37\0\4\3\1\0\1\3\23\0\3\3\20\0\11\3"+ + "\1\0\3\3\1\0\26\3\1\0\7\3\1\0\2\3\1\0\5\3"+ + "\3\0\1\3\22\0\1\3\17\0\2\3\17\0\1\3\23\0\10\3"+ + "\2\0\2\3\2\0\26\3\1\0\7\3\1\0\2\3\1\0\5\3"+ + "\3\0\1\3\36\0\2\3\1\0\3\3\17\0\1\3\21\0\1\3"+ + "\1\0\6\3\3\0\3\3\1\0\4\3\3\0\2\3\1\0\1\3"+ + "\1\0\2\3\3\0\2\3\3\0\3\3\3\0\10\3\1\0\3\3"+ + "\77\0\1\3\13\0\10\3\1\0\3\3\1\0\27\3\1\0\12\3"+ + "\1\0\5\3\46\0\2\3\43\0\10\3\1\0\3\3\1\0\27\3"+ + "\1\0\12\3\1\0\5\3\3\0\1\3\40\0\1\3\1\0\2\3"+ + "\43\0\10\3\1\0\3\3\1\0\27\3\1\0\20\3\46\0\2\3"+ + "\43\0\22\3\3\0\30\3\1\0\11\3\1\0\1\3\2\0\7\3"+ + "\72\0\60\3\1\0\2\3\13\0\10\3\72\0\2\3\1\0\1\3"+ + "\2\0\2\3\1\0\1\3\2\0\1\3\6\0\4\3\1\0\7\3"+ + "\1\0\3\3\1\0\1\3\1\0\1\3\2\0\2\3\1\0\4\3"+ + "\1\0\2\3\11\0\1\3\2\0\5\3\1\0\1\3\25\0\2\3"+ + "\42\0\1\3\77\0\10\3\1\0\42\3\35\0\4\3\164\0\42\3"+ + "\1\0\5\3\1\0\2\3\45\0\6\3\112\0\46\3\12\0\51\3"+ + "\7\0\132\3\5\0\104\3\5\0\122\3\6\0\7\3\1\0\77\3"+ + "\1\0\1\3\1\0\4\3\2\0\7\3\1\0\1\3\1\0\4\3"+ + "\2\0\47\3\1\0\1\3\1\0\4\3\2\0\37\3\1\0\1\3"+ + "\1\0\4\3\2\0\7\3\1\0\1\3\1\0\4\3\2\0\7\3"+ + "\1\0\7\3\1\0\27\3\1\0\37\3\1\0\1\3\1\0\4\3"+ + "\2\0\7\3\1\0\47\3\1\0\23\3\105\0\125\3\14\0\u026c\3"+ + "\2\0\10\3\12\0\32\3\5\0\113\3\3\0\3\3\17\0\15\3"+ + "\1\0\4\3\16\0\22\3\16\0\22\3\16\0\15\3\1\0\3\3"+ + "\17\0\64\3\43\0\1\3\3\0\2\3\103\0\130\3\10\0\51\3"+ + "\127\0\35\3\63\0\36\3\2\0\5\3\u038b\0\154\3\224\0\234\3"+ + "\4\0\132\3\6\0\26\3\2\0\6\3\2\0\46\3\2\0\6\3"+ + "\2\0\10\3\1\0\1\3\1\0\1\3\1\0\1\3\1\0\37\3"+ + "\2\0\65\3\1\0\7\3\1\0\1\3\3\0\3\3\1\0\7\3"+ + "\3\0\4\3\2\0\6\3\4\0\15\3\5\0\3\3\1\0\7\3"+ + "\102\0\2\3\23\0\1\3\34\0\1\3\15\0\1\3\40\0\22\3"+ + "\120\0\1\3\4\0\1\3\2\0\12\3\1\0\1\3\3\0\5\3"+ + "\6\0\1\3\1\0\1\3\1\0\1\3\1\0\4\3\1\0\3\3"+ + "\1\0\7\3\3\0\3\3\5\0\5\3\26\0\44\3\u0e81\0\3\3"+ + "\31\0\11\3\7\0\5\3\2\0\5\3\4\0\126\3\6\0\3\3"+ + "\1\0\137\3\5\0\50\3\4\0\136\3\21\0\30\3\70\0\20\3"+ + "\u0200\0\u19b6\3\112\0\u51a6\3\132\0\u048d\3\u0773\0\u2ba4\3\u215c\0\u012e\3"+ + "\2\0\73\3\225\0\7\3\14\0\5\3\5\0\1\3\1\0\12\3"+ + "\1\0\15\3\1\0\5\3\1\0\1\3\1\0\2\3\1\0\2\3"+ + "\1\0\154\3\41\0\u016b\3\22\0\100\3\2\0\66\3\50\0\15\3"+ + "\66\0\2\3\30\0\3\3\31\0\1\3\6\0\5\3\1\0\207\3"+ + "\7\0\1\3\34\0\32\3\4\0\1\3\1\0\32\3\12\0\132\3"+ + "\3\0\6\3\2\0\6\3\2\0\6\3\2\0\3\3\3\0\2\3"+ + "\3\0\2\3\31\0"; /** * Translates characters to character classes @@ -53,11 +113,11 @@ class _KDocLexer implements FlexLexer { private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\3\0\3\1\1\2\1\3\1\2\1\4\1\0\1\5"+ - "\1\0\1\6"; + "\5\0\3\1\1\2\1\3\1\4\5\2\1\0\1\5"+ + "\1\0\1\6\1\7\1\10\1\11\1\12"; private static int [] zzUnpackAction() { - int [] result = new int[14]; + int [] result = new int[24]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -82,11 +142,12 @@ class _KDocLexer implements FlexLexer { private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\5\0\12\0\17\0\24\0\31\0\17\0\36"+ - "\0\31\0\43\0\50\0\17\0\31\0\17"; + "\0\0\0\13\0\26\0\41\0\54\0\67\0\102\0\115"+ + "\0\67\0\130\0\143\0\156\0\171\0\204\0\102\0\217"+ + "\0\102\0\67\0\232\0\67\0\67\0\67\0\245\0\67"; private static int [] zzUnpackRowMap() { - int [] result = new int[14]; + int [] result = new int[24]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -109,13 +170,17 @@ class _KDocLexer implements FlexLexer { private static final int [] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = - "\2\4\1\5\1\6\1\0\1\7\1\10\1\7\1\11"+ - "\1\10\1\7\1\10\1\7\1\12\1\10\10\0\1\13"+ - "\3\0\1\14\1\15\2\0\1\10\2\0\1\10\2\0"+ - "\1\14\1\12\4\0\1\16\1\0"; + "\4\6\1\7\1\10\4\6\1\0\1\11\1\12\2\11"+ + "\1\13\2\11\1\14\1\15\1\16\1\12\1\11\1\12"+ + "\2\11\1\17\1\11\1\20\1\14\1\15\1\16\1\12"+ + "\1\11\1\12\2\11\1\17\2\11\1\14\1\15\1\16"+ + "\1\12\4\6\1\7\5\6\20\0\1\21\1\22\11\0"+ + "\1\23\7\0\1\12\10\0\1\12\4\0\1\13\1\22"+ + "\15\0\2\24\11\0\1\25\13\0\1\26\4\0\1\27"+ + "\13\0\1\30\10\0\2\27\7\0"; private static int [] zzUnpackTrans() { - int [] result = new int[45]; + int [] result = new int[176]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -156,11 +221,11 @@ class _KDocLexer implements FlexLexer { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\3\0\1\11\2\1\1\11\3\1\1\0\1\11\1\0"+ - "\1\11"; + "\5\0\1\11\2\1\1\11\7\1\1\0\1\11\1\0"+ + "\3\11\1\1\1\11"; private static int [] zzUnpackAttribute() { - int [] result = new int[14]; + int [] result = new int[24]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -223,14 +288,22 @@ class _KDocLexer implements FlexLexer { this((java.io.Reader)null); } - private final boolean isLastToken() { + private boolean isLastToken() { return zzMarkedPos == zzBuffer.length(); } - private final Boolean yytextContainLineBreaks() { + private Boolean yytextContainLineBreaks() { return CharArrayUtil.containLineBreaks(zzBuffer, zzStartRead, zzMarkedPos); } + private boolean nextIsNotWhitespace() { + return zzMarkedPos <= zzBuffer.length() && !Character.isWhitespace(zzBuffer.charAt(zzMarkedPos + 1)); + } + + private boolean prevIsNotWhitespace() { + return zzMarkedPos != 0 && !Character.isWhitespace(zzBuffer.charAt(zzMarkedPos - 1)); + } + _KDocLexer(java.io.Reader in) { this.zzReader = in; @@ -256,7 +329,7 @@ class _KDocLexer implements FlexLexer { char [] map = new char[0x10000]; int i = 0; /* index in packed string */ int j = 0; /* index in unpacked array */ - while (i < 24) { + while (i < 1206) { int count = packed.charAt(i++); char value = packed.charAt(i++); do map[j++] = value; while (--count > 0); @@ -479,40 +552,60 @@ class _KDocLexer implements FlexLexer { zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 6: - { yybegin(CONTENTS); - return KDocTokens.START; - } - case 7: break; - case 5: - { if (isLastToken()) return KDocTokens.END; - else return KDocTokens.TEXT; - } - case 8: break; - case 1: - { return TokenType.BAD_CHARACTER; - } - case 9: break; - case 2: - { yybegin(CONTENTS); - return KDocTokens.TEXT; - } - case 10: break; - case 4: - { yybegin(CONTENTS); - return KDocTokens.LEADING_ASTERISK; - } - case 11: break; case 3: { if (yytextContainLineBreaks()) { yybegin(LINE_BEGINNING); return TokenType.WHITE_SPACE; } else { - yybegin(CONTENTS); + yybegin(yystate() == CONTENTS_BEGINNING? CONTENTS_BEGINNING:CONTENTS); return KDocTokens.TEXT; // internal white space } } + case 11: break; + case 5: + { if (isLastToken()) return KDocTokens.END; + else return KDocTokens.TEXT; + } case 12: break; + case 9: + { yybegin(CONTENTS); + return KDocTokens.TAG_NAME; + } + case 13: break; + case 7: + { yybegin(CONTENTS); + return KDocTokens.WIKI_LINK_CLOSE; + } + case 14: break; + case 8: + { yybegin(CONTENTS); + return KDocTokens.WIKI_LINK_OPEN; + } + case 15: break; + case 10: + { yybegin(CONTENTS); + return KDocTokens.START; + } + case 16: break; + case 1: + { return TokenType.BAD_CHARACTER; + } + case 17: break; + case 6: + { yybegin(CONTENTS); + return KDocTokens.MARKDOWN_ESCAPED_CHAR; + } + case 18: break; + case 2: + { yybegin(CONTENTS); + return KDocTokens.TEXT; + } + case 19: break; + case 4: + { yybegin(CONTENTS_BEGINNING); + return KDocTokens.LEADING_ASTERISK; + } + case 20: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; diff --git a/compiler/testData/psi/kdoc/AtTags.jet b/compiler/testData/psi/kdoc/AtTags.jet new file mode 100644 index 00000000000..8798fcad57b --- /dev/null +++ b/compiler/testData/psi/kdoc/AtTags.jet @@ -0,0 +1,5 @@ +/** + * @tag + * text @notATag + * @ + */ \ No newline at end of file diff --git a/compiler/testData/psi/kdoc/AtTags.txt b/compiler/testData/psi/kdoc/AtTags.txt new file mode 100644 index 00000000000..8e1dd8be825 --- /dev/null +++ b/compiler/testData/psi/kdoc/AtTags.txt @@ -0,0 +1,17 @@ +JetFile: AtTags.jet + KDoc + PsiElement(KDOC_START)('/**') + PsiWhiteSpace('\n ') + PsiElement(KDOC_LEADING_ASTERISK)('*') + PsiElement(KDOC_TEXT)(' ') + PsiElement(KDOC_TAG_NAME)('@tag') + PsiWhiteSpace('\n ') + PsiElement(KDOC_LEADING_ASTERISK)('*') + PsiElement(KDOC_TEXT)(' text @notATag') + PsiWhiteSpace('\n ') + PsiElement(KDOC_LEADING_ASTERISK)('*') + PsiElement(KDOC_TEXT)(' @') + PsiWhiteSpace('\n ') + PsiElement(KDOC_END)('*/') + NAMESPACE_HEADER + \ No newline at end of file diff --git a/compiler/testData/psi/kdoc/Markdown.jet b/compiler/testData/psi/kdoc/Markdown.jet new file mode 100644 index 00000000000..8811d83ea2e --- /dev/null +++ b/compiler/testData/psi/kdoc/Markdown.jet @@ -0,0 +1,4 @@ +/** + * [[WikiLink]] + * Just \[[ and \]] + */ \ No newline at end of file diff --git a/compiler/testData/psi/kdoc/Markdown.txt b/compiler/testData/psi/kdoc/Markdown.txt new file mode 100644 index 00000000000..6755464bcff --- /dev/null +++ b/compiler/testData/psi/kdoc/Markdown.txt @@ -0,0 +1,20 @@ +JetFile: Markdown.jet + KDoc + PsiElement(KDOC_START)('/**') + PsiWhiteSpace('\n ') + PsiElement(KDOC_LEADING_ASTERISK)('*') + PsiElement(KDOC_TEXT)(' ') + PsiElement(KDOC_WIKI_LINK_OPEN)('[[') + PsiElement(KDOC_TEXT)('WikiLink') + PsiElement(KDOC_WIKI_LINK_CLOSE)(']]') + PsiWhiteSpace('\n ') + PsiElement(KDOC_LEADING_ASTERISK)('*') + PsiElement(KDOC_TEXT)(' Just ') + PsiElement(KDOC_MARKDOWN_ESCAPED_CHAR)('\[') + PsiElement(KDOC_TEXT)('[ and ') + PsiElement(KDOC_MARKDOWN_ESCAPED_CHAR)('\]') + PsiElement(KDOC_TEXT)(']') + PsiWhiteSpace('\n ') + PsiElement(KDOC_END)('*/') + NAMESPACE_HEADER + \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/JetBundle.properties b/idea/src/org/jetbrains/jet/plugin/JetBundle.properties index 9536b7af1f7..c640470d94b 100644 --- a/idea/src/org/jetbrains/jet/plugin/JetBundle.properties +++ b/idea/src/org/jetbrains/jet/plugin/JetBundle.properties @@ -110,6 +110,8 @@ options.jet.attribute.descriptor.closure.braces=Function literal braces and arro options.jet.attribute.descriptor.safe.access=Safe access dot options.jet.attribute.descriptor.arrow=Arrow options.jet.attribute.descriptor.kdoc.comment=KDoc comment +options.jet.attribute.descriptor.kdoc.tag=KDoc tag +options.jet.attribute.descriptor.kdoc.value=KDoc tag value options.jet.attribute.descriptor.trait=Trait options.jet.attribute.descriptor.annotation=Annotation options.jet.attribute.descriptor.var=Var (mutable variable, parameter or property) diff --git a/idea/src/org/jetbrains/jet/plugin/JetPairMatcher.java b/idea/src/org/jetbrains/jet/plugin/JetPairMatcher.java index 9bf05aa432b..40dd0154b1f 100644 --- a/idea/src/org/jetbrains/jet/plugin/JetPairMatcher.java +++ b/idea/src/org/jetbrains/jet/plugin/JetPairMatcher.java @@ -22,6 +22,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.kdoc.lexer.KDocTokens; import org.jetbrains.jet.lexer.JetTokens; public class JetPairMatcher implements PairedBraceMatcher { @@ -29,7 +30,8 @@ public class JetPairMatcher implements PairedBraceMatcher { new BracePair(JetTokens.LPAR, JetTokens.RPAR, false), new BracePair(JetTokens.LONG_TEMPLATE_ENTRY_START, JetTokens.LONG_TEMPLATE_ENTRY_END, false), new BracePair(JetTokens.LBRACE, JetTokens.RBRACE, true), - new BracePair(JetTokens.LBRACKET, JetTokens.RBRACKET, false) + new BracePair(JetTokens.LBRACKET, JetTokens.RBRACKET, false), + new BracePair(KDocTokens.WIKI_LINK_OPEN, KDocTokens.WIKI_LINK_CLOSE, false) }; @Override @@ -44,6 +46,8 @@ public class JetPairMatcher implements PairedBraceMatcher { return false; } + if (lbraceType == KDocTokens.WIKI_LINK_OPEN) return false; + return JetTokens.WHITE_SPACE_OR_COMMENT_BIT_SET.contains(contextType) || contextType == JetTokens.SEMICOLON || contextType == JetTokens.COMMA diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetColorSettingsPage.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetColorSettingsPage.java index c39db363ffd..c3ac0bccda9 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetColorSettingsPage.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetColorSettingsPage.java @@ -54,7 +54,7 @@ public class JetColorSettingsPage implements ColorSettingsPage { "\n" + "/**\n" + " * Doc comment here for `SomeClass`\n" + - " * @see Iterator#next()\n" + + " * @see Iterator#next()\n" + " */\n" + "[Deprecated]\n" + "public class MyClass<out T : Iterable<T>>(var prop1 : Int) {\n" + @@ -126,6 +126,8 @@ public class JetColorSettingsPage implements ColorSettingsPage { new AttributesDescriptor(OptionsBundle.message("options.java.attribute.descriptor.block.comment"), JetHighlightingColors.BLOCK_COMMENT), new AttributesDescriptor(JetBundle.message("options.jet.attribute.descriptor.kdoc.comment"), JetHighlightingColors.DOC_COMMENT), + new AttributesDescriptor(JetBundle.message("options.jet.attribute.descriptor.kdoc.tag"), JetHighlightingColors.KDOC_TAG), + new AttributesDescriptor(JetBundle.message("options.jet.attribute.descriptor.kdoc.value"), JetHighlightingColors.KDOC_TAG_VALUE), new AttributesDescriptor(OptionsBundle.message("options.java.attribute.descriptor.class"), JetHighlightingColors.CLASS), new AttributesDescriptor(OptionsBundle.message("options.java.attribute.descriptor.type.parameter"), JetHighlightingColors.TYPE_PARAMETER), diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetHighlighter.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetHighlighter.java index d4452953aab..8b649b2ff68 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetHighlighter.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetHighlighter.java @@ -23,7 +23,7 @@ import com.intellij.psi.TokenType; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lexer.JetLexer; +import org.jetbrains.jet.kdoc.lexer.KDocTokens; import org.jetbrains.jet.lexer.JetTokens; import java.util.HashMap; @@ -34,7 +34,7 @@ public class JetHighlighter extends SyntaxHighlighterBase { @NotNull public Lexer getHighlightingLexer() { - return new JetLexer(); + return new JetHighlightingLexer(); } @NotNull @@ -83,6 +83,9 @@ public class JetHighlighter extends SyntaxHighlighterBase { keys.put(JetTokens.BLOCK_COMMENT, JetHighlightingColors.BLOCK_COMMENT); keys.put(JetTokens.DOC_COMMENT, JetHighlightingColors.DOC_COMMENT); + fillMap(keys, KDocTokens.CONTENT_TOKENS, JetHighlightingColors.DOC_COMMENT); + keys.put(KDocTokens.TAG_NAME, JetHighlightingColors.KDOC_TAG); + keys.put(TokenType.BAD_CHARACTER, JetHighlightingColors.BAD_CHARACTER); } } diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetHighlightingColors.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetHighlightingColors.java index e7d1bfad66a..4230cc48b03 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetHighlightingColors.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetHighlightingColors.java @@ -44,6 +44,8 @@ public class JetHighlightingColors { public static final TextAttributesKey LINE_COMMENT = createTextAttributesKey("KOTLIN_LINE_COMMENT", DefaultLanguageHighlighterColors.LINE_COMMENT); public static final TextAttributesKey BLOCK_COMMENT = createTextAttributesKey("KOTLIN_BLOCK_COMMENT", DefaultLanguageHighlighterColors.BLOCK_COMMENT); public static final TextAttributesKey DOC_COMMENT = createTextAttributesKey("KOTLIN_DOC_COMMENT", DefaultLanguageHighlighterColors.DOC_COMMENT); + public static final TextAttributesKey KDOC_TAG = createTextAttributesKey("KDOC_TAG_NAME", DefaultLanguageHighlighterColors.DOC_COMMENT_TAG); + public static final TextAttributesKey KDOC_TAG_VALUE = createTextAttributesKey("KDOC_TAG_VALUE", DefaultLanguageHighlighterColors.DOC_COMMENT_TAG_VALUE); // class kinds public static final TextAttributesKey CLASS = createTextAttributesKey("KOTLIN_CLASS", CodeInsightColors.CLASS_NAME_ATTRIBUTES); diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetHighlightingLexer.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetHighlightingLexer.java new file mode 100644 index 00000000000..9e178dd5b1a --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetHighlightingLexer.java @@ -0,0 +1,15 @@ +package org.jetbrains.jet.plugin.highlighter; + +import com.intellij.lexer.LayeredLexer; +import com.intellij.psi.tree.IElementType; +import org.jetbrains.jet.kdoc.lexer.KDocLexer; +import org.jetbrains.jet.lexer.JetLexer; +import org.jetbrains.jet.lexer.JetTokens; + +public class JetHighlightingLexer extends LayeredLexer { + public JetHighlightingLexer() { + super(new JetLexer()); + + registerSelfStoppingLayer(new KDocLexer(), new IElementType[]{JetTokens.DOC_COMMENT}, IElementType.EMPTY_ARRAY); + } +}