Skip to content

Commit 5f7fa6f

Browse files
committed
Swift: generate class docs
Python docstrings in `schema.py` are now added to the generated classes. As an example, a docstring is added to `Expr`.
1 parent f41fd81 commit 5f7fa6f

File tree

7 files changed

+51
-0
lines changed

7 files changed

+51
-0
lines changed

swift/codegen/generators/qlgen.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ def get_ql_class(cls: schema.Class, lookup: typing.Dict[str, schema.Class]):
109109
properties=properties,
110110
dir=pathlib.Path(cls.group or ""),
111111
ipa=bool(cls.ipa),
112+
doc=cls.doc,
112113
**pragmas,
113114
)
114115

swift/codegen/lib/ql.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ def is_single(self):
7070
def is_child(self):
7171
return self.prev_child is not None
7272

73+
@property
74+
def has_doc(self) -> bool:
75+
return bool(self.doc)
76+
7377

7478
@dataclass
7579
class Base:
@@ -94,6 +98,7 @@ class Class:
9498
qltest_collapse_hierarchy: bool = False
9599
qltest_uncollapse_hierarchy: bool = False
96100
ipa: bool = False
101+
doc: List[str] = field(default_factory=list)
97102

98103
def __post_init__(self):
99104
self.bases = [Base(str(b), str(prev)) for b, prev in zip(self.bases, itertools.chain([""], self.bases))]
@@ -120,6 +125,10 @@ def has_children(self) -> bool:
120125
def last_base(self) -> str:
121126
return self.bases[-1].base if self.bases else ""
122127

128+
@property
129+
def has_doc(self) -> bool:
130+
return bool(self.doc)
131+
123132

124133
@dataclass
125134
class Stub:

swift/codegen/templates/ql_class.mustache

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ import {{.}}
66
{{/imports}}
77

88
module Generated {
9+
{{#has_doc}}
10+
/**
11+
{{#doc}}
12+
* {{.}}
13+
{{/doc}}
14+
*/
15+
{{/has_doc}}
916
class {{name}} extends Synth::T{{name}}{{#bases}}, {{.}}{{/bases}} {
1017
{{#root}}
1118
string toString() { none() } // overridden by subclasses

swift/codegen/test/test_ql.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,5 +127,25 @@ def test_class_with_children():
127127
assert cls.has_children is True
128128

129129

130+
def test_class_with_doc():
131+
cls = ql.Class("Class", doc=["foo", "bar"])
132+
assert cls.has_doc is True
133+
134+
135+
def test_class_without_doc():
136+
cls = ql.Class("Class", doc=[])
137+
assert cls.has_doc is False
138+
139+
140+
def test_property_with_doc():
141+
prop = ql.Property("X", "int", doc=["foo", "bar"])
142+
assert prop.has_doc is True
143+
144+
145+
def test_class_without_doc():
146+
prop = ql.Property("X", "int")
147+
assert prop.has_doc is False
148+
149+
130150
if __name__ == '__main__':
131151
sys.exit(pytest.main([__file__] + sys.argv[1:]))

swift/codegen/test/test_qlgen.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,16 @@ def test_single_class_property(generate_classes, is_child, prev_child):
350350
}
351351

352352

353+
def test_class_with_doc(generate_classes):
354+
doc = ["Very important class.", "Very."]
355+
assert generate_classes([
356+
schema.Class("A", doc=doc),
357+
]) == {
358+
"A.qll": (ql.Stub(name="A", base_import=gen_import_prefix + "A"),
359+
ql.Class(name="A", final=True, doc=doc)),
360+
}
361+
362+
353363
def test_class_dir(generate_classes):
354364
dir = "another/rel/path"
355365
assert generate_classes([

swift/ql/lib/codeql/swift/generated/expr/Expr.qll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import codeql.swift.elements.AstNode
55
import codeql.swift.elements.type.Type
66

77
module Generated {
8+
/**
9+
* The base class for all expressions in Swift.
10+
*/
811
class Expr extends Synth::TExpr, AstNode {
912
Type getImmediateType() {
1013
result = Synth::convertTypeFromRaw(Synth::convertExprToRaw(this).(Raw::Expr).getType())

swift/schema.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class Decl(AstNode):
6868

6969
@group("expr")
7070
class Expr(AstNode):
71+
"""The base class for all expressions in Swift."""
7172
type: optional[Type]
7273

7374
@group("pattern")

0 commit comments

Comments
 (0)