From 6fea9ef05e7acc76b65a0e3ff75325223f999e43 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Mon, 3 Jun 2019 16:06:25 -0400 Subject: [PATCH] go/analysis: add SuggestedFix to Diagnostic This change is uploaded for discussion. This adds a SuggestedFix field to Diagnostic that can be used to prepare refactorings or to surface fixes for diagnostics when they're shown by the LSP. Change-Id: Icad3bb78540b55df1707955139c889f612d1084f Reviewed-on: https://go-review.googlesource.com/c/tools/+/181941 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Dominik Honnef Reviewed-by: Rebecca Stambler --- go/analysis/analysis.go | 15 ---------- go/analysis/diagnostic.go | 20 +++++++++++++ go/analysis/diagnostic_experimental.go | 41 ++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 15 deletions(-) create mode 100644 go/analysis/diagnostic.go create mode 100644 go/analysis/diagnostic_experimental.go diff --git a/go/analysis/analysis.go b/go/analysis/analysis.go index 19e1e421..e375484f 100644 --- a/go/analysis/analysis.go +++ b/go/analysis/analysis.go @@ -211,18 +211,3 @@ func (pass *Pass) String() string { type Fact interface { AFact() // dummy method to avoid type errors } - -// A Diagnostic is a message associated with a source location or range. -// -// An Analyzer may return a variety of diagnostics; the optional Category, -// which should be a constant, may be used to classify them. -// It is primarily intended to make it easy to look up documentation. -// -// If End is provided, the diagnostic is specified to apply to the range between -// Pos and End. -type Diagnostic struct { - Pos token.Pos - End token.Pos // optional - Category string // optional - Message string -} diff --git a/go/analysis/diagnostic.go b/go/analysis/diagnostic.go new file mode 100644 index 00000000..e7debe93 --- /dev/null +++ b/go/analysis/diagnostic.go @@ -0,0 +1,20 @@ +// +build !experimental + +package analysis + +import "go/token" + +// A Diagnostic is a message associated with a source location or range. +// +// An Analyzer may return a variety of diagnostics; the optional Category, +// which should be a constant, may be used to classify them. +// It is primarily intended to make it easy to look up documentation. +// +// If End is provided, the diagnostic is specified to apply to the range between +// Pos and End. +type Diagnostic struct { + Pos token.Pos + End token.Pos // optional + Category string // optional + Message string +} diff --git a/go/analysis/diagnostic_experimental.go b/go/analysis/diagnostic_experimental.go new file mode 100644 index 00000000..2e9ebb20 --- /dev/null +++ b/go/analysis/diagnostic_experimental.go @@ -0,0 +1,41 @@ +// +build experimental + +package analysis + +import "go/token" + +// A Diagnostic is a message associated with a source location or range. +// +// An Analyzer may return a variety of diagnostics; the optional Category, +// which should be a constant, may be used to classify them. +// It is primarily intended to make it easy to look up documentation. +// +// If End is provided, the diagnostic is specified to apply to the range between +// Pos and End. +type Diagnostic struct { + Pos token.Pos + End token.Pos // optional + Category string // optional + Message string + + // TODO(matloob): Should multiple SuggestedFixes be allowed for a diagnostic? + SuggestedFixes []SuggestedFix // optional +} + +// A SuggestedFix is a code change associated with a Diagnostic that a user can choose +// to apply to their code. Usually the SuggestedFix is meant to fix the issue flagged +// by the diagnostic. +type SuggestedFix struct { + // A description for this suggested fix to be shown to a user deciding + // whether to accept it. + Message string + TextEdits []TextEdit +} + +// A TextEdit represents the replacement of the code between Pos and End with the new text. +type TextEdit struct { + // For a pure insertion, End can either be set to Pos or token.NoPos. + Pos token.Pos + End token.Pos + NewText []byte +}