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`.
This commit is contained in:
Paolo Tranquilli
2022-10-18 13:30:45 +02:00
parent f41fd81965
commit 5f7fa6f915
7 changed files with 51 additions and 0 deletions

View File

@@ -109,6 +109,7 @@ def get_ql_class(cls: schema.Class, lookup: typing.Dict[str, schema.Class]):
properties=properties,
dir=pathlib.Path(cls.group or ""),
ipa=bool(cls.ipa),
doc=cls.doc,
**pragmas,
)

View File

@@ -70,6 +70,10 @@ class Property:
def is_child(self):
return self.prev_child is not None
@property
def has_doc(self) -> bool:
return bool(self.doc)
@dataclass
class Base:
@@ -94,6 +98,7 @@ class Class:
qltest_collapse_hierarchy: bool = False
qltest_uncollapse_hierarchy: bool = False
ipa: bool = False
doc: List[str] = field(default_factory=list)
def __post_init__(self):
self.bases = [Base(str(b), str(prev)) for b, prev in zip(self.bases, itertools.chain([""], self.bases))]
@@ -120,6 +125,10 @@ class Class:
def last_base(self) -> str:
return self.bases[-1].base if self.bases else ""
@property
def has_doc(self) -> bool:
return bool(self.doc)
@dataclass
class Stub:

View File

@@ -6,6 +6,13 @@ import {{.}}
{{/imports}}
module Generated {
{{#has_doc}}
/**
{{#doc}}
* {{.}}
{{/doc}}
*/
{{/has_doc}}
class {{name}} extends Synth::T{{name}}{{#bases}}, {{.}}{{/bases}} {
{{#root}}
string toString() { none() } // overridden by subclasses

View File

@@ -127,5 +127,25 @@ def test_class_with_children():
assert cls.has_children is True
def test_class_with_doc():
cls = ql.Class("Class", doc=["foo", "bar"])
assert cls.has_doc is True
def test_class_without_doc():
cls = ql.Class("Class", doc=[])
assert cls.has_doc is False
def test_property_with_doc():
prop = ql.Property("X", "int", doc=["foo", "bar"])
assert prop.has_doc is True
def test_class_without_doc():
prop = ql.Property("X", "int")
assert prop.has_doc is False
if __name__ == '__main__':
sys.exit(pytest.main([__file__] + sys.argv[1:]))

View File

@@ -350,6 +350,16 @@ def test_single_class_property(generate_classes, is_child, prev_child):
}
def test_class_with_doc(generate_classes):
doc = ["Very important class.", "Very."]
assert generate_classes([
schema.Class("A", doc=doc),
]) == {
"A.qll": (ql.Stub(name="A", base_import=gen_import_prefix + "A"),
ql.Class(name="A", final=True, doc=doc)),
}
def test_class_dir(generate_classes):
dir = "another/rel/path"
assert generate_classes([

View File

@@ -5,6 +5,9 @@ import codeql.swift.elements.AstNode
import codeql.swift.elements.type.Type
module Generated {
/**
* The base class for all expressions in Swift.
*/
class Expr extends Synth::TExpr, AstNode {
Type getImmediateType() {
result = Synth::convertTypeFromRaw(Synth::convertExprToRaw(this).(Raw::Expr).getType())

View File

@@ -68,6 +68,7 @@ class Decl(AstNode):
@group("expr")
class Expr(AstNode):
"""The base class for all expressions in Swift."""
type: optional[Type]
@group("pattern")