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
# pylint: disable=missing-function-docstring,missing-class-docstring,missing-module-docstring,line-too-long
import abc
import re
import sys
import time
from pathlib import Path
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:
"String builder"
@@ -68,7 +85,7 @@ class GenerateStruct(Generator):
+ "{"
)
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.line("}")
@@ -82,7 +99,7 @@ class GenerateStruct(Generator):
return str(sb)
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):
@@ -130,7 +147,7 @@ class GenerateEnum(Generator):
+ "{"
)
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.line("}")
@@ -144,7 +161,7 @@ class GenerateEnum(Generator):
return str(sb)
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):