Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 40 additions & 10 deletions server/src/providers/definition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,11 @@ import * as ld from "../utils/languageDefinitions";
*/
const definitionTargetRangeMaxLines: number = 10;

/** Return a `LocationLink` for class member `memberName` in class `cls` */
/** Return a `LocationLink` for class member `memberName` in class `cls`
*
* This function queries `server` to find the source code of `cls` and locates
* the definition of `memberName` within the source code.
*/
async function classMemberLocationLink(
uri: string,
cls: string,
Expand Down Expand Up @@ -210,7 +214,7 @@ function findMemberInCurrentClass(
}
}

export async function onDefinition(params: TextDocumentPositionParams) {
export async function onDefinition(params: TextDocumentPositionParams): Promise<LocationLink[]> {
const doc = documents.get(params.textDocument.uri);
if (doc === undefined) {
return null;
Expand Down Expand Up @@ -313,7 +317,7 @@ export async function onDefinition(params: TextDocumentPositionParams) {
parsed[macrodefline][parsed[macrodefline].length - 1].p,
macrodefline,
parsed[macrodefline][parsed[macrodefline].length - 1].p +
parsed[macrodefline][parsed[macrodefline].length - 1].c,
parsed[macrodefline][parsed[macrodefline].length - 1].c,
),
),
)
Expand Down Expand Up @@ -398,6 +402,32 @@ export async function onDefinition(params: TextDocumentPositionParams) {
}
}
}
} else if (
parsed[params.position.line][i].l == ld.cls_langindex &&
i == 1 &&
isClassMember(
doc
.getText(
Range.create(
params.position.line,
parsed[params.position.line][0].p,
params.position.line,
parsed[params.position.line][0].p + parsed[params.position.line][0].c,
),
)
.toLowerCase(),
)
) {
// This is a class member definition
const range = findFullRange(params.position.line, parsed, i, symbolstart, symbolend);
return findMemberInCurrentClass(
doc,
parsed,
params.textDocument.uri,
doc.getText(range),
"Method|ClassMethod|ClientMethod|Property|Relationship",
range,
);
} else if (
parsed[params.position.line][i].l == ld.cos_langindex &&
(parsed[params.position.line][i].s == ld.cos_prop_attrindex ||
Expand Down Expand Up @@ -429,7 +459,12 @@ export async function onDefinition(params: TextDocumentPositionParams) {
}

let membercontext: { baseclass: string; context?: string };
if (parsed[params.position.line][i].s != ld.cos_instvar_attrindex) {
if (parsed[params.position.line][i].s == ld.cos_instvar_attrindex) {
membercontext = {
baseclass: thisclass,
context: "",
};
} else {
// Find the dot token
let dottkn = 0;
for (let tkn = 0; tkn < parsed[params.position.line].length; tkn++) {
Expand All @@ -441,11 +476,6 @@ export async function onDefinition(params: TextDocumentPositionParams) {

// Get the base class that this member is in
membercontext = await getClassMemberContext(doc, parsed, dottkn, params.position.line, server);
} else {
membercontext = {
baseclass: thisclass,
context: "",
};
}
if (membercontext.baseclass === "") {
// If we couldn't determine the class, don't return anything
Expand Down Expand Up @@ -1174,7 +1204,7 @@ export async function onDefinition(params: TextDocumentPositionParams) {
parsed[ln][0].l == ld.cls_langindex &&
parsed[ln][0].s == ld.cls_keyword_attrindex &&
doc.getText(Range.create(ln, parsed[ln][0].p, ln, parsed[ln][0].p + parsed[ln][0].c)).toLowerCase() ==
"class"
"class"
) {
// This is the class definition line
let seenExtends = false,
Expand Down