Add missing cases in specialChildren

Namely:
1) function body and optional params
2) object locals
This commit is contained in:
Stanisław Barzowski 2019-09-09 17:25:12 +02:00
parent 85fd887750
commit ab95594eea

View File

@ -98,7 +98,7 @@ func directChildren(node ast.Node) []ast.Node {
case *ast.Object: case *ast.Object:
return objectFieldsDirectChildren(node.Fields) return objectFieldsDirectChildren(node.Fields)
case *ast.DesugaredObject: case *ast.DesugaredObject:
return desugaredObjectFieldsDirectChildren(node.Fields) return desugaredObjectDirectChildren(node)
case *ast.ArrayComp: case *ast.ArrayComp:
result := []ast.Node{} result := []ast.Node{}
spec := &node.Spec spec := &node.Spec
@ -247,23 +247,29 @@ func inObjectFieldsChildren(fields ast.ObjectFields) ast.Nodes {
return result return result
} }
func desugaredObjectFieldsDirectChildren(fields ast.DesugaredObjectFields) ast.Nodes { func desugaredObjectDirectChildren(obj *ast.DesugaredObject) ast.Nodes {
result := ast.Nodes{} result := ast.Nodes{}
for _, field := range fields { for _, field := range obj.Fields {
if field.Name == nil {
panic("Name cannot be nil")
}
result = append(result, field.Name) result = append(result, field.Name)
} }
return result return result
} }
func inDesugaredObjectFieldsChildren(fields ast.DesugaredObjectFields) ast.Nodes { func inDesugaredObjectSpecialChildren(obj *ast.DesugaredObject) ast.Nodes {
result := ast.Nodes{} result := make([]ast.Node, 0, len(obj.Fields)+len(obj.Locals))
for _, field := range fields { for _, field := range obj.Fields {
result = append(result, field.Body) result = append(result, field.Body)
} }
for _, local := range obj.Locals {
result = append(result, local.Body)
}
return result return result
} }
// specialChildren returns children are neither direct nor thunked, // specialChildren returns children that are neither direct nor thunked,
// e.g. object field body. // e.g. object field body.
// These nodes are evaluated in a different environment from their parent. // These nodes are evaluated in a different environment from their parent.
// //
@ -287,8 +293,11 @@ func specialChildren(node ast.Node) []ast.Node {
case *ast.Error: case *ast.Error:
return nil return nil
case *ast.Function: case *ast.Function:
// TODO(sbarzowski) this children := []ast.Node{node.Body}
return nil for _, child := range node.Parameters.Optional {
children = append(children, child.DefaultArg)
}
return children
case *ast.Import: case *ast.Import:
return nil return nil
case *ast.ImportStr: case *ast.ImportStr:
@ -313,7 +322,7 @@ func specialChildren(node ast.Node) []ast.Node {
case *ast.LiteralString: case *ast.LiteralString:
return nil return nil
case *ast.DesugaredObject: case *ast.DesugaredObject:
return inDesugaredObjectFieldsChildren(node.Fields) return inDesugaredObjectSpecialChildren(node)
case *ast.Object: case *ast.Object:
return inObjectFieldsChildren(node.Fields) return inObjectFieldsChildren(node.Fields)
case *ast.ArrayComp: case *ast.ArrayComp: