Как определить исправление для проверки Go с помощью go / analysis? - PullRequest
2 голосов
/ 21 марта 2020

Я недавно написал Go средство проверки с использованием golang.org/x/tools/go/analysis и golang.org/x/tools/go/analysis/singlechecker, и мне удалось написать собственный механизм манипулирования файлами (отслеживание смещения файлов и т. Д. c.), Но я чувствовал, что боролся с системой.

Кажется, в https://pkg.go.dev/golang.org/x/tools/go/analysis/internal/checker определен флаг Fix, но я понятия не имею, как его использовать или подключиться к системе, которая его использует.

Также доступно определение

-fix
        apply all suggested fixes

, когда средство проверки скомпилировано с singlechecker:

import (
    "golang.org/x/tools/go/analysis/singlechecker"
)

var (
    Analyzer = &analysis.Analyzer{
        Name: "name",
        Run: run,
    }

    // Can't define a "fix" flag because golang.org/x/tools/go/analysis/internal/checker
    // defines it and flags cannot be redefined.
    // Fix = flag.Bool("autofix", false, "apply fixes automatically")
    Fix bool
)

func main() {
    // NOTE:
    // Don't do this at home. This should be properly integrated with
    // "golang.org/x/tools/go/analysis/internal/checker" flags (specifically -fix
    // flag) but I have no idea how to do that and the documentation is non existent.
    if len(os.Args) > 1 {
        for _, arg := range os.Args[1:] {
            if arg == "-fix" {
                Fix = true
                break
            }
        }
    }

    singlechecker.Main(Analyzer)
}

Я также не смог найти никакой документации по этому поводу. Код, который должен быть запущен, когда флаг Fix включен, здесь: https://github.com/golang/tools/blob/268ba720d32c891185aa340e8851e215f23173db/go/analysis/internal/checker/checker.go#L265

Любые подсказки, как его использовать?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

можно сделать так:

    pass.Report(
    analysis.Diagnostic{
        Pos:     be.Pos(),
        Message: fmt.Sprintf("do not compare errors directly, use errors.Is() instead: %q", oldExpr),
        SuggestedFixes: []analysis.SuggestedFix{
            {
                Message: fmt.Sprintf("should replace %q with %q", oldExpr, newExpr),
                TextEdits: []analysis.TextEdit{
                    {
                        Pos:     be.Pos(),
                        End:     be.End(),
                        NewText: []byte(newExpr),
                    },
                },
            },
        },
    },

хорошее место для начала чтения https://godoc.org/golang.org/x/tools/go/analysis#Diagnostic

0 голосов
/ 21 марта 2020

Вы можете просто указать флаг -fix=true при запуске своей программы проверки. singlechecker зарегистрирует этот флаг, запустив checker.RegisterFlags () . Затем переданные флаги будут проанализированы в analysisflags.Parse ()

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