|
1 | 1 | import { TextDocumentPositionParams, Position, Range } from 'vscode-languageserver';
|
2 |
| -import { getServerSpec, findFullRange, quoteUDLIdentifier, makeRESTRequest, createDefinitionUri, determineVariableClass, getClassMemberContext, getParsedDocument, getTextForUri } from '../utils/functions'; |
| 2 | +import { getServerSpec, findFullRange, quoteUDLIdentifier, makeRESTRequest, createDefinitionUri, determineVariableClass, getClassMemberContext, getParsedDocument, getTextForUri, currentClass, getMemberType } from '../utils/functions'; |
3 | 3 | import { ServerSpec, QueryData } from '../utils/types';
|
4 | 4 | import { documents } from '../utils/variables';
|
5 | 5 | import * as ld from '../utils/languageDefinitions';
|
@@ -27,101 +27,44 @@ export async function onTypeDefinition(params: TextDocumentPositionParams) {
|
27 | 27 | parsed[params.position.line][i].l == ld.cos_langindex && (
|
28 | 28 | parsed[params.position.line][i].s == ld.cos_method_attrindex ||
|
29 | 29 | parsed[params.position.line][i].s == ld.cos_attr_attrindex ||
|
30 |
| - parsed[params.position.line][i].s == ld.cos_mem_attrindex |
| 30 | + parsed[params.position.line][i].s == ld.cos_mem_attrindex || |
| 31 | + parsed[params.position.line][i].s == ld.cos_instvar_attrindex |
31 | 32 | )
|
32 | 33 | ) {
|
33 | 34 | // This token is a method or property
|
34 | 35 |
|
35 | 36 | // Get the full text of the member
|
36 | 37 | originrange = findFullRange(params.position.line,parsed,i,symbolstart,symbolend);
|
37 |
| - let member = quoteUDLIdentifier(doc.getText(originrange),0); |
| 38 | + const member = quoteUDLIdentifier(doc.getText(originrange).slice(parsed[params.position.line][i].s == ld.cos_instvar_attrindex ? 2 : 0),0); |
38 | 39 |
|
39 |
| - // Find the dot token |
40 |
| - let dottkn = 0; |
41 |
| - for (let tkn = 0; tkn < parsed[params.position.line].length; tkn ++) { |
42 |
| - if (parsed[params.position.line][tkn].p >= originrange.start.character) { |
43 |
| - break; |
| 40 | + let membercontext = { |
| 41 | + baseclass: "", |
| 42 | + context: "" |
| 43 | + }; |
| 44 | + if (parsed[params.position.line][i].s != ld.cos_instvar_attrindex) { |
| 45 | + // Find the dot token |
| 46 | + var dottkn = 0; |
| 47 | + for (let tkn = 0; tkn < parsed[params.position.line].length; tkn ++) { |
| 48 | + if (parsed[params.position.line][tkn].p >= originrange.start.character) { |
| 49 | + break; |
| 50 | + } |
| 51 | + dottkn = tkn; |
44 | 52 | }
|
45 |
| - dottkn = tkn; |
46 |
| - } |
47 | 53 |
|
48 |
| - // Get the base class that this member is in |
49 |
| - const membercontext = await getClassMemberContext(doc,parsed,dottkn,params.position.line,server); |
| 54 | + // Get the base class that this member is in |
| 55 | + membercontext = await getClassMemberContext(doc,parsed,dottkn,params.position.line,server); |
| 56 | + } else { |
| 57 | + membercontext = { |
| 58 | + baseclass: currentClass(doc,parsed), |
| 59 | + context: "" |
| 60 | + }; |
| 61 | + } |
50 | 62 | if (membercontext.baseclass === "") {
|
51 | 63 | // If we couldn't determine the class, don't return anything
|
52 | 64 | return null;
|
53 | 65 | }
|
54 | 66 |
|
55 |
| - let data: QueryData = { |
56 |
| - query: "", |
57 |
| - parameters: [] |
58 |
| - }; |
59 |
| - if (parsed[params.position.line][i].s == ld.cos_method_attrindex) { |
60 |
| - // This is a method |
61 |
| - data.query = "SELECT ReturnType AS Type, Stub FROM %Dictionary.CompiledMethod WHERE parent->ID = ? AND name = ?"; |
62 |
| - data.parameters = [membercontext.baseclass,member]; |
63 |
| - } |
64 |
| - else if (parsed[params.position.line][i].s == ld.cos_attr_attrindex) { |
65 |
| - // This is a property |
66 |
| - data.query = "SELECT RuntimeType AS Type, NULL AS Stub FROM %Dictionary.CompiledProperty WHERE parent->ID = ? AND name = ?"; |
67 |
| - data.parameters = [membercontext.baseclass,member]; |
68 |
| - } |
69 |
| - else { |
70 |
| - // This is a generic member |
71 |
| - if (membercontext.baseclass.substr(0,7) === "%SYSTEM") { |
72 |
| - // This is always a method |
73 |
| - data.query = "SELECT ReturnType AS Type, Stub FROM %Dictionary.CompiledMethod WHERE parent->ID = ? AND name = ?"; |
74 |
| - data.parameters = [membercontext.baseclass,member]; |
75 |
| - } |
76 |
| - else { |
77 |
| - // This can be a method or property |
78 |
| - data.query = "SELECT ReturnType AS Type, Stub FROM %Dictionary.CompiledMethod WHERE parent->ID = ? AND name = ? UNION ALL "; |
79 |
| - data.query = data.query.concat("SELECT RuntimeType AS Type, NULL AS Stub FROM %Dictionary.CompiledProperty WHERE parent->ID = ? AND name = ?"); |
80 |
| - data.parameters = [membercontext.baseclass,member,membercontext.baseclass,member]; |
81 |
| - } |
82 |
| - } |
83 |
| - const respdata = await makeRESTRequest("POST",1,"/action/query",server,data); |
84 |
| - if (Array.isArray(respdata?.data?.result?.content) && respdata.data.result.content.length > 0) { |
85 |
| - // We got data back |
86 |
| - |
87 |
| - let memobj = respdata.data.result.content[0]; |
88 |
| - if (respdata.data.result.content[0].Stub !== "") { |
89 |
| - // This is a method generated by member inheritance, so we need to get its type from the proper subtable |
90 |
| - |
91 |
| - const stubarr = respdata.data.result.content[0].Stub.split("."); |
92 |
| - let stubquery = ""; |
93 |
| - if (stubarr[2] === "i") { |
94 |
| - // This is a method generated from an index |
95 |
| - stubquery = "SELECT ReturnType AS Type FROM %Dictionary.CompiledIndexMethod WHERE Name = ? AND parent->parent->ID = ? AND parent->Name = ?"; |
96 |
| - } |
97 |
| - if (stubarr[2] === "q") { |
98 |
| - // This is a method generated from a query |
99 |
| - stubquery = "SELECT ReturnType AS Type FROM %Dictionary.CompiledQueryMethod WHERE Name = ? AND parent->parent->ID = ? AND parent->Name = ?"; |
100 |
| - } |
101 |
| - if (stubarr[2] === "a") { |
102 |
| - // This is a method generated from a property |
103 |
| - stubquery = "SELECT ReturnType AS Type FROM %Dictionary.CompiledPropertyMethod WHERE Name = ? AND parent->parent->ID = ? AND parent->Name = ?"; |
104 |
| - } |
105 |
| - if (stubarr[2] === "n") { |
106 |
| - // This is a method generated from a constraint |
107 |
| - stubquery = "SELECT ReturnType AS Type FROM %Dictionary.CompiledConstraintMethod WHERE Name = ? AND parent->parent->ID = ? AND parent->Name = ?"; |
108 |
| - } |
109 |
| - if (stubquery !== "") { |
110 |
| - const stubrespdata = await makeRESTRequest("POST",1,"/action/query",server,{ |
111 |
| - query: stubquery, |
112 |
| - parameters: [stubarr[1],membercontext.baseclass,stubarr[0]] |
113 |
| - }); |
114 |
| - if (Array.isArray(stubrespdata?.data?.result?.content) && stubrespdata.data.result.content.length > 0) { |
115 |
| - // We got data back |
116 |
| - memobj = stubrespdata.data.result.content[0]; |
117 |
| - } |
118 |
| - } |
119 |
| - } |
120 |
| - |
121 |
| - if (memobj.Type !== "") { |
122 |
| - targetcls = memobj.Type; |
123 |
| - } |
124 |
| - } |
| 67 | + targetcls = await getMemberType(parsed,params.position.line,i,membercontext.baseclass,member,server); |
125 | 68 | }
|
126 | 69 | else {
|
127 | 70 | // This token is an ObjectScript variable
|
|
0 commit comments