@@ -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
98
- kind = patterns ::IDENT_KIND [ match ]
99
- if kind == :ident
100
- if match [ /\A [A-Z]/ ] && !( match [ /[!?]$/ ] || match? ( /\( / ) )
101
- kind = :constant
97
+
98
+ if value_expected != :colon_expected && scan ( /:(?= )/ )
99
+ value_expected = true
100
+ encoder . text_token match , :key
101
+ encoder . text_token ':' , :operator
102
+ else
103
+ value_expected = false
104
+ kind = patterns ::IDENT_KIND [ match ]
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 :
@@ -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