Add snake_case converter to AST generator

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2024-10-16 10:34:30 -07:00
parent f7d863abb5
commit 43891bd2a3

View File

@@ -1,12 +1,29 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# pylint: disable=missing-function-docstring,missing-class-docstring,missing-module-docstring,line-too-long # pylint: disable=missing-function-docstring,missing-class-docstring,missing-module-docstring,line-too-long
import abc import abc
import re
import sys import sys
import time import time
from pathlib import Path from pathlib import Path
from typing import Self from typing import Self
def snake_case(s: str):
# This insane regex comes from ChatGPT. I have no idea what the original
# source is, doing a verbatim search on Google and DDG doesn't yield any
# useful results.
#
# Here is the breakdown of how it works:
# (?<!^) - "negative lookbehind". this ensures that the position is not
# preceded by a start character. If this was omitted, it would
# put an underscore before the first capital letter in the string,
# e.g. IndexAssign -> _index_assign
# (?=[A-Z]) - this is a lookahead, asserting that the next character is
# uppercase. It does not consume the character, so doing a .sub()
# on this will not replace it.
return re.sub(r"(?<!^)(?=[A-Z])", "_", s).lower()
class SB: class SB:
"String builder" "String builder"
@@ -68,7 +85,7 @@ class GenerateStruct(Generator):
+ "{" + "{"
) )
sb.indent() sb.indent()
sb.line(f"visitor.visit_{self.name.lower()}_{self.base.lower()}(self)") sb.line(f"visitor.visit_{snake_case(self.name + self.base)}(self)")
sb.dedent() sb.dedent()
sb.line("}") sb.line("}")
@@ -82,7 +99,7 @@ class GenerateStruct(Generator):
return str(sb) return str(sb)
def generate_visitor(self) -> str: def generate_visitor(self) -> str:
return f"fn visit_{self.name.lower()}_{self.base.lower()}(&mut self, {self.base.lower()}: &{self.name}{self.base}) -> Result<(), Error>;" return f"fn visit_{snake_case(self.name + self.base)}(&mut self, {snake_case(self.base)}: &{self.name}{self.base}) -> Result<(), Error>;"
class GenerateEnum(Generator): class GenerateEnum(Generator):
@@ -130,7 +147,7 @@ class GenerateEnum(Generator):
+ "{" + "{"
) )
sb.indent() sb.indent()
sb.line(f"visitor.visit_{self.name.lower()}_{self.base.lower()}(self)") sb.line(f"visitor.visit_{snake_case(self.name + self.base)}(self)")
sb.dedent() sb.dedent()
sb.line("}") sb.line("}")
@@ -144,7 +161,7 @@ class GenerateEnum(Generator):
return str(sb) return str(sb)
def generate_visitor(self) -> str: def generate_visitor(self) -> str:
return f"fn visit_{self.name.lower()}_{self.base.lower()}(&mut self, {self.base.lower()}: &{self.name}{self.base}) -> Result<(), Error>;" return f"fn visit_{snake_case(self.name)}(&mut self, {snake_case(self.base)}: &{self.name}{self.base}) -> Result<(), Error>;"
class GenerateGroup(Generator): class GenerateGroup(Generator):