// generated by {{generator}} private import codeql.swift.generated.Synth private import codeql.swift.generated.Raw {{#imports}} import {{.}} {{/imports}} module Generated { {{#has_doc}} /** {{#doc}} * {{.}} {{/doc}} {{#ql_internal}} * INTERNAL: Do not use. {{/ql_internal}} */ {{/has_doc}} class {{name}} extends Synth::T{{name}}{{#bases}}, {{.}}{{/bases}} { {{#root}} /** * Gets the string representation of this element. */ string toString() { none() } // overridden by subclasses /** * Gets the name of a primary CodeQL class to which this element belongs. * * This is the most precise syntactic category to which they belong; for * example, `CallExpr` is a primary class, but `ApplyExpr` is not. * * There might be some corner cases when this returns multiple classes, or none. */ string getAPrimaryQlClass() { none() } // overridden by subclasses /** * Gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs. */ final string getPrimaryQlClasses() { result = concat(this.getAPrimaryQlClass(), ",") } /** * Gets the most immediate element that should substitute this element in the explicit AST, if any. * Classes can override this to indicate this node should be in the "hidden" AST, mostly reserved * for conversions and syntactic sugar nodes like parentheses. */ {{name}} getResolveStep() { none() } // overridden by subclasses /** * Gets the element that should substitute this element in the explicit AST, applying `getResolveStep` * transitively. */ final {{name}} resolve() { not exists(getResolveStep()) and result = this or result = getResolveStep().resolve() } {{/root}} {{#final}} override string getAPrimaryQlClass() { result = "{{name}}" } {{/final}} {{#properties}} {{#type_is_class}} /** * {{>ql_property_doc}} * * This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the * behavior of both the `Immediate` and non-`Immediate` versions. */ {{type}} getImmediate{{singular}}({{#is_repeated}}int index{{/is_repeated}}) { {{^ipa}} result = Synth::convert{{type}}FromRaw(Synth::convert{{name}}ToRaw(this){{^root}}.(Raw::{{name}}){{/root}}.{{getter}}({{#is_repeated}}index{{/is_repeated}})) {{/ipa}} {{#ipa}} none() {{/ipa}} } /** * {{>ql_property_doc}} * {{#has_description}} {{#description}} * {{.}} {{/description}} {{/has_description}} */ final {{type}} {{getter}}({{#is_repeated}}int index{{/is_repeated}}) { result = getImmediate{{singular}}({{#is_repeated}}index{{/is_repeated}}).resolve() } {{/type_is_class}} {{^type_is_class}} /** * {{>ql_property_doc}} * {{#has_description}} {{#description}} * {{.}} {{/description}} {{/has_description}} */ {{type}} {{getter}}({{#is_repeated}}int index{{/is_repeated}}) { {{^ipa}} {{^is_predicate}}result = {{/is_predicate}}Synth::convert{{name}}ToRaw(this){{^root}}.(Raw::{{name}}){{/root}}.{{getter}}({{#is_repeated}}index{{/is_repeated}}) {{/ipa}} {{#ipa}} none() {{/ipa}} } {{/type_is_class}} {{#is_optional}} /** * Holds if `{{getter}}({{#is_repeated}}index{{/is_repeated}})` exists. */ final predicate has{{singular}}({{#is_repeated}}int index{{/is_repeated}}) { exists({{getter}}({{#is_repeated}}index{{/is_repeated}})) } {{/is_optional}} {{#is_repeated}} /** * Gets any of the {{doc_plural}}. */ final {{type}} {{indefinite_getter}}() { result = {{getter}}(_) } {{^is_optional}} /** * Gets the number of {{doc_plural}}. */ final int getNumberOf{{plural}}() { result = count(int i | exists({{getter}}(i))) } {{/is_optional}} {{/is_repeated}} {{/properties}} } }