57 lines
2 KiB
JavaScript
57 lines
2 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.collectSelectors = exports.NodeType = exports.getIdClassCompletion = void 0;
|
|
const vscode_languageserver_1 = require("vscode-languageserver");
|
|
function getIdClassCompletion(stylesheets, attributeContext) {
|
|
const collectingType = getCollectingType(attributeContext);
|
|
if (!collectingType) {
|
|
return null;
|
|
}
|
|
const items = collectSelectors(stylesheets, collectingType);
|
|
return vscode_languageserver_1.CompletionList.create(items);
|
|
}
|
|
exports.getIdClassCompletion = getIdClassCompletion;
|
|
function getCollectingType(attributeContext) {
|
|
if (attributeContext.inValue) {
|
|
if (attributeContext.name === 'class') {
|
|
return NodeType.ClassSelector;
|
|
}
|
|
if (attributeContext.name === 'id') {
|
|
return NodeType.IdentifierSelector;
|
|
}
|
|
}
|
|
else if (attributeContext.name.startsWith('class:')) {
|
|
return NodeType.ClassSelector;
|
|
}
|
|
}
|
|
/**
|
|
* incomplete see
|
|
* https://github.com/microsoft/vscode-css-languageservice/blob/master/src/parser/cssNodes.ts#L14
|
|
* The enum is not exported. we have to update this whenever it changes
|
|
*/
|
|
var NodeType;
|
|
(function (NodeType) {
|
|
NodeType[NodeType["ClassSelector"] = 14] = "ClassSelector";
|
|
NodeType[NodeType["IdentifierSelector"] = 15] = "IdentifierSelector";
|
|
})(NodeType = exports.NodeType || (exports.NodeType = {}));
|
|
function collectSelectors(stylesheets, type) {
|
|
const result = [];
|
|
stylesheets.forEach((stylesheet) => {
|
|
walk(stylesheet, (node) => {
|
|
if (node.type === type) {
|
|
result.push(node);
|
|
}
|
|
});
|
|
});
|
|
return result.map((node) => ({
|
|
label: node.getText().substring(1),
|
|
kind: vscode_languageserver_1.CompletionItemKind.Keyword,
|
|
}));
|
|
}
|
|
exports.collectSelectors = collectSelectors;
|
|
function walk(node, callback) {
|
|
callback(node);
|
|
if (node.children) {
|
|
node.children.forEach((childrenNode) => walk(childrenNode, callback));
|
|
}
|
|
}
|