postprocess.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. # Copyright 2019 The Meson development team
  2. # Licensed under the Apache License, Version 2.0 (the "License");
  3. # you may not use this file except in compliance with the License.
  4. # You may obtain a copy of the License at
  5. # http://www.apache.org/licenses/LICENSE-2.0
  6. # Unless required by applicable law or agreed to in writing, software
  7. # distributed under the License is distributed on an "AS IS" BASIS,
  8. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. # See the License for the specific language governing permissions and
  10. # limitations under the License.
  11. # This class contains the basic functionality needed to run any interpreter
  12. # or an interpreter-based tool
  13. from . import AstVisitor
  14. from .. import mparser
  15. class AstIndentationGenerator(AstVisitor):
  16. def __init__(self):
  17. self.level = 0
  18. def visit_default_func(self, node: mparser.BaseNode):
  19. # Store the current level in the node
  20. node.level = self.level
  21. def visit_ArrayNode(self, node: mparser.ArrayNode):
  22. self.visit_default_func(node)
  23. self.level += 1
  24. node.args.accept(self)
  25. self.level -= 1
  26. def visit_DictNode(self, node: mparser.DictNode):
  27. self.visit_default_func(node)
  28. self.level += 1
  29. node.args.accept(self)
  30. self.level -= 1
  31. def visit_MethodNode(self, node: mparser.MethodNode):
  32. self.visit_default_func(node)
  33. node.source_object.accept(self)
  34. self.level += 1
  35. node.args.accept(self)
  36. self.level -= 1
  37. def visit_FunctionNode(self, node: mparser.FunctionNode):
  38. self.visit_default_func(node)
  39. self.level += 1
  40. node.args.accept(self)
  41. self.level -= 1
  42. def visit_ForeachClauseNode(self, node: mparser.ForeachClauseNode):
  43. self.visit_default_func(node)
  44. self.level += 1
  45. node.items.accept(self)
  46. node.block.accept(self)
  47. self.level -= 1
  48. def visit_IfClauseNode(self, node: mparser.IfClauseNode):
  49. self.visit_default_func(node)
  50. for i in node.ifs:
  51. i.accept(self)
  52. if node.elseblock:
  53. self.level += 1
  54. node.elseblock.accept(self)
  55. self.level -= 1
  56. def visit_IfNode(self, node: mparser.IfNode):
  57. self.visit_default_func(node)
  58. self.level += 1
  59. node.condition.accept(self)
  60. node.block.accept(self)
  61. self.level -= 1
  62. class AstIDGenerator(AstVisitor):
  63. def __init__(self):
  64. self.counter = {}
  65. def visit_default_func(self, node: mparser.BaseNode):
  66. name = type(node).__name__
  67. if name not in self.counter:
  68. self.counter[name] = 0
  69. node.ast_id = name + '#' + str(self.counter[name])
  70. self.counter[name] += 1