@@ -181,7 +181,7 @@ func (d *PathDecoder) decodeReferenceTargetsForBody(body hcl.Body, parentBlock *
181
181
182
182
if bSchema .Address .InferBody && bSchema .Body != nil {
183
183
bodyRef .NestedTargets = append (bodyRef .NestedTargets ,
184
- d .collectInferredReferenceTargetsForBody (addr , bSchema .Address . ScopeId , blk .Body , bSchema .Body )... )
184
+ d .collectInferredReferenceTargetsForBody (addr , bSchema .Address , blk .Body , bSchema .Body , nil , lang. Address {} )... )
185
185
}
186
186
187
187
bodyRef .Type = bodyToDataType (bSchema .Type , bSchema .Body )
@@ -214,8 +214,17 @@ func (d *PathDecoder) decodeReferenceTargetsForBody(body hcl.Body, parentBlock *
214
214
bodyRef .Type = bodyToDataType (bSchema .Type , fullSchema )
215
215
216
216
if bSchema .Address .InferDependentBody && len (bSchema .DependentBody ) > 0 {
217
+ if bSchema .Address .DependentBodySelfRef {
218
+ bodyRef .LocalAddr = lang.Address {
219
+ lang.RootStep {Name : "self" },
220
+ }
221
+ bodyRef .TargetableFromRangePtr = blk .Range .Ptr ()
222
+ } else {
223
+ bodyRef .LocalAddr = lang.Address {}
224
+ }
225
+
217
226
bodyRef .NestedTargets = append (bodyRef .NestedTargets ,
218
- d .collectInferredReferenceTargetsForBody (addr , bSchema .Address . ScopeId , blk .Body , fullSchema )... )
227
+ d .collectInferredReferenceTargetsForBody (addr , bSchema .Address , blk .Body , fullSchema , nil , bodyRef . LocalAddr )... )
219
228
}
220
229
221
230
if ! bSchema .Address .BodyAsData {
@@ -652,10 +661,15 @@ func bodySchemaAsAttrTypes(bodySchema *schema.BodySchema) map[string]cty.Type {
652
661
return attrTypes
653
662
}
654
663
655
- func (d * PathDecoder ) collectInferredReferenceTargetsForBody (addr lang.Address , scopeId lang. ScopeId , body hcl.Body , bodySchema * schema.BodySchema ) reference.Targets {
664
+ func (d * PathDecoder ) collectInferredReferenceTargetsForBody (addr lang.Address , bAddrSchema * schema. BlockAddrSchema , body hcl.Body , bodySchema * schema.BodySchema , selfRefBodyRangePtr * hcl. Range , selfRefAddr lang. Address ) reference.Targets {
656
665
refs := make (reference.Targets , 0 )
657
666
658
667
content := decodeBody (body , bodySchema )
668
+ // We don't get body range for JSON here
669
+ // TODO? calculate or implement upstream
670
+ if bAddrSchema .DependentBodySelfRef && content .RangePtr != nil && selfRefBodyRangePtr == nil {
671
+ selfRefBodyRangePtr = content .RangePtr
672
+ }
659
673
660
674
for name , aSchema := range bodySchema .Attributes {
661
675
attrType , ok := exprConstraintToDataType (aSchema .Expr )
@@ -668,12 +682,21 @@ func (d *PathDecoder) collectInferredReferenceTargetsForBody(addr lang.Address,
668
682
669
683
ref := reference.Target {
670
684
Addr : attrAddr ,
671
- ScopeId : scopeId ,
685
+ ScopeId : bAddrSchema . ScopeId ,
672
686
Type : attrType ,
673
687
Description : aSchema .Description ,
674
688
RangePtr : body .MissingItemRange ().Ptr (),
675
689
}
676
690
691
+ if bAddrSchema .DependentBodySelfRef && selfRefBodyRangePtr != nil {
692
+ localAddr := make (lang.Address , len (selfRefAddr ))
693
+ copy (localAddr , selfRefAddr )
694
+ localAddr = append (localAddr , lang.AttrStep {Name : name })
695
+
696
+ ref .LocalAddr = localAddr
697
+ ref .TargetableFromRangePtr = selfRefBodyRangePtr .Ptr ()
698
+ }
699
+
677
700
var attrExpr hcl.Expression
678
701
if attr , ok := content .Attributes [name ]; ok {
679
702
ref .RangePtr = attr .Range .Ptr ()
@@ -683,7 +706,7 @@ func (d *PathDecoder) collectInferredReferenceTargetsForBody(addr lang.Address,
683
706
684
707
if attrExpr != nil && ! attrType .IsPrimitiveType () {
685
708
ref .NestedTargets = make (reference.Targets , 0 )
686
- ref .NestedTargets = append (ref .NestedTargets , decodeReferenceTargetsForComplexTypeExpr (attrAddr , attrExpr , attrType , scopeId )... )
709
+ ref .NestedTargets = append (ref .NestedTargets , decodeReferenceTargetsForComplexTypeExpr (attrAddr , attrExpr , attrType , bAddrSchema . ScopeId )... )
687
710
}
688
711
689
712
refs = append (refs , ref )
@@ -700,14 +723,21 @@ func (d *PathDecoder) collectInferredReferenceTargetsForBody(addr lang.Address,
700
723
701
724
blockRef := reference.Target {
702
725
Addr : blockAddr ,
703
- ScopeId : scopeId ,
726
+ LocalAddr : make (lang.Address , len (selfRefAddr )),
727
+ ScopeId : bAddrSchema .ScopeId ,
704
728
Type : cty .Object (bodySchemaAsAttrTypes (bCollection .Schema .Body )),
705
729
Description : bCollection .Schema .Description ,
706
730
DefRangePtr : blk .DefRange .Ptr (),
707
731
RangePtr : blk .Range .Ptr (),
708
- NestedTargets : d .collectInferredReferenceTargetsForBody (
709
- blockAddr , scopeId , blk .Body , bCollection .Schema .Body ),
710
732
}
733
+ if bAddrSchema .DependentBodySelfRef && selfRefBodyRangePtr != nil {
734
+ copy (blockRef .LocalAddr , selfRefAddr )
735
+ blockRef .LocalAddr = append (blockRef .LocalAddr , lang.AttrStep {Name : bType })
736
+ blockRef .TargetableFromRangePtr = selfRefBodyRangePtr .Ptr ()
737
+ }
738
+ blockRef .NestedTargets = d .collectInferredReferenceTargetsForBody (
739
+ blockAddr , bAddrSchema , blk .Body , bCollection .Schema .Body , selfRefBodyRangePtr , blockRef .LocalAddr )
740
+
711
741
sort .Sort (blockRef .NestedTargets )
712
742
refs = append (refs , blockRef )
713
743
}
@@ -719,11 +749,17 @@ func (d *PathDecoder) collectInferredReferenceTargetsForBody(addr lang.Address,
719
749
720
750
blockRef := reference.Target {
721
751
Addr : blockAddr ,
722
- ScopeId : scopeId ,
752
+ LocalAddr : make (lang.Address , len (selfRefAddr )),
753
+ ScopeId : bAddrSchema .ScopeId ,
723
754
Type : cty .List (cty .Object (bodySchemaAsAttrTypes (bCollection .Schema .Body ))),
724
755
Description : bCollection .Schema .Description ,
725
756
RangePtr : body .MissingItemRange ().Ptr (),
726
757
}
758
+ if bAddrSchema .DependentBodySelfRef && selfRefBodyRangePtr != nil {
759
+ copy (blockRef .LocalAddr , selfRefAddr )
760
+ blockRef .LocalAddr = append (blockRef .LocalAddr , lang.AttrStep {Name : bType })
761
+ blockRef .TargetableFromRangePtr = selfRefBodyRangePtr .Ptr ()
762
+ }
727
763
728
764
for i , b := range bCollection .Blocks {
729
765
elemAddr := make (lang.Address , len (blockAddr ))
@@ -734,14 +770,25 @@ func (d *PathDecoder) collectInferredReferenceTargetsForBody(addr lang.Address,
734
770
735
771
elemRef := reference.Target {
736
772
Addr : elemAddr ,
737
- ScopeId : scopeId ,
773
+ LocalAddr : make (lang.Address , len (blockRef .LocalAddr )),
774
+ ScopeId : bAddrSchema .ScopeId ,
738
775
Type : cty .Object (bodySchemaAsAttrTypes (bCollection .Schema .Body )),
739
776
Description : bCollection .Schema .Description ,
740
777
DefRangePtr : b .DefRange .Ptr (),
741
778
RangePtr : b .Range .Ptr (),
742
- NestedTargets : d .collectInferredReferenceTargetsForBody (
743
- elemAddr , scopeId , b .Body , bCollection .Schema .Body ),
744
779
}
780
+
781
+ if bAddrSchema .DependentBodySelfRef && selfRefBodyRangePtr != nil {
782
+ copy (elemRef .LocalAddr , blockRef .LocalAddr )
783
+ elemRef .LocalAddr = append (elemRef .LocalAddr , lang.IndexStep {
784
+ Key : cty .NumberIntVal (int64 (i )),
785
+ })
786
+ elemRef .TargetableFromRangePtr = selfRefBodyRangePtr .Ptr ()
787
+ }
788
+
789
+ elemRef .NestedTargets = d .collectInferredReferenceTargetsForBody (
790
+ elemAddr , bAddrSchema , b .Body , bCollection .Schema .Body , selfRefBodyRangePtr , elemRef .LocalAddr )
791
+
745
792
sort .Sort (elemRef .NestedTargets )
746
793
blockRef .NestedTargets = append (blockRef .NestedTargets , elemRef )
747
794
@@ -771,11 +818,17 @@ func (d *PathDecoder) collectInferredReferenceTargetsForBody(addr lang.Address,
771
818
772
819
blockRef := reference.Target {
773
820
Addr : blockAddr ,
774
- ScopeId : scopeId ,
821
+ LocalAddr : make (lang.Address , len (selfRefAddr )),
822
+ ScopeId : bAddrSchema .ScopeId ,
775
823
Type : cty .Set (cty .Object (bodySchemaAsAttrTypes (bCollection .Schema .Body ))),
776
824
Description : bCollection .Schema .Description ,
777
825
RangePtr : body .MissingItemRange ().Ptr (),
778
826
}
827
+ if bAddrSchema .DependentBodySelfRef && selfRefBodyRangePtr != nil {
828
+ copy (blockRef .LocalAddr , selfRefAddr )
829
+ blockRef .LocalAddr = append (blockRef .LocalAddr , lang.AttrStep {Name : bType })
830
+ blockRef .TargetableFromRangePtr = selfRefBodyRangePtr .Ptr ()
831
+ }
779
832
780
833
for i , b := range bCollection .Blocks {
781
834
if i == 0 {
@@ -803,11 +856,17 @@ func (d *PathDecoder) collectInferredReferenceTargetsForBody(addr lang.Address,
803
856
804
857
blockRef := reference.Target {
805
858
Addr : blockAddr ,
806
- ScopeId : scopeId ,
859
+ LocalAddr : make (lang.Address , len (selfRefAddr )),
860
+ ScopeId : bAddrSchema .ScopeId ,
807
861
Type : cty .Map (cty .Object (bodySchemaAsAttrTypes (bCollection .Schema .Body ))),
808
862
Description : bCollection .Schema .Description ,
809
863
RangePtr : body .MissingItemRange ().Ptr (),
810
864
}
865
+ if bAddrSchema .DependentBodySelfRef && selfRefBodyRangePtr != nil {
866
+ copy (blockRef .LocalAddr , selfRefAddr )
867
+ blockRef .LocalAddr = append (blockRef .LocalAddr , lang.AttrStep {Name : bType })
868
+ blockRef .TargetableFromRangePtr = selfRefBodyRangePtr .Ptr ()
869
+ }
811
870
812
871
for i , b := range bCollection .Blocks {
813
872
elemAddr := make (lang.Address , len (blockAddr ))
@@ -820,14 +879,23 @@ func (d *PathDecoder) collectInferredReferenceTargetsForBody(addr lang.Address,
820
879
821
880
elemRef := reference.Target {
822
881
Addr : elemAddr ,
823
- ScopeId : scopeId ,
882
+ LocalAddr : make (lang.Address , len (blockRef .LocalAddr )),
883
+ ScopeId : bAddrSchema .ScopeId ,
824
884
Type : refType ,
825
885
Description : bCollection .Schema .Description ,
826
886
RangePtr : b .Range .Ptr (),
827
887
DefRangePtr : b .DefRange .Ptr (),
828
- NestedTargets : d .collectInferredReferenceTargetsForBody (
829
- elemAddr , scopeId , b .Body , bCollection .Schema .Body ),
830
888
}
889
+ if bAddrSchema .DependentBodySelfRef && selfRefBodyRangePtr != nil {
890
+ copy (elemRef .LocalAddr , blockRef .LocalAddr )
891
+ elemRef .LocalAddr = append (elemRef .LocalAddr , lang.IndexStep {
892
+ Key : cty .StringVal (b .Labels [0 ]),
893
+ })
894
+ elemRef .TargetableFromRangePtr = selfRefBodyRangePtr .Ptr ()
895
+ }
896
+
897
+ elemRef .NestedTargets = d .collectInferredReferenceTargetsForBody (
898
+ elemAddr , bAddrSchema , b .Body , bCollection .Schema .Body , selfRefBodyRangePtr , elemRef .LocalAddr )
831
899
sort .Sort (elemRef .NestedTargets )
832
900
blockRef .NestedTargets = append (blockRef .NestedTargets , elemRef )
833
901
0 commit comments