@shopify/theme-language-server-common
Version:
<h1 align="center" style="position: relative;" > <br> <img src="https://github.com/Shopify/theme-check-vscode/blob/main/images/shopify_glyph.png?raw=true" alt="logo" width="141" height="160"> <br> Theme Language Server </h1>
60 lines • 2.78 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.ObjectAttributeCompletionProvider = void 0;
const liquid_html_parser_1 = require("@shopify/liquid-html-parser");
const vscode_languageserver_1 = require("vscode-languageserver");
const TypeSystem_1 = require("../../TypeSystem");
const params_1 = require("../params");
const common_1 = require("./common");
const ArrayCoreProperties = ['size', 'first', 'last'];
const StringCoreProperties = ['size'];
class ObjectAttributeCompletionProvider {
constructor(typeSystem, getThemeSettingsSchema) {
this.typeSystem = typeSystem;
this.getThemeSettingsSchema = getThemeSettingsSchema;
}
async completions(params) {
var _a;
if (!params.completionContext)
return [];
const { partialAst, node } = params.completionContext;
if (!node || node.type !== liquid_html_parser_1.NodeTypes.VariableLookup) {
return [];
}
if (node.lookups.length === 0) {
// We only do lookups in this one
return [];
}
const lastLookup = node.lookups.at(-1);
if (lastLookup.type !== liquid_html_parser_1.NodeTypes.String) {
// We don't complete numbers, or variable lookups
return [];
}
const partial = lastLookup.value.replace(params_1.CURSOR, '');
// Fake a VariableLookup up to the last one.
const parentLookup = { ...node };
parentLookup.lookups = [...parentLookup.lookups];
parentLookup.lookups.pop();
const parentType = await this.typeSystem.inferType(parentLookup, partialAst, params.textDocument.uri);
if ((0, TypeSystem_1.isArrayType)(parentType)) {
return completionItems(ArrayCoreProperties.map((name) => ({ name })), partial);
}
else if (parentType === 'string') {
return completionItems(StringCoreProperties.map((name) => ({ name })), partial);
}
const objectMap = await this.typeSystem.objectMap(params.textDocument.uri, partialAst);
const parentTypeProperties = ((_a = objectMap[parentType]) === null || _a === void 0 ? void 0 : _a.properties) || [];
return completionItems(parentTypeProperties, partial);
}
}
exports.ObjectAttributeCompletionProvider = ObjectAttributeCompletionProvider;
function completionItems(options, partial) {
return options
.filter(({ name }) => name.startsWith(partial))
.sort(common_1.sortByName)
.map(toPropertyCompletionItem);
}
function toPropertyCompletionItem(object) {
return (0, common_1.createCompletionItem)(object, { kind: vscode_languageserver_1.CompletionItemKind.Variable });
}
//# sourceMappingURL=ObjectAttributeCompletionProvider.js.map
;