Skip to content

Commit 7dce663

Browse files
Point to the specific node in resolve errors (#149)
1 parent 6531e73 commit 7dce663

File tree

6 files changed

+31
-31
lines changed

6 files changed

+31
-31
lines changed

internal/syntax/resolver/resolver.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ func (r *Resolver) error(node ast.Node, msg string) error {
149149

150150
r.diagnostics = append(r.diagnostics, diag)
151151

152-
return fmt.Errorf("%w: %s", ErrResolve, diag.String())
152+
return fmt.Errorf("%w: %s", ErrResolve, diag.Msg)
153153
}
154154

155155
// errorf calls error with a formatted message, adding it to
@@ -213,7 +213,7 @@ func (r *Resolver) resolveGlobalVarStatement(env *environment, file *spec.File,
213213

214214
value, err := r.resolveExpression(env, statement.Value)
215215
if err != nil {
216-
return r.errorf(statement, "failed to resolve value expression for key %s: %v", key, err)
216+
return r.errorf(statement.Value, "failed to resolve value expression for key %s: %v", key, err)
217217
}
218218

219219
if !isKeyword {
@@ -223,7 +223,7 @@ func (r *Resolver) resolveGlobalVarStatement(env *environment, file *spec.File,
223223
}
224224

225225
if err := env.define(key, value); err != nil {
226-
return r.error(statement, err.Error())
226+
return r.error(statement.Value, err.Error())
227227
}
228228

229229
file.Vars[key] = value
@@ -292,7 +292,7 @@ func (r *Resolver) resolveGlobalPromptStatement(
292292
//
293293
// Won't think 'id' is missing and fail because it's not defined yet.
294294
if err := env.define(name, PromptPlaceholderGlobal+name); err != nil {
295-
return r.errorf(statement, "prompt %s shadows global variable of the same name: %v", name, err)
295+
return r.errorf(statement.Ident, "prompt %s shadows global variable of the same name: %v", name, err)
296296
}
297297

298298
file.Prompts[name] = prompt
@@ -386,7 +386,7 @@ func (r *Resolver) resolveRequestStatement(env *environment, in ast.Request) (sp
386386

387387
redirect, err = r.resolveExpression(env, in.ResponseRedirect.File)
388388
if err != nil {
389-
return spec.Request{}, r.errorf(in.ResponseRedirect, "invalid response redirect expression: %v", err)
389+
return spec.Request{}, r.errorf(in.ResponseRedirect.File, "invalid response redirect expression: %v", err)
390390
}
391391

392392
request.ResponseFile = filepath.Clean(redirect)
@@ -397,7 +397,7 @@ func (r *Resolver) resolveRequestStatement(env *environment, in ast.Request) (sp
397397

398398
reference, err = r.resolveExpression(env, in.ResponseReference.File)
399399
if err != nil {
400-
return spec.Request{}, r.errorf(in.ResponseReference, "invalid response reference expression: %v", err)
400+
return spec.Request{}, r.errorf(in.ResponseReference.File, "invalid response reference expression: %v", err)
401401
}
402402

403403
request.ResponseRef = filepath.Clean(reference)
@@ -489,7 +489,7 @@ func (r *Resolver) resolveRequestVarStatement(
489489

490490
value, err := r.resolveExpression(env, statement.Value)
491491
if err != nil {
492-
return r.errorf(statement, "failed to resolve value expression for key %s: %v", key, err)
492+
return r.errorf(statement.Value, "failed to resolve value expression for key %s: %v", key, err)
493493
}
494494

495495
if !isKeyword {
@@ -499,7 +499,7 @@ func (r *Resolver) resolveRequestVarStatement(
499499
}
500500

501501
if err := env.define(key, value); err != nil {
502-
return r.error(statement, err.Error())
502+
return r.error(statement.Ident, err.Error())
503503
}
504504

505505
request.Vars[key] = value
@@ -547,7 +547,7 @@ func (r *Resolver) resolveRequestPromptStatement(
547547
}
548548

549549
if _, exists := request.Prompts[name]; exists {
550-
return r.errorf(statement, "prompt %s already declared", name)
550+
return r.errorf(statement.Ident, "prompt %s already declared", name)
551551
}
552552

553553
// Shouldn't need this because request is declared top level with all this
@@ -567,7 +567,7 @@ func (r *Resolver) resolveRequestPromptStatement(
567567
//
568568
// Won't think 'id' is missing and fail because it's not defined yet.
569569
if err := env.define(name, PromptPlaceholderLocal+name); err != nil {
570-
return r.errorf(statement, "prompt %s shadows local variable of the same name: %v", name, err)
570+
return r.errorf(statement.Ident, "prompt %s shadows local variable of the same name: %v", name, err)
571571
}
572572

573573
request.Prompts[name] = prompt
@@ -579,7 +579,7 @@ func (r *Resolver) resolveRequestPromptStatement(
579579
func (r *Resolver) resolveHeader(env *environment, in ast.Header) (key, value string, err error) {
580580
value, err = r.resolveExpression(env, in.Value)
581581
if err != nil {
582-
return "", "", r.errorf(in, "invalid value expression for header %s: %v", in.Key, err)
582+
return "", "", r.errorf(in.Value, "invalid value expression for header %s: %v", in.Key, err)
583583
}
584584

585585
return in.Key, value, nil
@@ -626,17 +626,17 @@ func (r *Resolver) resolveBody(env *environment, request *spec.Request, expressi
626626
func (r *Resolver) resolveInterpolatedExpression(env *environment, expr ast.InterpolatedExpression) (string, error) {
627627
leftResolved, err := r.resolveExpression(env, expr.Left)
628628
if err != nil {
629-
return "", r.errorf(expr, "could not resolve LHS of interpolated expression: %v", err)
629+
return "", r.errorf(expr.Left, "could not resolve LHS of interpolated expression: %v", err)
630630
}
631631

632632
interpResolved, err := r.resolveExpression(env, expr.Interp)
633633
if err != nil {
634-
return "", r.errorf(expr, "could not resolve interp of interpolated expression: %v", err)
634+
return "", r.errorf(expr.Interp, "could not resolve interp of interpolated expression: %v", err)
635635
}
636636

637637
rightResolved, err := r.resolveExpression(env, expr.Right)
638638
if err != nil {
639-
return "", r.errorf(expr, "could not resolve RHS of interpolated expression: %v", err)
639+
return "", r.errorf(expr.Right, "could not resolve RHS of interpolated expression: %v", err)
640640
}
641641

642642
return leftResolved + interpResolved + rightResolved, nil

internal/syntax/resolver/testdata/invalid/prompt-shadow-global.txtar

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
"msg": "prompt id shadows global variable of the same name: variable id already defined",
1010
"position": {
1111
"name": "prompt-shadow-global.txtar",
12-
"offset": 10,
12+
"offset": 18,
1313
"line": 2,
14-
"startCol": 1,
15-
"endCol": 23
14+
"startCol": 9,
15+
"endCol": 11
1616
}
1717
}
1818
]

internal/syntax/resolver/testdata/invalid/prompt-shadow-local.txtar

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ GET https://somewhere.com/{{ id }}
1111
"msg": "prompt id shadows local variable of the same name: variable id already defined",
1212
"position": {
1313
"name": "prompt-shadow-local.txtar",
14-
"offset": 18,
14+
"offset": 26,
1515
"line": 3,
16-
"startCol": 3,
17-
"endCol": 25
16+
"startCol": 11,
17+
"endCol": 13
1818
}
1919
}
2020
]

internal/syntax/resolver/testdata/invalid/redeclared-request-prompts.txtar

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,19 @@ GET https://example.com/1
1313
"msg": "prompt id already declared",
1414
"position": {
1515
"name": "redeclared-request-prompts.txtar",
16-
"offset": 52,
16+
"offset": 60,
1717
"line": 4,
18-
"startCol": 3,
19-
"endCol": 28
18+
"startCol": 11,
19+
"endCol": 13
2020
}
2121
},
2222
{
2323
"msg": "prompt no-description already declared",
2424
"position": {
2525
"name": "redeclared-request-prompts.txtar",
26-
"offset": 80,
26+
"offset": 88,
2727
"line": 5,
28-
"startCol": 3,
28+
"startCol": 11,
2929
"endCol": 25
3030
}
3131
}

internal/syntax/resolver/testdata/invalid/undeclared-var-in-interp.txtar

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ GET https://api.something.com/{{ missing }}/thing/{{ id }}
55
-- diagnostics.json --
66
[
77
{
8-
"msg": "could not resolve interp of interpolated expression: use of undeclared variable missing",
8+
"msg": "failed to resolve URL expression: resolve error: could not resolve interp of interpolated expression: use of undeclared variable missing",
99
"position": {
1010
"name": "undeclared-var-in-interp.txtar",
1111
"offset": 58,
@@ -15,13 +15,13 @@ GET https://api.something.com/{{ missing }}/thing/{{ id }}
1515
}
1616
},
1717
{
18-
"msg": "failed to resolve URL expression: resolve error: undeclared-var-in-interp.txtar:3:5-59: could not resolve interp of interpolated expression: use of undeclared variable missing",
18+
"msg": "could not resolve interp of interpolated expression: use of undeclared variable missing",
1919
"position": {
2020
"name": "undeclared-var-in-interp.txtar",
21-
"offset": 58,
21+
"offset": 84,
2222
"line": 3,
23-
"startCol": 5,
24-
"endCol": 59
23+
"startCol": 31,
24+
"endCol": 44
2525
}
2626
}
2727
]
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
### Get a Thing
2-
@prompt id The ID of a thing to get
2+
# @prompt id The ID of a thing to get
33
GET https://api.something.com/{{ missing }}/thing/{{ id }}

0 commit comments

Comments
 (0)