internal/span: update the offset if the end offset should be valid but is not

It used to be that when the start offset was valid, it was presumed the end was
as well.
This was not true in the case where the start offset was not supplied but could
be inferred (at the very start of the file).

Fixes golang/go#31797

Change-Id: Ie5a079796fa0f77cef5571a4e5b309c798e1e06b
Reviewed-on: https://go-review.googlesource.com/c/tools/+/174943
Run-TryBot: Ian Cottrell <iancottrell@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/internal/lsp/testdata/format/one_line.go.in b/internal/lsp/testdata/format/one_line.go.in
new file mode 100644
index 0000000..30f4137
--- /dev/null
+++ b/internal/lsp/testdata/format/one_line.go.in
@@ -0,0 +1 @@
+package format //@format("package")
\ No newline at end of file
diff --git a/internal/lsp/testdata/format/one_line.gofmt-d.golden.go b/internal/lsp/testdata/format/one_line.gofmt-d.golden.go
new file mode 100644
index 0000000..44f557c
--- /dev/null
+++ b/internal/lsp/testdata/format/one_line.gofmt-d.golden.go
@@ -0,0 +1,6 @@
+--- format/one_line.go.orig
++++ format/one_line.go
+@@ -1 +1 @@
+-package format //@format("package")
+\ No newline at end of file
++package format //@format("package")
diff --git a/internal/lsp/testdata/format/one_line.gofmt.golden.go b/internal/lsp/testdata/format/one_line.gofmt.golden.go
new file mode 100644
index 0000000..59aca82
--- /dev/null
+++ b/internal/lsp/testdata/format/one_line.gofmt.golden.go
@@ -0,0 +1 @@
+package format //@format("package")
diff --git a/internal/lsp/tests/tests.go b/internal/lsp/tests/tests.go
index 22d4a5d..4a0363b 100644
--- a/internal/lsp/tests/tests.go
+++ b/internal/lsp/tests/tests.go
@@ -29,7 +29,7 @@
 const (
 	ExpectedCompletionsCount       = 85
 	ExpectedDiagnosticsCount       = 17
-	ExpectedFormatCount            = 4
+	ExpectedFormatCount            = 5
 	ExpectedDefinitionsCount       = 21
 	ExpectedTypeDefinitionsCount   = 2
 	ExpectedHighlightsCount        = 2
diff --git a/internal/span/span.go b/internal/span/span.go
index 7719257..6da7a05 100644
--- a/internal/span/span.go
+++ b/internal/span/span.go
@@ -249,7 +249,7 @@
 			return err
 		}
 	}
-	if withOffset && !s.HasOffset() {
+	if withOffset && (!s.HasOffset() || (s.v.End.hasPosition() && !s.v.End.hasOffset())) {
 		if err := s.v.Start.updateOffset(c); err != nil {
 			return err
 		}