@@ -54,10 +54,17 @@ class JavaScript < Scanner
54
54
55
55
protected
56
56
57
+ def setup
58
+ @state = :initial
59
+ end
60
+
57
61
def scan_tokens encoder , options
58
62
59
- state = :initial
60
- string_delimiter = nil
63
+ state , string_delimiter = options [ :state ] || @state
64
+ if string_delimiter
65
+ encoder . begin_group state
66
+ end
67
+
61
68
value_expected = true
62
69
key_expected = false
63
70
function_expected = false
@@ -72,9 +79,10 @@ def scan_tokens encoder, options
72
79
value_expected = true if !value_expected && match . index ( ?\n)
73
80
encoder . text_token match , :space
74
81
75
- elsif match = scan ( %r! // [^\n \\ ]* (?: \\ . [^\n \\ ]* )* | /\* (?: .*? \* / | .* ) !mx )
82
+ elsif match = scan ( %r! // [^\n \\ ]* (?: \\ . [^\n \\ ]* )* | /\* (?: .*? \* / | .*() ) !mx )
76
83
value_expected = true
77
84
encoder . text_token match , :comment
85
+ state = :open_multi_line_comment if self [ 1 ]
78
86
79
87
elsif check ( /\. ?\d / )
80
88
key_expected = value_expected = false
@@ -176,19 +184,35 @@ def scan_tokens encoder, options
176
184
elsif match = scan ( / \\ | $ /x )
177
185
encoder . end_group state
178
186
encoder . text_token match , :error unless match . empty?
187
+ string_delimiter = nil
179
188
key_expected = value_expected = false
180
189
state = :initial
181
190
else
182
191
raise_inspect "else case #{ string_delimiter } reached; %p not handled." % peek ( 1 ) , encoder
183
192
end
184
193
194
+ when :open_multi_line_comment
195
+ if match = scan ( %r! .*? \* / !mx )
196
+ state = :initial
197
+ else
198
+ match = scan ( %r! .+ !mx )
199
+ end
200
+ value_expected = true
201
+ encoder . text_token match , :comment if match
202
+
185
203
else
186
- raise_inspect 'Unknown state' , encoder
204
+ #:nocov:
205
+ raise_inspect 'Unknown state: %p' % [ state ] , encoder
206
+ #:nocov:
187
207
188
208
end
189
209
190
210
end
191
211
212
+ if options [ :keep_state ]
213
+ @state = state , string_delimiter
214
+ end
215
+
192
216
if [ :string , :regexp ] . include? state
193
217
encoder . end_group state
194
218
end
0 commit comments