Skip to content

Conversation

ankitaS11
Copy link
Collaborator

This PR adds support for Go To Definition for the extension. To test it, please follow the instructions in the previous PRs/README, and right click on any global symbol - "Go to definition" and it will take you to the correct location.

Comment on lines +93 to +153
// Borrowed from Jakt: https://github.com/SerenityOS/jakt
function convertPosition(position: Position, text: string): number {
let line = 0;
let character = 0;
const buffer = new TextEncoder().encode(text);

let i = 0;
while (i < text.length) {
if (line == position.line && character == position.character) {
return i;
}

if (buffer.at(i) == 0x0A) {
line++;
character = 0;
} else {
character++;
}

i++;
}

return i;
}

connection.onDefinition(async (request) => {
console.time('onDefinition');
const document = documents.get(request.textDocument.uri);
const settings = await getDocumentSettings(request.textDocument.uri);
const text = document?.getText();
const symbols: SymbolInformation[] = [];
if (typeof text == "string") {
console.log("request: ");
console.log(request);
console.log("index: " + convertPosition(request.position, text));
const stdout = await runCompiler(text, "--goto-def " + convertPosition(request.position, text), settings);
console.log("got: ", stdout);
const obj = JSON.parse(stdout);
for (let i = 0; i < obj.length; i++) {
if (obj[i].location) {
return [{
targetUri: request.textDocument.uri,
targetRange: {
start: { line: obj[i].location.range.start.line, character: obj[i].location.range.start.character },
end: { line: obj[i].location.range.end.line, character: obj[i].location.range.end.character }
},
targetSelectionRange: {
start: { line: obj[i].location.range.start.line, character: obj[i].location.range.start.character },
end: { line: obj[i].location.range.end.line, character: obj[i].location.range.end.character }
},
originSelectionRange: {
start: { line: request.position.line, character: Math.max(0, request.position.character - 4) },
end: { line: request.position.line, character: request.position.character + 4 }
}
}];
}
}
// console.timeEnd('onDefinition');
return undefined;
}
});
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the relevant code for this PR. Once previous PRs are merged, and this is rebased, the PR will look cleaner.

@certik
Copy link
Contributor

certik commented Aug 18, 2022

Here is the corresponding LPython diff: lcompilers/lpython#982

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants