简体   繁体   English

vscode如何自动跳转到正确的定义

[英]vscode how to automatically jump to proper definition

//extension.ts
export function activate(context: vscode.ExtensionContext) {
    console.log('Congratulations, your extension "helloworld" is now active!');

    context.subscriptions.push(vscode.languages.registerDefinitionProvider(
        {language: "plsql"}, new GoDefinitionProvider() ));

}

class GoDefinitionProvider implements vscode.DefinitionProvider {
    public provideDefinition(
        document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken):
        Thenable<vscode.Definition>{
            return new Promise((resolve, reject) =>{
                let definitions:vscode.Definition = [];         
                for (let i = 0; i < document.lineCount; i++) {
                    let eachLine = document.lineAt(i).text.toLowerCase().trim();
                    if (eachLine.startsWith("cursor")) {                    
                        definitions.push({
                            uri: document.uri,
                            range: document.lineAt(i).range
                        });                     
                    }                   
                } 

                resolve(definitions);
            });

    }
}
// testing.txt
cursor a1 is
cursor a2 is
cursor a3 is
cursor a4 is
cursor a5 is
cursor a6 is
cursor a7 is
cursor a8 is
cursor a9 is

a1
a2
a3
a4
a5
a6
a7
a8
a9

for example, now we want to select "a4 " to jump to show definition, but the definition is auto jump to "cursor a9 is", not the proper one "cursor a4 is".例如,现在我们要选择“a4”来跳转显示定义,但是定义是自动跳转到“cursor a9 is”,而不是正确的“cursor a4 is”。

result image: https://i.imgur.com/RNAvWMN.png结果图像: https : //i.imgur.com/RNAvWMN.png

how can I implement the auto jumping to the proper definition?如何实现自动跳转到正确的定义? Above is the source code of extension.ts for your reference.以上是extension.ts的源码供大家参考。

Problem in your code is, that you return array of Definitions, not single Definition Location.您的代码中的问题是,您返回定义数组,而不是单个定义位置。

return new Promise((resolve, reject) =>{
    const range = document.getWordRangeAtPosition(position);
    const selectedWord = document.getText(range);
    let definitions:vscode.Definition = [];         
    for (let i = 0; i < document.lineCount; i++) {
        let eachLine = document.lineAt(i).text.toLowerCase().trim();
        if (eachLine.startsWith("cursor")) { 
            if ( eachLine.includes(selectedWord))  //only selectedWord                  
                definitions.push({
                    uri: document.uri,
                    range: document.lineAt(i).range
                });                     
            }
        }                   
    } 
    resolve(definitions);
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM