VSCode扩展程序中未显示CompletionProvider

时间:2020-08-08 03:53:50

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

我正在尝试使用动态代码片段构建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

研究了这个示例

现在,我的动态代码段扩展调用了一个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是要建议的代码段

1 个答案:

答案 0 :(得分:0)

我无法复制以下代码和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];
      }
    },''));

它显示一个Loading...,直到计时器调用resolve方法为止。


编辑:

不要假设fetch将成功。

删除此api密钥并创建一个新的

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];
  }
},''));