11package normalizer
22
33import (
4+ "github.com/bblfsh/sdk/v3/uast"
45 "strings"
56
67 "github.com/bblfsh/sdk/v3/uast/nodes"
@@ -15,49 +16,57 @@ func num2dots(n nodes.Value, prefix string) nodes.Value {
1516 return n
1617}
1718
18- // FIXME: not reversible
19- type OpPrependPath struct {
19+ type OpSplitPath struct {
2020 numLevel Op
2121 path Op
22- prefix string
2322}
2423
25- func (op OpPrependPath ) Kinds () nodes.Kind {
26- return nodes .KindString
24+ func (op OpSplitPath ) Kinds () nodes.Kind {
25+ return nodes .KindObject
2726}
2827
29- func (op OpPrependPath ) Check (st * State , n nodes.Node ) (bool , error ) {
30- v , ok := n .(nodes.Value )
31- if ! ok {
32- return false , nil
33- }
28+ func (op OpSplitPath ) Check (st * State , n nodes.Node ) (bool , error ) {
29+ panic ("TODO" ) // TODO: not reversible
30+ return true , nil
31+ }
3432
35- res1 , err := op .numLevel .Check (st , n )
36- if err != nil || ! res1 {
37- return false , err
33+ func (op OpSplitPath ) Construct (st * State , n nodes.Node ) (nodes.Node , error ) {
34+ var idents []uast.Identifier
35+ if op .numLevel != nil {
36+ nd , err := op .numLevel .Construct (st , nil )
37+ if err != nil {
38+ return nil , err
39+ }
40+ levels , ok := nd .(nodes.Int )
41+ if ! ok {
42+ return nil , ErrUnexpectedType .New (nodes .Int (0 ), nd )
43+ }
44+ for i := 0 ; i < int (levels ); i ++ {
45+ idents = append (idents , uast.Identifier {Name : ".." })
46+ }
3847 }
3948
40- res2 , err := op .path .Check (st , v )
41- if err != nil || ! res2 {
42- return false , err
49+ nd , err := op .path .Construct (st , n )
50+ if err != nil {
51+ return nil , err
4352 }
44-
45- return res1 && res2 , nil
46- }
47-
48- func (op OpPrependPath ) Construct (st * State , n nodes.Node ) (nodes.Node , error ) {
49- first , err := op .numLevel .Construct (st , n )
50- if err != nil || first == nil {
51- return n , err
53+ if nd == nil {
54+ if len (idents ) == 0 {
55+ idents = append (idents , uast.Identifier {Name : "." })
56+ }
57+ } else {
58+ path , ok := nd .(nodes.String )
59+ if ! ok {
60+ return nil , ErrUnexpectedType .New (nodes .String ("" ), nd )
61+ }
62+ for _ , name := range strings .Split (string (path ), "." ) {
63+ idents = append (idents , uast.Identifier {Name : name })
64+ }
5265 }
53- firstVal := first .(nodes.Value )
54- prependVal := num2dots (firstVal , op .prefix )
55-
56- path , err := op .path .Construct (st , n )
57- if err != nil || path == nil {
58- return n , err
66+ if len (idents ) == 1 {
67+ return uast .ToNode (idents [0 ])
5968 }
60- return prependVal .(nodes. String ) + path .(nodes. String ), nil
69+ return uast . ToNode (uast. QualifiedIdentifier { Names : idents })
6170}
6271
6372type OpLevelDotsNumConv struct {
0 commit comments