Búsqueda de sitios web

typescript - ¿Cómo actualizar los tokens semánticos a medida que cambia el rango visible del editor? (Extensión de VS Code)


He escrito un Proveedor de Tokens Semánticos para mi Extensión de VS Code, y está causando problemas cuando se abren archivos grandes (por ejemplo, archivos con un millón de líneas harán que el Host de la Extensión se bloquee).

Esto está ocurriendo porque, para analizar el texto del editor activo en tokens, cada vez que hay un cambio en el texto, el proveedor recorre cada línea una por una. Esto significa que, cuanto menor sea el número de líneas de texto, más rápido proporcionará la extensión el resaltado semántico. Por lo tanto, un millón de líneas es demasiado para que la extensión lo maneje y, como resultado, se termina el Host de Extensiones:

Para resolver este problema, mi idea era comprobar el rango visible del editor a medida que cambia cuando el usuario se desplaza hacia arriba y hacia abajo, y actualizar los tokens semánticos del documento. De esta manera, en cada cambio del rango visible, habría un rango diferente de líneas analizadas y, por lo tanto, se proporcionarían tokens diferentes, con el fin de hacer esta operación más eficiente.

Entonces, sé que puedo hacer algo así para obtener las líneas superior e inferior del rango visible en el editor activo:

const window = vscode.window
const textEditor = window.activeTextEditor;

if(textEditor) {
    window.onDidChangeTextEditorVisibleRanges(() => {
        const visibleRange = textEditor.visibleRanges[0];
        const topLineIndex = visibleRange.start.line;
        const bottomLineIndex = visibleRange.end.line;
        console.log(topLineIndex, bottomLineIndex);
    });
}

Sin embargo, no sé cómo actualizar los tokens de forma dinámica a medida que cambia el rango visible, porque no puedo devolver una instancia de SemanticTokens en un evento.

¿Hay una manera de actualizar los tokens semánticos en un evento? Si no, ¿existe una solución mejor y más eficiente que simplemente recorrer cada línea para analizar el texto en tokens?

Respuesta #1

Puedes revisar los comandos integrados de VSCode y específicamente ver "vscode.provideDocumentSemanticTokens", que parece ser lo que estás buscando.

Ahora, ¿es tu analizador el problema o el proveedor de tokens? Lo que podrías hacer para optimizar las cosas es analizar solo las líneas que se editaron en lugar de todo el archivo cada vez que el usuario cambia el archivo.

Si no me equivoco, los tokens semánticos solo se actualizan cuando es necesario, es decir, cuando cambia una porción de texto dentro del rango de un token, así que tu analizador podría ser el culpable de los fallos en su lugar.