Skip to content

Commit f9ed906

Browse files
authored
Tokenizer: don't assert non-empty identifiers (#15462)
* Tokenizer: don't assert non-empty identifiers * Add test
1 parent c422e70 commit f9ed906

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

src/Compiler/Service/ServiceLexing.fs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,7 @@ module internal TokenClassifications =
173173
match token with
174174
| HASH_IDENT s
175175
| IDENT s ->
176-
if s.Length <= 0 then
177-
System.Diagnostics.Debug.Assert(false, "BUG: Received zero length IDENT token.")
178-
// This is related to 4783. Recover by treating as lower case identifier.
179-
(FSharpTokenColorKind.Identifier, FSharpTokenCharKind.Identifier, FSharpTokenTriggerClass.None)
180-
else if Char.ToUpperInvariant s[0] = s[0] then
176+
if s.Length > 0 && Char.ToUpperInvariant s[0] = s[0] then
181177
(FSharpTokenColorKind.UpperIdentifier, FSharpTokenCharKind.Identifier, FSharpTokenTriggerClass.None)
182178
else
183179
(FSharpTokenColorKind.Identifier, FSharpTokenCharKind.Identifier, FSharpTokenTriggerClass.None)

tests/service/TokenizerTests.fs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ module FSharp.Compiler.Service.Tests.TokenizerTests
99
#endif
1010

1111
open FSharp.Compiler.Tokenization
12-
12+
open FsUnit
1313
open NUnit.Framework
1414

1515
let sourceTok = FSharpSourceTokenizer([], Some "C:\\test.fsx", None)
@@ -214,3 +214,22 @@ let ``Tokenizer test - single-line nested string interpolation``() =
214214
printfn "expected = %A" expected
215215
Assert.Fail(sprintf "actual and expected did not match,actual =\n%A\nexpected=\n%A\n" actual expected)
216216

217+
218+
[<Test>]
219+
let ``Unfinished idents``() =
220+
let tokenizedLines =
221+
tokenizeLines
222+
[| "`"; "``"; "``a"; "``a`"; "```" |]
223+
224+
let actual =
225+
[ for lineTokens in tokenizedLines |> List.map snd do
226+
[ for str, info in lineTokens -> info.TokenName, str ] ]
227+
228+
let expected =
229+
[["IDENT", "`"]
230+
["IDENT", "``"]
231+
["IDENT", "``a"]
232+
["IDENT", "``a`"]
233+
["IDENT", "```"]]
234+
235+
actual |> shouldEqual expected

0 commit comments

Comments
 (0)