Skip to content

Language Server Protocol #3

@roman-vorobiov

Description

@roman-vorobiov

Current "intellisense" is very primitive, which doesn't work in a lot of cases:

function getCandidates(model: Monaco.editor.ITextModel, position: Monaco.Position, state: State): string[] | Record<string, string> {
const tokenStack = tokenizeBackwards(model, position);
const prefix = tryGetPrefix(tokenStack);
if (prefix !== undefined) {
const settingInfo = prefixes[prefix];
const expressionInfo = expressions[prefix];
if (settingInfo !== undefined && !(expressionInfo !== undefined && insideCondition(tokenStack))) {
return settingInfo.allowedSuffixes;
}
if (expressionInfo !== undefined) {
let candidates = expressionInfo.allowedValues;
if (prefix === "SettingCurrent" || prefix === "SettingDefault") {
return [...Object.keys(prefixes), ...Object.keys(candidates)];
}
else {
return candidates;
}
}
}
else if (isAssignee(tokenStack)) {
const enumValues = settingEnums[tokenStack[0]] ?? settingEnums[tokenStack[1]];
if (enumValues !== undefined) {
return Object.fromEntries(Object.entries(enumValues).map(([text, label]) => [`"${text}"`, label]));
}
}
else if (insideCondition(tokenStack)) {
return [...Object.keys(expressions), ...Object.keys(otherExpressions)];
}
else if (insideImport(tokenStack)) {
return Object.fromEntries(state.configs.map(cfg => [cfg.name, cfg.name]));
}
else if (tokenStack.length > 1 && tokenStack[1] in triggerActions) {
return triggerActions[tokenStack[1] as keyof typeof triggerActions].allowedValues;
}
else if (tokenStack.length > 1 && tokenStack[1] in triggerConditions) {
return triggerConditions[tokenStack[1] as keyof typeof triggerConditions].allowedValues;
}
else if (tokenStack.length > 0 && tokenStack[0] in triggerActions) {
return triggerActions[tokenStack[0] as keyof typeof triggerActions].allowedValues;
}
else if (tokenStack.length > 0 && tokenStack[0] in triggerConditions) {
return triggerConditions[tokenStack[0] as keyof typeof triggerConditions].allowedValues;
}
else if (tokenStack.length > 0 && (tokenStack[0] === "when" || tokenStack[1] === "when")) {
return Object.keys(triggerConditions);
}
else if (tokenStack.length < 2) {
return [...Object.keys(prefixes), ...settings, ...Object.keys(triggerActions)];
}
return [];
}

Implement the LSP instead, it should show variables that are available in the current scope and differentiate between Challenge the setting prefix and Challenge the condition expression to name a few things.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions