Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: go-delve/delve
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 84a23b14a523ad12ba82765548c156de4bdc8101
Choose a base ref
..
head repository: go-delve/delve
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 63f52b19a0863df69dbceb9e54545673c804585d
Choose a head ref
Showing with 32 additions and 14 deletions.
  1. +1 −10 pkg/gobuild/gobuild.go
  2. +2 −2 service/dap/server.go
  3. +1 −1 service/dap/server_test.go
  4. +28 −1 service/dap/types.go
11 changes: 1 addition & 10 deletions pkg/gobuild/gobuild.go
Original file line number Diff line number Diff line change
@@ -90,7 +90,7 @@ func goBuildArgs(debugname string, pkgs []string, buildflags string, isTest bool
return args
}

// goBuildArgs2 is like goBuildArgs, but takes either string, []string, or []interface{}.
// goBuildArgs2 is like goBuildArgs, but takes either string or []string.
func goBuildArgs2(debugname string, pkgs []string, buildflags interface{}, isTest bool) ([]string, error) {
var args []string
switch buildflags := buildflags.(type) {
@@ -99,15 +99,6 @@ func goBuildArgs2(debugname string, pkgs []string, buildflags interface{}, isTes
case nil:
case []string:
args = append(args, buildflags...)
case []interface{}:
for _, flag := range buildflags {
switch flag := flag.(type) {
case string:
args = append(args, flag)
default:
return nil, fmt.Errorf("invalid buildflags element type %T (%q)", flag, flag)
}
}
default:
return nil, fmt.Errorf("invalid buildflags type %T", buildflags)
}
4 changes: 2 additions & 2 deletions service/dap/server.go
Original file line number Diff line number Diff line change
@@ -982,9 +982,9 @@ func (s *Session) onLaunchRequest(request *dap.LaunchRequest) {

switch args.Mode {
case "debug":
cmd, out, err = gobuild.GoBuildCombinedOutput(args.Output, []string{args.Program}, args.BuildFlags)
cmd, out, err = gobuild.GoBuildCombinedOutput(args.Output, []string{args.Program}, args.BuildFlags.value)
case "test":
cmd, out, err = gobuild.GoTestBuildCombinedOutput(args.Output, []string{args.Program}, args.BuildFlags)
cmd, out, err = gobuild.GoTestBuildCombinedOutput(args.Output, []string{args.Program}, args.BuildFlags.value)
}
args.DlvCwd, _ = filepath.Abs(args.DlvCwd)
s.config.log.Debugf("building from %q: [%s]", args.DlvCwd, cmd)
2 changes: 1 addition & 1 deletion service/dap/server_test.go
Original file line number Diff line number Diff line change
@@ -6316,7 +6316,7 @@ func TestBadLaunchRequests(t *testing.T) {
// Bad "buildFlags"
client.LaunchRequestWithArgs(map[string]interface{}{"mode": "debug", "program": fixture.Source, "buildFlags": 123})
checkFailedToLaunchWithMessage(client.ExpectVisibleErrorResponse(t),
"Failed to launch: invalid debug configuration - cannot unmarshal number into \"buildFlags\" of type string")
"Failed to launch: invalid debug configuration - cannot unmarshal number into \"buildFlags\" of type []string or string")

// Bad "backend"
client.LaunchRequestWithArgs(map[string]interface{}{"mode": "debug", "program": fixture.Source, "backend": 123})
29 changes: 28 additions & 1 deletion service/dap/types.go
Original file line number Diff line number Diff line change
@@ -110,7 +110,7 @@ type LaunchConfig struct {
// or
// "buildFlags": ["-tags=integration", "-ldflags=-X main.Hello=World"]
// Using other types is an error.
BuildFlags interface{} `json:"buildFlags,omitempty"`
BuildFlags BuildFlags `json:"buildFlags,omitempty"`

// Output path for the binary of the debuggee.
// Relative path is interpreted as the path relative to
@@ -274,3 +274,30 @@ func prettyPrint(config interface{}) string {
}
return string(pretty)
}

// BuildFlags is either string or []string.
type BuildFlags struct{
value interface{}
}

func (s *BuildFlags) UnmarshalJSON(b []byte) error {
if v := string(b); v == "" || v == "null" {
s.value = nil
return nil
}
var strs []string
if err := json.Unmarshal(b, &strs); err == nil {
s.value = strs
return nil
}
var str string
if err := json.Unmarshal(b, &str); err != nil {
s.value = nil
if uerr, ok := err.(*json.UnmarshalTypeError); ok {
return fmt.Errorf(`cannot unmarshal %v into "buildFlags" of type []string or string`, uerr.Value)
}
return err
}
s.value = str
return nil
}