Skip to content

Commit

Permalink
update lgbundle and fix suggestions
Browse files Browse the repository at this point in the history
  • Loading branch information
cosmicshuai committed Oct 31, 2019
1 parent 8de58eb commit a96f03a
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 83 deletions.
131 changes: 65 additions & 66 deletions src/languageFeatures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,71 +204,77 @@ export class SuggestAdapter extends Adapter implements monaco.languages.Completi
return ['.'];
}

private async matchedStates(model: monaco.editor.IReadOnlyModel, position: Position): Promise<{matched: boolean; state:string}> {
const state : string[] = [];
const lineContent = model.getLineContent(position.lineNumber);
let flag = false;
let finalState = '';
if (lineContent.trim().indexOf('-') !== 0) {
return {matched: flag, state:finalState}
};

//if the line starts with '-', will try to match
flag = true;
//initilize the state to plaintext
state.push('PlainText');
let i = 0;
while (i < lineContent.length) {
let char = lineContent.charAt(i);
if (char === `'`) {
if (state[state.length -1] === 'expression' || state[state.length -1] === 'double') {
state.push('single')
} else {
state.pop()
}
}

if (char === `"`) {
if (state[state.length -1] === 'expression' || state[state.length -1] === 'single') {
state.push('double')
} else {
state.pop()
}
}

if (char === '{' && i >= 1 && state[state.length -1] !== 'single' && state[state.length -1] !== 'double' ) {
if (lineContent.charAt(i-1) === '@') {
state.push('expression')
}
}

if (char === '}' && state[state.length -1] === 'expression') {
state.pop()
}
console.log(state);
i = i + 1
};
finalState = state[state.length -1]
return {matched: flag, state:finalState}
}

private removeParamFormar(params: string): string {
const paramArr: string[] = params.split(",");
const resultArr: string[] = [];
paramArr.forEach(element => { resultArr.push(element.trim().split(':')[0])});
return resultArr.join(' ,');
}

provideCompletionItems(model: monaco.editor.IReadOnlyModel, position: Position, _context: monaco.languages.CompletionContext, token: CancellationToken): Thenable<monaco.languages.CompletionList> {
const wordInfo = model.getWordUntilPosition(position);
const wordRange = new Range(position.lineNumber, wordInfo.startColumn, position.lineNumber, wordInfo.endColumn);
const resource = model.uri;

return this._worker(resource).then(() => {
let suggestions: monaco.languages.CompletionItem[] = [{
label: 'ifelse',
kind: monaco.languages.CompletionItemKind.Snippet,
range: wordRange,
insertText: [
'- if (${1:condition}) {',
'- \t$0',
'- else:',
'-\t'
].join('\n'),
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
documentation: 'If-Else Statement'
},
{
label: 'template',
kind: monaco.languages.CompletionItemKind.Snippet,
range: wordRange,
insertText: [
"# ${1:template_name}(${2:optional_parameters})",
"- hi"
].join('\n'),
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
documentation: 'New Template'
},
{
label: 'import',
kind: monaco.languages.CompletionItemKind.Snippet,
range: wordRange,
insertText: [
"[import](${1:relative path of extra lg file})"
].join('\n'),
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
documentation: 'New import'
},
{
label: 'switchcase',
kind: monaco.languages.CompletionItemKind.Snippet,
range: wordRange,
insertText: [
"SWITCH:{${1:case}}",
"- CASE: {${2:case1}}",
" - ${3:output1}",
"- CASE: {${4:case2}}",
" - ${5:output2}",
"- DEFAULT:",
" - ${6:final output}"
].join('\n'),
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
documentation: 'Switch case Statement'
}];

return this._worker(resource).then(() =>this.matchedStates(model, position).then(
(match) => {
let suggestions: monaco.languages.CompletionItem[] = [];
let functions = buildInfunctionsMap;
functions.forEach((value, key) => {
let item = {
label: key,
kind: monaco.languages.CompletionItemKind.Function,
range: wordRange,
//TODO: a little more to do to make completion more concrete
insertText: key+ '(' + value.Params.toString() + ')',
insertText: key+ '(' + this.removeParamFormar(value.Params.toString()) + ')',
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
documentation: value.Introduction
};
Expand Down Expand Up @@ -298,19 +304,12 @@ export class SuggestAdapter extends Adapter implements monaco.languages.Completi
suggestions.push(item);
});
}
// {
// label: 'add',
// kind: monaco.languages.CompletionItemKind.Function,
// range: wordRange,
// insertText: 'add(${1:number}, ${2:number})',
// insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
// documentation: 'Return the result from adding two numbers.'
// }

return {
suggestions
};
});
if (match.matched && match.state === 'expression'){
return {
suggestions
};
}
}));
}
}

Expand Down
26 changes: 13 additions & 13 deletions src/lgMode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ export function getLGWorker(): Promise<(first: Uri, ...more: Uri[]) => Promise<L
return new Promise((resolve, reject) => {
if (!lgWorker) {
return reject("LG not registered!");
}
};

resolve(lgWorker);
resolve(lgWorker);
});
}

Expand Down Expand Up @@ -73,7 +73,7 @@ function setupMode(defaults: LanguageServiceDefaultsImpl, modeId: string): (firs
// structure_lg
[/^\s*\[/, { token: 'structure-lg', next: '@structure_lg' }],
//parameter in template name
[/([a-zA-Z0-9_.' ]+)(,|\))/, ['parameter', 'delimeter']],
[/([a-zA-Z0-9_.'-]+)(,|\))/, ['parameter', 'delimeter']],
// other
[/[^\()]/, 'template-name']
],
Expand All @@ -93,22 +93,22 @@ function setupMode(defaults: LanguageServiceDefaultsImpl, modeId: string): (firs
//template-ref
[/\[/, {token : 'template-ref', next: 'template_ref'}],
//expression
[/\{/, { token: 'expression', next: '@expression' }],
[/@\{/, { token: 'expression', next: '@expression' }],
],

template_ref:
[
[/\]/, 'template-ref', '@pop'],
[/([a-zA-Z0-9_.]+)(\()/,[{token:'function-name'}, {token:'param_identifier'}]],
[/([a-zA-Z0-9_.-]+)(\()/,[{token:'function-name'}, {token:'param_identifier'}]],
[/'[\s\S]*?'/, 'string'],
[/([a-zA-Z][a-zA-Z0-9_. ]*)(,|\))/, ['parameter', 'delimeter']],
[/([a-zA-Z][a-zA-Z0-9_. ]*)/, 'parameter'],
[/([a-zA-Z][a-zA-Z0-9_.-]*)(,|\))/, ['parameter', 'delimeter']],
[/([a-zA-Z][a-zA-Z0-9_.-]*)/, 'parameter'],
[/[0-9.]+/, 'number']
],

fence_block: [
[/`{3}\s*$/, 'fence-block', '@pop'],
[/\{/, { token: 'expression', next: '@expression' }],
[/@\{/, { token: 'expression', next: '@expression' }],
[/./, 'fence-block.content']
],
inline_string: [
Expand All @@ -118,20 +118,20 @@ function setupMode(defaults: LanguageServiceDefaultsImpl, modeId: string): (firs
],
expression: [
[/\}/, 'expression', '@pop'],
[/([a-zA-Z][a-zA-Z0-9_.]*)(\()/,[{token:'function-name'}, {token:'param_identifier'}]],
[/([a-zA-Z][a-zA-Z0-9_.-]*)(\()/,[{token:'function-name'}, {token:'param_identifier'}]],
[/'[\s\S]*?'/, 'string'],
[/([a-zA-Z][a-zA-Z0-9_. ]*)(,|\))/, ['parameter', 'delimeter']],
[/([a-zA-Z][a-zA-Z0-9_. ]*)/, 'parameter'],
[/([a-zA-Z][a-zA-Z0-9_.-]*)(,|\))/, ['parameter', 'delimeter']],
[/([a-zA-Z][a-zA-Z0-9_.-]*)/, 'parameter'],
[/[0-9.]+/, 'number'],
[/./, 'expression.content']
],
structure_lg: [
[/^\s*\]\s*$/, 'structure-lg', '@pop'],
[/^\s*>[\s\S]*$/, 'comments'],
[/(=|\|)([a_zA-Z0-9@ ]|\@)*\{/, { token: 'expression', next: '@expression' }],
[/^\s*\{/, { token: 'expression', next: '@expression' }],
[/^\s*@\{/, { token: 'expression', next: '@expression' }],
[/=\s*[\s\S]+\s*$/, { token: 'structure-property' }],
[/\s*[a-zA-Z0-9_ ]+\s*$/, { token: 'structure-name' }],
[/\s*[a-zA-Z0-9_-]+\s*$/, { token: 'structure-name' }],
[/./, 'structure-lg.content']
],
}
Expand Down
Loading

0 comments on commit a96f03a

Please sign in to comment.