github.com/jhump/protocompile@v0.0.0-20221021153901-4f6f732835e8/ast/visitor_test.go (about) 1 package ast 2 3 import ( 4 "sort" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 ) 9 10 // The single visitor returned has all functions set to record the method call. 11 // The slice of visitors has one element per function, each with exactly one 12 // function set. So the first visitor can be used to determine the preferred 13 // function (which should match the node's concrete type). The slice of visitors 14 // can be used to enumerate ALL matching function calls. 15 // 16 // This function is generated via commented-out code at the bottom of this file. 17 func testVisitors(methodCalled *string) (*SimpleVisitor, []*SimpleVisitor) { 18 v := &SimpleVisitor{ 19 DoVisitEnumNode: func(*EnumNode) error { 20 *methodCalled = "*EnumNode" 21 return nil 22 }, 23 DoVisitEnumValueNode: func(*EnumValueNode) error { 24 *methodCalled = "*EnumValueNode" 25 return nil 26 }, 27 DoVisitFieldDeclNode: func(FieldDeclNode) error { 28 *methodCalled = "FieldDeclNode" 29 return nil 30 }, 31 DoVisitFieldNode: func(*FieldNode) error { 32 *methodCalled = "*FieldNode" 33 return nil 34 }, 35 DoVisitGroupNode: func(*GroupNode) error { 36 *methodCalled = "*GroupNode" 37 return nil 38 }, 39 DoVisitOneOfNode: func(*OneOfNode) error { 40 *methodCalled = "*OneOfNode" 41 return nil 42 }, 43 DoVisitMapTypeNode: func(*MapTypeNode) error { 44 *methodCalled = "*MapTypeNode" 45 return nil 46 }, 47 DoVisitMapFieldNode: func(*MapFieldNode) error { 48 *methodCalled = "*MapFieldNode" 49 return nil 50 }, 51 DoVisitFileNode: func(*FileNode) error { 52 *methodCalled = "*FileNode" 53 return nil 54 }, 55 DoVisitSyntaxNode: func(*SyntaxNode) error { 56 *methodCalled = "*SyntaxNode" 57 return nil 58 }, 59 DoVisitImportNode: func(*ImportNode) error { 60 *methodCalled = "*ImportNode" 61 return nil 62 }, 63 DoVisitPackageNode: func(*PackageNode) error { 64 *methodCalled = "*PackageNode" 65 return nil 66 }, 67 DoVisitIdentValueNode: func(IdentValueNode) error { 68 *methodCalled = "IdentValueNode" 69 return nil 70 }, 71 DoVisitIdentNode: func(*IdentNode) error { 72 *methodCalled = "*IdentNode" 73 return nil 74 }, 75 DoVisitCompoundIdentNode: func(*CompoundIdentNode) error { 76 *methodCalled = "*CompoundIdentNode" 77 return nil 78 }, 79 DoVisitKeywordNode: func(*KeywordNode) error { 80 *methodCalled = "*KeywordNode" 81 return nil 82 }, 83 DoVisitMessageDeclNode: func(MessageDeclNode) error { 84 *methodCalled = "MessageDeclNode" 85 return nil 86 }, 87 DoVisitMessageNode: func(*MessageNode) error { 88 *methodCalled = "*MessageNode" 89 return nil 90 }, 91 DoVisitExtendNode: func(*ExtendNode) error { 92 *methodCalled = "*ExtendNode" 93 return nil 94 }, 95 DoVisitNode: func(Node) error { 96 *methodCalled = "Node" 97 return nil 98 }, 99 DoVisitTerminalNode: func(TerminalNode) error { 100 *methodCalled = "TerminalNode" 101 return nil 102 }, 103 DoVisitCompositeNode: func(CompositeNode) error { 104 *methodCalled = "CompositeNode" 105 return nil 106 }, 107 DoVisitRuneNode: func(*RuneNode) error { 108 *methodCalled = "*RuneNode" 109 return nil 110 }, 111 DoVisitEmptyDeclNode: func(*EmptyDeclNode) error { 112 *methodCalled = "*EmptyDeclNode" 113 return nil 114 }, 115 DoVisitOptionNode: func(*OptionNode) error { 116 *methodCalled = "*OptionNode" 117 return nil 118 }, 119 DoVisitOptionNameNode: func(*OptionNameNode) error { 120 *methodCalled = "*OptionNameNode" 121 return nil 122 }, 123 DoVisitFieldReferenceNode: func(*FieldReferenceNode) error { 124 *methodCalled = "*FieldReferenceNode" 125 return nil 126 }, 127 DoVisitCompactOptionsNode: func(*CompactOptionsNode) error { 128 *methodCalled = "*CompactOptionsNode" 129 return nil 130 }, 131 DoVisitExtensionRangeNode: func(*ExtensionRangeNode) error { 132 *methodCalled = "*ExtensionRangeNode" 133 return nil 134 }, 135 DoVisitRangeNode: func(*RangeNode) error { 136 *methodCalled = "*RangeNode" 137 return nil 138 }, 139 DoVisitReservedNode: func(*ReservedNode) error { 140 *methodCalled = "*ReservedNode" 141 return nil 142 }, 143 DoVisitServiceNode: func(*ServiceNode) error { 144 *methodCalled = "*ServiceNode" 145 return nil 146 }, 147 DoVisitRPCNode: func(*RPCNode) error { 148 *methodCalled = "*RPCNode" 149 return nil 150 }, 151 DoVisitRPCTypeNode: func(*RPCTypeNode) error { 152 *methodCalled = "*RPCTypeNode" 153 return nil 154 }, 155 DoVisitValueNode: func(ValueNode) error { 156 *methodCalled = "ValueNode" 157 return nil 158 }, 159 DoVisitStringValueNode: func(StringValueNode) error { 160 *methodCalled = "StringValueNode" 161 return nil 162 }, 163 DoVisitStringLiteralNode: func(*StringLiteralNode) error { 164 *methodCalled = "*StringLiteralNode" 165 return nil 166 }, 167 DoVisitCompoundStringLiteralNode: func(*CompoundStringLiteralNode) error { 168 *methodCalled = "*CompoundStringLiteralNode" 169 return nil 170 }, 171 DoVisitIntValueNode: func(IntValueNode) error { 172 *methodCalled = "IntValueNode" 173 return nil 174 }, 175 DoVisitUintLiteralNode: func(*UintLiteralNode) error { 176 *methodCalled = "*UintLiteralNode" 177 return nil 178 }, 179 DoVisitPositiveUintLiteralNode: func(*PositiveUintLiteralNode) error { 180 *methodCalled = "*PositiveUintLiteralNode" 181 return nil 182 }, 183 DoVisitNegativeIntLiteralNode: func(*NegativeIntLiteralNode) error { 184 *methodCalled = "*NegativeIntLiteralNode" 185 return nil 186 }, 187 DoVisitFloatValueNode: func(FloatValueNode) error { 188 *methodCalled = "FloatValueNode" 189 return nil 190 }, 191 DoVisitFloatLiteralNode: func(*FloatLiteralNode) error { 192 *methodCalled = "*FloatLiteralNode" 193 return nil 194 }, 195 DoVisitSpecialFloatLiteralNode: func(*SpecialFloatLiteralNode) error { 196 *methodCalled = "*SpecialFloatLiteralNode" 197 return nil 198 }, 199 DoVisitSignedFloatLiteralNode: func(*SignedFloatLiteralNode) error { 200 *methodCalled = "*SignedFloatLiteralNode" 201 return nil 202 }, 203 DoVisitBoolLiteralNode: func(*BoolLiteralNode) error { 204 *methodCalled = "*BoolLiteralNode" 205 return nil 206 }, 207 DoVisitArrayLiteralNode: func(*ArrayLiteralNode) error { 208 *methodCalled = "*ArrayLiteralNode" 209 return nil 210 }, 211 DoVisitMessageLiteralNode: func(*MessageLiteralNode) error { 212 *methodCalled = "*MessageLiteralNode" 213 return nil 214 }, 215 DoVisitMessageFieldNode: func(*MessageFieldNode) error { 216 *methodCalled = "*MessageFieldNode" 217 return nil 218 }, 219 } 220 others := []*SimpleVisitor{ 221 { 222 DoVisitEnumNode: v.DoVisitEnumNode, 223 }, 224 { 225 DoVisitEnumValueNode: v.DoVisitEnumValueNode, 226 }, 227 { 228 DoVisitFieldDeclNode: v.DoVisitFieldDeclNode, 229 }, 230 { 231 DoVisitFieldNode: v.DoVisitFieldNode, 232 }, 233 { 234 DoVisitGroupNode: v.DoVisitGroupNode, 235 }, 236 { 237 DoVisitOneOfNode: v.DoVisitOneOfNode, 238 }, 239 { 240 DoVisitMapTypeNode: v.DoVisitMapTypeNode, 241 }, 242 { 243 DoVisitMapFieldNode: v.DoVisitMapFieldNode, 244 }, 245 { 246 DoVisitFileNode: v.DoVisitFileNode, 247 }, 248 { 249 DoVisitSyntaxNode: v.DoVisitSyntaxNode, 250 }, 251 { 252 DoVisitImportNode: v.DoVisitImportNode, 253 }, 254 { 255 DoVisitPackageNode: v.DoVisitPackageNode, 256 }, 257 { 258 DoVisitIdentValueNode: v.DoVisitIdentValueNode, 259 }, 260 { 261 DoVisitIdentNode: v.DoVisitIdentNode, 262 }, 263 { 264 DoVisitCompoundIdentNode: v.DoVisitCompoundIdentNode, 265 }, 266 { 267 DoVisitKeywordNode: v.DoVisitKeywordNode, 268 }, 269 { 270 DoVisitMessageDeclNode: v.DoVisitMessageDeclNode, 271 }, 272 { 273 DoVisitMessageNode: v.DoVisitMessageNode, 274 }, 275 { 276 DoVisitExtendNode: v.DoVisitExtendNode, 277 }, 278 { 279 DoVisitNode: v.DoVisitNode, 280 }, 281 { 282 DoVisitTerminalNode: v.DoVisitTerminalNode, 283 }, 284 { 285 DoVisitCompositeNode: v.DoVisitCompositeNode, 286 }, 287 { 288 DoVisitRuneNode: v.DoVisitRuneNode, 289 }, 290 { 291 DoVisitEmptyDeclNode: v.DoVisitEmptyDeclNode, 292 }, 293 { 294 DoVisitOptionNode: v.DoVisitOptionNode, 295 }, 296 { 297 DoVisitOptionNameNode: v.DoVisitOptionNameNode, 298 }, 299 { 300 DoVisitFieldReferenceNode: v.DoVisitFieldReferenceNode, 301 }, 302 { 303 DoVisitCompactOptionsNode: v.DoVisitCompactOptionsNode, 304 }, 305 { 306 DoVisitExtensionRangeNode: v.DoVisitExtensionRangeNode, 307 }, 308 { 309 DoVisitRangeNode: v.DoVisitRangeNode, 310 }, 311 { 312 DoVisitReservedNode: v.DoVisitReservedNode, 313 }, 314 { 315 DoVisitServiceNode: v.DoVisitServiceNode, 316 }, 317 { 318 DoVisitRPCNode: v.DoVisitRPCNode, 319 }, 320 { 321 DoVisitRPCTypeNode: v.DoVisitRPCTypeNode, 322 }, 323 { 324 DoVisitValueNode: v.DoVisitValueNode, 325 }, 326 { 327 DoVisitStringValueNode: v.DoVisitStringValueNode, 328 }, 329 { 330 DoVisitStringLiteralNode: v.DoVisitStringLiteralNode, 331 }, 332 { 333 DoVisitCompoundStringLiteralNode: v.DoVisitCompoundStringLiteralNode, 334 }, 335 { 336 DoVisitIntValueNode: v.DoVisitIntValueNode, 337 }, 338 { 339 DoVisitUintLiteralNode: v.DoVisitUintLiteralNode, 340 }, 341 { 342 DoVisitPositiveUintLiteralNode: v.DoVisitPositiveUintLiteralNode, 343 }, 344 { 345 DoVisitNegativeIntLiteralNode: v.DoVisitNegativeIntLiteralNode, 346 }, 347 { 348 DoVisitFloatValueNode: v.DoVisitFloatValueNode, 349 }, 350 { 351 DoVisitFloatLiteralNode: v.DoVisitFloatLiteralNode, 352 }, 353 { 354 DoVisitSpecialFloatLiteralNode: v.DoVisitSpecialFloatLiteralNode, 355 }, 356 { 357 DoVisitSignedFloatLiteralNode: v.DoVisitSignedFloatLiteralNode, 358 }, 359 { 360 DoVisitBoolLiteralNode: v.DoVisitBoolLiteralNode, 361 }, 362 { 363 DoVisitArrayLiteralNode: v.DoVisitArrayLiteralNode, 364 }, 365 { 366 DoVisitMessageLiteralNode: v.DoVisitMessageLiteralNode, 367 }, 368 { 369 DoVisitMessageFieldNode: v.DoVisitMessageFieldNode, 370 }, 371 } 372 return v, others 373 } 374 375 func TestVisitorAll(t *testing.T) { 376 testCases := map[Node][]string{ 377 (*EnumNode)(nil): { 378 "*EnumNode", "CompositeNode", "Node", 379 }, 380 (*EnumValueNode)(nil): { 381 "*EnumValueNode", "CompositeNode", "Node", 382 }, 383 (*FieldNode)(nil): { 384 "*FieldNode", "FieldDeclNode", "CompositeNode", "Node", 385 }, 386 (*GroupNode)(nil): { 387 "*GroupNode", "FieldDeclNode", "MessageDeclNode", "CompositeNode", "Node", 388 }, 389 (*OneOfNode)(nil): { 390 "*OneOfNode", "CompositeNode", "Node", 391 }, 392 (*MapTypeNode)(nil): { 393 "*MapTypeNode", "CompositeNode", "Node", 394 }, 395 (*MapFieldNode)(nil): { 396 "*MapFieldNode", "FieldDeclNode", "MessageDeclNode", "CompositeNode", "Node", 397 }, 398 (*FileNode)(nil): { 399 "*FileNode", "CompositeNode", "Node", 400 }, 401 (*SyntaxNode)(nil): { 402 "*SyntaxNode", "CompositeNode", "Node", 403 }, 404 (*ImportNode)(nil): { 405 "*ImportNode", "CompositeNode", "Node", 406 }, 407 (*PackageNode)(nil): { 408 "*PackageNode", "CompositeNode", "Node", 409 }, 410 (*IdentNode)(nil): { 411 "*IdentNode", "ValueNode", "IdentValueNode", "TerminalNode", "Node", 412 }, 413 (*CompoundIdentNode)(nil): { 414 "*CompoundIdentNode", "ValueNode", "IdentValueNode", "CompositeNode", "Node", 415 }, 416 (*KeywordNode)(nil): { 417 "*KeywordNode", "TerminalNode", "Node", 418 }, 419 (*MessageNode)(nil): { 420 "*MessageNode", "MessageDeclNode", "CompositeNode", "Node", 421 }, 422 (*ExtendNode)(nil): { 423 "*ExtendNode", "CompositeNode", "Node", 424 }, 425 (*RuneNode)(nil): { 426 "*RuneNode", "TerminalNode", "Node", 427 }, 428 (*EmptyDeclNode)(nil): { 429 "*EmptyDeclNode", "CompositeNode", "Node", 430 }, 431 (*OptionNode)(nil): { 432 "*OptionNode", "CompositeNode", "Node", 433 }, 434 (*OptionNameNode)(nil): { 435 "*OptionNameNode", "CompositeNode", "Node", 436 }, 437 (*FieldReferenceNode)(nil): { 438 "*FieldReferenceNode", "CompositeNode", "Node", 439 }, 440 (*CompactOptionsNode)(nil): { 441 "*CompactOptionsNode", "CompositeNode", "Node", 442 }, 443 (*ExtensionRangeNode)(nil): { 444 "*ExtensionRangeNode", "CompositeNode", "Node", 445 }, 446 (*RangeNode)(nil): { 447 "*RangeNode", "CompositeNode", "Node", 448 }, 449 (*ReservedNode)(nil): { 450 "*ReservedNode", "CompositeNode", "Node", 451 }, 452 (*ServiceNode)(nil): { 453 "*ServiceNode", "CompositeNode", "Node", 454 }, 455 (*RPCNode)(nil): { 456 "*RPCNode", "CompositeNode", "Node", 457 }, 458 (*RPCTypeNode)(nil): { 459 "*RPCTypeNode", "CompositeNode", "Node", 460 }, 461 (*StringLiteralNode)(nil): { 462 "*StringLiteralNode", "ValueNode", "StringValueNode", "TerminalNode", "Node", 463 }, 464 (*CompoundStringLiteralNode)(nil): { 465 "*CompoundStringLiteralNode", "ValueNode", "StringValueNode", "CompositeNode", "Node", 466 }, 467 (*UintLiteralNode)(nil): { 468 "*UintLiteralNode", "ValueNode", "IntValueNode", "FloatValueNode", "TerminalNode", "Node", 469 }, 470 (*PositiveUintLiteralNode)(nil): { 471 "*PositiveUintLiteralNode", "ValueNode", "IntValueNode", "CompositeNode", "Node", 472 }, 473 (*NegativeIntLiteralNode)(nil): { 474 "*NegativeIntLiteralNode", "ValueNode", "IntValueNode", "CompositeNode", "Node", 475 }, 476 (*FloatLiteralNode)(nil): { 477 "*FloatLiteralNode", "ValueNode", "FloatValueNode", "TerminalNode", "Node", 478 }, 479 (*SpecialFloatLiteralNode)(nil): { 480 "*SpecialFloatLiteralNode", "ValueNode", "FloatValueNode", "TerminalNode", "Node", 481 }, 482 (*SignedFloatLiteralNode)(nil): { 483 "*SignedFloatLiteralNode", "ValueNode", "FloatValueNode", "CompositeNode", "Node", 484 }, 485 (*BoolLiteralNode)(nil): { 486 "*BoolLiteralNode", "ValueNode", "TerminalNode", "Node", 487 }, 488 (*ArrayLiteralNode)(nil): { 489 "*ArrayLiteralNode", "ValueNode", "CompositeNode", "Node", 490 }, 491 (*MessageLiteralNode)(nil): { 492 "*MessageLiteralNode", "ValueNode", "CompositeNode", "Node", 493 }, 494 (*MessageFieldNode)(nil): { 495 "*MessageFieldNode", "CompositeNode", "Node", 496 }, 497 } 498 499 for n, expectedCalls := range testCases { 500 var call string 501 v, all := testVisitors(&call) 502 _ = Visit(n, v) 503 assert.Equal(t, expectedCalls[0], call) 504 var allCalls []string 505 for _, v := range all { 506 call = "" 507 _ = Visit(n, v) 508 if call != "" { 509 allCalls = append(allCalls, call) 510 } 511 } 512 sort.Strings(allCalls) 513 sort.Strings(expectedCalls) 514 assert.Equal(t, expectedCalls, allCalls) 515 } 516 } 517 518 func TestVisitorPriorityOrder(t *testing.T) { 519 // This tests a handful of cases, concrete types that implement numerous interfaces, 520 // and verifies that the preferred function on the visitor is called when present. 521 var call string 522 var n Node 523 524 v, _ := testVisitors(&call) 525 n = (*StringLiteralNode)(nil) 526 527 v.DoVisitStringLiteralNode = nil 528 _ = Visit(n, v) 529 assert.Equal(t, "StringValueNode", call) 530 call = "" 531 v.DoVisitStringValueNode = nil 532 _ = Visit(n, v) 533 assert.Equal(t, "ValueNode", call) 534 call = "" 535 v.DoVisitValueNode = nil 536 _ = Visit(n, v) 537 assert.Equal(t, "TerminalNode", call) 538 call = "" 539 v.DoVisitTerminalNode = nil 540 _ = Visit(n, v) 541 assert.Equal(t, "Node", call) 542 call = "" 543 v.DoVisitNode = nil 544 _ = Visit(n, v) 545 assert.Equal(t, "", call) 546 547 v, _ = testVisitors(&call) 548 n = (*CompoundStringLiteralNode)(nil) 549 550 v.DoVisitCompoundStringLiteralNode = nil 551 _ = Visit(n, v) 552 assert.Equal(t, "StringValueNode", call) 553 call = "" 554 v.DoVisitStringValueNode = nil 555 _ = Visit(n, v) 556 assert.Equal(t, "ValueNode", call) 557 call = "" 558 v.DoVisitValueNode = nil 559 _ = Visit(n, v) 560 assert.Equal(t, "CompositeNode", call) 561 call = "" 562 v.DoVisitCompositeNode = nil 563 _ = Visit(n, v) 564 assert.Equal(t, "Node", call) 565 call = "" 566 v.DoVisitNode = nil 567 _ = Visit(n, v) 568 assert.Equal(t, "", call) 569 570 v, _ = testVisitors(&call) 571 n = (*UintLiteralNode)(nil) 572 573 v.DoVisitUintLiteralNode = nil 574 _ = Visit(n, v) 575 assert.Equal(t, "IntValueNode", call) 576 call = "" 577 v.DoVisitIntValueNode = nil 578 _ = Visit(n, v) 579 assert.Equal(t, "FloatValueNode", call) 580 call = "" 581 v.DoVisitFloatValueNode = nil 582 _ = Visit(n, v) 583 assert.Equal(t, "ValueNode", call) 584 call = "" 585 v.DoVisitValueNode = nil 586 _ = Visit(n, v) 587 assert.Equal(t, "TerminalNode", call) 588 call = "" 589 v.DoVisitTerminalNode = nil 590 _ = Visit(n, v) 591 assert.Equal(t, "Node", call) 592 call = "" 593 v.DoVisitNode = nil 594 _ = Visit(n, v) 595 assert.Equal(t, "", call) 596 597 v, _ = testVisitors(&call) 598 n = (*GroupNode)(nil) 599 600 v.DoVisitGroupNode = nil 601 _ = Visit(n, v) 602 assert.Equal(t, "FieldDeclNode", call) 603 call = "" 604 v.DoVisitFieldDeclNode = nil 605 _ = Visit(n, v) 606 assert.Equal(t, "MessageDeclNode", call) 607 call = "" 608 v.DoVisitMessageDeclNode = nil 609 _ = Visit(n, v) 610 assert.Equal(t, "CompositeNode", call) 611 call = "" 612 v.DoVisitCompositeNode = nil 613 _ = Visit(n, v) 614 assert.Equal(t, "Node", call) 615 call = "" 616 v.DoVisitNode = nil 617 _ = Visit(n, v) 618 assert.Equal(t, "", call) 619 620 v, _ = testVisitors(&call) 621 n = (*MapFieldNode)(nil) 622 623 v.DoVisitMapFieldNode = nil 624 _ = Visit(n, v) 625 assert.Equal(t, "FieldDeclNode", call) 626 call = "" 627 v.DoVisitFieldDeclNode = nil 628 _ = Visit(n, v) 629 assert.Equal(t, "MessageDeclNode", call) 630 call = "" 631 v.DoVisitMessageDeclNode = nil 632 _ = Visit(n, v) 633 assert.Equal(t, "CompositeNode", call) 634 call = "" 635 v.DoVisitCompositeNode = nil 636 _ = Visit(n, v) 637 assert.Equal(t, "Node", call) 638 call = "" 639 v.DoVisitNode = nil 640 _ = Visit(n, v) 641 assert.Equal(t, "", call) 642 } 643 644 //func TestDoGenerate(t *testing.T) { 645 // generateVisitors() 646 //} 647 // 648 //func generateVisitors() { 649 // // This is manually-curated list of all node types in this package 650 // // Not all of them are valid as visitor functions, since we intentionally 651 // // omit NoSourceNode, SyntheticMapFieldNode, the various *Element interfaces, 652 // // and all of the *DeclNode interfaces that have only one real impl. 653 // types := ` 654 //*EnumNode 655 //EnumElement 656 //EnumValueDeclNode 657 //*EnumValueNode 658 //FieldDeclNode 659 //*FieldNode 660 //*FieldLabel 661 //*GroupNode 662 //*OneOfNode 663 //OneOfElement 664 //*MapTypeNode 665 //*MapFieldNode 666 //*SyntheticMapField 667 //FileDeclNode 668 //*FileNode 669 //FileElement 670 //*SyntaxNode 671 //*ImportNode 672 //*PackageNode 673 //IdentValueNode 674 //*IdentNode 675 //*CompoundIdentNode 676 //*KeywordNode 677 //MessageDeclNode 678 //*MessageNode 679 //MessageElement 680 //*ExtendNode 681 //ExtendElement 682 //Node 683 //TerminalNode 684 //CompositeNode 685 //*RuneNode 686 //*EmptyDeclNode 687 //OptionDeclNode 688 //*OptionNode 689 //*OptionNameNode 690 //*FieldReferenceNode 691 //*CompactOptionsNode 692 //*ExtensionRangeNode 693 //RangeDeclNode 694 //*RangeNode 695 //*ReservedNode 696 //*ServiceNode 697 //ServiceElement 698 //RPCDeclNode 699 //*RPCNode 700 //RPCElement 701 //*RPCTypeNode 702 //ValueNode 703 //StringValueNode 704 //*StringLiteralNode 705 //*CompoundStringLiteralNode 706 //IntValueNode 707 //*UintLiteralNode 708 //*PositiveUintLiteralNode 709 //*NegativeIntLiteralNode 710 //FloatValueNode 711 //*FloatLiteralNode 712 //*SpecialFloatLiteralNode 713 //*SignedFloatLiteralNode 714 //*BoolLiteralNode 715 //*ArrayLiteralNode 716 //*MessageLiteralNode 717 //*MessageFieldNode 718 //` 719 // strs := strings.Split(types, "\n") 720 // fmt.Println(`func testVisitors(methodCalled *string) (*Visitor, []*Visitor) {`) 721 // fmt.Println(` v := &SimpleVisitor{`) 722 // for _, str := range strs { 723 // if str == "" { 724 // continue 725 // } 726 // name := strings.TrimPrefix(str, "*") 727 // fmt.Printf(` DoVisit%s: func(%s) error {`, name, str); fmt.Println() 728 // fmt.Printf(` *methodCalled = "%s"`, str); fmt.Println() 729 // fmt.Println(` return nil`) 730 // fmt.Println(` },`) 731 // } 732 // fmt.Println(` }`) 733 // fmt.Println(` others := []*SimpleVisitor{`) 734 // for _, str := range strs { 735 // if str == "" { 736 // continue 737 // } 738 // name := strings.TrimPrefix(str, "*") 739 // fmt.Println(` {`) 740 // fmt.Printf(` DoVisit%s: v.DoVisit%s,`, name, name); fmt.Println() 741 // fmt.Println(` },`) 742 // } 743 // fmt.Println(` }`) 744 // fmt.Println(`}`) 745 //}