Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GoTo Definition Support for LPython #3

Open
wants to merge 9 commits into
base: main
Choose a base branch
from

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