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.
- package/README.md +84 -0
- package/out/cottonParser.js +224 -0
- package/out/cottonParser.js.map +1 -0
- package/out/handlers/completion.js +251 -0
- package/out/handlers/completion.js.map +1 -0
- package/out/handlers/definition.js +149 -0
- package/out/handlers/definition.js.map +1 -0
- package/out/handlers/diagnostics.js +83 -0
- package/out/handlers/diagnostics.js.map +1 -0
- package/out/handlers/hover.js +72 -0
- package/out/handlers/hover.js.map +1 -0
- package/out/handlers/references.js +62 -0
- package/out/handlers/references.js.map +1 -0
- package/out/server.js +274 -0
- package/out/server.js.map +1 -0
- package/out/utils/componentIndex.js +325 -0
- package/out/utils/componentIndex.js.map +1 -0
- package/out/utils/usageIndex.js +258 -0
- package/out/utils/usageIndex.js.map +1 -0
- package/package.json +41 -0
|
@@ -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":"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"}
|
|
@@ -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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"}
|