mirror of
https://github.com/github/codeql.git
synced 2025-12-17 09:13:20 +01:00
Swift: some restructuring of codegen
Loading of the schema and dbscheme has been moved to a separate `loaders` package for better separation of concerns.
This commit is contained in:
@@ -105,54 +105,3 @@ class Scheme:
|
||||
src: str
|
||||
includes: List[SchemeInclude]
|
||||
declarations: List[Decl]
|
||||
|
||||
|
||||
class Re:
|
||||
entity = re.compile(
|
||||
"(?m)"
|
||||
r"(?:^#keyset\[(?P<tablekeys>[\w\s,]+)\][\s\n]*)?^(?P<table>\w+)\("
|
||||
r"(?:\s*//dir=(?P<tabledir>\S*))?(?P<tablebody>[^\)]*)"
|
||||
r"\);?"
|
||||
"|"
|
||||
r"^(?P<union>@\w+)\s*=\s*(?P<unionbody>@\w+(?:\s*\|\s*@\w+)*)\s*;?"
|
||||
)
|
||||
field = re.compile(r"(?m)[\w\s]*\s(?P<field>\w+)\s*:\s*(?P<type>@?\w+)(?P<ref>\s+ref)?")
|
||||
key = re.compile(r"@\w+")
|
||||
comment = re.compile(r"(?m)(?s)/\*.*?\*/|//(?!dir=)[^\n]*$") # lookahead avoid ignoring metadata like //dir=foo
|
||||
|
||||
|
||||
def get_column(match):
|
||||
return Column(
|
||||
schema_name=match["field"].rstrip("_"),
|
||||
type=match["type"],
|
||||
binding=not match["ref"],
|
||||
)
|
||||
|
||||
|
||||
def get_table(match):
|
||||
keyset = None
|
||||
if match["tablekeys"]:
|
||||
keyset = KeySet(k.strip() for k in match["tablekeys"].split(","))
|
||||
return Table(
|
||||
name=match["table"],
|
||||
columns=[get_column(f) for f in Re.field.finditer(match["tablebody"])],
|
||||
keyset=keyset,
|
||||
dir=pathlib.PosixPath(match["tabledir"]) if match["tabledir"] else None,
|
||||
)
|
||||
|
||||
|
||||
def get_union(match):
|
||||
return Union(
|
||||
lhs=match["union"],
|
||||
rhs=(d[0] for d in Re.key.finditer(match["unionbody"])),
|
||||
)
|
||||
|
||||
|
||||
def iterload(file):
|
||||
with open(file) as file:
|
||||
data = Re.comment.sub("", file.read())
|
||||
for e in Re.entity.finditer(data):
|
||||
if e["table"]:
|
||||
yield get_table(e)
|
||||
elif e["union"]:
|
||||
yield get_union(e)
|
||||
|
||||
Reference in New Issue
Block a user