@@ -53,7 +53,7 @@ var Transformers = []transformer.Tranformer{
5353// https://godoc.org/gopkg.in/bblfsh/sdk.v1/uast/ann
5454var AnnotationRules = On (Any ).Self (
5555 On (Not (pyast .Module )).Error (errors .New ("root must be uast.Module" )),
56- On (pyast .Module ).Roles (uast .File ).Descendants (
56+ On (pyast .Module ).Roles (uast .File , uast . Module ).Descendants (
5757
5858 // Binary Expressions
5959 On (pyast .BinOp ).Roles (uast .Expression , uast .Binary ).Children (
@@ -127,16 +127,17 @@ var AnnotationRules = On(Any).Self(
127127
128128 // FIXME: the FunctionDeclarationReceiver is not set for methods; it should be taken from the parent
129129 // Type node Token (2 levels up) but the SDK doesn't allow this
130- On (pyast .FunctionDef ).Roles (uast .Function , uast .Declaration , uast .Name , uast .Identifier ),
130+ On (pyast .FunctionDef ).Roles (uast .Function , uast .Declaration , uast .Name , uast .Identifier ).Children (
131+ On (pyast .Arguments ).Roles (uast .Function , uast .Declaration , uast .Incomplete , uast .Argument ).Children (
132+ On (HasInternalRole ("args" )).Roles (uast .Function , uast .Declaration , uast .Argument , uast .Name , uast .Identifier ),
133+ On (HasInternalRole ("vararg" )).Roles (uast .Function , uast .Declaration , uast .Argument , uast .ArgsList , uast .Name , uast .Identifier ),
134+ On (HasInternalRole ("kwarg" )).Roles (uast .Function , uast .Declaration , uast .Argument , uast .ArgsList , uast .Map , uast .Name , uast .Identifier ),
135+ On (HasInternalRole ("kwonlyargs" )).Roles (uast .Function , uast .Declaration , uast .Argument , uast .ArgsList , uast .Map , uast .Name , uast .Identifier ),
136+ ),
137+ ),
131138 On (pyast .AsyncFunctionDef ).Roles (uast .Function , uast .Declaration , uast .Name , uast .Identifier , uast .Incomplete ),
132139 On (pyast .FuncDecorators ).Roles (uast .Function , uast .Declaration , uast .Call , uast .Incomplete ),
133140 On (pyast .FuncDefBody ).Roles (uast .Function , uast .Declaration , uast .Body ),
134- // FIXME: arguments is a Groping node, update it we get a "Grouper" or "Container" role
135- On (HasInternalRole ("arguments" )).Roles (uast .Function , uast .Declaration , uast .Argument , uast .Incomplete ),
136- On (HasInternalRole ("args" )).Roles (uast .Function , uast .Declaration , uast .Argument , uast .Name , uast .Identifier ),
137- On (HasInternalRole ("vararg" )).Roles (uast .Function , uast .Declaration , uast .Argument , uast .ArgsList , uast .Name , uast .Identifier ),
138- On (HasInternalRole ("kwarg" )).Roles (uast .Function , uast .Declaration , uast .Argument , uast .ArgsList , uast .Map , uast .Name , uast .Identifier ),
139- On (HasInternalRole ("kwonlyargs" )).Roles (uast .Function , uast .Declaration , uast .Argument , uast .ArgsList , uast .Map , uast .Name , uast .Identifier ),
140141 // Default arguments: Python's AST puts default arguments on a sibling list to the one of
141142 // arguments that must be mapped to the arguments right-aligned like:
142143 // a, b=2, c=3 ->
@@ -155,9 +156,9 @@ var AnnotationRules = On(Any).Self(
155156 On (pyast .Name ).Roles (uast .Identifier , uast .Qualified )),
156157
157158 On (pyast .Call ).Roles (uast .Function , uast .Call , uast .Expression ).Children (
158- On (HasInternalRole ("args" )).Roles (uast .Call , uast .Argument , uast .Positional ),
159- On (HasInternalRole ("keywords" )).Roles (uast .Call , uast .Argument , uast .Name ).Children (
160- On (HasInternalRole ("value" )).Roles (uast .Call , uast . Argument , uast .Value ),
159+ On (HasInternalRole ("args" )).Roles (uast .Function , uast . Call , uast .Positional , uast . Argument , uast .Name ),
160+ On (HasInternalRole ("keywords" )).Roles (uast .Function , uast . Call , uast .Argument , uast .Name ).Children (
161+ On (HasInternalRole ("value" )).Roles (uast .Argument , uast .Value ),
161162 ),
162163 On (HasInternalRole ("func" )).Self (
163164 On (pyast .Name ).Roles (uast .Call , uast .Callee ),
@@ -217,21 +218,19 @@ var AnnotationRules = On(Any).Self(
217218 On (pyast .Break ).Roles (uast .Break , uast .Statement ),
218219 On (pyast .Continue ).Roles (uast .Continue , uast .Statement ),
219220
220- // - Compare.ops (internaluast.Type): [uast.LessThan, uast.LessThan]
221- // - Compare.comparators (internaluast.Type): ['a', 10]
222- // The current mapping is:
223- // - left: uast.Expression, uast.Binary, uast.Left
224- // - Compare.ops: uast.Expression, uast.Binary, uast.Operator
225- // - Compare.comparators: uast.Expression, uast.Binary, uast.Right
226- // But this is obviously not correct. To fix this properly we would need
227- // and SDK feature to mix lists (also needed for default and keyword arguments and
228- // boolean operators).
229- // "uast.If that sounds awkward is because it is" (their words)
221+ // Comparison nodes in Python are oddly structured. Probably one if the first
222+ // things that could be changed once we can normalize tree structures. Check:
223+ // https://greentreesnakes.readthedocs.io/en/latest/nodes.html#Compare
224+
225+ // Parent of all comparisons
230226 On (pyast .Compare ).Roles (uast .Expression , uast .Binary ).Children (
231- On (pyast .CompareOps ).Roles (uast .Expression , uast .Binary , uast .Operator ),
232- On (HasInternalRole ("left" )).Roles (uast .Expression , uast .Binary , uast .Left ),
227+ // Operators
228+ On (pyast .CompareOps ).Roles (uast .Expression ),
229+ // Leftmost element (the others are the comparators below)
230+ On (HasInternalRole ("left" )).Roles (uast .Expression , uast .Left ),
231+ // These hold the members of the comparison (not the operators)
232+ On (pyast .CompareComparators ).Roles (uast .Expression , uast .Right ),
233233 ),
234- On (pyast .CompareComparators ).Roles (uast .Expression , uast .Binary , uast .Right ),
235234 On (pyast .If ).Roles (uast .If , uast .Statement ).Children (
236235 On (pyast .IfBody ).Roles (uast .If , uast .Body , uast .Then ),
237236 On (HasInternalRole ("test" )).Roles (uast .If , uast .Condition ),
@@ -320,10 +319,7 @@ var AnnotationRules = On(Any).Self(
320319 On (HasInternalRole ("iter" )).Roles (uast .For , uast .Update , uast .Statement ),
321320 On (HasInternalRole ("target" )).Roles (uast .For , uast .Expression ),
322321 // FIXME: see the comment on uast.If, uast.Condition above
323- On (pyast .Compare ).Roles (uast .If , uast .Condition , uast .Expression , uast .Binary ).Children (
324- On (pyast .CompareOps ).Roles (uast .Expression , uast .Binary , uast .Operator ),
325- On (HasInternalRole ("left" )).Roles (uast .Expression , uast .Binary , uast .Left ),
326- ),
322+ On (pyast .Compare ).Roles (uast .If , uast .Condition ),
327323 ),
328324
329325 On (pyast .Delete ).Roles (uast .Statement , uast .Incomplete ),
0 commit comments