24
24
25
25
package org. opensolaris. opengrok. analysis. kotlin;
26
26
27
- import org. opensolaris. opengrok. analysis. JFlexXref;
28
- import java. io. IOException;
29
- import java. io. Writer;
30
- import java. io. Reader;
27
+ import org. opensolaris. opengrok. analysis. JFlexXrefSimple;
28
+ import org. opensolaris. opengrok. util. StringUtils;
29
+ import org. opensolaris. opengrok. web. HtmlConsts;
31
30
import org. opensolaris. opengrok. web. Util;
32
-
33
31
% %
34
32
%public
35
33
%class KotlinXref
36
- %extends JFlexXref
34
+ %extends JFlexXrefSimple
37
35
%unicode
38
36
%ignorecase
39
37
%int
@@ -42,19 +40,26 @@ import org.opensolaris.opengrok.web.Util;
42
40
/* Must match {WhiteSpace} regex */
43
41
private final static String WHITE_SPACE = " [ \\ t\\ f]+" ;
44
42
43
+ private int nestedComment;
44
+
45
+ @Override
46
+ public void reset() {
47
+ super . reset();
48
+ nestedComment = 0 ;
49
+ }
50
+
45
51
// TODO move this into an include file when bug #16053 is fixed
46
52
@Override
47
53
protected int getLineNumber() { return yyline; }
48
54
@Override
49
55
protected void setLineNumber(int x) { yyline = x; }
50
56
%}
51
57
52
- /* TODO: prohibit '$' in identifiers? */
53
- Identifier = [:jletter:] [:jletterdigit:]*
54
-
55
- File = [ a- zA- Z] {FNameChar} * "." ( "java" | "properties" | "props" | "xml" | "conf" | "txt" | "htm" | "html" | "ini" | "jnlp" | "jad" | "diff" | "patch" )
56
-
57
- Number = ( 0[ xX][ 0- 9a- fA- F] +| [ 0- 9] + \. [ 0- 9] +| [ 0- 9] +)(( [ eE][ +-] ? [ 0- 9] +)? [ ufdlUFDL] *)?
58
+ File = [ a- zA- Z] {FNameChar} * "." ( [ Jj][ Aa][ Vv][ Aa] |
59
+ [ Pp][ Rr][ Oo][ Pp][ Ee][ Rr][ Tt][ Ii][ Ee][ Ss] | [ Pp][ Rr][ Oo][ Pp][ Ss] |
60
+ [ Xx][ Mm][ Ll] | [ Cc][ Oo][ Nn][ Ff] | [ Tt][ Xx][ Tt] | [ Hh][ Tt][ Mm][ Ll] ? |
61
+ [ Ii][ Nn][ Ii] | [ Jj][ Nn][ Ll][ Pp] | [ Jj][ Aa][ Dd] | [ Dd][ Ii][ Ff][ Ff] |
62
+ [ Pp][ Aa][ Tt][ Cc][ Hh] )
58
63
59
64
KdocWithClassArg = "@throws" | "@exception"
60
65
KdocWithParamNameArg = "@param"
@@ -67,6 +72,7 @@ ParamName = {Identifier} | "<" {Identifier} ">"
67
72
%include Common.lexh
68
73
%include CommonURI.lexh
69
74
%include CommonPath.lexh
75
+ %include Kotlin.lexh
70
76
%%
71
77
<YYINITIAL> {
72
78
\{ { incScope(); writeUnicodeChar(yycharat(0 )); }
@@ -91,41 +97,104 @@ ParamName = {Identifier} | "<" {Identifier} ">"
91
97
out. write(" >" );
92
98
}
93
99
94
- /* {Hier}
95
- { out.write(Util.breadcrumbPath(urlPrefix+"defs=",yytext(),'.'));}
96
- */
97
- {Number} { out. write(" <span class=\" n\" >" ); out. write(yytext()); out. write(" </span>" ); }
98
-
99
- \" { yybegin(STRING );out. write(" <span class=\" s\" >\" " );}
100
- \' { yybegin(QSTRING );out. write(" <span class=\" s\" >\' " );}
101
- \"\"\" { yybegin(TSTRING );out. write(" <span class=\" s\" >\"\"\" " );}
102
- "/**" / [^ /] { yybegin(KDOC );out. write(" <span class=\" c\" >/**" );}
103
- "/*" { yybegin(COMMENT );out. write(" <span class=\" c\" >/*" );}
104
- "//" { yybegin(SCOMMENT );out. write(" <span class=\" c\" >//" );}
100
+ {Number} {
101
+ disjointSpan(HtmlConsts . NUMBER_CLASS );
102
+ out. write(yytext());
103
+ disjointSpan(null );
104
+ }
105
+
106
+ \" {
107
+ pushSpan(STRING , HtmlConsts . STRING_CLASS );
108
+ out. write(htmlize(yytext()));
109
+ }
110
+ \' {
111
+ pushSpan(QSTRING , HtmlConsts . STRING_CLASS );
112
+ out. write(htmlize(yytext()));
113
+ }
114
+ \"\"\" {
115
+ pushSpan(TSTRING , HtmlConsts . STRING_CLASS );
116
+ out. write(htmlize(yytext()));
117
+ }
118
+ "/**" / [^ /] {
119
+ if (nestedComment++ == 0 ) {
120
+ pushSpan(KDOC , HtmlConsts . COMMENT_CLASS );
121
+ }
122
+ out. write(yytext());
123
+ }
124
+ "//" {
125
+ pushSpan(SCOMMENT , HtmlConsts . COMMENT_CLASS );
126
+ out. write(yytext());
127
+ }
105
128
}
106
- /* TODO : support raw """ strings */
129
+
107
130
<STRING> {
108
- \" {WhiteSpace} \" { out. write(yytext());}
109
- \" { yybegin(YYINITIAL ); out. write(" \" </span>" ); }
110
- \\\\ { out. write(" \\\\ " ); }
111
- \\\" { out. write(" \\\" " ); }
131
+ \\ [ \"\$\\ ] { out. write(htmlize(yytext())); }
132
+ \" {
133
+ out. write(htmlize(yytext()));
134
+ yypop();
135
+ }
112
136
}
113
137
114
138
<QSTRING> {
115
- "\\\\ " { out. write(" \\\\ " ); }
116
- "\\\' " { out. write(" \\\' " ); }
117
- \' {WhiteSpace} \' { out. write(yytext()); }
118
- \' { yybegin(YYINITIAL ); out. write(" '</span>" ); }
139
+ \\ [ \'\\ ] |
140
+ \' {WhiteSpace} \' { out. write(htmlize(yytext())); }
141
+ \' {
142
+ out. write(htmlize(yytext()));
143
+ yypop();
144
+ }
119
145
}
120
146
121
147
<TSTRING> {
122
- "\\\\ " { out. write(" \\\\ " ); }
123
- "\\\" " { out. write(" \\\" " ); }
124
- \"\"\" { yybegin(YYINITIAL ); out. write(" \"\"\" </span>" ); }
148
+ /*
149
+ * "raw string ... doesn't support backslash escaping"
150
+ */
151
+ \"\"\" {
152
+ out. write(htmlize(yytext()));
153
+ yypop();
154
+ }
155
+ }
156
+
157
+ <STRING, TSTRING> {
158
+ /*
159
+ * TODO : support template expressions inside curly brackets
160
+ */
161
+ \$ {Identifier} {
162
+ String capture = yytext();
163
+ String sigil = capture. substring(0 , 1 );
164
+ String id = capture. substring(1 );
165
+ out. write(sigil);
166
+ disjointSpan(null );
167
+ writeSymbol(id, Consts . kwd, yyline);
168
+ disjointSpan(HtmlConsts . STRING_CLASS );
169
+ }
170
+ {WhspChar} * {EOL} {
171
+ disjointSpan(null );
172
+ startNewLine();
173
+ disjointSpan(HtmlConsts . STRING_CLASS );
174
+ }
175
+ }
176
+
177
+ <YYINITIAL, COMMENT, KDOC> {
178
+ "/*" {
179
+ if (nestedComment++ == 0 ) {
180
+ pushSpan(COMMENT , HtmlConsts . COMMENT_CLASS );
181
+ }
182
+ out. write(yytext());
183
+ }
125
184
}
126
185
127
186
<COMMENT, KDOC> {
128
- "*/" { yybegin(YYINITIAL ); out. write(" */</span>" ); }
187
+ "*/" {
188
+ out. write(yytext());
189
+ if (-- nestedComment == 0 ) {
190
+ yypop();
191
+ }
192
+ }
193
+ {WhspChar} * {EOL} {
194
+ disjointSpan(null );
195
+ startNewLine();
196
+ disjointSpan(HtmlConsts . COMMENT_CLASS );
197
+ }
129
198
}
130
199
131
200
<KDOC> {
@@ -145,23 +214,22 @@ ParamName = {Identifier} | "<" {Identifier} ">"
145
214
146
215
<SCOMMENT> {
147
216
{WhspChar} * {EOL} {
148
- yybegin( YYINITIAL ); out . write( " </span> " );
217
+ yypop( );
149
218
startNewLine();
150
219
}
151
220
}
152
221
153
222
154
223
<YYINITIAL, STRING, COMMENT, SCOMMENT, QSTRING, KDOC, TSTRING> {
155
- "&" { out. write( " &" );}
156
- "<" { out. write( " <" );}
157
- ">" { out. write( " >" );}
224
+ [ &<>\'\" ] { out. write(htmlize(yytext())); }
225
+
158
226
{WhspChar} * {EOL} { startNewLine(); }
159
227
{WhiteSpace} { out. write(yytext()); }
160
228
[ !- ~] { out. write(yycharat(0 )); }
161
229
[^\n] { writeUnicodeChar(yycharat(0 )); }
162
230
}
163
231
164
- <STRING, COMMENT, SCOMMENT, STRING, QSTRING, TSTRING, KDOC> {
232
+ <STRING, COMMENT, SCOMMENT, QSTRING, TSTRING, KDOC> {
165
233
{FPath}
166
234
{ out. write(Util . breadcrumbPath(urlPrefix+ " path=" ,yytext(),' /' ));}
167
235
@@ -175,12 +243,20 @@ ParamName = {Identifier} | "<" {Identifier} ">"
175
243
out. write(path);
176
244
out. write(" </a>" );}
177
245
178
- {BrowseableURI} {
179
- appendLink(yytext(), true );
180
- }
181
-
182
246
{FNameChar} + "@" {FNameChar} + "." {FNameChar} +
183
247
{
184
248
writeEMailAddress(yytext());
185
249
}
186
250
}
251
+
252
+ <STRING, SCOMMENT, QSTRING, TSTRING> {
253
+ {BrowseableURI} {
254
+ appendLink(yytext(), true );
255
+ }
256
+ }
257
+
258
+ <COMMENT, KDOC> {
259
+ {BrowseableURI} {
260
+ appendLink(yytext(), true , StringUtils . END_C_COMMENT );
261
+ }
262
+ }
0 commit comments