Какой смысл в пользовательских сопоставителях проблем, если проблемы, которые они создают, никогда не могут быть устранены или решены? - PullRequest
0 голосов
/ 02 апреля 2020

Я работал с некоторыми очень простыми c awk-сценариями, которые я запускал с входным каналом из inotifywait для генерации классов машинописи с информацией из шейдеров WebGL при каждом изменении исходных файлов шейдера. Работает как очарование для того, что начиналось как расширенный oneliner.

Тогда у меня появилась милая идея начать все это с задачи vscode с помощью специального средства сопоставления проблем, чтобы посмотреть, смогу ли я получить свои 50 строк сценария для также обеспечиваем ворсинки. Я имею в виду, что они все равно просматривали файлы.

Конечно, никаких проблем там нет. Просто скопируйте пример сопоставления проблем с веб-сайта vscode, немного подправьте его для запуска в фоновом режиме, а затем добавьте некоторые выходные данные из сценария awk, которые соответствуют регулярному выражению, которое они использовали в примере. Работает как сон.

То есть если бы не было проблем и исправлений ошибок, которые невозможно удалить после того, как они были сгенерированы ...

Я действительно не использовал задачи в vscode раньше, так что я, вероятно, что-то упустил. Но то, что я получаю от некоторого прибегания к гуглу, состоит в том, что у сопоставителей проблем или их задач нет возможности устранить любые проблемы, которые они генерируют, и это намеченный способ, потому что они должны обрабатываться с помощью расширения расширений и тому подобного. Они даже не могут быть удалены пользователем вручную.

Это действительно так? Кажется, что было бы невероятно полезно иметь указатели c проекта с кратким сценарием и регулярным выражением.

Я включу свои сценарии вместе с сопоставителем проблем ниже. Я бы не стал предостерегать от использования метода inotifywait + awk для чего-либо серьезного. Это не особенно переносимо.

задач. json:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "prep-shaders",
            "type": "process",
            "command": "./tsc-shader.sh",
            "isBackground": true,
            "problemMatcher": {
                "fileLocation": ["relative", "${workspaceFolder}"],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                },
                "background": {
                    "activeOnStart": false,
                    "beginsPattern": "^File change detected\\. Rebuilding '.+\\ts'$",
                    "endsPattern": "^Build complete\\.$"
                }
            }
        }
    ]
}

ts c -shader.awk:

#!/usr/bin/gawk -f
BEGIN { FS = "[ ;]"; }
function printErr(location, severity, message) {
    printf("%s: %s: %s\n", location, severity, message) > "/dev/stderr"
}
function addField(name, tstype, gltype, type) {
    loc = sprintf("%s:%d:%d", FILENAME, FNR, index($0, $1));
    errForm = "%s storage does not match declaration '%s' at '%s'";
    if (name in fields && fields[name]["gl"] != gltype) {
        printErr(loc, "error", sprintf(\
            errForm, name, fields[name]["type"], fields[name]["loc"]));
        if (fields[name]["err"]++ == 0)
            printErr(fields[name]["loc"], "error", sprintf(\
                errForm, name, type, loc));
    } else {
        fields[name]["ts"] = tstype;
        fields[name]["gl"] = gltype;
        fields[name]["loc"] = loc;
        fields[name]["type"] = type;
    }
}
($1 == "attribute") {
    addField($3, "number", "Attrib", "attribute")
}
($1 == "uniform") {
    addField($3, "WebGLUniformLocation | null", "Uniform", "uniform")
}
(FNR == 1) {
    n = split(FILENAME, arr, ".");
    printf("%sexport const %s_SOURCE: string = `\n",
        (FNR != NR ? "`\n" : ""), toupper(arr[n]));
}
{
    printf("\t%s\n", $0);
}
function declareProp(name, tstype) {
    printf("\tpublic readonly %s: %s;\n", name, tstype);
}
function setProp(name, gltype) {
    printf("%sthis.%s = gl.get%sLocation(\n%s\tthis.shaderProgram, '%s');\n",
        "\t\t", name, gltype, "\t\t", name);
}
END {
    printf("`;\nexport class ShaderInfo {\n");
    for (name in fields)
        declareProp(name, fields[name]["ts"]);
    printf("\tconstructor(\n\t\tpublic readonly shaderProgram: WebGLProgram,\n"\
        "\t\tgl: WebGL2RenderingContext) {\n");
    for (i in fields)
        declareProp(name, fields[name]["gl"]);
    printf("\t}\n}");
}

ts c -shader . sh:

#!/bin/bash

inotifywait -e close_write,moved_to,create -m src |
grep -P --line-buffered 'vert$|frag$' |
while read -r directory _ filename; do
    md5sum "$directory$filename"
done |
awk '
(!($2 in a) || a[$2] != $1) {
    a[$2] = $1;
    print(gensub(/^(.*\/)(.*)(\.vert$|\.frag$)/, "\\1\t\\2", "g", $2));
    fflush();
}
' |
while read -r dir name; do
    echo "File change detected. Rebuilding 'gen/$name.shader.ts'."
    ./tsc-shader.awk "$dir$name.vert" "$dir$name.frag" 2>&1 >"gen/$name.shader.ts"
    echo "Build complete."
done

Структура файла:

./
| .vscode/                                                                                                                                                                                               
| | tasks.json
| gen/
| | gltest.shader.ts
| src/
| | gltest.frag
| | gltest.vert
| tsc-shader.awk*
| tsc-shader.sh*
  • .vscode /

1 Ответ

0 голосов
/ 22 апреля 2020

У меня похожая настройка. У меня есть задача, запущенная вручную, которая запускает скрипт, который анализирует файлы в проекте и распечатывает найденные местоположения с проблемами, которые соответствуют аргументам скрипта. Средство сопоставления проблем обнаруживает проблемы и показывает их на вкладке Problems.

Когда я исправляю несколько проблем и перезапускаю задачу / скрипт, эти проблемы удаляются со вкладки Problems.

Кажется, что проблемы сохраняются / связаны с помощью сопоставителя проблем. Если я определяю глобальное средство сопоставления проблем в tasks.json и несколько задач (с разными аргументами сценария), которые используют это средство сопоставления проблем, проблемы предыдущей выполненной задачи удаляются со вкладки Problems, если я запускаю задачу, которая использует глобальный сопоставитель проблем.

Я думаю, что идея сопоставителя проблем состоит в том, что он сообщает о проблемах, которые вы исправили, и затем задача запускается снова, чтобы увидеть, устранена ли проблема.

Если есть проблему в своем шейдере вы исправляете и задача запускается снова, и проблема должна быть удалена с вкладки Problems.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...