CopyNode computes a deep code of an AssertionNode precondition: node is not nil
(node AssertionNode)
| 405 | // CopyNode computes a deep code of an AssertionNode |
| 406 | // precondition: node is not nil |
| 407 | func CopyNode(node AssertionNode) AssertionNode { |
| 408 | var fresh AssertionNode |
| 409 | switch node := node.(type) { |
| 410 | case *RootAssertionNode: |
| 411 | fresh = &RootAssertionNode{ |
| 412 | triggers: append(make([]annotation.FullTrigger, 0), node.triggers...), |
| 413 | exprNonceMap: node.exprNonceMap, |
| 414 | functionContext: node.functionContext, |
| 415 | } |
| 416 | case *varAssertionNode: |
| 417 | fresh = &varAssertionNode{decl: node.decl} |
| 418 | case *fldAssertionNode: |
| 419 | fresh = &fldAssertionNode{decl: node.decl, functionContext: node.functionContext} |
| 420 | case *funcAssertionNode: |
| 421 | fresh = &funcAssertionNode{decl: node.decl, args: node.args} |
| 422 | case *indexAssertionNode: |
| 423 | fresh = &indexAssertionNode{ |
| 424 | index: node.index, |
| 425 | valType: node.valType, |
| 426 | recvType: node.recvType} |
| 427 | default: |
| 428 | panic("unrecognized node type") |
| 429 | } |
| 430 | |
| 431 | fresh.SetChildren(make([]AssertionNode, 0, len(node.Children()))) |
| 432 | for _, child := range node.Children() { |
| 433 | freshChild := CopyNode(child) |
| 434 | freshChild.SetParent(fresh) |
| 435 | fresh.SetChildren(append(fresh.Children(), freshChild)) |
| 436 | } |
| 437 | |
| 438 | copyConsumers := make([]*annotation.ConsumeTrigger, 0, len(node.ConsumeTriggers())) |
| 439 | for _, c := range node.ConsumeTriggers() { |
| 440 | copyConsumers = append(copyConsumers, c.Copy()) |
| 441 | } |
| 442 | fresh.SetConsumeTriggers(copyConsumers) |
| 443 | |
| 444 | return fresh |
| 445 | } |
| 446 | |
| 447 | // lookupAstFromFile attempts to find the file ast for a given file (token.File) |
| 448 | // nilable(result 0) |
no test coverage detected