Skip to content

Commit ece2f1f

Browse files
authored
Refactor hoverAtPos to use collected origins (#155)
1 parent 4b3f4ad commit ece2f1f

File tree

3 files changed

+308
-10
lines changed

3 files changed

+308
-10
lines changed

decoder/hover.go

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ func (d *PathDecoder) hoverDataForExpr(ctx context.Context, expr hcl.Expression,
283283

284284
tes, ok := constraints.TraversalExprs()
285285
if ok {
286-
content, err := d.hoverContentForTraversalExpr(e.AsTraversal(), tes)
286+
content, err := d.hoverContentForTraversalExpr(e.AsTraversal(), tes, pos)
287287
if err != nil {
288288
return nil, err
289289
}
@@ -642,19 +642,28 @@ func stringValFromTemplateExpr(tplExpr *hclsyntax.TemplateExpr) (cty.Value, bool
642642
return cty.StringVal(value), true
643643
}
644644

645-
func (d *PathDecoder) hoverContentForTraversalExpr(traversal hcl.Traversal, tes []schema.TraversalExpr) (string, error) {
646-
origin, err := reference.TraversalToLocalOrigin(traversal, tes)
647-
if err != nil {
648-
return "", nil
645+
func (d *PathDecoder) hoverContentForTraversalExpr(traversal hcl.Traversal, tes []schema.TraversalExpr, pos hcl.Pos) (string, error) {
646+
origins, ok := d.pathCtx.ReferenceOrigins.AtPos(traversal.SourceRange().Filename, pos)
647+
if !ok {
648+
return "", &reference.NoOriginFound{}
649649
}
650650

651-
targets, ok := d.pathCtx.ReferenceTargets.Match(origin)
652-
if !ok {
653-
return "", &reference.NoTargetFound{}
651+
for _, origin := range origins {
652+
matchableOrigin, ok := origin.(reference.MatchableOrigin)
653+
if !ok {
654+
continue
655+
}
656+
targets, ok := d.pathCtx.ReferenceTargets.Match(matchableOrigin)
657+
if !ok {
658+
// target not found
659+
continue
660+
}
661+
662+
// TODO: Reflect additional found targets here?
663+
return hoverContentForReferenceTarget(targets[0])
654664
}
655665

656-
// TODO: Reflect additional found targets here?
657-
return hoverContentForReferenceTarget(targets[0])
666+
return "", &reference.NoTargetFound{}
658667
}
659668

660669
func hoverContentForReferenceTarget(ref reference.Target) (string, error) {

decoder/hover_expressions_test.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,6 +1309,7 @@ func TestDecoder_HoverAtPos_traversalExpressions(t *testing.T) {
13091309
name string
13101310
attrSchema map[string]*schema.AttributeSchema
13111311
refs reference.Targets
1312+
origins reference.Origins
13121313
cfg string
13131314
pos hcl.Pos
13141315
expectedData *lang.HoverData
@@ -1324,6 +1325,32 @@ func TestDecoder_HoverAtPos_traversalExpressions(t *testing.T) {
13241325
},
13251326
},
13261327
reference.Targets{},
1328+
reference.Origins{
1329+
reference.LocalOrigin{
1330+
Addr: lang.Address{
1331+
lang.RootStep{Name: "var"},
1332+
lang.AttrStep{Name: "blah"},
1333+
},
1334+
Range: hcl.Range{
1335+
Filename: "test.tf",
1336+
Start: hcl.Pos{
1337+
Line: 1,
1338+
Column: 8,
1339+
Byte: 7,
1340+
},
1341+
End: hcl.Pos{
1342+
Line: 1,
1343+
Column: 16,
1344+
Byte: 15,
1345+
},
1346+
},
1347+
Constraints: reference.OriginConstraints{
1348+
reference.OriginConstraint{
1349+
OfType: cty.String,
1350+
},
1351+
},
1352+
},
1353+
},
13271354
`attr = var.blah`,
13281355
hcl.Pos{Line: 1, Column: 10, Byte: 9},
13291356
nil,
@@ -1347,6 +1374,32 @@ func TestDecoder_HoverAtPos_traversalExpressions(t *testing.T) {
13471374
Type: cty.Bool,
13481375
},
13491376
},
1377+
reference.Origins{
1378+
reference.LocalOrigin{
1379+
Addr: lang.Address{
1380+
lang.RootStep{Name: "var"},
1381+
lang.AttrStep{Name: "blah"},
1382+
},
1383+
Range: hcl.Range{
1384+
Filename: "test.tf",
1385+
Start: hcl.Pos{
1386+
Line: 1,
1387+
Column: 8,
1388+
Byte: 7,
1389+
},
1390+
End: hcl.Pos{
1391+
Line: 1,
1392+
Column: 16,
1393+
Byte: 15,
1394+
},
1395+
},
1396+
Constraints: reference.OriginConstraints{
1397+
reference.OriginConstraint{
1398+
OfType: cty.String,
1399+
},
1400+
},
1401+
},
1402+
},
13501403
`attr = var.blah`,
13511404
hcl.Pos{Line: 1, Column: 10, Byte: 9},
13521405
nil,
@@ -1370,6 +1423,32 @@ func TestDecoder_HoverAtPos_traversalExpressions(t *testing.T) {
13701423
Type: cty.String,
13711424
},
13721425
},
1426+
reference.Origins{
1427+
reference.LocalOrigin{
1428+
Addr: lang.Address{
1429+
lang.RootStep{Name: "var"},
1430+
lang.AttrStep{Name: "blah"},
1431+
},
1432+
Range: hcl.Range{
1433+
Filename: "test.tf",
1434+
Start: hcl.Pos{
1435+
Line: 1,
1436+
Column: 8,
1437+
Byte: 7,
1438+
},
1439+
End: hcl.Pos{
1440+
Line: 1,
1441+
Column: 16,
1442+
Byte: 15,
1443+
},
1444+
},
1445+
Constraints: reference.OriginConstraints{
1446+
reference.OriginConstraint{
1447+
OfType: cty.String,
1448+
},
1449+
},
1450+
},
1451+
},
13731452
`attr = var.blah`,
13741453
hcl.Pos{Line: 1, Column: 10, Byte: 9},
13751454
&lang.HoverData{
@@ -1408,6 +1487,33 @@ func TestDecoder_HoverAtPos_traversalExpressions(t *testing.T) {
14081487
Type: cty.DynamicPseudoType,
14091488
},
14101489
},
1490+
reference.Origins{
1491+
reference.LocalOrigin{
1492+
Addr: lang.Address{
1493+
lang.RootStep{Name: "var"},
1494+
lang.AttrStep{Name: "foo"},
1495+
lang.AttrStep{Name: "bar"},
1496+
},
1497+
Range: hcl.Range{
1498+
Filename: "test.tf",
1499+
Start: hcl.Pos{
1500+
Line: 1,
1501+
Column: 8,
1502+
Byte: 7,
1503+
},
1504+
End: hcl.Pos{
1505+
Line: 1,
1506+
Column: 19,
1507+
Byte: 18,
1508+
},
1509+
},
1510+
Constraints: reference.OriginConstraints{
1511+
reference.OriginConstraint{
1512+
OfType: cty.String,
1513+
},
1514+
},
1515+
},
1516+
},
14111517
`attr = var.foo.bar`,
14121518
hcl.Pos{Line: 1, Column: 10, Byte: 9},
14131519
&lang.HoverData{
@@ -1447,6 +1553,32 @@ func TestDecoder_HoverAtPos_traversalExpressions(t *testing.T) {
14471553
Name: "special",
14481554
},
14491555
},
1556+
reference.Origins{
1557+
reference.LocalOrigin{
1558+
Addr: lang.Address{
1559+
lang.RootStep{Name: "var"},
1560+
lang.AttrStep{Name: "foo"},
1561+
},
1562+
Range: hcl.Range{
1563+
Filename: "test.tf",
1564+
Start: hcl.Pos{
1565+
Line: 1,
1566+
Column: 8,
1567+
Byte: 7,
1568+
},
1569+
End: hcl.Pos{
1570+
Line: 1,
1571+
Column: 15,
1572+
Byte: 14,
1573+
},
1574+
},
1575+
Constraints: reference.OriginConstraints{
1576+
reference.OriginConstraint{
1577+
OfScopeId: lang.ScopeId("foo"),
1578+
},
1579+
},
1580+
},
1581+
},
14501582
`attr = var.foo`,
14511583
hcl.Pos{Line: 1, Column: 10, Byte: 9},
14521584
&lang.HoverData{
@@ -1480,6 +1612,7 @@ func TestDecoder_HoverAtPos_traversalExpressions(t *testing.T) {
14801612
d := testPathDecoder(t, &PathContext{
14811613
Schema: bodySchema,
14821614
ReferenceTargets: tc.refs,
1615+
ReferenceOrigins: tc.origins,
14831616
Files: map[string]*hcl.File{
14841617
"test.tf": f,
14851618
},

0 commit comments

Comments
 (0)