all_generate.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #!python
  2. # from gen_base_visitor import *
  3. # from gen_node import *
  4. from assemble import *
  5. from meta_gen import *
  6. import re
  7. import os
  8. def gen_file(rootfile, template, output, **kwargs):
  9. namespace, root_base, struct_name = meta_gen(readfile(rootfile))
  10. vc = assemble(readfile(template), namespace=namespace, root_base=root_base, struct_name=struct_name, **kwargs)
  11. file = open(output, 'w')
  12. license = open("../../internal/core/build-support/cpp_license.txt").read()
  13. file.write(license + vc)
  14. def extract_extra_body(visitor_info, query_path):
  15. pattern = re.compile(r"class(.*){\n((.|\n)*?)\n};", re.MULTILINE)
  16. for node, visitors in visitor_info.items():
  17. for visitor in visitors:
  18. vis_name = visitor['visitor_name']
  19. vis_file = query_path + "visitors/" + vis_name + ".cpp"
  20. body = ' public:'
  21. inc_pattern_str = r'^(#include(.|\n)*)\n#include "query/generated/{}.h"'.format(vis_name)
  22. inc_pattern = re.compile(inc_pattern_str, re.MULTILINE)
  23. if os.path.exists(vis_file):
  24. content = readfile(vis_file)
  25. infos = pattern.findall(content)
  26. assert len(infos) <= 1
  27. if len(infos) == 1:
  28. name, body, _ = infos[0]
  29. extra_inc_infos = inc_pattern.findall(content)
  30. assert(len(extra_inc_infos) <= 1)
  31. print(extra_inc_infos)
  32. if len(extra_inc_infos) == 1:
  33. extra_inc_body, _ = extra_inc_infos[0]
  34. visitor["ctor_and_member"] = body
  35. visitor["extra_inc"] = extra_inc_body
  36. if __name__ == "__main__":
  37. query_path = "../../internal/core/src/query/"
  38. output_path = query_path + "generated/"
  39. node_names = ["Expr", "PlanNode"]
  40. visitor_info = {
  41. 'Expr': [
  42. {
  43. 'visitor_name': "ShowExprVisitor",
  44. "parameter_name": 'expr',
  45. },
  46. {
  47. 'visitor_name': "ExecExprVisitor",
  48. "parameter_name": 'expr',
  49. },
  50. {
  51. 'visitor_name': "VerifyExprVisitor",
  52. "parameter_name": 'expr',
  53. },
  54. {
  55. 'visitor_name': "ExtractInfoExprVisitor",
  56. "parameter_name": 'expr',
  57. },
  58. ],
  59. 'PlanNode': [
  60. {
  61. 'visitor_name': "ShowPlanNodeVisitor",
  62. "parameter_name": 'node',
  63. },
  64. {
  65. 'visitor_name': "ExecPlanNodeVisitor",
  66. "parameter_name": 'node',
  67. },
  68. {
  69. 'visitor_name': "VerifyPlanNodeVisitor",
  70. "parameter_name": 'node',
  71. },
  72. {
  73. 'visitor_name': "ExtractInfoPlanNodeVisitor",
  74. "parameter_name": 'node',
  75. },
  76. ]
  77. }
  78. extract_extra_body(visitor_info, query_path)
  79. for name in node_names:
  80. rootfile = query_path + name + ".h"
  81. template = 'templates/visitor_base.h'
  82. output = output_path + name + 'Visitor.h'
  83. gen_file(rootfile, template, output)
  84. template = 'templates/node_def.cpp'
  85. output = output_path + name + '.cpp'
  86. gen_file(rootfile, template, output)
  87. for info in visitor_info[name]:
  88. vis_name = info['visitor_name']
  89. template = 'templates/visitor_derived.h'
  90. output = output_path + vis_name + '.h'
  91. gen_file(rootfile, template, output, **info)
  92. vis_name = info['visitor_name']
  93. template = 'templates/visitor_derived.cpp'
  94. output = output_path + vis_name + '.cpp'
  95. gen_file(rootfile, template, output, **info)
  96. print("Done")