Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions misc/codegen/templates/ql_db.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,79 @@ module Raw {
{{type}} {{getter}}({{#is_indexed}}int index{{/is_indexed}}) {
{{tablename}}({{#tableparams}}{{^first}}, {{/first}}{{param}}{{/tableparams}})
}
{{#is_indexed}}
/**
* Gets the number of {{doc_plural}}.
{{#internal}}
* INTERNAL: Do not use.
{{/internal}}
*/
int getNumberOf{{plural}}() {
result = count(int i | {{tablename}}(this, i, _))
}
{{/is_indexed}}
{{/synth}}
{{/properties}}
}


{{#final}}
private Element getImmediateChildOf{{name}}({{name}} e, int index) {
{{^has_children}}none(){{/has_children}}
{{#has_children}}
{{! n is the base offset 0, for ease of generation }}
{{! n<child> is constructed to be strictly greater than the indexes for <child> children }}
exists(int n{{#all_children}}, int n{{property.singular}}{{/all_children}} |
n = 0
{{#all_children}}
{{#property}}
{{#synth}}
and
n{{singular}} = n{{prev}}
{{/synth}}
{{^synth}}
{{! n<child> is defined on top of the previous definition }}
{{! for single and optional properties it adds 1 (regardless of whether the optional property exists) }}
{{! for repeated it adds 1 + the maximum index (which works for repeated optional as well) }}
and
n{{singular}} = n{{prev}} {{^is_repeated}}+ 1{{/is_repeated}}{{#is_repeated}}+ e.getNumberOf{{plural}}(){{/is_repeated}}
{{/synth}}
{{/property}}
{{/all_children}} and (
none()
{{#all_children}}
{{#property}}
{{^synth}}
or
{{#is_repeated}}
result = e.get{{singular}}(index - n{{prev}})
{{/is_repeated}}
{{^is_repeated}}
index = n{{prev}} and result = e.get{{singular}}()
{{/is_repeated}}
{{/synth}}
{{/property}}
{{/all_children}}
))
{{/has_children}}
}
{{/final}}

{{/classes}}

/**
* Gets the immediate child indexed at `index`. Indexes are not guaranteed to be contiguous, but are guaranteed to be distinct.
*/
pragma[nomagic]
Element getImmediateChild(Element e, int index) {
// why does this look more complicated than it should?
// * none() simplifies generation, as we can append `or ...` without a special case for the first item
none()
{{#classes}}
{{#final}}
or
result = getImmediateChildOf{{name}}(e, index)
{{/final}}
{{/classes}}
}
}
7 changes: 6 additions & 1 deletion misc/codegen/templates/ql_parent.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,12 @@ private module Impl {
{{! for single and optional properties it adds 1 (regardless of whether the optional property exists) }}
{{! for repeated it adds 1 + the maximum index (which works for repeated optional as well) }}
and
n{{singular}} = n{{prev}} + 1{{#is_repeated}}+ max(int i | i = -1 or exists(e.get{{#type_is_hideable}}Immediate{{/type_is_hideable}}{{singular}}(i)) | i){{/is_repeated}}
{{#type_is_hideable}}
n{{singular}} = n{{prev}} + 1{{#is_repeated}}+ max(int i | i = -1 or exists(e.getImmediate{{singular}}(i)) | i){{/is_repeated}}
{{/type_is_hideable}}
{{^type_is_hideable}}
n{{singular}} = n{{prev}} {{^is_repeated}}+ 1{{/is_repeated}}{{#is_repeated}}+ e.getNumberOf{{plural}}(){{/is_repeated}}
{{/type_is_hideable}}
{{/property}}
{{/all_children}} and (
none()
Expand Down
19 changes: 19 additions & 0 deletions misc/codegen/templates/ql_synth_types.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,28 @@ module Synth {
{{/root}}
{{/non_final_classes}}

/**
* INTERNAL: Do not use.
*
* Gets the parent of synthetic element `e`.
*/
Raw::{{root}} getSynthParent(T{{root}} e) {
none()
{{#final_classes}}
{{#is_fresh_synth}}
{{#has_params}}
or
e = T{{name}}({{#params}}{{#first}}result{{/first}}{{^first}}, _{{/first}}{{/params}})
{{/has_params}}
{{/is_fresh_synth}}
{{/final_classes}}
}


{{#final_classes}}
/**
* INTERNAL: Do not use.
*
* Converts a raw element to a synthesized `T{{name}}`, if possible.
*/
T{{name}} convert{{name}}FromRaw(Raw::Element e) {
Expand Down
6 changes: 3 additions & 3 deletions rust/ql/.generated.list

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading