Skip to content

Commit 5eb30df

Browse files
committed
支持Hover提供符号信息
1 parent 18b74bc commit 5eb30df

File tree

10 files changed

+1666
-343
lines changed

10 files changed

+1666
-343
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"displayName": "LuaCoderAssist",
44
"description": "lua coder assistant in javascript for vscode",
55
"icon": "images/icon.png",
6-
"version": "2.0.4",
6+
"version": "2.0.5",
77
"publisher": "liwangqian",
88
"engines": {
99
"vscode": "^1.25.0"

server/coder.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ class Coder {
155155
}
156156

157157
provideHover(params) {
158+
setTimeout(parseDependences, 0, engine.LoadedPackages[params.textDocument.uri], this);
158159
return {
159160
contents: this._hoverProvider.provideHover(params)
160161
};
@@ -199,6 +200,9 @@ class Coder {
199200
};
200201

201202
var _coderInstance = undefined;
203+
/**
204+
* @returns {Coder}
205+
*/
202206
function instance() {
203207
if (_coderInstance === undefined) {
204208
_coderInstance = new Coder();

server/lib/engine/extend.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ function parseJsonObject(node, name) {
8787
return undefined;
8888
}
8989

90-
if (!node.type && (node instanceof Object)) {
90+
if (!name && (node instanceof Object)) {
9191
const object = {};
9292
for (const key in node) {
9393
const value = node[key];
@@ -141,11 +141,12 @@ function parseVariantsArgumentsObject(variants, func) {
141141
return;
142142
}
143143

144-
func.description = [];
145-
func.variants = variants.map((variant, index) => {
146-
let desc = variant.description;
147-
func.description[index] = desc || '';
148-
return parseArgumentsObject(variant.args);
144+
func.variants = variants.map(variant => {
145+
return {
146+
description: variant.description || '',
147+
args: parseArgumentsObject(variant.args),
148+
returns: parseReturnsObject(variant.returnTypes)
149+
};
149150
});
150151
}
151152

@@ -185,5 +186,5 @@ function parseRefJsonObject(node, name) {
185186
}
186187

187188

188-
// loadExtentLib('../../../stdlibs/love.json');
189-
// console.log(namedTypes);
189+
loadExtentLib('./stdlibs/5_1.json');
190+
console.log(namedTypes);

server/lib/engine/symbol.js

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ const LuaSymbolKind = {
7777
table: 'table',
7878
class: 'class',
7979
module: 'module',
80-
function: 'function'
80+
function: 'function',
81+
thread: 'thread',
82+
userdata: 'userdata'
8183
}
8284

8385
exports.LuaSymbolKind = LuaSymbolKind;
@@ -143,6 +145,8 @@ const LuaTypes = {
143145
table: 'table',
144146
function: 'function',
145147
module: 'module',
148+
thread: 'thread',
149+
userdata: 'userdata',
146150
lazy: 'lazy'
147151
}
148152

@@ -178,6 +182,22 @@ class LuaString extends LuaTypeBase {
178182

179183
exports.LuaString = LuaString;
180184

185+
class LuaThread extends LuaTypeBase {
186+
constructor() {
187+
super(LuaTypes.thread);
188+
}
189+
}
190+
191+
exports.LuaThread = LuaThread;
192+
193+
class LuaUserData extends LuaTypeBase {
194+
constructor() {
195+
super(LuaTypes.userdata);
196+
}
197+
}
198+
199+
exports.LuaUserData = LuaUserData;
200+
181201
class LuaAny extends LuaTypeBase {
182202
constructor() {
183203
super(LuaTypes.any);
@@ -190,6 +210,8 @@ const LuaBasicTypes = {
190210
number: new LuaNumber(),
191211
boolean: new LuaBoolean(),
192212
string: new LuaString(),
213+
thread: new LuaThread(),
214+
userdata: new LuaUserData(),
193215
any: new LuaAny()
194216
};
195217

@@ -214,6 +236,54 @@ class SearchResult {
214236
SearchResult.null = new SearchResult();
215237
exports.SearchResult = SearchResult;
216238

239+
class TypeGroup {
240+
constructor() {
241+
this.symbols = [];
242+
}
243+
244+
has(predictor) {
245+
return this.indexOf(predictor) < this.symbols.length;
246+
}
247+
248+
indexOf(predictor) {
249+
const length = this.symbol.length;
250+
for (let i = 0; i < length; i++) {
251+
const symbol = this.symbols[i];
252+
if (predictor(symbol)) {
253+
return i;
254+
}
255+
}
256+
return length;
257+
}
258+
259+
add(symbol) {
260+
const index = this.indexOf(s => s.uri === symbol.uri);
261+
delete this.symbols[index];
262+
this.symbols[index] = symbol;
263+
return index;
264+
}
265+
266+
del(symbol) {
267+
const index = this.indexOf(s => s.uri === symbol.uri);
268+
delete this.symbols.splice(index, 1)[0];
269+
}
270+
271+
get(name, modulePath) {
272+
const symbols = [];
273+
this.symbols.forEach(symbol => {
274+
if (!symbol.uri || symbol.uri.includes(modulePath)) {
275+
if (symbol.type instanceof LuaTable) {
276+
let field = symbol.get(name);
277+
field && symbols.push(field);
278+
}
279+
}
280+
});
281+
return symbols;
282+
}
283+
}
284+
285+
exports.TypeGroup = TypeGroup;
286+
217287
class LuaTable extends LuaTypeBase {
218288
constructor(metatable) {
219289
super(LuaTypes.table);

server/providers/completion-provider.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,14 @@ class CompletionProvider {
4444
let data = this.cache[item.data.index];
4545
const override = item.data.override;
4646
item.detail = utils.symbolSignature(data, override);
47-
const description = data.type.description;
47+
const description = data.type.description || '';
4848
const link = data.type.link;
49-
if (description) {
50-
const desc = (override !== undefined) ? description[override] : description;
51-
item.documentation = {
52-
kind: langserver.MarkupKind.Markdown,
53-
value: desc + (link ? ` \r\n[more...](${link})` : '')
54-
};
55-
}
56-
utils.functionSnippet(item, data);
49+
const desc = (override !== undefined) ? data.type.variants[override].description : description;
50+
item.documentation = {
51+
kind: langserver.MarkupKind.Markdown,
52+
value: desc + (link ? ` \r\n[more...](${link})` : '')
53+
};
54+
utils.functionSnippet(item, data, override);
5755
return item;
5856
}
5957

server/providers/hover-provider.js

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
'use strict';
22

3-
const symbol_manager = require('./lib/symbol-manager');
3+
const { DefinitionContext, definitionProvider } = require('../lib/engine/definition');
44
const utils = require('./lib/utils');
5+
const langserver_1 = require('vscode-languageserver');
56

67
class HoverProvider {
78
constructor(coder) {
@@ -21,36 +22,33 @@ class HoverProvider {
2122
return undefined;
2223
}
2324

24-
// find in current module
25-
let defs = this._findDefInCurrentModule(uri, ref);
26-
27-
// find in dependence
28-
defs = defs.concat(this._findDefInDependence(uri, ref));
29-
30-
return defs.map(d => {
31-
let typeDesc = (d.islocal ? '(local ' : '') + utils.symbolKindDesc(d.kind) + (d.islocal ? ') ' : ' ');
32-
var item = {
33-
language: document.languageId,
34-
value: typeDesc + (utils.symbolSignature(d) || d.name)
25+
let defs = definitionProvider(new DefinitionContext(ref.name, ref.range, uri));
26+
27+
let hovers = [];
28+
defs.forEach(d => {
29+
const variants = d.type.variants;
30+
if (!variants) {
31+
let hover = this._makeHover(d);
32+
hovers.push(hover);
33+
} else {
34+
variants.forEach((_, override) => {
35+
let hover = this._makeHover(d, override);
36+
hovers.push(hover);
37+
});
3538
}
36-
return item;
3739
});
38-
}
39-
40-
_findDefInCurrentModule(uri, ref) {
41-
let sm = symbol_manager.instance();
42-
let docsym = sm.documentSymbol(uri);
43-
if (!docsym) {
44-
return [];
45-
}
4640

47-
return utils.filterModDefinitions(docsym.definitions(), ref, utils.preciseCompareName);
41+
return {
42+
kind: langserver_1.MarkupKind.Markdown,
43+
value: hovers.join(' \r\n')
44+
};
4845
}
4946

50-
_findDefInDependence(uri, ref) {
51-
return utils.filterDepDefinitions(
52-
utils.getDefinitionsInDependences(uri, ref, this.coder.tracer),
53-
ref, utils.preciseCompareName);
47+
_makeHover(symbol, override) {
48+
const desc = (override !== undefined) ? symbol.type.variants[override].description : (symbol.type.description || '');
49+
const link = symbol.type.link;
50+
const more = (link ? ` \r\n[more...](${link})` : '');
51+
return `\`\`\`lua\n${utils.symbolSignature(symbol, override)}\`\`\`` + `\r\n${desc}${more}`;
5452
}
5553
};
5654

server/providers/lib/file-manager.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ class FileManager {
5757
};
5858

5959
var _instance = undefined;
60+
/**
61+
* @returns {FileManager}
62+
*/
6063
exports.instance = () => {
6164
if (_instance === undefined) {
6265
_instance = new FileManager()

server/providers/lib/utils.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ function symbolAtPosition(position, doc, options) {
177177

178178
exports.symbolAtPosition = symbolAtPosition;
179179

180-
function functionSignature(symbol, override) {
180+
function symbolSignature(symbol, override) {
181181
let details = [];
182182
details.push(symbol.isLocal ? 'local ' : '');
183183
let type = engine.typeOf(symbol);
@@ -190,23 +190,24 @@ function functionSignature(symbol, override) {
190190
return details.join('');
191191
}
192192

193-
let ret = type.returns.map(item => {
193+
let returns = (override !== undefined) ? type.variants[override].returns : type.returns;
194+
let ret = returns.map(item => {
194195
let typeName = engine.typeOf(item).typeName;
195196
typeName = typeName.startsWith('@') ? 'any' : typeName;
196197
return typeName;
197198
});
198199

199-
const args = override ? type.variants[override] : type.args;
200+
let args = (override !== undefined) ? type.variants[override].args : type.args;
200201
details.push('function ', symbol.name);
201-
details.push('(' + args.map(p => symbol.displayName || p.name).join(', ') + ') : ');
202+
details.push('(' + args.map(p => p.displayName || p.name).join(', ') + ') -> ');
202203
details.push(ret.length == 0 ? 'void' : ret.join(', '));
203204
return details.join('');
204205
}
205206

206-
exports.symbolSignature = functionSignature;
207+
exports.symbolSignature = symbolSignature;
207208

208-
function functionSnippet(item, symbol) {
209-
const args = symbol.type.args;
209+
function functionSnippet(item, symbol, override) {
210+
const args = (override === undefined) ? symbol.type.args : symbol.type.variants[override].args;
210211
if (symbol.type.typeName !== 'function') {
211212
return;
212213
}

0 commit comments

Comments
 (0)