From 8d8f38a39f2ca7eb58e4651f50f4dca2804277c3 Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Thu, 22 Aug 2024 23:17:39 +0300 Subject: [PATCH 1/2] improve errors around around dots extracted from #3807 --- src/language/__tests__/lexer-test.ts | 5 +++-- src/language/lexer.ts | 27 ++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/language/__tests__/lexer-test.ts b/src/language/__tests__/lexer-test.ts index 8ec91df52f..fd8d76dd6d 100644 --- a/src/language/__tests__/lexer-test.ts +++ b/src/language/__tests__/lexer-test.ts @@ -852,7 +852,8 @@ describe('Lexer', () => { }); expectSyntaxError('.123').to.deep.equal({ - message: 'Syntax Error: Unexpected character: ".".', + message: + 'Syntax Error: Invalid number, expected digit before ".", did you mean "0.123"?', locations: [{ line: 1, column: 1 }], }); @@ -1030,7 +1031,7 @@ describe('Lexer', () => { it('lex reports useful unknown character error', () => { expectSyntaxError('..').to.deep.equal({ - message: 'Syntax Error: Unexpected character: ".".', + message: 'Syntax Error: Unexpected "..", did you mean "..."?', locations: [{ line: 1, column: 1 }], }); diff --git a/src/language/lexer.ts b/src/language/lexer.ts index c20c879700..6b6a5e90dc 100644 --- a/src/language/lexer.ts +++ b/src/language/lexer.ts @@ -258,14 +258,31 @@ function readNextToken(lexer: Lexer, start: number): Token { return createToken(lexer, TokenKind.PAREN_L, position, position + 1); case 0x0029: // ) return createToken(lexer, TokenKind.PAREN_R, position, position + 1); - case 0x002e: // . - if ( - body.charCodeAt(position + 1) === 0x002e && - body.charCodeAt(position + 2) === 0x002e - ) { + case 0x002e: { + // . + const nextCode = body.charCodeAt(position + 1); + if (nextCode === 0x002e && body.charCodeAt(position + 2) === 0x002e) { return createToken(lexer, TokenKind.SPREAD, position, position + 3); } + if (nextCode === 0x002e) { + throw syntaxError( + lexer.source, + position, + 'Unexpected "..", did you mean "..."?', + ); + } else if (isDigit(nextCode)) { + const digits = lexer.source.body.slice( + position + 1, + readDigits(lexer, position + 1, nextCode), + ); + throw syntaxError( + lexer.source, + position, + `Invalid number, expected digit before ".", did you mean "0.${digits}"?`, + ); + } break; + } case 0x003a: // : return createToken(lexer, TokenKind.COLON, position, position + 1); case 0x003d: // = From 6056f80ea9c73f901192e3996f5aed9ba9b934ed Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Thu, 22 Aug 2024 23:35:00 +0300 Subject: [PATCH 2/2] add test for coverage --- src/language/__tests__/lexer-test.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/language/__tests__/lexer-test.ts b/src/language/__tests__/lexer-test.ts index fd8d76dd6d..f781e57207 100644 --- a/src/language/__tests__/lexer-test.ts +++ b/src/language/__tests__/lexer-test.ts @@ -165,6 +165,13 @@ describe('Lexer', () => { }); }); + it('reports unexpected characters', () => { + expectSyntaxError('.').to.deep.equal({ + message: 'Syntax Error: Unexpected character: ".".', + locations: [{ line: 1, column: 1 }], + }); + }); + it('errors respect whitespace', () => { let caughtError; try {