Add snake_case converter to AST generator
Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user