1
1
component extends = " AbstractParser" {
2
2
3
- this .STATE = {NONE = 0 ,COMMENT = 1 , IF_STATEMENT = 2 , ELSE_IF_STATEMENT = 3 , ELSE_STATEMENT = 4 , SWITCH_STATEMENT = 5 , STATEMENT = 6 , COMPONENT_STATEMENT = 7 , FOR_LOOP = 8 ,WHILE_LOOP = 9 ,RETURN_STATEMENT = 10 ,CLOSURE = 11 ,FUNCTION_STATEMENT = 12 };
3
+ this .STATE = {NONE = 0 ,COMMENT = 1 , IF_STATEMENT = 2 , ELSE_IF_STATEMENT = 3 , ELSE_STATEMENT = 4 , SWITCH_STATEMENT = 5 , STATEMENT = 6 , COMPONENT_STATEMENT = 7 , FOR_LOOP = 8 ,WHILE_LOOP = 9 ,RETURN_STATEMENT = 10 ,CLOSURE = 11 ,FUNCTION_STATEMENT = 12 , DO_WHILE_LOOP = 13 , TRY_BLOCK = 14 , CATCH_BLOCK = 15 , FINALLY_BLOCK = 16 };
4
4
5
5
6
6
public function parse (file , startPosition = 0 , endPosition = 0 ) {
@@ -10,6 +10,8 @@ component extends="AbstractParser" {
10
10
var parent = " " ;
11
11
var currentState = this .STATE .NONE ;
12
12
var c = " " ;
13
+ var cCode = 0 ;
14
+ var lowerC = " " ;
13
15
var endPos = 0 ;
14
16
var temp = " " ;
15
17
var paren = 0 ;
@@ -89,6 +91,13 @@ component extends="AbstractParser" {
89
91
if (currentState == this .STATE .CLOSURE ) {
90
92
currentState = this .STATE .STATEMENT ;
91
93
sb .append (c );
94
+ } else if (! isSimpleValue (parent ) && parent .getName () == " do" ) {
95
+ // end of a do / while loop
96
+ parent .setBodyClose (pos );
97
+ currentStatement = parent ;
98
+ currentState = this .STATE .DO_WHILE_LOOP ;
99
+ parent = currentStatement .getParent ();
100
+ sb .setLength (0 );
92
101
} else {
93
102
if (! isSimpleValue (parent )) {
94
103
parent .setBodyClose (pos );
@@ -107,6 +116,12 @@ component extends="AbstractParser" {
107
116
if (reFindNoCase (" \s*cf(output|mail|savecontent|query|document|pdf|htmltopdf|htmltopdfitem|form|storedproc|chart|client|div|documentitem|documentsection|formgroup|grid|http|imap|invoke|layout|lock|login|map|menu|module|pod|presentation|thread\report|silent|table|textarea|timer|transaction|tree|zip|window|xml)\s*\([^{]+\)\s*$" , sb .toString ())) {
108
117
// script tag that can have body
109
118
currentStatement .setBodyOpen (pos );
119
+ parent = currentStatement ;
120
+ currentState = this .STATE .NONE ;
121
+ sb .setLength (0 );
122
+ } else if (reFindNoCase (" \s(transaction|)\s*$" , sb .toString ())) {
123
+ currentStatement .setBodyOpen (pos );
124
+
110
125
parent = currentStatement ;
111
126
currentState = this .STATE .NONE ;
112
127
sb .setLength (0 );
@@ -123,7 +138,7 @@ component extends="AbstractParser" {
123
138
}
124
139
} else if (c == " ;" ) {
125
140
// TODO handle case where if/else if/else/for/while does not use {}
126
- if (currentState == this .STATE .STATEMENT ) {
141
+ if (currentState == this .STATE .STATEMENT || currentState == this . STATE . DO_WHILE_LOOP ) {
127
142
currentState = this .STATE .NONE ;
128
143
129
144
currentStatement .setEndPosition (pos );
@@ -138,7 +153,7 @@ component extends="AbstractParser" {
138
153
sb .append (" ;" );
139
154
}
140
155
} else if (c == chr (13 )) {
141
- if (currentState == this .STATE .STATEMENT ) {
156
+ if (currentState == this .STATE .STATEMENT || currentState == this . STATE . DO_WHILE_LOOP ) {
142
157
if (isValidStatement (sb .toString ())) {
143
158
currentState = this .STATE .NONE ;
144
159
currentStatement .setEndPosition (pos );
@@ -150,24 +165,25 @@ component extends="AbstractParser" {
150
165
sb .append (c );
151
166
}
152
167
} else if (currentState == this .STATE .NONE ) {
153
-
154
- if (reFind (" [a-z_]" , c )) {
155
- // some letter
168
+ lowerC = lCase (c );
169
+ cCode = asc (lowerC );
170
+ if ( (cCode >= 97 && cCode <= 122 ) || cCode == 95 ) {
171
+ // some letter reFind("[a-z_]", c)
156
172
157
173
158
174
159
175
sb .setLength (0 );
160
- if (c == " c" && mid (content , pos , 9 ) == " component" ) {
176
+ if (lowerC == " c" && mid (content , pos , 9 ) == " component" ) {
161
177
currentStatement = new ScriptStatement (name = " component" ,startPosition = pos , file = arguments .file , parent = parent );
162
178
addStatement (currentStatement );
163
179
parent = currentStatement ;
180
+ sb .append (mid (content , pos , 9 ));
164
181
pos = pos + 9 ;
165
- sb .append (" component" );
166
182
currentState = this .STATE .COMPONENT_STATEMENT ;
167
183
continue ;
168
- } else if (c == " f" && reFind (" function[\t\r\n a-zA-Z_]" , mid (content , pos , 9 )) ) {
184
+ } else if (lowerC == " f" && reFindNoCase (" function[\t\r\n a-zA-Z_]" , mid (content , pos , 9 )) ) {
169
185
// a function without access modifier or return type
170
- sb .append (" function " );
186
+ sb .append (mid ( content , pos , 8 ) );
171
187
currentState = this .STATE .FUNCTION_STATEMENT ;
172
188
currentStatement = new ScriptStatement (name = " function" ,startPosition = pos , file = arguments .file , parent = parent );
173
189
addStatement (currentStatement );
@@ -176,7 +192,7 @@ component extends="AbstractParser" {
176
192
}
177
193
pos = pos + 8 ;
178
194
continue ;
179
- } else if (c == " i" && reFind (" if[\t\r\n (]" , mid (content , pos , 3 ))) {
195
+ } else if (lowerC == " i" && reFindNoCase (" if[\t\r\n (]" , mid (content , pos , 3 ))) {
180
196
currentStatementStart = pos ;
181
197
currentStatement = new ScriptStatement (name = " if" , startPosition = pos , file = arguments .file , parent = parent );
182
198
parent = currentStatement ;
@@ -186,10 +202,10 @@ component extends="AbstractParser" {
186
202
if (! isSimpleValue (parent )) {
187
203
parent .addChild (currentStatement );
188
204
}
189
- sb .append (" if " );
205
+ sb .append (mid ( content , pos , 2 ) );
190
206
pos = pos + 2 ;
191
207
continue ;
192
- } else if (c == " e" && reFind (" else[ \t\r\n]+if[\t\r\n (]" , content , pos ) == pos ) {
208
+ } else if (lowerC == " e" && reFindNoCase (" else[ \t\r\n]+if[\t\r\n (]" , content , pos ) == pos ) {
193
209
currentStatementStart = pos ;
194
210
currentStatement = new ScriptStatement (name = " else if" , startPosition = pos , file = arguments .file , parent = parent );
195
211
currentState = this .STATE .ELSE_IF_STATEMENT ;
@@ -202,7 +218,7 @@ component extends="AbstractParser" {
202
218
sb .append (mid (content , pos , paren - pos ));
203
219
pos = paren ;
204
220
continue ;
205
- } else if (c == " e" && reFind (" else[\t\r\n (]" , content , pos ) == pos ) {
221
+ } else if (lowerC == " e" && reFindNoCase (" else[\t\r\n (]" , content , pos ) == pos ) {
206
222
currentStatementStart = pos ;
207
223
currentStatement = new ScriptStatement (name = " else" , startPosition = pos , file = arguments .file , parent = parent );
208
224
parent = currentStatement ;
@@ -211,10 +227,10 @@ component extends="AbstractParser" {
211
227
if (! isSimpleValue (parent )) {
212
228
parent .addChild (currentStatement );
213
229
}
214
- sb .append (" else " );
230
+ sb .append (mid ( content , pos , 4 ) );
215
231
pos = pos + 4 ;
216
232
continue ;
217
- } else if (c == " v" && trim (mid (content , pos , 4 )) == " var" ) {
233
+ } else if (lowerC == " v" && trim (mid (content , pos , 4 )) == " var" ) {
218
234
currentStatement = new ScriptStatement (name = " var" , startPosition = pos , file = arguments .file , parent = parent );
219
235
currentState = this .STATE .STATEMENT ;
220
236
addStatement (currentStatement );
@@ -225,16 +241,88 @@ component extends="AbstractParser" {
225
241
sb .append (" var " );
226
242
pos = pos + 4 ;
227
243
continue ;
228
- } else if (c == " r" && reFind (" return[\t\r\n ;]" , mid (content , pos , 7 )) == pos ) {
244
+ } else if (lowerC == " r" && reFindNoCase (" return[\t\r\n ;]" , mid (content , pos , 7 )) == pos ) {
229
245
currentStatement = new ScriptStatement (name = " return" , startPosition = pos , file = arguments .file , parent = parent );
230
246
currentState = this .STATE .RETURN_STATEMENT ;
231
247
addStatement (currentStatement );
232
248
if (! isSimpleValue (parent )) {
233
249
parent .addChild (currentStatement );
234
250
}
235
- sb .append (" return " );
251
+ sb .append (mid ( content , pos , 6 ) );
236
252
pos = pos + 6 ;
237
253
continue ;
254
+ } else if (lowerC == " f" && reFindNoCase (" for\s*\(" , content , pos ) == pos ) {
255
+ currentStatementStart = pos ;
256
+ currentStatement = new ScriptStatement (name = " for" , startPosition = pos , file = arguments .file , parent = parent );
257
+ parent = currentStatement ;
258
+ currentState = this .STATE .FOR_LOOP ;
259
+ addStatement (currentStatement );
260
+ if (! isSimpleValue (parent )) {
261
+ parent .addChild (currentStatement );
262
+ }
263
+ sb .append (mid (content , pos , 3 ));
264
+ pos = pos + 3 ;
265
+ continue ;
266
+ } else if (lowerC == " w" && reFindNoCase (" while\s*\(" , content , pos ) == pos ) {
267
+ currentStatementStart = pos ;
268
+ currentStatement = new ScriptStatement (name = " while" , startPosition = pos , file = arguments .file , parent = parent );
269
+ parent = currentStatement ;
270
+ currentState = this .STATE .WHILE_LOOP ;
271
+ addStatement (currentStatement );
272
+ if (! isSimpleValue (parent )) {
273
+ parent .addChild (currentStatement );
274
+ }
275
+ sb .append (mid (content , pos , 5 ));
276
+ pos = pos + 5 ;
277
+ continue ;
278
+ } else if (lowerC == " d" && reFindNoCase (" do\s*{" , content , pos ) == pos ) {
279
+ currentStatementStart = pos ;
280
+ currentStatement = new ScriptStatement (name = " do" , startPosition = pos , file = arguments .file , parent = parent );
281
+ parent = currentStatement ;
282
+ currentState = this .STATE .DO_WHILE_LOOP ;
283
+ addStatement (currentStatement );
284
+ if (! isSimpleValue (parent )) {
285
+ parent .addChild (currentStatement );
286
+ }
287
+ sb .append (mid (content , pos , 2 ));
288
+ pos = pos + 2 ;
289
+ continue ;
290
+ } else if (lowerC == " t" && reFindNoCase (" try\s*{" , content , pos ) == pos ) {
291
+ currentStatementStart = pos ;
292
+ currentStatement = new ScriptStatement (name = " try" , startPosition = pos , file = arguments .file , parent = parent );
293
+ parent = currentStatement ;
294
+ currentState = this .STATE .TRY_BLOCK ;
295
+ addStatement (currentStatement );
296
+ if (! isSimpleValue (parent )) {
297
+ parent .addChild (currentStatement );
298
+ }
299
+ sb .append (mid (content , pos , 3 ));
300
+ pos = pos + 3 ;
301
+ continue ;
302
+ } else if (lowerC == " c" && reFindNoCase (" catch\s*\(" , content , pos ) == pos ) {
303
+ currentStatementStart = pos ;
304
+ currentStatement = new ScriptStatement (name = " catch" , startPosition = pos , file = arguments .file , parent = parent );
305
+ parent = currentStatement ;
306
+ currentState = this .STATE .CATCH_BLOCK ;
307
+ addStatement (currentStatement );
308
+ if (! isSimpleValue (parent )) {
309
+ parent .addChild (currentStatement );
310
+ }
311
+ sb .append (mid (content , pos , 5 ));
312
+ pos = pos + 5 ;
313
+ continue ;
314
+ } else if (lowerC == " f" && reFindNoCase (" finally\s*\{" , content , pos ) == pos ) {
315
+ currentStatementStart = pos ;
316
+ currentStatement = new ScriptStatement (name = " finally" , startPosition = pos , file = arguments .file , parent = parent );
317
+ parent = currentStatement ;
318
+ currentState = this .STATE .CATCH_BLOCK ;
319
+ addStatement (currentStatement );
320
+ if (! isSimpleValue (parent )) {
321
+ parent .addChild (currentStatement );
322
+ }
323
+ sb .append (mid (content , pos , 7 ));
324
+ pos = pos + 7 ;
325
+ continue ;
238
326
} else {
239
327
// either a statement or a function
240
328
/* cases to handle
@@ -252,7 +340,7 @@ component extends="AbstractParser" {
252
340
semi = find (" ;" , content , pos + 1 );
253
341
paren = find (" (" , content , pos + 1 );
254
342
quotePos = reFind (" ['"" ]" , content , pos + 1 );
255
- temp = reFind (" [^a-zA-Z0-9_.]*function[\t\r\n ]+[a-zA-Z_]" , content , pos );
343
+ temp = reFindNoCase (" [^a-zA-Z0-9_.]*function[\t\r\n ]+[a-zA-Z_]" , content , pos );
256
344
257
345
258
346
if (temp == 0 ) {
0 commit comments