From c87c0a9d2abdfc528ed99bb0bcbff15ee84cc010 Mon Sep 17 00:00:00 2001 From: Alisdair McDiarmid Date: Fri, 5 Jun 2020 16:17:27 -0400 Subject: [PATCH] command/format: Fix empty overlap diagnostics Diagnostics where the highlight range has an empty overlap with a line would skip lines of the output. This is because if two ranges abut each other, they can be considered to overlap, but that overlap is empty. This results in an edge case in the diagnostic printer which causes the line not to be printed. --- command/format/diagnostic.go | 2 +- command/format/diagnostic_test.go | 47 +++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/command/format/diagnostic.go b/command/format/diagnostic.go index dc1dfe5bf..fa7584a4b 100644 --- a/command/format/diagnostic.go +++ b/command/format/diagnostic.go @@ -100,7 +100,7 @@ func Diagnostic(diag tfdiags.Diagnostic, sources map[string][]byte, color *color if !lineRange.Overlaps(snippetRange) { continue } - if lineRange.Overlaps(highlightRange) { + if !lineRange.Overlap(highlightRange).Empty() { beforeRange, highlightedRange, afterRange := lineRange.PartitionAround(highlightRange) before := beforeRange.SliceBytes(src) highlighted := highlightedRange.SliceBytes(src) diff --git a/command/format/diagnostic_test.go b/command/format/diagnostic_test.go index 8848e4b29..98b879d38 100644 --- a/command/format/diagnostic_test.go +++ b/command/format/diagnostic_test.go @@ -120,3 +120,50 @@ Error: Some error t.Fatalf("unexpected output: got:\n%s\nwant\n%s\n", output, expected) } } + +func TestDiagnostic_emptyOverlapHighlightContext(t *testing.T) { + var diags tfdiags.Diagnostics + + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Some error", + Detail: "...", + Subject: &hcl.Range{ + Filename: "source.tf", + Start: hcl.Pos{Line: 3, Column: 10, Byte: 38}, + End: hcl.Pos{Line: 4, Column: 1, Byte: 39}, + }, + Context: &hcl.Range{ + Filename: "source.tf", + Start: hcl.Pos{Line: 2, Column: 13, Byte: 27}, + End: hcl.Pos{Line: 4, Column: 1, Byte: 39}, + }, + }) + sources := map[string][]byte{ + "source.tf": []byte(`variable "x" { + default = { + "foo" + } +`), + } + color := &colorstring.Colorize{ + Colors: colorstring.DefaultColors, + Reset: true, + Disable: true, + } + expected := ` +Error: Some error + + on source.tf line 3, in variable "x": + 2: default = { + 3: "foo" + 4: } + +... +` + output := Diagnostic(diags[0], sources, color, 80) + + if output != expected { + t.Fatalf("unexpected output: got:\n%s\nwant\n%s\n", output, expected) + } +}