mirror of
https://github.com/github/codeql.git
synced 2026-05-01 03:35:13 +02:00
Rust: Auto-generate CfgNodes.qll
This commit is contained in:
@@ -160,6 +160,8 @@ def get_ql_class(cls: schema.Class, lookup: typing.Dict[str, schema.Class]) -> q
|
||||
prop = get_ql_property(cls, p, lookup, prev_child)
|
||||
if prop.is_child:
|
||||
prev_child = prop.singular
|
||||
if prop.type in lookup and lookup[prop.type].cfg:
|
||||
prop.cfg = True
|
||||
properties.append(prop)
|
||||
return ql.Class(
|
||||
name=cls.name,
|
||||
@@ -171,6 +173,16 @@ def get_ql_class(cls: schema.Class, lookup: typing.Dict[str, schema.Class]) -> q
|
||||
doc=cls.doc,
|
||||
hideable="ql_hideable" in cls.pragmas,
|
||||
internal="ql_internal" in cls.pragmas,
|
||||
cfg=cls.cfg,
|
||||
)
|
||||
|
||||
|
||||
def get_ql_cfg_class(cls: schema.Class, lookup: typing.Dict[str, ql.Class]) -> ql.CfgClass:
|
||||
return ql.CfgClass(
|
||||
name=cls.name,
|
||||
bases=[base for base in cls.bases if lookup[base.base].cfg],
|
||||
properties=cls.properties,
|
||||
doc=cls.doc
|
||||
)
|
||||
|
||||
|
||||
@@ -361,6 +373,7 @@ def generate(opts, renderer):
|
||||
input = opts.schema
|
||||
out = opts.ql_output
|
||||
stub_out = opts.ql_stub_output
|
||||
cfg_out = opts.ql_cfg_output
|
||||
test_out = opts.ql_test_output
|
||||
missing_test_source_filename = "MISSING_SOURCE.txt"
|
||||
include_file = stub_out.with_suffix(".qll")
|
||||
@@ -385,6 +398,7 @@ def generate(opts, renderer):
|
||||
imports = {}
|
||||
imports_impl = {}
|
||||
classes_used_by = {}
|
||||
cfg_classes = []
|
||||
generated_import_prefix = get_import(out, opts.root_dir)
|
||||
registry = opts.generated_registry or pathlib.Path(
|
||||
os.path.commonpath((out, stub_out, test_out)), ".generated.list")
|
||||
@@ -402,6 +416,8 @@ def generate(opts, renderer):
|
||||
imports[c.name] = path
|
||||
path_impl = get_import(stub_out / c.dir / "internal" / c.name, opts.root_dir)
|
||||
imports_impl[c.name + "Impl"] = path_impl + "Impl"
|
||||
if c.cfg:
|
||||
cfg_classes.append(get_ql_cfg_class(c, classes))
|
||||
|
||||
for c in classes.values():
|
||||
qll = out / c.path.with_suffix(".qll")
|
||||
@@ -411,6 +427,14 @@ def generate(opts, renderer):
|
||||
c.import_prefix = generated_import_prefix
|
||||
renderer.render(c, qll)
|
||||
|
||||
if cfg_out:
|
||||
cfg_classes_val = ql.CfgClasses(
|
||||
include_file_import=get_import(include_file, opts.root_dir),
|
||||
classes=cfg_classes
|
||||
)
|
||||
cfg_qll = cfg_out / "CfgNodes.qll"
|
||||
renderer.render(cfg_classes_val, cfg_qll)
|
||||
|
||||
for c in data.classes.values():
|
||||
path = _get_path(c)
|
||||
path_impl = _get_path_impl(c)
|
||||
|
||||
Reference in New Issue
Block a user