diagnostic.go raw

   1  // Copyright 2019 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  package analysis
   6  
   7  import "go/token"
   8  
   9  // A Diagnostic is a message associated with a source location or range.
  10  //
  11  // An Analyzer may return a variety of diagnostics; the optional Category,
  12  // which should be a constant, may be used to classify them.
  13  // It is primarily intended to make it easy to look up documentation.
  14  //
  15  // All Pos values are interpreted relative to Pass.Fset. If End is
  16  // provided, the diagnostic is specified to apply to the range between
  17  // Pos and End.
  18  type Diagnostic struct {
  19  	Pos      token.Pos
  20  	End      token.Pos // optional
  21  	Category string    // optional
  22  	Message  string
  23  
  24  	// URL is the optional location of a web page that provides
  25  	// additional documentation for this diagnostic.
  26  	//
  27  	// If URL is empty but a Category is specified, then the
  28  	// Analysis driver should treat the URL as "#"+Category.
  29  	//
  30  	// The URL may be relative. If so, the base URL is that of the
  31  	// Analyzer that produced the diagnostic;
  32  	// see https://pkg.go.dev/net/url#URL.ResolveReference.
  33  	URL string
  34  
  35  	// SuggestedFixes is an optional list of fixes to address the
  36  	// problem described by the diagnostic. Each one represents an
  37  	// alternative strategy, and should have a distinct and
  38  	// descriptive message; at most one may be applied.
  39  	//
  40  	// Fixes for different diagnostics should be treated as
  41  	// independent changes to the same baseline file state,
  42  	// analogous to a set of git commits all with the same parent.
  43  	// Combining fixes requires resolving any conflicts that
  44  	// arise, analogous to a git merge.
  45  	// Any conflicts that remain may be dealt with, depending on
  46  	// the tool, by discarding fixes, consulting the user, or
  47  	// aborting the operation.
  48  	SuggestedFixes []SuggestedFix
  49  
  50  	// Related contains optional secondary positions and messages
  51  	// related to the primary diagnostic.
  52  	Related []RelatedInformation
  53  }
  54  
  55  // RelatedInformation contains information related to a diagnostic.
  56  // For example, a diagnostic that flags duplicated declarations of a
  57  // variable may include one RelatedInformation per existing
  58  // declaration.
  59  type RelatedInformation struct {
  60  	Pos     token.Pos
  61  	End     token.Pos // optional
  62  	Message string
  63  }
  64  
  65  // A SuggestedFix is a code change associated with a Diagnostic that a
  66  // user can choose to apply to their code. Usually the SuggestedFix is
  67  // meant to fix the issue flagged by the diagnostic.
  68  //
  69  // The TextEdits must not overlap, nor contain edits for other
  70  // packages. Edits need not be totally ordered, but the order
  71  // determines how insertions at the same point will be applied.
  72  type SuggestedFix struct {
  73  	// A verb phrase describing the fix, to be shown to
  74  	// a user trying to decide whether to accept it.
  75  	//
  76  	// Example: "Remove the surplus argument"
  77  	Message   string
  78  	TextEdits []TextEdit
  79  }
  80  
  81  // A TextEdit represents the replacement of the code between Pos and End with the new text.
  82  // Each TextEdit should apply to a single file. End should not be earlier in the file than Pos.
  83  type TextEdit struct {
  84  	// For a pure insertion, End can either be set to Pos or token.NoPos.
  85  	Pos     token.Pos
  86  	End     token.Pos
  87  	NewText []byte
  88  }
  89