Skip to content

Commit c535c22

Browse files
authored
Change AST (#59)
1 parent d2f0b12 commit c535c22

File tree

148 files changed

+3110
-303
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

148 files changed

+3110
-303
lines changed

src/ast.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ export interface SvelteName extends BaseNode {
199199
| SvelteStyleElement
200200
| SvelteAttribute
201201
| SvelteMemberExpressionName
202+
| SvelteDirectiveKey
202203
}
203204

204205
/** Nodes that may be used in component names. The component names separated by dots. */
@@ -414,7 +415,7 @@ export type SvelteDirective =
414415
| SvelteTransitionDirective
415416
export interface SvelteDirectiveKey extends BaseNode {
416417
type: "SvelteDirectiveKey"
417-
name: ESTree.Identifier
418+
name: ESTree.Identifier | SvelteName
418419
modifiers: string[]
419420
parent: SvelteDirective
420421
}

src/context/let-directive-collection.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import type { SvelteLetDirective, SvelteNode } from "../ast"
1+
import type { SvelteLetDirective, SvelteName, SvelteNode } from "../ast"
22
import type * as ESTree from "estree"
33
import type { ScriptLetCallback, ScriptLetCallbackOption } from "./script-let"
44

55
/** A class that collects pattern nodes for Let directives. */
66
export class LetDirectiveCollection {
77
private readonly list: {
8-
pattern: ESTree.Pattern
8+
pattern: ESTree.Pattern | SvelteName
99
directive: SvelteLetDirective
1010
typing: string
1111
callbacks: ScriptLetCallback<ESTree.Pattern>[]
@@ -15,7 +15,7 @@ export class LetDirectiveCollection {
1515
return this.list.length === 0
1616
}
1717

18-
public getLetParams(): ESTree.Pattern[] {
18+
public getLetParams(): (ESTree.Pattern | SvelteName)[] {
1919
return this.list.map((d) => d.pattern)
2020
}
2121

@@ -43,7 +43,7 @@ export class LetDirectiveCollection {
4343
}
4444

4545
public addPattern(
46-
pattern: ESTree.Pattern,
46+
pattern: ESTree.Pattern | SvelteName,
4747
directive: SvelteLetDirective,
4848
typing: string,
4949
...callbacks: ScriptLetCallback<ESTree.Pattern>[]

src/context/script-let.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
Locations,
77
SvelteEachBlock,
88
SvelteIfBlock,
9+
SvelteName,
910
SvelteNode,
1011
Token,
1112
} from "../ast"
@@ -50,6 +51,11 @@ function getNodeRange(
5051
end: number
5152
leadingComments?: Comment[]
5253
trailingComments?: Comment[]
54+
}
55+
| {
56+
range: [number, number]
57+
leadingComments?: Comment[]
58+
trailingComments?: Comment[]
5359
},
5460
): [number, number] {
5561
let start = null
@@ -98,7 +104,7 @@ export class ScriptLetContext {
98104
}
99105

100106
public addExpression<E extends ESTree.Expression>(
101-
expression: E,
107+
expression: E | SvelteName,
102108
parent: SvelteNode,
103109
typing?: string | null,
104110
...callbacks: ScriptLetCallback<E>[]
@@ -300,7 +306,7 @@ export class ScriptLetContext {
300306

301307
public nestBlock(
302308
block: SvelteNode,
303-
params: ESTree.Pattern[],
309+
params: (ESTree.Pattern | SvelteName)[],
304310
parents: SvelteNode[],
305311
callback: (
306312
nodes: ESTree.Pattern[],
@@ -311,7 +317,7 @@ export class ScriptLetContext {
311317

312318
public nestBlock(
313319
block: SvelteNode,
314-
params?: ESTree.Pattern[],
320+
params?: (ESTree.Pattern | SvelteName)[],
315321
parents?: SvelteNode[],
316322
callback?: (
317323
nodes: ESTree.Pattern[],

src/parser/converts/attr.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import type {
1111
SvelteSpreadAttribute,
1212
SvelteTransitionDirective,
1313
SvelteStartTag,
14+
SvelteName,
1415
} from "../../ast"
1516
import type ESTree from "estree"
1617
import type { Context } from "../../context"
@@ -399,9 +400,12 @@ function processDirective<
399400
node: D & { expression: null | E },
400401
directive: S,
401402
ctx: Context,
402-
processExpression: (expression: E) => ScriptLetCallback<NonNullable<E>>[],
403+
processExpression: (
404+
expression: E,
405+
shorthand: boolean,
406+
) => ScriptLetCallback<NonNullable<E>>[],
403407
processName?: (
404-
expression: ESTree.Identifier,
408+
expression: SvelteName,
405409
) => ScriptLetCallback<ESTree.Identifier>[],
406410
) {
407411
const colonIndex = ctx.code.indexOf(":", directive.range[0])
@@ -444,15 +448,22 @@ function processDirective<
444448
keyEndIndex = nextEnd
445449
}
446450

447-
let isShorthand = false
451+
let isShorthandExpression = false
448452

449453
if (node.expression) {
450-
isShorthand =
454+
isShorthandExpression =
451455
node.expression.type === "Identifier" &&
452456
node.expression.name === node.name &&
453-
getWithLoc(node.expression).start === nameRange.start &&
454-
getWithLoc(node.expression).end === nameRange.end
455-
processExpression(node.expression).push((es) => {
457+
getWithLoc(node.expression).start === nameRange.start
458+
if (
459+
isShorthandExpression &&
460+
getWithLoc(node.expression).end !== nameRange.end
461+
) {
462+
// The identifier location may be incorrect in some edge cases.
463+
// e.g. bind:value=""
464+
getWithLoc(node.expression).end = nameRange.end
465+
}
466+
processExpression(node.expression, isShorthandExpression).push((es) => {
456467
directive.expression = es
457468
})
458469
}
@@ -467,12 +478,12 @@ function processDirective<
467478

468479
// put name
469480
key.name = {
470-
type: "Identifier",
481+
type: "SvelteName",
471482
name: node.name,
472483
parent: key,
473484
...ctx.getConvertLocation(nameRange),
474485
}
475-
if (!isShorthand) {
486+
if (!isShorthandExpression) {
476487
if (processName) {
477488
processName(key.name).push((es) => {
478489
key.name = es

tests/fixtures/parser/ast/blog/write-less-code01-output.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@
326326
"key": {
327327
"type": "SvelteDirectiveKey",
328328
"name": {
329-
"type": "Identifier",
329+
"type": "SvelteName",
330330
"name": "value",
331331
"range": [
332332
70,
@@ -530,7 +530,7 @@
530530
"key": {
531531
"type": "SvelteDirectiveKey",
532532
"name": {
533-
"type": "Identifier",
533+
"type": "SvelteName",
534534
"name": "value",
535535
"range": [
536536
107,

tests/fixtures/parser/ast/class-directive01-output.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@
270270
"key": {
271271
"type": "SvelteDirectiveKey",
272272
"name": {
273-
"type": "Identifier",
273+
"type": "SvelteName",
274274
"name": "bar",
275275
"range": [
276276
66,
@@ -434,7 +434,7 @@
434434
"key": {
435435
"type": "SvelteDirectiveKey",
436436
"name": {
437-
"type": "Identifier",
437+
"type": "SvelteName",
438438
"name": "foo",
439439
"range": [
440440
94,

tests/fixtures/parser/ast/docs/component-format/01-script/03-$-marks-a-statement-as-reactive/02-output.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@
616616
"key": {
617617
"type": "SvelteDirectiveKey",
618618
"name": {
619-
"type": "Identifier",
619+
"type": "SvelteName",
620620
"name": "click",
621621
"range": [
622622
154,
@@ -840,7 +840,7 @@
840840
"key": {
841841
"type": "SvelteDirectiveKey",
842842
"name": {
843-
"type": "Identifier",
843+
"type": "SvelteName",
844844
"name": "click",
845845
"range": [
846846
208,

tests/fixtures/parser/ast/docs/template-syntax/04-comments/02-output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
"key": {
6868
"type": "SvelteDirectiveKey",
6969
"name": {
70-
"type": "Identifier",
70+
"type": "SvelteName",
7171
"name": "value",
7272
"range": [
7373
50,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/01-on-eventname/01-output.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"key": {
3232
"type": "SvelteDirectiveKey",
3333
"name": {
34-
"type": "Identifier",
34+
"type": "SvelteName",
3535
"name": "eventname",
3636
"range": [
3737
8,
@@ -179,7 +179,7 @@
179179
"key": {
180180
"type": "SvelteDirectiveKey",
181181
"name": {
182-
"type": "Identifier",
182+
"type": "SvelteName",
183183
"name": "eventname",
184184
"range": [
185185
39,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/01-on-eventname/02-output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@
345345
"key": {
346346
"type": "SvelteDirectiveKey",
347347
"name": {
348-
"type": "Identifier",
348+
"type": "SvelteName",
349349
"name": "click",
350350
"range": [
351351
96,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/01-on-eventname/03-output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"key": {
3232
"type": "SvelteDirectiveKey",
3333
"name": {
34-
"type": "Identifier",
34+
"type": "SvelteName",
3535
"name": "click",
3636
"range": [
3737
11,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/01-on-eventname/04-output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"key": {
3232
"type": "SvelteDirectiveKey",
3333
"name": {
34-
"type": "Identifier",
34+
"type": "SvelteName",
3535
"name": "submit",
3636
"range": [
3737
9,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/01-on-eventname/05-output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"key": {
3232
"type": "SvelteDirectiveKey",
3333
"name": {
34-
"type": "Identifier",
34+
"type": "SvelteName",
3535
"name": "click",
3636
"range": [
3737
11,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/01-on-eventname/06-output.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@
512512
"key": {
513513
"type": "SvelteDirectiveKey",
514514
"name": {
515-
"type": "Identifier",
515+
"type": "SvelteName",
516516
"name": "click",
517517
"range": [
518518
150,
@@ -584,7 +584,7 @@
584584
"key": {
585585
"type": "SvelteDirectiveKey",
586586
"name": {
587-
"type": "Identifier",
587+
"type": "SvelteName",
588588
"name": "click",
589589
"range": [
590590
171,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/02-bind-property/01-output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"key": {
3232
"type": "SvelteDirectiveKey",
3333
"name": {
34-
"type": "Identifier",
34+
"type": "SvelteName",
3535
"name": "property",
3636
"range": [
3737
10,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/02-bind-property/02-output.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"key": {
3232
"type": "SvelteDirectiveKey",
3333
"name": {
34-
"type": "Identifier",
34+
"type": "SvelteName",
3535
"name": "value",
3636
"range": [
3737
12,
@@ -179,7 +179,7 @@
179179
"key": {
180180
"type": "SvelteDirectiveKey",
181181
"name": {
182-
"type": "Identifier",
182+
"type": "SvelteName",
183183
"name": "value",
184184
"range": [
185185
41,
@@ -399,7 +399,7 @@
399399
"key": {
400400
"type": "SvelteDirectiveKey",
401401
"name": {
402-
"type": "Identifier",
402+
"type": "SvelteName",
403403
"name": "checked",
404404
"range": [
405405
95,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/02-bind-property/03-output.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
"key": {
6868
"type": "SvelteDirectiveKey",
6969
"name": {
70-
"type": "Identifier",
70+
"type": "SvelteName",
7171
"name": "value",
7272
"range": [
7373
42,
@@ -215,7 +215,7 @@
215215
"key": {
216216
"type": "SvelteDirectiveKey",
217217
"name": {
218-
"type": "Identifier",
218+
"type": "SvelteName",
219219
"name": "value",
220220
"range": [
221221
69,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/02-bind-property/04-output.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@
8787
"key": {
8888
"type": "SvelteDirectiveKey",
8989
"name": {
90-
"type": "Identifier",
90+
"type": "SvelteName",
9191
"name": "value",
9292
"range": [
9393
26,
@@ -291,7 +291,7 @@
291291
"key": {
292292
"type": "SvelteDirectiveKey",
293293
"name": {
294-
"type": "Identifier",
294+
"type": "SvelteName",
295295
"name": "value",
296296
"range": [
297297
64,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/02-bind-property/05-output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@
254254
"key": {
255255
"type": "SvelteDirectiveKey",
256256
"name": {
257-
"type": "Identifier",
257+
"type": "SvelteName",
258258
"name": "files",
259259
"range": [
260260
91,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/02-bind-property/06-output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"key": {
3232
"type": "SvelteDirectiveKey",
3333
"name": {
34-
"type": "Identifier",
34+
"type": "SvelteName",
3535
"name": "value",
3636
"range": [
3737
13,

tests/fixtures/parser/ast/docs/template-syntax/11-element-directives/02-bind-property/07-output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
"key": {
6969
"type": "SvelteDirectiveKey",
7070
"name": {
71-
"type": "Identifier",
71+
"type": "SvelteName",
7272
"name": "value",
7373
"range": [
7474
22,

0 commit comments

Comments
 (0)