@azerothjs/language-service 0.4.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +259 -0
- package/dist/html-source.d.ts +12 -0
- package/dist/html-source.d.ts.map +1 -0
- package/dist/html-source.js +108 -0
- package/dist/html-source.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/language-data.d.ts +41 -0
- package/dist/language-data.d.ts.map +1 -0
- package/dist/language-data.js +164 -0
- package/dist/language-data.js.map +1 -0
- package/dist/mapping.d.ts +71 -0
- package/dist/mapping.d.ts.map +1 -0
- package/dist/mapping.js +123 -0
- package/dist/mapping.js.map +1 -0
- package/dist/markup-model.d.ts +67 -0
- package/dist/markup-model.d.ts.map +1 -0
- package/dist/markup-model.js +313 -0
- package/dist/markup-model.js.map +1 -0
- package/dist/protocol.d.ts +176 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +58 -0
- package/dist/protocol.js.map +1 -0
- package/dist/providers/completion.d.ts +26 -0
- package/dist/providers/completion.d.ts.map +1 -0
- package/dist/providers/completion.js +339 -0
- package/dist/providers/completion.js.map +1 -0
- package/dist/providers/css-service.d.ts +7 -0
- package/dist/providers/css-service.d.ts.map +1 -0
- package/dist/providers/css-service.js +84 -0
- package/dist/providers/css-service.js.map +1 -0
- package/dist/providers/diagnostics.d.ts +5 -0
- package/dist/providers/diagnostics.d.ts.map +1 -0
- package/dist/providers/diagnostics.js +89 -0
- package/dist/providers/diagnostics.js.map +1 -0
- package/dist/providers/editing.d.ts +17 -0
- package/dist/providers/editing.d.ts.map +1 -0
- package/dist/providers/editing.js +176 -0
- package/dist/providers/editing.js.map +1 -0
- package/dist/providers/hover.d.ts +5 -0
- package/dist/providers/hover.d.ts.map +1 -0
- package/dist/providers/hover.js +213 -0
- package/dist/providers/hover.js.map +1 -0
- package/dist/providers/html-service.d.ts +8 -0
- package/dist/providers/html-service.d.ts.map +1 -0
- package/dist/providers/html-service.js +108 -0
- package/dist/providers/html-service.js.map +1 -0
- package/dist/providers/inlay-hints.d.ts +25 -0
- package/dist/providers/inlay-hints.d.ts.map +1 -0
- package/dist/providers/inlay-hints.js +52 -0
- package/dist/providers/inlay-hints.js.map +1 -0
- package/dist/providers/navigation.d.ts +16 -0
- package/dist/providers/navigation.d.ts.map +1 -0
- package/dist/providers/navigation.js +107 -0
- package/dist/providers/navigation.js.map +1 -0
- package/dist/providers/semantic-tokens.d.ts +5 -0
- package/dist/providers/semantic-tokens.d.ts.map +1 -0
- package/dist/providers/semantic-tokens.js +63 -0
- package/dist/providers/semantic-tokens.js.map +1 -0
- package/dist/providers/signature.d.ts +5 -0
- package/dist/providers/signature.d.ts.map +1 -0
- package/dist/providers/signature.js +38 -0
- package/dist/providers/signature.js.map +1 -0
- package/dist/providers/structure.d.ts +19 -0
- package/dist/providers/structure.d.ts.map +1 -0
- package/dist/providers/structure.js +188 -0
- package/dist/providers/structure.js.map +1 -0
- package/dist/providers/symbols.d.ts +8 -0
- package/dist/providers/symbols.d.ts.map +1 -0
- package/dist/providers/symbols.js +108 -0
- package/dist/providers/symbols.js.map +1 -0
- package/dist/request.d.ts +37 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +49 -0
- package/dist/request.js.map +1 -0
- package/dist/service.d.ts +73 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +177 -0
- package/dist/service.js.map +1 -0
- package/dist/text.d.ts +25 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +66 -0
- package/dist/text.js.map +1 -0
- package/dist/ts-project.d.ts +75 -0
- package/dist/ts-project.d.ts.map +1 -0
- package/dist/ts-project.js +266 -0
- package/dist/ts-project.js.map +1 -0
- package/dist/uri.d.ts +21 -0
- package/dist/uri.d.ts.map +1 -0
- package/dist/uri.js +41 -0
- package/dist/uri.js.map +1 -0
- package/dist/virtual-code.d.ts +27 -0
- package/dist/virtual-code.d.ts.map +1 -0
- package/dist/virtual-code.js +360 -0
- package/dist/virtual-code.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-data.js","sourceRoot":"","sources":["../src/language-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** Why a segment exists - useful for debugging and for the markup layer. */
|
|
2
|
+
export type MappingKind = 'script' | 'expression' | 'attribute' | 'tag' | 'text';
|
|
3
|
+
/**
|
|
4
|
+
* One verbatim span. The two ranges have equal length, so any offset `o` with
|
|
5
|
+
* `sourceStart <= o <= sourceEnd` maps to `generatedStart + (o - sourceStart)`.
|
|
6
|
+
*/
|
|
7
|
+
export interface MappingSegment {
|
|
8
|
+
sourceStart: number;
|
|
9
|
+
sourceEnd: number;
|
|
10
|
+
generatedStart: number;
|
|
11
|
+
generatedEnd: number;
|
|
12
|
+
kind: MappingKind;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* An immutable mapping built by the virtual-code generator. Lookups are binary
|
|
16
|
+
* searches over the segment list (sorted by start), so translating the many
|
|
17
|
+
* locations a "find references" can return stays cheap.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const map = new CodeMapping([
|
|
22
|
+
* { sourceStart: 0, sourceEnd: 10, generatedStart: 40, generatedEnd: 50, kind: 'script' }
|
|
23
|
+
* ]);
|
|
24
|
+
* map.toGenerated(3); // 43
|
|
25
|
+
* map.toOriginal(43); // 3
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare class CodeMapping {
|
|
29
|
+
/** Segments sorted by `sourceStart` (for original -> generated). */
|
|
30
|
+
private readonly bySource;
|
|
31
|
+
/** Segments sorted by `generatedStart` (for generated -> original). */
|
|
32
|
+
private readonly byGenerated;
|
|
33
|
+
constructor(segments: MappingSegment[]);
|
|
34
|
+
/**
|
|
35
|
+
* Maps an offset in the original source to the virtual module, or `null`
|
|
36
|
+
* when it falls in non-mapped generated scaffolding. A position touching a
|
|
37
|
+
* segment's exclusive end still maps (so a caret right after an identifier
|
|
38
|
+
* resolves), preferring the segment that actually contains it.
|
|
39
|
+
*/
|
|
40
|
+
toGenerated(sourceOffset: number): number | null;
|
|
41
|
+
/**
|
|
42
|
+
* Maps an offset in the virtual module back to the original source, or
|
|
43
|
+
* `null` when it lands in generated scaffolding with no original origin.
|
|
44
|
+
*/
|
|
45
|
+
toOriginal(generatedOffset: number): number | null;
|
|
46
|
+
/**
|
|
47
|
+
* Maps an original `[start, end)` range to the virtual module. Returns
|
|
48
|
+
* `null` unless both ends land in the *same* segment, which guarantees the
|
|
49
|
+
* translated range is contiguous and meaningful (e.g. a rename edit).
|
|
50
|
+
*/
|
|
51
|
+
toGeneratedRange(sourceStart: number, sourceEnd: number): {
|
|
52
|
+
start: number;
|
|
53
|
+
end: number;
|
|
54
|
+
} | null;
|
|
55
|
+
/**
|
|
56
|
+
* Maps a virtual `[start, end)` range back to the original source. Both
|
|
57
|
+
* ends must share a segment; otherwise the range straddles generated
|
|
58
|
+
* scaffolding and has no faithful original counterpart.
|
|
59
|
+
*/
|
|
60
|
+
toOriginalRange(generatedStart: number, generatedEnd: number): {
|
|
61
|
+
start: number;
|
|
62
|
+
end: number;
|
|
63
|
+
} | null;
|
|
64
|
+
/**
|
|
65
|
+
* Binary-searches `segments` (sorted by `start`) for the one whose
|
|
66
|
+
* `[start, end]` span contains `offset`, preferring a span that strictly
|
|
67
|
+
* contains it over one it only touches at the end.
|
|
68
|
+
*/
|
|
69
|
+
private static find;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"AAeA,4EAA4E;AAC5E,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;AAEjF;;;GAGG;AACH,MAAM,WAAW,cAAc;IAE3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,WAAW,CAAC;CACrB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,WAAW;IAEpB,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAE5C,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;gBAEnC,QAAQ,EAAE,cAAc,EAAE;IAMtC;;;;;OAKG;IACI,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUvD;;;OAGG;IACI,UAAU,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUzD;;;;OAIG;IACI,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAatG;;;;OAIG;IACI,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAa3G;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,IAAI;CAsCtB"}
|
package/dist/mapping.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// Bidirectional offset mapping between an original `.azeroth` source and the
|
|
2
|
+
// virtual TypeScript module the language service type-checks against.
|
|
3
|
+
//
|
|
4
|
+
// The mapping is a sorted list of *verbatim* segments - spans of user-authored
|
|
5
|
+
// text that appear byte-for-byte in both documents (the script outside markup,
|
|
6
|
+
// the code inside `{ ... }` holes, attribute expressions, component tag names).
|
|
7
|
+
// Because those spans are copied 1:1, a position inside one translates by a
|
|
8
|
+
// simple additive shift. Generated scaffolding (the `h('div', { ... })` a
|
|
9
|
+
// markup region expands to) has no segment, so positions there don't map back -
|
|
10
|
+
// which is exactly right: there is no original character to point at.
|
|
11
|
+
//
|
|
12
|
+
// Everything the TypeScript bridge does flows through here: a request arrives
|
|
13
|
+
// at an original offset, `toGenerated` finds where to ask TS, and `toOriginal`
|
|
14
|
+
// translates each location TS hands back.
|
|
15
|
+
/**
|
|
16
|
+
* An immutable mapping built by the virtual-code generator. Lookups are binary
|
|
17
|
+
* searches over the segment list (sorted by start), so translating the many
|
|
18
|
+
* locations a "find references" can return stays cheap.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const map = new CodeMapping([
|
|
23
|
+
* { sourceStart: 0, sourceEnd: 10, generatedStart: 40, generatedEnd: 50, kind: 'script' }
|
|
24
|
+
* ]);
|
|
25
|
+
* map.toGenerated(3); // 43
|
|
26
|
+
* map.toOriginal(43); // 3
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export class CodeMapping {
|
|
30
|
+
/** Segments sorted by `sourceStart` (for original -> generated). */
|
|
31
|
+
bySource;
|
|
32
|
+
/** Segments sorted by `generatedStart` (for generated -> original). */
|
|
33
|
+
byGenerated;
|
|
34
|
+
constructor(segments) {
|
|
35
|
+
this.bySource = [...segments].sort((a, b) => a.sourceStart - b.sourceStart);
|
|
36
|
+
this.byGenerated = [...segments].sort((a, b) => a.generatedStart - b.generatedStart);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Maps an offset in the original source to the virtual module, or `null`
|
|
40
|
+
* when it falls in non-mapped generated scaffolding. A position touching a
|
|
41
|
+
* segment's exclusive end still maps (so a caret right after an identifier
|
|
42
|
+
* resolves), preferring the segment that actually contains it.
|
|
43
|
+
*/
|
|
44
|
+
toGenerated(sourceOffset) {
|
|
45
|
+
const seg = CodeMapping.find(this.bySource, sourceOffset, segment => segment.sourceStart, segment => segment.sourceEnd);
|
|
46
|
+
if (seg === null) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return seg.generatedStart + (sourceOffset - seg.sourceStart);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Maps an offset in the virtual module back to the original source, or
|
|
53
|
+
* `null` when it lands in generated scaffolding with no original origin.
|
|
54
|
+
*/
|
|
55
|
+
toOriginal(generatedOffset) {
|
|
56
|
+
const seg = CodeMapping.find(this.byGenerated, generatedOffset, segment => segment.generatedStart, segment => segment.generatedEnd);
|
|
57
|
+
if (seg === null) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
return seg.sourceStart + (generatedOffset - seg.generatedStart);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Maps an original `[start, end)` range to the virtual module. Returns
|
|
64
|
+
* `null` unless both ends land in the *same* segment, which guarantees the
|
|
65
|
+
* translated range is contiguous and meaningful (e.g. a rename edit).
|
|
66
|
+
*/
|
|
67
|
+
toGeneratedRange(sourceStart, sourceEnd) {
|
|
68
|
+
const seg = CodeMapping.find(this.bySource, sourceStart, segment => segment.sourceStart, segment => segment.sourceEnd);
|
|
69
|
+
if (seg === null || sourceEnd > seg.sourceEnd) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
start: seg.generatedStart + (sourceStart - seg.sourceStart),
|
|
74
|
+
end: seg.generatedStart + (sourceEnd - seg.sourceStart)
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Maps a virtual `[start, end)` range back to the original source. Both
|
|
79
|
+
* ends must share a segment; otherwise the range straddles generated
|
|
80
|
+
* scaffolding and has no faithful original counterpart.
|
|
81
|
+
*/
|
|
82
|
+
toOriginalRange(generatedStart, generatedEnd) {
|
|
83
|
+
const seg = CodeMapping.find(this.byGenerated, generatedStart, segment => segment.generatedStart, segment => segment.generatedEnd);
|
|
84
|
+
if (seg === null || generatedEnd > seg.generatedEnd) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
start: seg.sourceStart + (generatedStart - seg.generatedStart),
|
|
89
|
+
end: seg.sourceStart + (generatedEnd - seg.generatedStart)
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Binary-searches `segments` (sorted by `start`) for the one whose
|
|
94
|
+
* `[start, end]` span contains `offset`, preferring a span that strictly
|
|
95
|
+
* contains it over one it only touches at the end.
|
|
96
|
+
*/
|
|
97
|
+
static find(segments, offset, start, end) {
|
|
98
|
+
let lo = 0;
|
|
99
|
+
let hi = segments.length - 1;
|
|
100
|
+
let touch = null;
|
|
101
|
+
while (lo <= hi) {
|
|
102
|
+
const mid = (lo + hi) >> 1;
|
|
103
|
+
const seg = segments[mid];
|
|
104
|
+
if (offset < start(seg)) {
|
|
105
|
+
hi = mid - 1;
|
|
106
|
+
}
|
|
107
|
+
else if (offset > end(seg)) {
|
|
108
|
+
lo = mid + 1;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// Inside the span. An exact hit on the exclusive end is kept as
|
|
112
|
+
// a fallback but we keep scanning left for a strict container.
|
|
113
|
+
if (offset < end(seg)) {
|
|
114
|
+
return seg;
|
|
115
|
+
}
|
|
116
|
+
touch = seg;
|
|
117
|
+
hi = mid - 1;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return touch;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { MarkupElement, MarkupFragment } from '@azerothjs/compiler';
|
|
2
|
+
/** The syntactic role of a caret position, used to pick a completion strategy. */
|
|
3
|
+
export type PositionContext =
|
|
4
|
+
/** Typing an element/component tag name (after `<` or `</`). */
|
|
5
|
+
{
|
|
6
|
+
kind: 'tagName';
|
|
7
|
+
partial: string;
|
|
8
|
+
closing: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Typing an attribute/event name inside an opening tag. */
|
|
11
|
+
| {
|
|
12
|
+
kind: 'attributeName';
|
|
13
|
+
tag: string;
|
|
14
|
+
partial: string;
|
|
15
|
+
}
|
|
16
|
+
/** Inside a static `attr="..."` value. */
|
|
17
|
+
| {
|
|
18
|
+
kind: 'attributeValue';
|
|
19
|
+
tag: string;
|
|
20
|
+
attribute: string;
|
|
21
|
+
}
|
|
22
|
+
/** Inside a `{ ... }` hole or `attr={ ... }` - plain TypeScript. */
|
|
23
|
+
| {
|
|
24
|
+
kind: 'expression';
|
|
25
|
+
}
|
|
26
|
+
/** Element text content. */
|
|
27
|
+
| {
|
|
28
|
+
kind: 'text';
|
|
29
|
+
}
|
|
30
|
+
/** Outside any markup - plain TypeScript. */
|
|
31
|
+
| {
|
|
32
|
+
kind: 'script';
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Classifies the caret at `offset`. Resilient to incomplete markup.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* classifyPosition('const x = <div cla', 18); // { kind: 'attributeName', tag: 'div', partial: 'cla' }
|
|
40
|
+
* classifyPosition('const x = <di', 13); // { kind: 'tagName', partial: 'di', closing: false }
|
|
41
|
+
* classifyPosition('const x = <p>{count(', 20);// { kind: 'expression' }
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function classifyPosition(source: string, offset: number): PositionContext;
|
|
45
|
+
/**
|
|
46
|
+
* Collects every markup node in the file, descending into expression holes,
|
|
47
|
+
* skipping regions that don't parse. Powers folding ranges and semantic
|
|
48
|
+
* highlighting.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* collectMarkupNodes('const x = <ul>{items.map(i => <li/>)}</ul>;').length; // 2
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function collectMarkupNodes(source: string): (MarkupElement | MarkupFragment)[];
|
|
56
|
+
/**
|
|
57
|
+
* The innermost element whose *opening tag* contains `offset` (so the caret is
|
|
58
|
+
* in its attribute area), searching markup nested in holes too. Used to resolve
|
|
59
|
+
* a component's props type for attribute completion/hover.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* enclosingElement('const x = <Counter start={0}/>;', 20)?.tag; // 'Counter'
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare function enclosingElement(source: string, offset: number): MarkupElement | null;
|
|
67
|
+
//# sourceMappingURL=markup-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markup-model.d.ts","sourceRoot":"","sources":["../src/markup-model.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAe,MAAM,qBAAqB,CAAC;AAEtF,kFAAkF;AAClF,MAAM,MAAM,eAAe;AACvB,gEAAgE;AAC9D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE;AACxD,4DAA4D;GAC1D;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACzD,0CAA0C;GACxC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAC5D,oEAAoE;GAClE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE;AACxB,4BAA4B;GAC1B;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE;AAClB,6CAA6C;GAC3C;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEzB;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAYhF;AA4QD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,aAAa,GAAG,cAAc,CAAC,EAAE,CAKrF;AAyDD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAgBrF"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
// Understands *where* a caret sits inside a `.azeroth` file so the providers
|
|
2
|
+
// can ask the right question: a tag-name position wants element/component
|
|
3
|
+
// suggestions, an attribute-name position wants the tag's attributes, and an
|
|
4
|
+
// expression position (`{ ... }` hole or `attr={ ... }`) is plain TypeScript
|
|
5
|
+
// that the type bridge answers.
|
|
6
|
+
//
|
|
7
|
+
// It reuses the compiler's scanner (findMarkupStart) and parser (parseMarkup)
|
|
8
|
+
// to locate and descend markup - including markup nested inside expression
|
|
9
|
+
// holes, which it re-scans recursively the same way the compiler does. Parsing
|
|
10
|
+
// is wrapped in try/catch because an editor buffer is constantly half-typed
|
|
11
|
+
// (`<div clas`); when the region under the caret doesn't parse yet, a resilient
|
|
12
|
+
// local scan still classifies it so completion keeps working as you type.
|
|
13
|
+
import { findMarkupStart, skipBalanced, isIdentPart, isWhitespace } from '@azerothjs/compiler';
|
|
14
|
+
import { parseMarkup, CompileError } from '@azerothjs/compiler';
|
|
15
|
+
/**
|
|
16
|
+
* Classifies the caret at `offset`. Resilient to incomplete markup.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* classifyPosition('const x = <div cla', 18); // { kind: 'attributeName', tag: 'div', partial: 'cla' }
|
|
21
|
+
* classifyPosition('const x = <di', 13); // { kind: 'tagName', partial: 'di', closing: false }
|
|
22
|
+
* classifyPosition('const x = <p>{count(', 20);// { kind: 'expression' }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function classifyPosition(source, offset) {
|
|
26
|
+
// A tag name being typed (`<div`, `</sec`, `<Cou`) is detected directly,
|
|
27
|
+
// independent of whether the surrounding markup currently parses - while
|
|
28
|
+
// you type a new element the region is momentarily broken, and the
|
|
29
|
+
// structural walk below would otherwise misread the caret as text/script.
|
|
30
|
+
const typed = tagNameBeingTyped(source, offset);
|
|
31
|
+
if (typed !== null) {
|
|
32
|
+
return { kind: 'tagName', partial: typed.partial, closing: typed.closing };
|
|
33
|
+
}
|
|
34
|
+
return classifyInRange(source, 0, source.length, offset, 'script');
|
|
35
|
+
}
|
|
36
|
+
/** Keywords after which a `<` begins an expression (so markup, not a compare). */
|
|
37
|
+
const TAG_EXPR_KEYWORDS = new Set([
|
|
38
|
+
'return', 'do', 'else', 'yield', 'await', 'case', 'delete', 'void', 'new', 'in', 'of', 'typeof', 'instanceof'
|
|
39
|
+
]);
|
|
40
|
+
/**
|
|
41
|
+
* If the caret sits at the end of a tag-name run that follows `<` (or `</`) in
|
|
42
|
+
* expression position, returns the partial name; otherwise null. The
|
|
43
|
+
* expression-position test distinguishes `<div` (a tag) from `a < b` or
|
|
44
|
+
* `createSignal<Todo` (a comparison / generic).
|
|
45
|
+
*/
|
|
46
|
+
function tagNameBeingTyped(source, offset) {
|
|
47
|
+
let i = offset;
|
|
48
|
+
while (i > 0 && (isIdentPart(source[i - 1]) || source[i - 1] === '.' || source[i - 1] === '-')) {
|
|
49
|
+
i--;
|
|
50
|
+
}
|
|
51
|
+
let lt;
|
|
52
|
+
let closing = false;
|
|
53
|
+
if (i > 0 && source[i - 1] === '<') {
|
|
54
|
+
lt = i - 1;
|
|
55
|
+
}
|
|
56
|
+
else if (i > 1 && source[i - 1] === '/' && source[i - 2] === '<') {
|
|
57
|
+
lt = i - 2;
|
|
58
|
+
closing = true;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
// Significant character before the `<` decides tag vs. operator.
|
|
64
|
+
let k = lt - 1;
|
|
65
|
+
while (k >= 0 && (source[k] === ' ' || source[k] === '\t')) {
|
|
66
|
+
k--;
|
|
67
|
+
}
|
|
68
|
+
const partial = source.slice(i, offset);
|
|
69
|
+
if (k < 0) {
|
|
70
|
+
return { partial, closing };
|
|
71
|
+
}
|
|
72
|
+
const prev = source[k];
|
|
73
|
+
if (isIdentPart(prev)) {
|
|
74
|
+
// An identifier/number before `<` means a compare/generic - unless it's
|
|
75
|
+
// a keyword like `return` after which an expression (markup) begins.
|
|
76
|
+
let w = k;
|
|
77
|
+
while (w >= 0 && isIdentPart(source[w])) {
|
|
78
|
+
w--;
|
|
79
|
+
}
|
|
80
|
+
return TAG_EXPR_KEYWORDS.has(source.slice(w + 1, k + 1)) ? { partial, closing } : null;
|
|
81
|
+
}
|
|
82
|
+
if (prev === ')' || prev === ']') {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return { partial, closing };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Walks `[lo, hi)` looking for the markup region containing `offset`. `base` is
|
|
89
|
+
* the context that applies to plain text in this range: `script` at the top
|
|
90
|
+
* level, `expression` inside an expression hole.
|
|
91
|
+
*/
|
|
92
|
+
function classifyInRange(source, lo, hi, offset, base) {
|
|
93
|
+
let i = lo;
|
|
94
|
+
for (;;) {
|
|
95
|
+
const m = findMarkupStart(source, i);
|
|
96
|
+
if (m === -1 || m >= hi || m > offset) {
|
|
97
|
+
return { kind: base };
|
|
98
|
+
}
|
|
99
|
+
let node;
|
|
100
|
+
let end;
|
|
101
|
+
try {
|
|
102
|
+
({ node, end } = parseMarkup(source, m));
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
// Incomplete markup under or before the caret: fall back to a
|
|
106
|
+
// resilient local scan so completion still fires mid-type.
|
|
107
|
+
if (err instanceof CompileError && offset >= m) {
|
|
108
|
+
return localScan(source, m, offset);
|
|
109
|
+
}
|
|
110
|
+
return { kind: base };
|
|
111
|
+
}
|
|
112
|
+
if (offset < end) {
|
|
113
|
+
return classifyNode(source, node, offset);
|
|
114
|
+
}
|
|
115
|
+
i = end;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** Classifies a caret known to fall within a parsed element/fragment. */
|
|
119
|
+
function classifyNode(source, node, offset) {
|
|
120
|
+
if (node.kind === 'element') {
|
|
121
|
+
const nameStart = node.start + 1;
|
|
122
|
+
const nameEnd = nameStart + node.tag.length;
|
|
123
|
+
if (offset >= nameStart && offset <= nameEnd) {
|
|
124
|
+
return { kind: 'tagName', partial: source.slice(nameStart, offset), closing: false };
|
|
125
|
+
}
|
|
126
|
+
const openEnd = openTagEnd(source, node);
|
|
127
|
+
if (offset <= openEnd) {
|
|
128
|
+
for (const attr of node.attributes) {
|
|
129
|
+
if (attr.value.kind === 'expression' || attr.spread) {
|
|
130
|
+
const brace = source.indexOf('{', attr.start);
|
|
131
|
+
const close = attr.end;
|
|
132
|
+
if (offset > brace && offset < close) {
|
|
133
|
+
return classifyInRange(source, brace + 1, close - 1, offset, 'expression');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else if (attr.value.kind === 'static') {
|
|
137
|
+
// Within the quoted value (attr.end is just past the close quote).
|
|
138
|
+
const eq = source.indexOf('=', attr.start);
|
|
139
|
+
if (eq !== -1 && offset > eq && offset < attr.end) {
|
|
140
|
+
return { kind: 'attributeValue', tag: node.tag, attribute: attr.name ?? '' };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return { kind: 'attributeName', tag: node.tag, partial: identifierBefore(source, offset) };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
for (const child of node.children) {
|
|
148
|
+
if (offset >= child.start && offset < child.end) {
|
|
149
|
+
return classifyChild(source, child, offset);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return { kind: 'text' };
|
|
153
|
+
}
|
|
154
|
+
/** Classifies a caret within a specific child node. */
|
|
155
|
+
function classifyChild(source, child, offset) {
|
|
156
|
+
if (child.kind === 'expression') {
|
|
157
|
+
return classifyInRange(source, child.start + 1, child.end - 1, offset, 'expression');
|
|
158
|
+
}
|
|
159
|
+
if (child.kind === 'element' || child.kind === 'fragment') {
|
|
160
|
+
return classifyNode(source, child, offset);
|
|
161
|
+
}
|
|
162
|
+
return { kind: 'text' };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Last-resort classifier for an unparseable (half-typed) tag starting at the
|
|
166
|
+
* `<` index `ltIndex`. Lexes forward to the caret, tracking whether we're in
|
|
167
|
+
* the tag name, an attribute name, a quoted value, or an expression value.
|
|
168
|
+
*/
|
|
169
|
+
function localScan(source, ltIndex, offset) {
|
|
170
|
+
let i = ltIndex + 1;
|
|
171
|
+
const closing = source[i] === '/';
|
|
172
|
+
if (closing) {
|
|
173
|
+
i++;
|
|
174
|
+
}
|
|
175
|
+
const nameStart = i;
|
|
176
|
+
while (i < offset && (isIdentPart(source[i]) || source[i] === '.' || source[i] === '-')) {
|
|
177
|
+
i++;
|
|
178
|
+
}
|
|
179
|
+
const tag = source.slice(nameStart, i);
|
|
180
|
+
if (offset <= i) {
|
|
181
|
+
return { kind: 'tagName', partial: source.slice(nameStart, offset), closing };
|
|
182
|
+
}
|
|
183
|
+
// Past the tag name: lex attributes up to the caret.
|
|
184
|
+
while (i < offset) {
|
|
185
|
+
const ch = source[i];
|
|
186
|
+
if (ch === '>') {
|
|
187
|
+
return { kind: 'text' };
|
|
188
|
+
}
|
|
189
|
+
if (ch === '=') {
|
|
190
|
+
i++;
|
|
191
|
+
while (i < offset && isWhitespace(source[i])) {
|
|
192
|
+
i++;
|
|
193
|
+
}
|
|
194
|
+
const v = source[i];
|
|
195
|
+
if (v === '{') {
|
|
196
|
+
return classifyInRange(source, i + 1, offset + 1, offset, 'expression');
|
|
197
|
+
}
|
|
198
|
+
if (v === '"' || v === '\'') {
|
|
199
|
+
let j = i + 1;
|
|
200
|
+
while (j < offset && source[j] !== v) {
|
|
201
|
+
j++;
|
|
202
|
+
}
|
|
203
|
+
if (j >= offset) {
|
|
204
|
+
return { kind: 'attributeValue', tag, attribute: '' };
|
|
205
|
+
}
|
|
206
|
+
i = j + 1;
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
i++;
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
i++;
|
|
213
|
+
}
|
|
214
|
+
return { kind: 'attributeName', tag, partial: identifierBefore(source, offset) };
|
|
215
|
+
}
|
|
216
|
+
/** Returns the identifier-ish run ending at `offset` (what the user has typed). */
|
|
217
|
+
function identifierBefore(source, offset) {
|
|
218
|
+
let s = offset;
|
|
219
|
+
while (s > 0 && (isIdentPart(source[s - 1]) || source[s - 1] === '-' || source[s - 1] === ':')) {
|
|
220
|
+
s--;
|
|
221
|
+
}
|
|
222
|
+
return source.slice(s, offset);
|
|
223
|
+
}
|
|
224
|
+
/** Offset just past an element's opening tag (`>` or `/>`). */
|
|
225
|
+
function openTagEnd(source, node) {
|
|
226
|
+
let p = node.start + 1 + node.tag.length;
|
|
227
|
+
for (const attr of node.attributes) {
|
|
228
|
+
if (attr.end > p) {
|
|
229
|
+
p = attr.end;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const gt = source.indexOf('>', p);
|
|
233
|
+
return gt === -1 ? source.length : gt + 1;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Collects every markup node in the file, descending into expression holes,
|
|
237
|
+
* skipping regions that don't parse. Powers folding ranges and semantic
|
|
238
|
+
* highlighting.
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```ts
|
|
242
|
+
* collectMarkupNodes('const x = <ul>{items.map(i => <li/>)}</ul>;').length; // 2
|
|
243
|
+
* ```
|
|
244
|
+
*/
|
|
245
|
+
export function collectMarkupNodes(source) {
|
|
246
|
+
const nodes = [];
|
|
247
|
+
collectInRange(source, 0, source.length, nodes);
|
|
248
|
+
return nodes;
|
|
249
|
+
}
|
|
250
|
+
function collectInRange(source, lo, hi, out) {
|
|
251
|
+
let i = lo;
|
|
252
|
+
for (;;) {
|
|
253
|
+
const m = findMarkupStart(source, i);
|
|
254
|
+
if (m === -1 || m >= hi) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
let node;
|
|
258
|
+
let end;
|
|
259
|
+
try {
|
|
260
|
+
({ node, end } = parseMarkup(source, m));
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
collectNode(source, node, out);
|
|
266
|
+
i = end;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function collectNode(source, node, out) {
|
|
270
|
+
out.push(node);
|
|
271
|
+
if (node.kind === 'element') {
|
|
272
|
+
for (const attr of node.attributes) {
|
|
273
|
+
if (attr.value.kind === 'expression' || attr.spread) {
|
|
274
|
+
const brace = source.indexOf('{', attr.start);
|
|
275
|
+
if (brace !== -1) {
|
|
276
|
+
collectInRange(source, brace + 1, skipBalanced(source, brace) - 1, out);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
for (const child of node.children) {
|
|
282
|
+
if (child.kind === 'expression') {
|
|
283
|
+
collectInRange(source, child.start + 1, child.end - 1, out);
|
|
284
|
+
}
|
|
285
|
+
else if (child.kind === 'element' || child.kind === 'fragment') {
|
|
286
|
+
collectNode(source, child, out);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* The innermost element whose *opening tag* contains `offset` (so the caret is
|
|
292
|
+
* in its attribute area), searching markup nested in holes too. Used to resolve
|
|
293
|
+
* a component's props type for attribute completion/hover.
|
|
294
|
+
*
|
|
295
|
+
* @example
|
|
296
|
+
* ```ts
|
|
297
|
+
* enclosingElement('const x = <Counter start={0}/>;', 20)?.tag; // 'Counter'
|
|
298
|
+
* ```
|
|
299
|
+
*/
|
|
300
|
+
export function enclosingElement(source, offset) {
|
|
301
|
+
let best = null;
|
|
302
|
+
for (const node of collectMarkupNodes(source)) {
|
|
303
|
+
if (node.kind !== 'element') {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const openEnd = openTagEnd(source, node);
|
|
307
|
+
if (offset >= node.start && offset <= openEnd && (best === null || node.start > best.start)) {
|
|
308
|
+
best = node;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return best;
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=markup-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markup-model.js","sourceRoot":"","sources":["../src/markup-model.ts"],"names":[],"mappings":"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"}
|