xref: /OpenGrok/opengrok-indexer/src/main/jflex/analysis/golang/GolangXref.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) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
22*d219b4ceSAdam Hornacek  * Portions Copyright (c) 2017, Chris Fraire <cfraire@me.com>.
23*d219b4ceSAdam Hornacek  */
24*d219b4ceSAdam Hornacek 
25*d219b4ceSAdam Hornacek /*
26*d219b4ceSAdam Hornacek  * Cross reference a Golang file
27*d219b4ceSAdam Hornacek  */
28*d219b4ceSAdam Hornacek 
29*d219b4ceSAdam Hornacek package org.opengrok.indexer.analysis.golang;
30*d219b4ceSAdam Hornacek 
31*d219b4ceSAdam Hornacek import java.io.IOException;
32*d219b4ceSAdam Hornacek import org.opengrok.indexer.analysis.JFlexSymbolMatcher;
33*d219b4ceSAdam Hornacek import org.opengrok.indexer.util.StringUtils;
34*d219b4ceSAdam Hornacek import org.opengrok.indexer.web.HtmlConsts;
35*d219b4ceSAdam Hornacek 
36*d219b4ceSAdam Hornacek /**
37*d219b4ceSAdam Hornacek  * @author Patrick Lundquist
38*d219b4ceSAdam Hornacek  */
39*d219b4ceSAdam Hornacek %%
40*d219b4ceSAdam Hornacek %public
41*d219b4ceSAdam Hornacek %class GolangXref
42*d219b4ceSAdam Hornacek %extends JFlexSymbolMatcher
43*d219b4ceSAdam Hornacek %unicode
44*d219b4ceSAdam Hornacek %int
45*d219b4ceSAdam Hornacek %char
46*d219b4ceSAdam Hornacek %include ../CommonLexer.lexh
47*d219b4ceSAdam Hornacek %include ../CommonXref.lexh
48*d219b4ceSAdam Hornacek %{
49*d219b4ceSAdam Hornacek     @Override
yypop()50*d219b4ceSAdam Hornacek     public void yypop() throws IOException {
51*d219b4ceSAdam Hornacek         onDisjointSpanChanged(null, yychar);
52*d219b4ceSAdam Hornacek         super.yypop();
53*d219b4ceSAdam Hornacek     }
54*d219b4ceSAdam Hornacek 
chkLOC()55*d219b4ceSAdam Hornacek     protected void chkLOC() {
56*d219b4ceSAdam Hornacek         switch (yystate()) {
57*d219b4ceSAdam Hornacek             case COMMENT:
58*d219b4ceSAdam Hornacek             case SCOMMENT:
59*d219b4ceSAdam Hornacek                 break;
60*d219b4ceSAdam Hornacek             default:
61*d219b4ceSAdam Hornacek                 phLOC();
62*d219b4ceSAdam Hornacek                 break;
63*d219b4ceSAdam Hornacek         }
64*d219b4ceSAdam Hornacek     }
65*d219b4ceSAdam Hornacek %}
66*d219b4ceSAdam Hornacek 
67*d219b4ceSAdam Hornacek File = [a-zA-Z]{FNameChar}* "." ([Gg][Oo] | [Tt][Xx][Tt] | [Hh][Tt][Mm][Ll]? |
68*d219b4ceSAdam Hornacek     [Dd][Ii][Ff][Ff] | [Pp][Aa][Tt][Cc][Hh])
69*d219b4ceSAdam Hornacek 
70*d219b4ceSAdam Hornacek %state STRING COMMENT SCOMMENT QSTRING
71*d219b4ceSAdam Hornacek 
72*d219b4ceSAdam Hornacek %include ../Common.lexh
73*d219b4ceSAdam Hornacek %include ../CommonURI.lexh
74*d219b4ceSAdam Hornacek %include ../CommonPath.lexh
75*d219b4ceSAdam Hornacek %include Golang.lexh
76*d219b4ceSAdam Hornacek %%
77*d219b4ceSAdam Hornacek <YYINITIAL> {
78*d219b4ceSAdam Hornacek     {Identifier} {
79*d219b4ceSAdam Hornacek         chkLOC();
80*d219b4ceSAdam Hornacek         String id = yytext();
81*d219b4ceSAdam Hornacek         onFilteredSymbolMatched(id, yychar, Consts.kwd);
82*d219b4ceSAdam Hornacek     }
83*d219b4ceSAdam Hornacek     {Number}     {
84*d219b4ceSAdam Hornacek         chkLOC();
85*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.NUMBER_CLASS, yychar);
86*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
87*d219b4ceSAdam Hornacek         onDisjointSpanChanged(null, yychar);
88*d219b4ceSAdam Hornacek     }
89*d219b4ceSAdam Hornacek     \"           {
90*d219b4ceSAdam Hornacek         chkLOC();
91*d219b4ceSAdam Hornacek         yypush(STRING);
92*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.STRING_CLASS, yychar);
93*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
94*d219b4ceSAdam Hornacek     }
95*d219b4ceSAdam Hornacek     \'           {
96*d219b4ceSAdam Hornacek         chkLOC();
97*d219b4ceSAdam Hornacek         yypush(QSTRING);
98*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.STRING_CLASS, yychar);
99*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
100*d219b4ceSAdam Hornacek     }
101*d219b4ceSAdam Hornacek     "/*"         {
102*d219b4ceSAdam Hornacek         yypush(COMMENT);
103*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.COMMENT_CLASS, yychar);
104*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
105*d219b4ceSAdam Hornacek     }
106*d219b4ceSAdam Hornacek     "//"         {
107*d219b4ceSAdam Hornacek         yypush(SCOMMENT);
108*d219b4ceSAdam Hornacek         onDisjointSpanChanged(HtmlConsts.COMMENT_CLASS, yychar);
109*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
110*d219b4ceSAdam Hornacek     }
111*d219b4ceSAdam Hornacek }
112*d219b4ceSAdam Hornacek 
113*d219b4ceSAdam Hornacek "<" ({File}|{FPath}) ">" {
114*d219b4ceSAdam Hornacek     chkLOC();
115*d219b4ceSAdam Hornacek     onNonSymbolMatched("<", yychar);
116*d219b4ceSAdam Hornacek     String path = yytext();
117*d219b4ceSAdam Hornacek     path = path.substring(1, path.length() - 1);
118*d219b4ceSAdam Hornacek     onFilelikeMatched(path, yychar + 1);
119*d219b4ceSAdam Hornacek     onNonSymbolMatched(">", yychar + 1 + path.length());
120*d219b4ceSAdam Hornacek }
121*d219b4ceSAdam Hornacek 
122*d219b4ceSAdam Hornacek <STRING> {
123*d219b4ceSAdam Hornacek     \\[\"\\] |
124*d219b4ceSAdam Hornacek     \" {WhspChar}+ \"    { chkLOC(); onNonSymbolMatched(yytext(), yychar); }
125*d219b4ceSAdam Hornacek     \"    {
126*d219b4ceSAdam Hornacek         chkLOC();
127*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
128*d219b4ceSAdam Hornacek         yypop();
129*d219b4ceSAdam Hornacek     }
130*d219b4ceSAdam Hornacek }
131*d219b4ceSAdam Hornacek 
132*d219b4ceSAdam Hornacek <QSTRING> {
133*d219b4ceSAdam Hornacek     \\[\'\\] |
134*d219b4ceSAdam Hornacek     \' {WhspChar}+ \'    { chkLOC(); onNonSymbolMatched(yytext(), yychar); }
135*d219b4ceSAdam Hornacek     \'    {
136*d219b4ceSAdam Hornacek         chkLOC();
137*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
138*d219b4ceSAdam Hornacek         yypop();
139*d219b4ceSAdam Hornacek     }
140*d219b4ceSAdam Hornacek }
141*d219b4ceSAdam Hornacek 
142*d219b4ceSAdam Hornacek <COMMENT> {
143*d219b4ceSAdam Hornacek     "*/"    {
144*d219b4ceSAdam Hornacek         onNonSymbolMatched(yytext(), yychar);
145*d219b4ceSAdam Hornacek         yypop();
146*d219b4ceSAdam Hornacek     }
147*d219b4ceSAdam Hornacek }
148*d219b4ceSAdam Hornacek 
149*d219b4ceSAdam Hornacek <SCOMMENT> {
150*d219b4ceSAdam Hornacek     {WhspChar}*{EOL}    {
151*d219b4ceSAdam Hornacek         yypop();
152*d219b4ceSAdam Hornacek         onEndOfLineMatched(yytext(), yychar);
153*d219b4ceSAdam Hornacek     }
154*d219b4ceSAdam Hornacek }
155*d219b4ceSAdam Hornacek 
156*d219b4ceSAdam Hornacek <YYINITIAL, STRING, COMMENT, SCOMMENT, QSTRING> {
157*d219b4ceSAdam Hornacek     {WhspChar}*{EOL}   { onEndOfLineMatched(yytext(), yychar); }
158*d219b4ceSAdam Hornacek     [[\s]--[\n]]       { onNonSymbolMatched(yytext(), yychar); }
159*d219b4ceSAdam Hornacek     [^\n]              { chkLOC(); onNonSymbolMatched(yytext(), yychar); }
160*d219b4ceSAdam Hornacek }
161*d219b4ceSAdam Hornacek 
162*d219b4ceSAdam Hornacek <STRING, COMMENT, SCOMMENT, QSTRING> {
163*d219b4ceSAdam Hornacek     {FPath}    {
164*d219b4ceSAdam Hornacek         chkLOC();
165*d219b4ceSAdam Hornacek         onPathlikeMatched(yytext(), '/', false, yychar);
166*d219b4ceSAdam Hornacek     }
167*d219b4ceSAdam Hornacek     {File} {
168*d219b4ceSAdam Hornacek         chkLOC();
169*d219b4ceSAdam Hornacek         String path = yytext();
170*d219b4ceSAdam Hornacek         onFilelikeMatched(path, yychar);
171*d219b4ceSAdam Hornacek     }
172*d219b4ceSAdam Hornacek     {FNameChar}+ "@" {FNameChar}+ "." {FNameChar}+    {
173*d219b4ceSAdam Hornacek         chkLOC();
174*d219b4ceSAdam Hornacek     }
175*d219b4ceSAdam Hornacek }
176*d219b4ceSAdam Hornacek 
177*d219b4ceSAdam Hornacek <STRING, SCOMMENT> {
178*d219b4ceSAdam Hornacek     {BrowseableURI}    {
179*d219b4ceSAdam Hornacek         chkLOC();
180*d219b4ceSAdam Hornacek         onUriMatched(yytext(), yychar);
181*d219b4ceSAdam Hornacek     }
182*d219b4ceSAdam Hornacek }
183*d219b4ceSAdam Hornacek 
184*d219b4ceSAdam Hornacek <COMMENT> {
185*d219b4ceSAdam Hornacek     {BrowseableURI}    {
186*d219b4ceSAdam Hornacek         onUriMatched(yytext(), yychar, StringUtils.END_C_COMMENT);
187*d219b4ceSAdam Hornacek     }
188*d219b4ceSAdam Hornacek }
189*d219b4ceSAdam Hornacek 
190*d219b4ceSAdam Hornacek <QSTRING> {
191*d219b4ceSAdam Hornacek     {BrowseableURI}    {
192*d219b4ceSAdam Hornacek         chkLOC();
193*d219b4ceSAdam Hornacek         onUriMatched(yytext(), yychar, StringUtils.APOS_NO_BSESC);
194*d219b4ceSAdam Hornacek     }
195*d219b4ceSAdam Hornacek }
196