Skip to content

Commit

Permalink
优化:支持显式通过_G来获取全局变量的代码补全;优化:支持string类型变量及字面值字符串的函数补全
Browse files Browse the repository at this point in the history
  • Loading branch information
liwangqian committed Nov 18, 2018
1 parent 413d0dd commit d1708cd
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 7 deletions.
15 changes: 14 additions & 1 deletion server/lib/engine/completion.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
********************************************************************************/
'use strict';

const { LoadedPackages } = require('./luaenv');
const { LoadedPackages, _G } = require('./luaenv');
const { object2Array } = require('./utils');
const { typeOf, findDef, searchInnerStackIndex } = require('./typeof');
const { ScopeEnd } = require('./linear-stack');
Expand All @@ -34,6 +34,7 @@ class CompletionContext {
this.range = range;
this.uri = uri;
this.functionOnly = expr.endsWith(':');
this.isString = false;
}
};

Expand Down Expand Up @@ -87,13 +88,25 @@ function completionProvider(context) {
value = findDef(name, context.uri, context.range);
}

if (context.isString) {
value = _G.get('string');
}

if (!value) {
return [];
}

if (Is.luaFunction(typeOf(value))) {
if (!value.type.returns) {
return [];
}
value = value.type.returns[0];
}

if (Is.luaString(value.type)) {
value = _G.get('string');
}

if (!Is.luaTable(typeOf(value)) && !Is.luaModule(value)) {
return [];
}
Expand Down
2 changes: 2 additions & 0 deletions server/lib/engine/luaenv.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ const createTableSymbol = (name, loc, range, local) => {

const _G = createTableSymbol('_G', [0, 3], [0, Infinity], false);
_G.state = { valid: true };
_G.set(_G.name, _G);

const LoadedPackages = {};

const global__metatable = createTableSymbol('_G__metatable', [0, 0], [0, Infinity], false);
Expand Down
1 change: 1 addition & 0 deletions server/providers/completion-provider.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class CompletionProvider {
}

let ctx = new engine.CompletionContext(ref.name, ref.range, uri);
ctx.isString = ref.isString;
let items = engine.completionProvider(ctx);
let completionItems = [];
items.forEach((item, index) => {
Expand Down
20 changes: 14 additions & 6 deletions server/providers/lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ function bracketMatches(bracketLeft, bracketRight) {
let rightBracketRegx = /[\)\]\}]/;
let bracketPairsRegx = /[\(\)\[\]\{\}]/;
function backward(content, offset, collection) {
let isString = false;
let charIndex = offset;
let bracketStack = [];
while (charIndex >= 0) {
Expand All @@ -154,6 +155,10 @@ function backward(content, offset, collection) {
let topChar = bracketStack[bracketStack.length - 1];
if (topChar == c) {
bracketStack.pop();
if (bracketStack.length === 0) {
isString = true;
break;
}
} else {
bracketStack.push(c);
}
Expand Down Expand Up @@ -199,17 +204,19 @@ function backward(content, offset, collection) {
}

collection.reverse();
return charIndex + 1;
return { offset: charIndex + 1, isString };
}

const forwardRegex = /[a-zA-Z0-9_]/; // parse only the name
function extendTextRange(content, from, options) {
let range = { start: from, end: from, text: '' };
let range = { start: from, end: from, text: '', isString: false };
let offset = from;
let collection = [];
if (options.backward) {
offset = backward(content, offset, collection);
range.start = offset;
let res = backward(content, offset, collection);
range.start = res.offset;
range.isString = res.isString;
offset = res.offset;
}

if (options.forward) {
Expand Down Expand Up @@ -260,7 +267,7 @@ function symbolAtPosition(position, doc, options) {
return undefined;
}

let ref = { name: range.text, range: [range.start, range.end] };
let ref = { name: range.text, range: [range.start, range.end], isString: range.isString };
return ref;
}

Expand Down Expand Up @@ -358,7 +365,8 @@ function signatureContext(content, offset) {
end_pos = skip(/\s/, content, end_pos - 1, -1);

let collection = [];
let start_pos = backward(content, end_pos, collection);
let res = backward(content, end_pos, collection);
let start_pos = res.offset;
if (start_pos < lower_bound) {
return undefined;
}
Expand Down

0 comments on commit d1708cd

Please sign in to comment.