@@ -112,6 +112,93 @@ suite('Monarch', () => {
112
112
disposables . dispose ( ) ;
113
113
} ) ;
114
114
115
+ test ( 'Test nextEmbedded: "@pop" in cases statement' , ( ) => {
116
+ const disposables = new DisposableStore ( ) ;
117
+ const languageService = disposables . add ( new LanguageService ( ) ) ;
118
+ const configurationService = new StandaloneConfigurationService ( new NullLogService ( ) ) ;
119
+ disposables . add ( languageService . registerLanguage ( { id : 'sql' } ) ) ;
120
+ disposables . add ( TokenizationRegistry . register ( 'sql' , disposables . add ( createMonarchTokenizer ( languageService , 'sql' , {
121
+ tokenizer : {
122
+ root : [
123
+ [ / ./ , 'token' ]
124
+ ]
125
+ }
126
+ } , configurationService ) ) ) ) ;
127
+ const SQL_QUERY_START = '(SELECT|INSERT|UPDATE|DELETE|CREATE|REPLACE|ALTER|WITH)' ;
128
+ const tokenizer = disposables . add ( createMonarchTokenizer ( languageService , 'test1' , {
129
+ tokenizer : {
130
+ root : [
131
+ [ `(\"\"\")${ SQL_QUERY_START } ` , [ { 'token' : 'string.quote' , } , { token : '@rematch' , next : '@endStringWithSQL' , nextEmbedded : 'sql' , } , ] ] ,
132
+ [ / ( " " " ) $ / , [ { token : 'string.quote' , next : '@maybeStringIsSQL' , } , ] ] ,
133
+ ] ,
134
+ maybeStringIsSQL : [
135
+ [ / ( .* ) / , {
136
+ cases : {
137
+ [ `${ SQL_QUERY_START } \\b.*` ] : { token : '@rematch' , next : '@endStringWithSQL' , nextEmbedded : 'sql' , } ,
138
+ '@default' : { token : '@rematch' , switchTo : '@endDblDocString' , } ,
139
+ }
140
+ } ] ,
141
+ ] ,
142
+ endDblDocString : [
143
+ [ '[^\']+' , 'string' ] ,
144
+ [ '\\\\\'' , 'string' ] ,
145
+ [ '\'\'\'' , 'string' , '@popall' ] ,
146
+ [ '\'' , 'string' ]
147
+ ] ,
148
+ endStringWithSQL : [ [ / " " " / , {
149
+ cases : {
150
+ '"""' : {
151
+ cases : {
152
+ '' : { token : 'string.quote' , next : '@popall' , nextEmbedded : '@pop' , }
153
+ }
154
+ } ,
155
+ '@default' : ''
156
+ }
157
+ } ] ] ,
158
+ }
159
+ } , configurationService ) ) ;
160
+
161
+ const lines = [
162
+ `mysql_query("""SELECT * FROM table_name WHERE ds = '<DATEID>'""")` ,
163
+ `mysql_query("""` ,
164
+ `SELECT *` ,
165
+ `FROM table_name` ,
166
+ `WHERE ds = '<DATEID>'` ,
167
+ `""")` ,
168
+ ] ;
169
+
170
+ const actualTokens = getTokens ( tokenizer , lines ) ;
171
+
172
+ assert . deepStrictEqual ( actualTokens , [
173
+ [
174
+ new Token ( 0 , 'source.test1' , 'test1' ) ,
175
+ new Token ( 12 , 'string.quote.test1' , 'test1' ) ,
176
+ new Token ( 15 , 'token.sql' , 'sql' ) ,
177
+ new Token ( 61 , 'string.quote.test1' , 'test1' ) ,
178
+ new Token ( 64 , 'source.test1' , 'test1' )
179
+ ] ,
180
+ [
181
+ new Token ( 0 , 'source.test1' , 'test1' ) ,
182
+ new Token ( 12 , 'string.quote.test1' , 'test1' )
183
+ ] ,
184
+ [
185
+ new Token ( 0 , 'token.sql' , 'sql' )
186
+ ] ,
187
+ [
188
+ new Token ( 0 , 'token.sql' , 'sql' )
189
+ ] ,
190
+ [
191
+ new Token ( 0 , 'token.sql' , 'sql' )
192
+ ] ,
193
+ [
194
+ new Token ( 0 , 'string.quote.test1' , 'test1' ) ,
195
+ new Token ( 3 , 'source.test1' , 'test1' )
196
+ ]
197
+ ] ) ;
198
+ disposables . dispose ( ) ;
199
+ } ) ;
200
+
201
+
115
202
test ( 'microsoft/monaco-editor#1235: Empty Line Handling' , ( ) => {
116
203
const disposables = new DisposableStore ( ) ;
117
204
const configurationService = new StandaloneConfigurationService ( new NullLogService ( ) ) ;
0 commit comments