Skip to content

Commit 2374e6b

Browse files
authored
Merge pull request #8934 from redsun82/swift-trapgen
Swift: added trapgen
2 parents 9d2f386 + 773ef62 commit 2374e6b

31 files changed

+558
-73
lines changed

.github/workflows/swift-codegen.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ jobs:
1313
runs-on: ubuntu-latest
1414
steps:
1515
- uses: actions/checkout@v3
16+
- uses: ./.github/actions/fetch-codeql
17+
- uses: bazelbuild/setup-bazelisk@v2
1618
- uses: actions/setup-python@v3
1719
with:
1820
python-version: '~3.8'
1921
cache: 'pip'
20-
- uses: ./.github/actions/fetch-codeql
21-
- uses: bazelbuild/setup-bazelisk@v2
22-
- name: Install dependencies
22+
- name: Install python dependencies
2323
run: |
2424
pip install -r swift/codegen/requirements.txt
2525
- name: Run unit tests
2626
run: |
27-
bazel test //swift/codegen:tests --test_output=errors
27+
bazel test //swift/codegen/test --test_output=errors
2828
- name: Check that code was generated
2929
run: |
3030
bazel run //swift/codegen

.github/workflows/swift-qltest.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ jobs:
2929
- uses: actions/checkout@v3
3030
- uses: ./.github/actions/fetch-codeql
3131
- uses: bazelbuild/setup-bazelisk@v2
32+
- uses: actions/setup-python@v3
33+
with:
34+
python-version: '~3.8'
35+
cache: 'pip'
36+
- name: Install python dependencies
37+
run: |
38+
pip install -r codegen/requirements.txt
3239
- name: Build Swift extractor
3340
run: |
3441
bazel run //swift:create-extractor-pack

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,5 @@ repos:
4747
name: Run Swift code generation unit tests
4848
files: ^swift/codegen/.*\.py$
4949
language: system
50-
entry: bazel test //swift/codegen:tests
50+
entry: bazel test //swift/codegen/test
5151
pass_filenames: false

swift/.gitignore

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
extractor-pack
1+
# directory created by bazel run //swift:create-extractor-pack
2+
/extractor-pack
3+
4+
# output files created by running tests
5+
*.o

swift/BUILD.bazel

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@ load("@rules_pkg//:mappings.bzl", "pkg_attributes", "pkg_filegroup", "pkg_files"
22
load("@rules_pkg//:install.bzl", "pkg_install")
33
load("//:defs.bzl", "codeql_platform")
44

5-
pkg_files(
5+
filegroup(
66
name = "dbscheme",
7+
srcs = ["ql/lib/swift.dbscheme"],
8+
visibility = ["//visibility:public"],
9+
)
10+
11+
pkg_files(
12+
name = "dbscheme_files",
713
srcs = [
8-
"ql/lib/swift.dbscheme",
914
"ql/lib/swift.dbscheme.stats",
15+
":dbscheme",
1016
],
1117
)
1218

@@ -25,7 +31,7 @@ pkg_files(
2531
pkg_filegroup(
2632
name = "extractor-pack-generic",
2733
srcs = [
28-
":dbscheme",
34+
":dbscheme_files",
2935
":manifest",
3036
":qltest",
3137
],
@@ -58,7 +64,7 @@ pkg_filegroup(
5864
name = "extractor-pack-arch",
5965
srcs = [
6066
":extractor",
61-
":swift-test-sdk-arch"
67+
":swift-test-sdk-arch",
6268
],
6369
visibility = ["//visibility:public"],
6470
)

swift/codegen/BUILD.bazel

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,16 @@
11
py_binary(
22
name = "codegen",
3-
srcs = glob([
4-
"lib/*.py",
5-
"*.py",
6-
]),
3+
srcs = glob(["*.py"]),
4+
visibility = ["//swift/codegen/test:__pkg__"],
5+
deps = ["//swift/codegen/lib"],
76
)
87

9-
py_library(
10-
name = "test_utils",
11-
testonly = True,
12-
srcs = ["test/utils.py"],
13-
deps = [":codegen"],
14-
)
15-
16-
[
17-
py_test(
18-
name = src[len("test/"):-len(".py")],
19-
size = "small",
20-
srcs = [src],
21-
deps = [
22-
":codegen",
23-
":test_utils",
24-
],
25-
)
26-
for src in glob(["test/test_*.py"])
27-
]
28-
29-
test_suite(
30-
name = "tests",
8+
# as opposed to the above, that is meant to only be run with bazel run,
9+
# we need to be precise with data dependencies of this which is meant be run during build
10+
py_binary(
11+
name = "trapgen",
12+
srcs = ["trapgen.py"],
13+
data = ["//swift/codegen/templates:cpp"],
14+
visibility = ["//swift:__subpackages__"],
15+
deps = ["//swift/codegen/lib"],
3116
)

swift/codegen/codegen.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66
import qlgen
77

88
if __name__ == "__main__":
9-
generator.run(dbschemegen.generate, qlgen.generate)
9+
generator.run(dbschemegen, qlgen)

swift/codegen/dbschemegen.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,13 @@ def generate(opts, renderer):
7979
data = schema.load(input)
8080

8181
dbscheme = Scheme(src=input.relative_to(paths.swift_dir),
82-
includes=get_includes(data, include_dir=input.parent),
83-
declarations=get_declarations(data))
82+
includes=get_includes(data, include_dir=input.parent),
83+
declarations=get_declarations(data))
8484

8585
renderer.render(dbscheme, out)
8686

8787

88+
tags = ("schema", "dbscheme")
89+
8890
if __name__ == "__main__":
89-
generator.run(generate, tags=["schema", "dbscheme"])
91+
generator.run()

swift/codegen/lib/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
py_library(
2+
name = "lib",
3+
srcs = glob(["*.py"]),
4+
visibility = ["//swift/codegen:__subpackages__"],
5+
)

swift/codegen/lib/cpp.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from dataclasses import dataclass, field
2+
from typing import List, ClassVar
3+
4+
# taken from https://en.cppreference.com/w/cpp/keyword
5+
cpp_keywords = {"alignas", "alignof", "and", "and_eq", "asm", "atomic_cancel", "atomic_commit", "atomic_noexcept",
6+
"auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "char8_t", "char16_t", "char32_t",
7+
"class", "compl", "concept", "const", "consteval", "constexpr", "constinit", "const_cast", "continue",
8+
"co_await", "co_return", "co_yield", "decltype", "default", "delete", "do", "double", "dynamic_cast",
9+
"else", "enum", "explicit", "export", "extern", "false", "float", "for", "friend", "goto", "if",
10+
"inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq", "nullptr",
11+
"operator", "or", "or_eq", "private", "protected", "public", "reflexpr", "register", "reinterpret_cast",
12+
"requires", "return", "short", "signed", "sizeof", "static", "static_assert", "static_cast", "struct",
13+
"switch", "synchronized", "template", "this", "thread_local", "throw", "true", "try", "typedef",
14+
"typeid", "typename", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while",
15+
"xor", "xor_eq"}
16+
17+
18+
@dataclass
19+
class Field:
20+
name: str
21+
type: str
22+
first: bool = False
23+
24+
def cpp_name(self):
25+
if self.name in cpp_keywords:
26+
return self.name + "_"
27+
return self.name
28+
29+
def stream(self):
30+
if self.type == "std::string":
31+
return lambda x: f"trapQuoted({x})"
32+
elif self.type == "bool":
33+
return lambda x: f'({x} ? "true" : "false")'
34+
else:
35+
return lambda x: x
36+
37+
38+
@dataclass
39+
class Trap:
40+
table_name: str
41+
name: str
42+
fields: List[Field]
43+
id: Field = None
44+
45+
def __post_init__(self):
46+
assert self.fields
47+
self.fields[0].first = True
48+
49+
50+
@dataclass
51+
class TagBase:
52+
base: str
53+
first: bool = False
54+
55+
56+
@dataclass
57+
class Tag:
58+
name: str
59+
bases: List[TagBase]
60+
index: int
61+
id: str
62+
63+
def __post_init__(self):
64+
if self.bases:
65+
self.bases = [TagBase(b) for b in self.bases]
66+
self.bases[0].first = True
67+
68+
def has_bases(self):
69+
return bool(self.bases)
70+
71+
72+
@dataclass
73+
class TrapList:
74+
template: ClassVar = 'cpp_traps'
75+
76+
traps: List[Trap] = field(default_factory=list)
77+
78+
79+
@dataclass
80+
class TagList:
81+
template: ClassVar = 'cpp_tags'
82+
83+
tags: List[Tag] = field(default_factory=list)

0 commit comments

Comments
 (0)