@@ -94,18 +94,27 @@ def scan_tokens encoder, options
94
94
if !method_call_expected &&
95
95
match = scan ( unicode ? /#{ patterns ::METHOD_NAME } /uo :
96
96
/#{ patterns ::METHOD_NAME } /o )
97
- value_expected = false
97
+
98
98
kind = patterns ::IDENT_KIND [ match ]
99
- if kind == :ident
100
- if match [ /\A [A-Z]/ ] && !( match [ /[!?]$/ ] || match? ( /\( / ) )
101
- kind = :constant
99
+ if kind == :ident && value_expected != :colon_expected && scan ( /:(?!:)/ )
100
+ value_expected = true
101
+ encoder . text_token match , :key
102
+ encoder . text_token ':' , :operator
103
+ else
104
+ value_expected = false
105
+ if kind == :ident
106
+ if match [ /\A [A-Z]/ ] && !( match [ /[!?]$/ ] || match? ( /\( / ) )
107
+ kind = :constant
108
+ end
109
+ elsif kind == :keyword
110
+ state = patterns ::KEYWORD_NEW_STATE [ match ]
111
+ if patterns ::KEYWORDS_EXPECTING_VALUE [ match ]
112
+ value_expected = match == 'when' ? :colon_expected : true
113
+ end
102
114
end
103
- elsif kind == :keyword
104
- state = patterns ::KEYWORD_NEW_STATE [ match ]
105
- value_expected = true if patterns ::KEYWORDS_EXPECTING_VALUE [ match ]
115
+ value_expected = true if !value_expected && check ( /#{ patterns ::VALUE_FOLLOWS } /o )
116
+ encoder . text_token match , kind
106
117
end
107
- value_expected = true if !value_expected && check ( /#{ patterns ::VALUE_FOLLOWS } /o )
108
- encoder . text_token match , kind
109
118
110
119
elsif method_call_expected &&
111
120
match = scan ( unicode ? /#{ patterns ::METHOD_AFTER_DOT } /uo :
@@ -119,9 +128,9 @@ def scan_tokens encoder, options
119
128
value_expected = check ( /#{ patterns ::VALUE_FOLLOWS } /o )
120
129
121
130
# OPERATORS #
122
- elsif !method_call_expected && match = scan ( / (\. (?!\. )|::) | (?: \. \. \. ? | ==?=? | [,\( \[ \{ ] )( ) | [\) \] \} ] /x )
131
+ elsif !method_call_expected && match = scan ( / (\. (?!\. )|::) | ( \. \. \. ? | ==?=? | [,\( \[ \{ ] ) | [\) \] \} ] /x )
123
132
method_call_expected = self [ 1 ]
124
- value_expected = !method_call_expected && self [ 2 ]
133
+ value_expected = !method_call_expected && !! self [ 2 ]
125
134
if inline_block_stack
126
135
case match
127
136
when '{'
@@ -213,7 +222,7 @@ def scan_tokens encoder, options
213
222
encoder . text_token match , :integer
214
223
215
224
elsif match = scan ( / %=? | <(?:<|=>?)? | \? /x )
216
- value_expected = true
225
+ value_expected = match == '?' ? :colon_expected : true
217
226
encoder . text_token match , :operator
218
227
219
228
elsif match = scan ( /`/ )
0 commit comments