【问题标题】:CompletionProvider not showing up in VSCode ExtensionCompletionProvider 未显示在 VSCode 扩展中
【发布时间】:2020-08-08 03:53:50
【问题描述】:

我正在尝试使用动态 sn-ps 构建 VSCode 扩展。我查看了这个 StackOverflow 答案:Dynamic snippet evaluation in VSCode,然后尝试使用 CompletionItemProvider (https://code.visualstudio.com/api/references/vscode-api#CompletionItemProvider) 并查看了 Microsoft https://github.com/microsoft/vscode-extension-samples/tree/master/completions-sample/src 这个示例

现在我的动态 sn-p 扩展程序调用一个 API(我制作并且工作正常),然后检索数据。但是 CompletionItem 没有出现在 VSCode 上

这是扩展的代码

const provider1 = vscode.languages.registerCompletionItemProvider('plaintext', {

        async provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext) {
            const linePrefix = document.lineAt(position).text.substr(0, position.character);

            console.log(linePrefix);

            console.log("in provide")
            
            const val = await callToAPIAndRetrieve("sa")
            console.log(val)



            // a simple completion item which inserts `Hello World!`
            const simpleCompletion = new vscode.CompletionItem(val);
            return [simpleCompletion];

        }
    },'');
context.subscriptions.push(provider1);

扩展已注册,所有其他功能都可以使用。唯一的问题是这个完成

这里的变量val 填充了我要添加的字符串。我的假设是它与 async 函数有关。如果我对其进行硬编码,它可以正常工作。所以我怀疑async await 可能是问题所在 任何帮助表示赞赏

编辑 这是callToAPIAndRetrieve的代码:

async function callToAPIAndRetrieve(term: string): Promise<string> {
    const apiKey = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1OTU0MTI5NTQsIm5iZiI6MTU5NTQxMjk1NCwianRpIjoiY2EzOThjZDctMmEzOS00NzNjLTlmMGEtM2RjNTEyMTkwOTdiIiwiZXhwIjoxNjI2OTQ4OTU0LCJpZGVudGl0eSI6IkdldENvZGVUZXN0IiwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.Rmjxa4zfzuGGW-DrHEasGfBJ0xZZdVmHGuDyemrrn6s";

    var url = "https://getcode.herokuapp.com/api/snippets/2";


    const response = await fetch(url,{
        method:"GET",
        headers:{
            "Authorization":"Bearer "+apiKey
        }
    });

    const json = await response.json();
    console.log(json.snippet.code)
    return (json.snippet.code)
    

}

编辑我根据答案编辑了代码,现在我得到了这些日志(这意味着它可以工作)但仍然存在完成项未显示的问题

ex
Object
sdfg

这里ex是我输入的字符串,sdfg是要建议的代码sn-p

【问题讨论】:

    标签: typescript visual-studio-code vscode-extensions


    【解决方案1】:

    我无法使用以下代码和 VSC 1.44 重现

        const callToAPIAndRetrieve = msg => new Promise(resolve => { setTimeout(() => resolve(msg), 1000); });
        context.subscriptions.push(vscode.languages.registerCompletionItemProvider('plaintext', {
          async provideCompletionItems(document, position, token, context) {
            const val = await callToAPIAndRetrieve('Async Await!!');
            console.log(val);
            const simpleCompletion = new vscode.CompletionItem(val);
            return [simpleCompletion];
          }
        },''));
    

    在计时器调用resolve 方法之前,它会显示Loading...


    编辑:

    不要假设fetch 会成功。

    删除此 api-key 并创建一个新的。

    function callToAPIAndRetrieve(term) {
      return new Promise(resolve => {
        const apiKey = "eyJ0eX....";
        var url = "https://getcode.herokuapp.com/api/snippets/2";
        fetch(url,{
          method:"GET",
          headers:{ "Authorization":"XXX "+apiKey }
        })
        .then(response => {
          if (!response.ok) { resolve(undefined); return; }
          const contentType = response.headers.get('content-type');
          if (!contentType || !contentType.includes('application/json')) { resolve(undefined); return; }
          return response.json();
        })
        .then(json => {
          if (!(json.hasOwnProperty('snippet') && json.snippet.hasOwnProperty('code'))) { resolve(undefined); return; }
          resolve(json.snippet.code);
        })
        .catch( () => resolve(undefined));
      });
    }
    
    // ...
    
    context.subscriptions.push(vscode.languages.registerCompletionItemProvider('plaintext', {
      async provideCompletionItems(document, position, token, context) {
        const val = await callToAPIAndRetrieve('sa');
        console.log(val);
        if (!val) return undefined;
        const simpleCompletion = new vscode.CompletionItem(val);
        return [simpleCompletion];
      }
    },''));
    

    【讨论】:

    • @CodeYard 如果我的代码也为您运行,那么问题出在callToAPIAndRetrieve。如果您在该函数中遇到异常,则一切都会失败
    • 编辑问题
    • @CodeYard 也许修改后的callToAPIAndRetrieve 有效
    • 仍然没有弹出。 val 填充了字符串但没有弹出完成项
    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多