mecanografiado: invoca programáticamente Organizar importaciones y guarda el archivo luego

CorePress2023-11-30  1

Lo que estoy haciendo es básicamente:

async function doItAll(ownEdits: Array<TextEdit>) {
    const editor: TextEditor = await getEditor();
    applyOwnChanges(editor, ownEdits);
    await commands.executeCommand('editor.action.organizeImports',
        editor.document.uri.path);
    await editor.document.save();
}

Todo funciona, pero el guardado ocurre antes de que finalice organizImports y termino con un editor sucio, cuando se modifican las importaciones.

Verifiqué tres veces que no olvidé la palabra clave await, pero funciona como si no estuviera allí.

Esto puede ser un error o puede que esté haciendo o esperando algo mal. ¿Lo soy?



------------------------

De hecho, el comando organizeImports regresa antes de actualizar el documento.

Como solución alternativa, utilice onDidChangeTextDocument para interceptar cuando organizeImports haya finalizado.y su documento estará listo para guardar.

const handler = vscode.workspace.onDidChangeTextDocument(doc => {
  if (doc.document.uri.path === editor.document.uri.path) {
    doc.document.save()
    handler.dispose()
  }
})
2
  • Seguramente probaré tu solución enDidChangeTextDocument (y apuesto a que funcionará), pero ¿no es esto devolver un error antes de tiempo? - maaartinus 15 de junio de 2020 a las 2:17
  • Tal vez deberías hacer una pequeña prueba extensión dentro de un repositorio separado para reproducir. Creo que tiene algo que ver con el código subyacente workspace.applyEdit y la comunicación del servidor de idiomas. Si desea profundizar, puede comenzar desde aquí: github.com/microsoft/vscode/blob/… -Yuriy Naydenov 15 de junio de 2020 a las 9:15


------------------------

executeCommand es entonces realizable. Entonces, el método save() debe moverse dentro de thenable.

vscode.commands.executeCommand('editor.action.organizeImports', editor.document.uri.path).then(function(){
        await editor.document.save();
});

Si el guardado aún se realiza antes de que finalice organizImports, intente llamar al método de guardado dentro de setTi.meout(función(){....}, T).

 vscode.commands.executeCommand('editor.action.organizeImports', editor.document.uri.path).then(function(){
       setTimeout(function(){
            await editor.document.save();
       }, 500);
});
2
  • 1 executeCommand devuelve una Promesa (así que sí, es "entoncesable"), pero este enfoque no es realmente diferente a esperar la promesa en lugar de invocar su función .then. -gastador 10 de junio de 2020 a las 12:55
  • No puedo usar ningún tiempo de espera porque necesito abrir, organizar, guardar y cerrar muchos editores sin molestar al usuario por mucho tiempo. - maaartinus 10 de junio de 2020 a las 17:04
Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare