fix: better error for TS annotations in snippets without lang="ts"

pull/17954/head
Julia 6 months ago
parent 7ec156a7b0
commit 9d0edf720e

@ -0,0 +1,5 @@
---
'svelte': patch
---
Improve error message when TypeScript syntax is used in snippet parameters without `lang="ts"`

@ -177,10 +177,11 @@ export class Parser {
/** /**
* @param {any} err * @param {any} err
* @param {string} [suffix]
* @returns {never} * @returns {never}
*/ */
acorn_error(err) { acorn_error(err, suffix = '') {
e.js_parse_error(err.pos, err.message.replace(regex_position_indicator, '')); e.js_parse_error(err.pos, err.message.replace(regex_position_indicator, '') + suffix);
} }
/** /**

@ -390,16 +390,28 @@ function open(parser) {
const prelude = parser.template.slice(0, params_start).replace(/\S/g, ' '); const prelude = parser.template.slice(0, params_start).replace(/\S/g, ' ');
const params = parser.template.slice(params_start, parser.index); const params = parser.template.slice(params_start, parser.index);
let function_expression = matched let function_expression;
? /** @type {ArrowFunctionExpression} */ (
if (matched) {
try {
function_expression = /** @type {ArrowFunctionExpression} */ (
parse_expression_at( parse_expression_at(
prelude + `${params} => {}`, prelude + `${params} => {}`,
parser.root.comments, parser.root.comments,
parser.ts, parser.ts,
params_start params_start
) )
) );
: { params: [] }; } catch (/** @type {any} */ err) {
const suffix =
!parser.ts && parser.template[err.pos] === ':'
? ` (did you forget to add \`lang="ts"\`?)`
: '';
parser.acorn_error(err, suffix);
}
} else {
function_expression = { params: [] };
}
parser.allow_whitespace(); parser.allow_whitespace();
parser.eat('}', true); parser.eat('}', true);

@ -0,0 +1,9 @@
import { test } from '../../test';
export default test({
error: {
code: 'js_parse_error',
message: 'Unexpected token (did you forget to add `lang="ts"`?)',
position: [18, 18]
}
});
Loading…
Cancel
Save