xref: /OpenGrok/opengrok-indexer/src/main/jflex/analysis/rust/RustXref.lex (revision d219b4cea555a12b602d2d5518daa22134ad4879)
1*d219b4ceSAdam Hornacek /*
2*d219b4ceSAdam Hornacek  * CDDL HEADER START
3*d219b4ceSAdam Hornacek  *
4*d219b4ceSAdam Hornacek  * The contents of this file are subject to the terms of the
5*d219b4ceSAdam Hornacek  * Common Development and Distribution License (the "License").
6*d219b4ceSAdam Hornacek  * You may not use this file except in compliance with the License.
7*d219b4ceSAdam Hornacek  *
8*d219b4ceSAdam Hornacek  * See LICENSE.txt included in this distribution for the specific
9*d219b4ceSAdam Hornacek  * language governing permissions and limitations under the License.
10*d219b4ceSAdam Hornacek  *
11*d219b4ceSAdam Hornacek  * When distributing Covered Code, include this CDDL HEADER in each
12*d219b4ceSAdam Hornacek  * file and include the License file at LICENSE.txt.
13*d219b4ceSAdam Hornacek  * If applicable, add the following below this CDDL HEADER, with the
14*d219b4ceSAdam Hornacek  * fields enclosed by brackets "[]" replaced with your own identifying
15*d219b4ceSAdam Hornacek  * information: Portions Copyright [yyyy] [name of copyright owner]
16*d219b4ceSAdam Hornacek  *
17*d219b4ceSAdam Hornacek  * CDDL HEADER END
18*d219b4ceSAdam Hornacek  */
19*d219b4ceSAdam Hornacek 
20*d219b4ceSAdam Hornacek /*
21*d219b4ceSAdam Hornacek  * Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved.
22*d219b4ceSAdam Hornacek  * Portions Copyright (c) 2016 Nikolay Denev.
23*d219b4ceSAdam Hornacek  * Portions Copyright (c) 2017, Chris Fraire <cfraire@me.com>.
24*d219b4ceSAdam Hornacek  */
25*d219b4ceSAdam Hornacek 
26*d219b4ceSAdam Hornacek /*
27*d219b4ceSAdam Hornacek  * Cross reference a Rust file
28*d219b4ceSAdam Hornacek  */
29*d219b4ceSAdam Hornacek 
30*d219b4ceSAdam Hornacek package org.opengrok.indexer.analysis.rust;
31*d219b4ceSAdam Hornacek 
32*d219b4ceSAdam Hornacek import java.io.IOException;
33*d219b4ceSAdam Hornacek import org.opengrok.indexer.analysis.JFlexSymbolMatcher;
34*d219b4ceSAdam Hornacek import org.opengrok.indexer.analysis.ScopeAction;
35*d219b4ceSAdam Hornacek import org.opengrok.indexer.util.StringUtils;
36*d219b4ceSAdam Hornacek import org.opengrok.indexer.web.HtmlConsts;
37*d219b4ceSAdam Hornacek %%
38*d219b4ceSAdam Hornacek %public
39*d219b4ceSAdam Hornacek %class RustXref
40*d219b4ceSAdam Hornacek %extends JFlexSymbolMatcher
41*d219b4ceSAdam Hornacek %unicode
42*d219b4ceSAdam Hornacek %int
43*d219b4ceSAdam Hornacek %char
44*d219b4ceSAdam Hornacek %include ../CommonLexer.lexh
45*d219b4ceSAdam Hornacek %include ../CommonXref.lexh
46*d219b4ceSAdam Hornacek %{
47*d219b4ceSAdam Hornacek   /**
48*d219b4ceSAdam Hornacek    * Stores the number of hashes beginning and ending a raw string or raw byte
49*d219b4ceSAdam Hornacek    * string. E.g., r##"blah"## has rawHashCount == 2.
50*d219b4ceSAdam Hornacek    */
51*d219b4ceSAdam Hornacek   int rawHashCount;
52*d219b4ceSAdam Hornacek 
53*d219b4ceSAdam Hornacek   int nestedComment;
54*d219b4ceSAdam Hornacek 
55*d219b4ceSAdam Hornacek   @Override
reset()56*d219b4ceSAdam Hornacek   public void reset() {
57*d219b4ceSAdam Hornacek       super.reset();
58*d219b4ceSAdam Hornacek       rawHashCount = 0;
59*d219b4ceSAdam Hornacek       nestedComment = 0;
60*d219b4ceSAdam Hornacek   }
61*d219b4ceSAdam Hornacek 
62*d219b4ceSAdam Hornacek   @Override
yypop()63*d219b4ceSAdam Hornacek   public void yypop() throws IOException {
64*d219b4ceSAdam Hornacek       onDisjointSpanChanged(null, yychar);
65*d219b4ceSAdam Hornacek       super.yypop();
66*d219b4ceSAdam Hornacek   }
67*d219b4ceSAdam Hornacek 
chkLOC()68*d219b4ceSAdam Hornacek   protected void chkLOC() {
69*d219b4ceSAdam Hornacek       switch (yystate()) {
70*d219b4ceSAdam Hornacek           case COMMENT:
71*d219b4ceSAdam Hornacek           case SCOMMENT:
72*d219b4ceSAdam Hornacek               break;
73*d219b4ceSAdam Hornacek           default:
74*d219b4ceSAdam Hornacek               phLOC();
75*d219b4ceSAdam Hornacek               break;
76*d219b4ceSAdam Hornacek       }
77*d219b4ceSAdam Hornacek   }
78*d219b4ceSAdam Hornacek %}
79*d219b4ceSAdam Hornacek 
80*d219b4ceSAdam Hornacek File = [a-zA-Z]{FNameChar}* "." ([Rr][Ss] | [Cc][Oo][Nn][Ff] | [Tt][Xx][Tt] |
81*d219b4ceSAdam Hornacek     [Hh][Tt][Mm][Ll]? | [Xx][Mm][Ll] | [Ii][Nn][Ii] | [Dd][Ii][Ff][Ff] |
82*d219b4ceSAdam Hornacek     [Pp][Aa][Tt][Cc][Hh])
83*d219b4ceSAdam Hornacek 
84*d219b4ceSAdam Hornacek %state  STRING RSTRING COMMENT SCOMMENT
85*d219b4ceSAdam Hornacek 
86*d219b4ceSAdam Hornacek %include ../Common.lexh
87*d219b4ceSAdam Hornacek %include ../CommonURI.lexh
88*d219b4ceSAdam Hornacek %include ../CommonPath.lexh
89*d219b4ceSAdam Hornacek %include Rust.lexh
90*d219b4ceSAdam Hornacek %%
91*d219b4ceSAdam Hornacek <YYINITIAL> {
92*d219b4ceSAdam Hornacek     \{ { chkLOC(); onScopeChanged(ScopeAction.INC, yytext(), yychar); }
93*d219b4ceSAdam Hornacek     \} { chkLOC(); onScopeChanged(ScopeAction.DEC, yytext(), yychar); }
94*d219b4ceSAdam Hornacek     \; { chkLOC(); onScopeChanged(ScopeAction.END, yytext(), yychar); }
95*d219b4ceSAdam Hornacek     {Identifier} {
96*d219b4ceSAdam Hornacek         chkLOC();
97*d219b4ceSAdam Hornacek         String id = yytext();
98*d219b4ceSAdam Hornacek         onFilteredSymbolMatched(id, yychar, Consts.kwd);
99*d219b4ceSAdam Hornacek     }
100*d219b4ceSAdam Hornacek     "<" ({File}|{FPath}) ">" {
101*d219b4ceSAdam Hornacek         chkLOC();
102*d219b4ceSAdam Hornacek         onNonSymbolMatched("<", yychar);
103*d219b4ceSAdam Hornacek         String path = yytext();
104*d219b4ceSAdam Hornacek         path = path.substring(1, path.length() - 1);
105*d219b4ceSAdam Hornacek         onFilelikeMatched(path, yychar + 1);
106*d219b4ceSAdam Hornacek         onNonSymbolMatched(">", yychar + 1 + path.length());
107*d219b4ceSAdam Hornacek     }
108*d219b4ceSAdam Hornacek     {Number} {
109*d219b4ceSAdam Hornacek         chkLOC();
110*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.NUMBER_CLASS, yychar);
111*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
112*d219b4ceSAdam Hornacek         onDisjointSpanChanged(null, yychar);
113*d219b4ceSAdam Hornacek     }
114*d219b4ceSAdam Hornacek     [b]?\" {
115*d219b4ceSAdam Hornacek         chkLOC();
116*d219b4ceSAdam Hornacek         yypush(STRING);
117*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.STRING_CLASS, yychar);
118*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
119*d219b4ceSAdam Hornacek     }
120*d219b4ceSAdam Hornacek     [b]?[r][#]*\" {
121*d219b4ceSAdam Hornacek         chkLOC();
122*d219b4ceSAdam Hornacek         yypush(RSTRING);
123*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.STRING_CLASS, yychar);
124*d219b4ceSAdam Hornacek         String capture = yytext();
125*d219b4ceSAdam Hornacek         onNonSymbolMatched(capture, yychar);
126*d219b4ceSAdam Hornacek         rawHashCount = RustUtils.countRawHashes(capture);
127*d219b4ceSAdam Hornacek     }
128*d219b4ceSAdam Hornacek     [b]?\' ([^\n\r\'\\] | \\[^\n\r]) \' |
129*d219b4ceSAdam Hornacek     [b]?\' \\[xX]{HEXDIG}{HEXDIG} \' |
130*d219b4ceSAdam Hornacek     [b]?\' \\[uU]\{ {HEXDIG}{1,6} \}\'    {
131*d219b4ceSAdam Hornacek         chkLOC();
132*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.STRING_CLASS, yychar);
133*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
134*d219b4ceSAdam Hornacek         onDisjointSpanChanged(null, yychar);
135*d219b4ceSAdam Hornacek     }
136*d219b4ceSAdam Hornacek     "//" {
137*d219b4ceSAdam Hornacek         yypush(SCOMMENT);
138*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.COMMENT_CLASS, yychar);
139*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
140*d219b4ceSAdam Hornacek     }
141*d219b4ceSAdam Hornacek     "/*"  {
142*d219b4ceSAdam Hornacek         ++nestedComment;
143*d219b4ceSAdam Hornacek         yypush(COMMENT);
144*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.COMMENT_CLASS, yychar);
145*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
146*d219b4ceSAdam Hornacek     }
147*d219b4ceSAdam Hornacek }
148*d219b4ceSAdam Hornacek 
149*d219b4ceSAdam Hornacek <STRING> {
150*d219b4ceSAdam Hornacek     \\[\"\\]    { chkLOC(); onNonSymbolMatched(yytext(), yychar); }
151*d219b4ceSAdam Hornacek     \"    {
152*d219b4ceSAdam Hornacek         chkLOC();
153*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
154*d219b4ceSAdam Hornacek         yypop();
155*d219b4ceSAdam Hornacek     }
156*d219b4ceSAdam Hornacek }
157*d219b4ceSAdam Hornacek 
158*d219b4ceSAdam Hornacek <RSTRING> {
159*d219b4ceSAdam Hornacek     \"[#]*    {
160*d219b4ceSAdam Hornacek         chkLOC();
161*d219b4ceSAdam Hornacek         String capture = yytext();
162*d219b4ceSAdam Hornacek         if (RustUtils.isRawEnding(capture, rawHashCount)) {
163*d219b4ceSAdam Hornacek             String ender = capture.substring(0, 1 + rawHashCount);
164*d219b4ceSAdam Hornacek             onNonSymbolMatched(ender, yychar);
165*d219b4ceSAdam Hornacek             yypop();
166*d219b4ceSAdam Hornacek             int excess = capture.length() - ender.length();
167*d219b4ceSAdam Hornacek             if (excess > 0) yypushback(excess);
168*d219b4ceSAdam Hornacek         } else {
169*d219b4ceSAdam Hornacek             onNonSymbolMatched(capture, yychar);
170*d219b4ceSAdam Hornacek         }
171*d219b4ceSAdam Hornacek     }
172*d219b4ceSAdam Hornacek }
173*d219b4ceSAdam Hornacek 
174*d219b4ceSAdam Hornacek <STRING, RSTRING> {
175*d219b4ceSAdam Hornacek     {WhspChar}*{EOL}    {
176*d219b4ceSAdam Hornacek         onDisjointSpanChanged(null, yychar);
177*d219b4ceSAdam Hornacek         onEndOfLineMatched(yytext(), yychar);
178*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.STRING_CLASS, yychar);
179*d219b4ceSAdam Hornacek     }
180*d219b4ceSAdam Hornacek }
181*d219b4ceSAdam Hornacek 
182*d219b4ceSAdam Hornacek <COMMENT> {
183*d219b4ceSAdam Hornacek     "*/"    {
184*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
185*d219b4ceSAdam Hornacek         if (--nestedComment == 0) yypop();
186*d219b4ceSAdam Hornacek     }
187*d219b4ceSAdam Hornacek     "/*"    {
188*d219b4ceSAdam Hornacek         ++nestedComment;
189*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
190*d219b4ceSAdam Hornacek     }
191*d219b4ceSAdam Hornacek }
192*d219b4ceSAdam Hornacek 
193*d219b4ceSAdam Hornacek <SCOMMENT> {
194*d219b4ceSAdam Hornacek     {WhspChar}*{EOL} {
195*d219b4ceSAdam Hornacek         yypop();
196*d219b4ceSAdam Hornacek         onEndOfLineMatched(yytext(), yychar);
197*d219b4ceSAdam Hornacek     }
198*d219b4ceSAdam Hornacek }
199*d219b4ceSAdam Hornacek 
200*d219b4ceSAdam Hornacek <YYINITIAL, STRING, RSTRING, COMMENT, SCOMMENT> {
201*d219b4ceSAdam Hornacek     {WhspChar}*{EOL}    { onEndOfLineMatched(yytext(), yychar); }
202*d219b4ceSAdam Hornacek     [[\s]--[\n]]    { onNonSymbolMatched(yytext(), yychar); }
203*d219b4ceSAdam Hornacek     [^\n]    { chkLOC(); onNonSymbolMatched(yytext(), yychar); }
204*d219b4ceSAdam Hornacek }
205*d219b4ceSAdam Hornacek 
206*d219b4ceSAdam Hornacek <STRING, SCOMMENT> {
207*d219b4ceSAdam Hornacek     {FPath}    {
208*d219b4ceSAdam Hornacek         chkLOC();
209*d219b4ceSAdam Hornacek         onPathlikeMatched(yytext(), '/', false, yychar);
210*d219b4ceSAdam Hornacek     }
211*d219b4ceSAdam Hornacek 
212*d219b4ceSAdam Hornacek     {File} {
213*d219b4ceSAdam Hornacek         chkLOC();
214*d219b4ceSAdam Hornacek         String path = yytext();
215*d219b4ceSAdam Hornacek         onFilelikeMatched(path, yychar);
216*d219b4ceSAdam Hornacek     }
217*d219b4ceSAdam Hornacek 
218*d219b4ceSAdam Hornacek     {FNameChar}+ "@" {FNameChar}+ "." {FNameChar}+ {
219*d219b4ceSAdam Hornacek         chkLOC();
220*d219b4ceSAdam Hornacek         onEmailAddressMatched(yytext(), yychar);
221*d219b4ceSAdam Hornacek     }
222*d219b4ceSAdam Hornacek }
223*d219b4ceSAdam Hornacek 
224*d219b4ceSAdam Hornacek <STRING, RSTRING, SCOMMENT> {
225*d219b4ceSAdam Hornacek     {BrowseableURI}    {
226*d219b4ceSAdam Hornacek         chkLOC();
227*d219b4ceSAdam Hornacek         onUriMatched(yytext(), yychar);
228*d219b4ceSAdam Hornacek     }
229*d219b4ceSAdam Hornacek }
230*d219b4ceSAdam Hornacek 
231*d219b4ceSAdam Hornacek <COMMENT> {
232*d219b4ceSAdam Hornacek     {BrowseableURI}    {
233*d219b4ceSAdam Hornacek         onUriMatched(yytext(), yychar, StringUtils.END_C_COMMENT);
234*d219b4ceSAdam Hornacek     }
235*d219b4ceSAdam Hornacek }
236