django-cotton-lsp 1.0.0

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.
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefinitionHandler = void 0;
4
+ const vscode_languageserver_1 = require("vscode-languageserver");
5
+ const vscode_languageserver_textdocument_1 = require("vscode-languageserver-textdocument");
6
+ const vscode_uri_1 = require("vscode-uri");
7
+ class DefinitionHandler {
8
+ constructor(parser, componentIndex) {
9
+ this.parser = parser;
10
+ this.componentIndex = componentIndex;
11
+ }
12
+ async handleDefinition(document, position) {
13
+ const content = document.getText();
14
+ const offset = document.offsetAt(position);
15
+ const htmlDoc = this.parser.parseDocument(content, document.uri);
16
+ const component = this.parser.findComponentAtOffset(htmlDoc, offset);
17
+ if (component) {
18
+ // <c-component is="literal-name" /> - resolve a *static* `is` value to a real
19
+ // component. If `is` is a Django expression (`:is="..."`) or embeds template
20
+ // syntax ({{ }} / {% %}), it can't be resolved statically, so we leave it alone.
21
+ if (component.name === 'component') {
22
+ const isAttr = this.parser.getAttributeValue(content, component.node, 'is');
23
+ // Cmd/Ctrl+click the `is` value itself -> jump to that component's file.
24
+ if (isAttr &&
25
+ !isAttr.hasColon &&
26
+ !/[{}%]/.test(isAttr.value) &&
27
+ offset >= isAttr.start && offset <= isAttr.end) {
28
+ const originRange = vscode_languageserver_1.Range.create(document.positionAt(isAttr.start), document.positionAt(isAttr.end));
29
+ return this.getComponentLocationLink(isAttr.value, originRange);
30
+ }
31
+ // Cmd/Ctrl+click any other attribute (a prop passed through to whatever
32
+ // component `is` resolves to) -> treat it exactly like a prop on a normal
33
+ // component tag. Only possible when `is` is a static, resolvable name.
34
+ if (isAttr && !isAttr.hasColon && !/[{}%]/.test(isAttr.value)) {
35
+ const attributeMatch = this.parser.findAttributeNameAtOffset(content, component.node, offset);
36
+ if (attributeMatch && attributeMatch.name !== 'is') {
37
+ const originRange = vscode_languageserver_1.Range.create(document.positionAt(attributeMatch.start), document.positionAt(attributeMatch.end));
38
+ return this.getPropLocationLink(isAttr.value, attributeMatch.name, originRange);
39
+ }
40
+ }
41
+ return null;
42
+ }
43
+ // <c-slot name="icon"> - jump to where the enclosing component consumes this slot
44
+ // (e.g. {{ icon }}), its <c-vars> declaration if it has one, or the top of the file.
45
+ if (component.name === 'slot') {
46
+ const slotContext = this.parser.getSlotNameContext(content, component.node, offset);
47
+ if (slotContext && slotContext.slotName) {
48
+ const originRange = vscode_languageserver_1.Range.create(document.positionAt(slotContext.valueStart), document.positionAt(slotContext.valueEnd));
49
+ return this.getPropLocationLink(slotContext.componentName, slotContext.slotName, originRange);
50
+ }
51
+ return null;
52
+ }
53
+ if (this.componentIndex.isBuiltinDirective(component.name)) {
54
+ return null;
55
+ }
56
+ // Check opening tag name
57
+ const tagNameRange = this.parser.getTagNameRange(component.node);
58
+ if (tagNameRange && offset >= tagNameRange.start && offset <= tagNameRange.end) {
59
+ const originRange = vscode_languageserver_1.Range.create(document.positionAt(tagNameRange.start), document.positionAt(tagNameRange.end));
60
+ return this.getComponentLocationLink(component.name, originRange);
61
+ }
62
+ // Check an attribute name within the opening tag (a "prop" being passed to the component)
63
+ const attributeMatch = this.parser.findAttributeNameAtOffset(content, component.node, offset);
64
+ if (attributeMatch) {
65
+ const originRange = vscode_languageserver_1.Range.create(document.positionAt(attributeMatch.start), document.positionAt(attributeMatch.end));
66
+ return this.getPropLocationLink(component.name, attributeMatch.name, originRange);
67
+ }
68
+ // Check closing tag
69
+ if (component.node.endTagStart !== undefined) {
70
+ const closingStart = component.node.endTagStart + 2; // Skip '</'
71
+ const closingEnd = closingStart + component.fullTag.length;
72
+ if (offset >= closingStart && offset <= closingEnd) {
73
+ const originRange = vscode_languageserver_1.Range.create(document.positionAt(closingStart), document.positionAt(closingEnd));
74
+ return this.getComponentLocationLink(component.name, originRange);
75
+ }
76
+ }
77
+ }
78
+ // Fallback: regex search for closing tags
79
+ const closingTagInfo = this.findClosingTagAtOffset(content, offset);
80
+ if (closingTagInfo && !this.componentIndex.isBuiltinDirective(closingTagInfo.name)) {
81
+ const originRange = vscode_languageserver_1.Range.create(document.positionAt(closingTagInfo.start), document.positionAt(closingTagInfo.end));
82
+ return this.getComponentLocationLink(closingTagInfo.name, originRange);
83
+ }
84
+ return null;
85
+ }
86
+ async getComponentLocationLink(componentName, originSelectionRange) {
87
+ const componentInfo = await this.componentIndex.findComponent(componentName);
88
+ if (!componentInfo) {
89
+ return null;
90
+ }
91
+ const targetRange = vscode_languageserver_1.Range.create(vscode_languageserver_1.Position.create(0, 0), vscode_languageserver_1.Position.create(0, 0));
92
+ return [{
93
+ originSelectionRange,
94
+ targetUri: vscode_uri_1.URI.file(componentInfo.filePath).toString(),
95
+ targetRange,
96
+ targetSelectionRange: targetRange
97
+ }];
98
+ }
99
+ /**
100
+ * Resolve a prop (or slot name) clicked at a component usage site to a location inside the
101
+ * component's file: its <c-vars> declaration, or its first usage in the file. If it's not
102
+ * tracked by the component at all (neither declared nor referenced), there's nowhere
103
+ * meaningful to navigate to, so go-to-definition should not activate - return null rather
104
+ * than falling back to the top of the file.
105
+ */
106
+ async getPropLocationLink(componentName, propName, originSelectionRange) {
107
+ const componentInfo = await this.componentIndex.findComponent(componentName);
108
+ if (!componentInfo) {
109
+ return null;
110
+ }
111
+ const content = await this.componentIndex.getComponentFileContent(componentInfo.filePath);
112
+ const targetOffsetRange = content ? this.componentIndex.findPropTargetOffset(content, propName) : null;
113
+ if (!targetOffsetRange || !content) {
114
+ return null;
115
+ }
116
+ const targetDocument = vscode_languageserver_textdocument_1.TextDocument.create(componentInfo.filePath, 'html', 0, content);
117
+ const targetRange = vscode_languageserver_1.Range.create(targetDocument.positionAt(targetOffsetRange.start), targetDocument.positionAt(targetOffsetRange.end));
118
+ return [{
119
+ originSelectionRange,
120
+ targetUri: vscode_uri_1.URI.file(componentInfo.filePath).toString(),
121
+ targetRange,
122
+ targetSelectionRange: targetRange
123
+ }];
124
+ }
125
+ findClosingTagAtOffset(content, offset) {
126
+ const searchStart = Math.max(0, offset - 50);
127
+ const searchEnd = Math.min(content.length, offset + 50);
128
+ const searchArea = content.substring(searchStart, searchEnd);
129
+ const closingTagRegex = /<\/c-([\w.-]+)>/g;
130
+ let match;
131
+ while ((match = closingTagRegex.exec(searchArea)) !== null) {
132
+ const matchStart = searchStart + match.index;
133
+ const matchEnd = matchStart + match[0].length;
134
+ if (offset >= matchStart && offset <= matchEnd) {
135
+ // Return the range of the full tag including </c-
136
+ const tagStart = matchStart + 2; // Skip '</'
137
+ const tagEnd = matchEnd - 1; // Exclude '>'
138
+ return {
139
+ name: match[1],
140
+ start: tagStart,
141
+ end: tagEnd
142
+ };
143
+ }
144
+ }
145
+ return null;
146
+ }
147
+ }
148
+ exports.DefinitionHandler = DefinitionHandler;
149
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/handlers/definition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DiagnosticsHandler = void 0;
4
+ const vscode_languageserver_1 = require("vscode-languageserver");
5
+ class DiagnosticsHandler {
6
+ constructor(parser, componentIndex) {
7
+ this.parser = parser;
8
+ this.componentIndex = componentIndex;
9
+ }
10
+ async getDiagnostics(document) {
11
+ const content = document.getText();
12
+ const htmlDoc = this.parser.parseDocument(content, document.uri);
13
+ const components = this.parser.findCottonComponents(htmlDoc);
14
+ const diagnostics = [];
15
+ for (const component of components) {
16
+ // <c-component is="literal-name" /> - only validate when `is` is a static string;
17
+ // dynamic expressions (`:is="..."`) or embedded template syntax can't be checked here.
18
+ if (component.name === 'component') {
19
+ const isAttr = this.parser.getAttributeValue(content, component.node, 'is');
20
+ if (isAttr && !isAttr.hasColon && !/[{}%]/.test(isAttr.value)) {
21
+ const componentInfo = await this.componentIndex.findComponent(isAttr.value);
22
+ if (!componentInfo) {
23
+ diagnostics.push({
24
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
25
+ range: vscode_languageserver_1.Range.create(document.positionAt(isAttr.start), document.positionAt(isAttr.end)),
26
+ message: `Cotton component '${isAttr.value}' not found`,
27
+ source: 'Cotton',
28
+ code: 'cotton-component-not-found'
29
+ });
30
+ }
31
+ }
32
+ continue;
33
+ }
34
+ // <c-slot name="icon"> - flag a slot name that the enclosing component doesn't
35
+ // actually reference anywhere (typo, renamed slot, etc). Only checked when the name
36
+ // is a static string; dynamic (`:name="expr"`) or template-embedded values can't be
37
+ // checked here.
38
+ if (component.name === 'slot') {
39
+ const nameAttr = this.parser.getAttributeValue(content, component.node, 'name');
40
+ if (nameAttr && !nameAttr.hasColon && !/[{}%]/.test(nameAttr.value)) {
41
+ const enclosingComponentName = this.parser.findEnclosingComponentName(component.node);
42
+ const enclosingInfo = enclosingComponentName
43
+ ? await this.componentIndex.findComponent(enclosingComponentName)
44
+ : null;
45
+ if (enclosingInfo) {
46
+ const isReferenced = await this.componentIndex.hasSlotReference(enclosingInfo.filePath, nameAttr.value);
47
+ if (!isReferenced) {
48
+ diagnostics.push({
49
+ severity: vscode_languageserver_1.DiagnosticSeverity.Warning,
50
+ range: vscode_languageserver_1.Range.create(document.positionAt(nameAttr.start), document.positionAt(nameAttr.end)),
51
+ message: `Slot '${nameAttr.value}' doesn't appear to be used anywhere in <c-${enclosingComponentName}> (no {{ ${nameAttr.value} }} or {% if ${nameAttr.value} %} found). Check for a typo.`,
52
+ source: 'Cotton',
53
+ code: 'cotton-slot-not-referenced'
54
+ });
55
+ }
56
+ }
57
+ }
58
+ continue;
59
+ }
60
+ if (this.componentIndex.isBuiltinDirective(component.name)) {
61
+ continue;
62
+ }
63
+ const componentInfo = await this.componentIndex.findComponent(component.name);
64
+ if (!componentInfo) {
65
+ const tagContent = content.substring(component.startOffset);
66
+ const tagNameEndMatch = tagContent.match(/^<c-[\w.-]+/);
67
+ const tagEndOffset = tagNameEndMatch
68
+ ? component.startOffset + tagNameEndMatch[0].length
69
+ : component.startOffset + component.fullTag.length + 1;
70
+ diagnostics.push({
71
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
72
+ range: vscode_languageserver_1.Range.create(document.positionAt(component.startOffset), document.positionAt(tagEndOffset)),
73
+ message: `Cotton component '${component.name}' not found`,
74
+ source: 'Cotton',
75
+ code: 'cotton-component-not-found'
76
+ });
77
+ }
78
+ }
79
+ return diagnostics;
80
+ }
81
+ }
82
+ exports.DiagnosticsHandler = DiagnosticsHandler;
83
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/handlers/diagnostics.ts"],"names":[],"mappings":";;;AAAA,iEAI+B;AAK/B,MAAa,kBAAkB;IAC3B,YACY,MAAoB,EACpB,cAA8B;QAD9B,WAAM,GAAN,MAAM,CAAc;QACpB,mBAAc,GAAd,cAAc,CAAgB;IACvC,CAAC;IAEJ,KAAK,CAAC,cAAc,CAAC,QAAsB;QACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE7D,MAAM,WAAW,GAAiB,EAAE,CAAC;QAErC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACjC,kFAAkF;YAClF,uFAAuF;YACvF,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC5E,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC5D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC5E,IAAI,CAAC,aAAa,EAAE,CAAC;wBACjB,WAAW,CAAC,IAAI,CAAC;4BACb,QAAQ,EAAE,0CAAkB,CAAC,KAAK;4BAClC,KAAK,EAAE,6BAAK,CAAC,MAAM,CACf,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EACjC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAClC;4BACD,OAAO,EAAE,qBAAqB,MAAM,CAAC,KAAK,aAAa;4BACvD,MAAM,EAAE,QAAQ;4BAChB,IAAI,EAAE,4BAA4B;yBACrC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;gBACD,SAAS;YACb,CAAC;YAED,+EAA+E;YAC/E,oFAAoF;YACpF,oFAAoF;YACpF,gBAAgB;YAChB,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAChF,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClE,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,0BAA0B,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACtF,MAAM,aAAa,GAAG,sBAAsB;wBACxC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,sBAAsB,CAAC;wBACjE,CAAC,CAAC,IAAI,CAAC;oBAEX,IAAI,aAAa,EAAE,CAAC;wBAChB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;wBACxG,IAAI,CAAC,YAAY,EAAE,CAAC;4BAChB,WAAW,CAAC,IAAI,CAAC;gCACb,QAAQ,EAAE,0CAAkB,CAAC,OAAO;gCACpC,KAAK,EAAE,6BAAK,CAAC,MAAM,CACf,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EACnC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CACpC;gCACD,OAAO,EAAE,SAAS,QAAQ,CAAC,KAAK,8CAA8C,sBAAsB,YAAY,QAAQ,CAAC,KAAK,gBAAgB,QAAQ,CAAC,KAAK,+BAA+B;gCAC3L,MAAM,EAAE,QAAQ;gCAChB,IAAI,EAAE,4BAA4B;6BACrC,CAAC,CAAC;wBACP,CAAC;oBACL,CAAC;gBACL,CAAC;gBACD,SAAS;YACb,CAAC;YAED,IAAI,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,SAAS;YACb,CAAC;YAED,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAE9E,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBAC5D,MAAM,eAAe,GAAG,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAExD,MAAM,YAAY,GAAG,eAAe;oBAChC,CAAC,CAAC,SAAS,CAAC,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM;oBACnD,CAAC,CAAC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBAE3D,WAAW,CAAC,IAAI,CAAC;oBACb,QAAQ,EAAE,0CAAkB,CAAC,KAAK;oBAClC,KAAK,EAAE,6BAAK,CAAC,MAAM,CACf,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,EAC1C,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CACpC;oBACD,OAAO,EAAE,qBAAqB,SAAS,CAAC,IAAI,aAAa;oBACzD,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,4BAA4B;iBACrC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAED,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ;AAhGD,gDAgGC"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HoverHandler = void 0;
4
+ const vscode_languageserver_1 = require("vscode-languageserver");
5
+ class HoverHandler {
6
+ constructor(parser, componentIndex) {
7
+ this.parser = parser;
8
+ this.componentIndex = componentIndex;
9
+ }
10
+ async handleHover(document, position) {
11
+ const content = document.getText();
12
+ const offset = document.offsetAt(position);
13
+ const htmlDoc = this.parser.parseDocument(content, document.uri);
14
+ const component = this.parser.findComponentAtOffset(htmlDoc, offset);
15
+ if (!component || this.componentIndex.isBuiltinDirective(component.name)) {
16
+ return null;
17
+ }
18
+ const tagNameRange = this.parser.getTagNameRange(component.node);
19
+ const overTagName = !!tagNameRange && offset >= tagNameRange.start && offset <= tagNameRange.end;
20
+ const attributeMatch = this.parser.findAttributeNameAtOffset(content, component.node, offset);
21
+ if (!overTagName && !attributeMatch) {
22
+ return null;
23
+ }
24
+ const componentInfo = await this.componentIndex.findComponent(component.name);
25
+ if (!componentInfo) {
26
+ return null;
27
+ }
28
+ if (attributeMatch) {
29
+ const cVar = componentInfo.cVars.find(v => v.name === attributeMatch.name);
30
+ if (!cVar) {
31
+ return null;
32
+ }
33
+ return {
34
+ contents: {
35
+ kind: vscode_languageserver_1.MarkupKind.Markdown,
36
+ value: this.renderPropDoc(cVar)
37
+ }
38
+ };
39
+ }
40
+ const doc = await this.componentIndex.getComponentDocumentation(componentInfo.filePath);
41
+ return {
42
+ contents: {
43
+ kind: vscode_languageserver_1.MarkupKind.Markdown,
44
+ value: this.renderComponentDoc(component.name, doc, componentInfo.cVars)
45
+ }
46
+ };
47
+ }
48
+ renderComponentDoc(name, doc, cVars) {
49
+ const lines = [`**\`<c-${name}>\`**`];
50
+ if (doc) {
51
+ lines.push('', doc);
52
+ }
53
+ if (cVars.length > 0) {
54
+ lines.push('', '**Props:**');
55
+ for (const cVar of cVars) {
56
+ const defaultText = cVar.defaultValue ? ` = \`${cVar.defaultValue}\`` : '';
57
+ lines.push(`- \`${cVar.name}\`${defaultText}`);
58
+ }
59
+ }
60
+ return lines.join('\n');
61
+ }
62
+ renderPropDoc(cVar) {
63
+ const lines = [`**${cVar.name}**`, ''];
64
+ lines.push(`Default: \`${cVar.defaultValue || 'undefined'}\``);
65
+ if (!cVar.defaultValue && !cVar.isDjangoExpression) {
66
+ lines.push('', 'Can be passed as a boolean flag (no value = `True`).');
67
+ }
68
+ return lines.join('\n');
69
+ }
70
+ }
71
+ exports.HoverHandler = HoverHandler;
72
+ //# sourceMappingURL=hover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover.js","sourceRoot":"","sources":["../../src/handlers/hover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReferencesHandler = void 0;
4
+ const vscode_languageserver_1 = require("vscode-languageserver");
5
+ const vscode_uri_1 = require("vscode-uri");
6
+ class ReferencesHandler {
7
+ constructor(parser, componentIndex, usageIndex) {
8
+ this.parser = parser;
9
+ this.componentIndex = componentIndex;
10
+ this.usageIndex = usageIndex;
11
+ }
12
+ async handleReferences(document, position, includeDeclaration) {
13
+ const content = document.getText();
14
+ const offset = document.offsetAt(position);
15
+ const htmlDoc = this.parser.parseDocument(content, document.uri);
16
+ const componentName = this.resolveComponentNameAtOffset(content, htmlDoc, offset);
17
+ if (!componentName || this.componentIndex.isBuiltinDirective(componentName)) {
18
+ return null;
19
+ }
20
+ await this.usageIndex.ensureBuilt();
21
+ const references = this.usageIndex.getReferences(componentName);
22
+ if (includeDeclaration) {
23
+ const componentInfo = await this.componentIndex.findComponent(componentName);
24
+ if (componentInfo) {
25
+ references.push(vscode_languageserver_1.Location.create(vscode_uri_1.URI.file(componentInfo.filePath).toString(), vscode_languageserver_1.Range.create(vscode_languageserver_1.Position.create(0, 0), vscode_languageserver_1.Position.create(0, 0))));
26
+ }
27
+ }
28
+ return references;
29
+ }
30
+ /**
31
+ * Resolve the component name a "Find All References" invocation should target: the
32
+ * tag name of a <c-foo> usage (opening or closing), or a static `is="foo"` value on
33
+ * a <c-component> dynamic-component tag.
34
+ */
35
+ resolveComponentNameAtOffset(content, htmlDoc, offset) {
36
+ const component = this.parser.findComponentAtOffset(htmlDoc, offset);
37
+ if (!component)
38
+ return null;
39
+ if (component.name === 'component') {
40
+ const isAttr = this.parser.getAttributeValue(content, component.node, 'is');
41
+ if (isAttr && !isAttr.hasColon && !/[{}%]/.test(isAttr.value) &&
42
+ offset >= isAttr.start && offset <= isAttr.end) {
43
+ return isAttr.value;
44
+ }
45
+ return null;
46
+ }
47
+ const tagNameRange = this.parser.getTagNameRange(component.node);
48
+ if (tagNameRange && offset >= tagNameRange.start && offset <= tagNameRange.end) {
49
+ return component.name;
50
+ }
51
+ if (component.node.endTagStart !== undefined) {
52
+ const closingStart = component.node.endTagStart + 2;
53
+ const closingEnd = closingStart + component.fullTag.length;
54
+ if (offset >= closingStart && offset <= closingEnd) {
55
+ return component.name;
56
+ }
57
+ }
58
+ return null;
59
+ }
60
+ }
61
+ exports.ReferencesHandler = ReferencesHandler;
62
+ //# sourceMappingURL=references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/handlers/references.ts"],"names":[],"mappings":"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"}