codeql/cpp/downgrades/73af5058c6899dcdb05754c27ca.../semmlecode.cpp.dbscheme

2131 строка
50 KiB
Plaintext

/**
* An invocation of the compiler. Note that more than one file may be
* compiled per invocation. For example, this command compiles three
* source files:
*
* gcc -c f1.c f2.c f3.c
*
* The `id` simply identifies the invocation, while `cwd` is the working
* directory from which the compiler was invoked.
*/
compilations(
/**
* An invocation of the compiler. Note that more than one file may
* be compiled per invocation. For example, this command compiles
* three source files:
*
* gcc -c f1.c f2.c f3.c
*/
unique int id : @compilation,
string cwd : string ref
);
/**
* The arguments that were passed to the extractor for a compiler
* invocation. If `id` is for the compiler invocation
*
* gcc -c f1.c f2.c f3.c
*
* then typically there will be rows for
*
* num | arg
* --- | ---
* 0 | *path to extractor*
* 1 | `--mimic`
* 2 | `/usr/bin/gcc`
* 3 | `-c`
* 4 | f1.c
* 5 | f2.c
* 6 | f3.c
*/
#keyset[id, num]
compilation_args(
int id : @compilation ref,
int num : int ref,
string arg : string ref
);
/**
* The source files that are compiled by a compiler invocation.
* If `id` is for the compiler invocation
*
* gcc -c f1.c f2.c f3.c
*
* then there will be rows for
*
* num | arg
* --- | ---
* 0 | f1.c
* 1 | f2.c
* 2 | f3.c
*
* Note that even if those files `#include` headers, those headers
* do not appear as rows.
*/
#keyset[id, num]
compilation_compiling_files(
int id : @compilation ref,
int num : int ref,
int file : @file ref
);
/**
* The time taken by the extractor for a compiler invocation.
*
* For each file `num`, there will be rows for
*
* kind | seconds
* ---- | ---
* 1 | CPU seconds used by the extractor frontend
* 2 | Elapsed seconds during the extractor frontend
* 3 | CPU seconds used by the extractor backend
* 4 | Elapsed seconds during the extractor backend
*/
#keyset[id, num, kind]
compilation_time(
int id : @compilation ref,
int num : int ref,
/* kind:
1 = frontend_cpu_seconds
2 = frontend_elapsed_seconds
3 = extractor_cpu_seconds
4 = extractor_elapsed_seconds
*/
int kind : int ref,
float seconds : float ref
);
/**
* An error or warning generated by the extractor.
* The diagnostic message `diagnostic` was generated during compiler
* invocation `compilation`, and is the `file_number_diagnostic_number`th
* message generated while extracting the `file_number`th file of that
* invocation.
*/
#keyset[compilation, file_number, file_number_diagnostic_number]
diagnostic_for(
int diagnostic : @diagnostic ref,
int compilation : @compilation ref,
int file_number : int ref,
int file_number_diagnostic_number : int ref
);
/**
* If extraction was successful, then `cpu_seconds` and
* `elapsed_seconds` are the CPU time and elapsed time (respectively)
* that extraction took for compiler invocation `id`.
*/
compilation_finished(
unique int id : @compilation ref,
float cpu_seconds : float ref,
float elapsed_seconds : float ref
);
/**
* External data, loaded from CSV files during snapshot creation. See
* [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data)
* for more information.
*/
externalData(
int id : @externalDataElement,
string path : string ref,
int column: int ref,
string value : string ref
);
/**
* The source location of the snapshot.
*/
sourceLocationPrefix(string prefix : string ref);
/**
* Information about packages that provide code used during compilation.
* The `id` is just a unique identifier.
* The `namespace` is typically the name of the package manager that
* provided the package (e.g. "dpkg" or "yum").
* The `package_name` is the name of the package, and `version` is its
* version (as a string).
*/
external_packages(
unique int id: @external_package,
string namespace : string ref,
string package_name : string ref,
string version : string ref
);
/**
* Holds if File `fileid` was provided by package `package`.
*/
header_to_external_package(
int fileid : @file ref,
int package : @external_package ref
);
/*
* Version history
*/
svnentries(
unique int id : @svnentry,
string revision : string ref,
string author : string ref,
date revisionDate : date ref,
int changeSize : int ref
)
svnaffectedfiles(
int id : @svnentry ref,
int file : @file ref,
string action : string ref
)
svnentrymsg(
unique int id : @svnentry ref,
string message : string ref
)
svnchurn(
int commit : @svnentry ref,
int file : @file ref,
int addedLines : int ref,
int deletedLines : int ref
)
/*
* C++ dbscheme
*/
@location = @location_stmt | @location_expr | @location_default ;
/**
* The location of an element that is not an expression or a statement.
* The location spans column `startcolumn` of line `startline` to
* column `endcolumn` of line `endline` in file `file`.
* For more information, see
* [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
*/
locations_default(
/** The location of an element that is not an expression or a statement. */
unique int id: @location_default,
int container: @container ref,
int startLine: int ref,
int startColumn: int ref,
int endLine: int ref,
int endColumn: int ref
);
/**
* The location of a statement.
* The location spans column `startcolumn` of line `startline` to
* column `endcolumn` of line `endline` in file `file`.
* For more information, see
* [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
*/
locations_stmt(
/** The location of a statement. */
unique int id: @location_stmt,
int container: @container ref,
int startLine: int ref,
int startColumn: int ref,
int endLine: int ref,
int endColumn: int ref
);
/**
* The location of an expression.
* The location spans column `startcolumn` of line `startline` to
* column `endcolumn` of line `endline` in file `file`.
* For more information, see
* [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
*/
locations_expr(
/** The location of an expression. */
unique int id: @location_expr,
int container: @container ref,
int startLine: int ref,
int startColumn: int ref,
int endLine: int ref,
int endColumn: int ref
);
/** An element for which line-count information is available. */
@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable;
numlines(
int element_id: @sourceline ref,
int num_lines: int ref,
int num_code: int ref,
int num_comment: int ref
);
diagnostics(
unique int id: @diagnostic,
int severity: int ref,
string error_tag: string ref,
string error_message: string ref,
string full_error_message: string ref,
int location: @location_default ref
);
files(
unique int id: @file,
string name: string ref
);
folders(
unique int id: @folder,
string name: string ref
);
@container = @folder | @file
containerparent(
int parent: @container ref,
unique int child: @container ref
);
fileannotations(
int id: @file ref,
int kind: int ref,
string name: string ref,
string value: string ref
);
inmacroexpansion(
int id: @element ref,
int inv: @macroinvocation ref
);
affectedbymacroexpansion(
int id: @element ref,
int inv: @macroinvocation ref
);
/*
case @macroinvocations.kind of
1 = macro expansion
| 2 = other macro reference
;
*/
macroinvocations(
unique int id: @macroinvocation,
int macro_id: @ppd_define ref,
int location: @location_default ref,
int kind: int ref
);
macroparent(
unique int id: @macroinvocation ref,
int parent_id: @macroinvocation ref
);
// a macroinvocation may be part of another location
// the way to find a constant expression that uses a macro
// is thus to find a constant expression that has a location
// to which a macro invocation is bound
macrolocationbind(
int id: @macroinvocation ref,
int location: @location ref
);
#keyset[invocation, argument_index]
macro_argument_unexpanded(
int invocation: @macroinvocation ref,
int argument_index: int ref,
string text: string ref
);
#keyset[invocation, argument_index]
macro_argument_expanded(
int invocation: @macroinvocation ref,
int argument_index: int ref,
string text: string ref
);
/*
case @function.kind of
1 = normal
| 2 = constructor
| 3 = destructor
| 4 = conversion
| 5 = operator
| 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk
;
*/
functions(
unique int id: @function,
string name: string ref,
int kind: int ref
);
function_entry_point(int id: @function ref, unique int entry_point: @stmt ref);
function_return_type(int id: @function ref, int return_type: @type ref);
/** If `function` is a coroutine, then this gives the
std::experimental::resumable_traits instance associated with it,
and the variables representing the `handle` and `promise` for it. */
coroutine(
unique int function: @function ref,
int traits: @type ref,
int handle: @variable ref,
int promise: @variable ref
);
/** The `new` function used for allocating the coroutine state, if any. */
coroutine_new(
unique int function: @function ref,
int new: @function ref
);
/** The `delete` function used for deallocating the coroutine state, if any. */
coroutine_delete(
unique int function: @function ref,
int delete: @function ref
);
purefunctions(unique int id: @function ref);
function_deleted(unique int id: @function ref);
function_defaulted(unique int id: @function ref);
member_function_this_type(unique int id: @function ref, int this_type: @type ref);
#keyset[id, type_id]
fun_decls(
int id: @fun_decl,
int function: @function ref,
int type_id: @type ref,
string name: string ref,
int location: @location_default ref
);
fun_def(unique int id: @fun_decl ref);
fun_specialized(unique int id: @fun_decl ref);
fun_implicit(unique int id: @fun_decl ref);
fun_decl_specifiers(
int id: @fun_decl ref,
string name: string ref
)
#keyset[fun_decl, index]
fun_decl_throws(
int fun_decl: @fun_decl ref,
int index: int ref,
int type_id: @type ref
);
/* an empty throw specification is different from none */
fun_decl_empty_throws(unique int fun_decl: @fun_decl ref);
fun_decl_noexcept(
int fun_decl: @fun_decl ref,
int constant: @expr ref
);
fun_decl_empty_noexcept(int fun_decl: @fun_decl ref);
fun_decl_typedef_type(
unique int fun_decl: @fun_decl ref,
int typedeftype_id: @usertype ref
);
param_decl_bind(
unique int id: @var_decl ref,
int index: int ref,
int fun_decl: @fun_decl ref
);
#keyset[id, type_id]
var_decls(
int id: @var_decl,
int variable: @variable ref,
int type_id: @type ref,
string name: string ref,
int location: @location_default ref
);
var_def(unique int id: @var_decl ref);
var_decl_specifiers(
int id: @var_decl ref,
string name: string ref
)
is_structured_binding(unique int id: @variable ref);
type_decls(
unique int id: @type_decl,
int type_id: @type ref,
int location: @location_default ref
);
type_def(unique int id: @type_decl ref);
type_decl_top(
unique int type_decl: @type_decl ref
);
namespace_decls(
unique int id: @namespace_decl,
int namespace_id: @namespace ref,
int location: @location_default ref,
int bodylocation: @location_default ref
);
usings(
unique int id: @using,
int element_id: @element ref,
int location: @location_default ref
);
/** The element which contains the `using` declaration. */
using_container(
int parent: @element ref,
int child: @using ref
);
static_asserts(
unique int id: @static_assert,
int condition : @expr ref,
string message : string ref,
int location: @location_default ref,
int enclosing : @element ref
);
// each function has an ordered list of parameters
#keyset[id, type_id]
#keyset[function, index, type_id]
params(
int id: @parameter,
int function: @functionorblock ref,
int index: int ref,
int type_id: @type ref
);
overrides(int new: @function ref, int old: @function ref);
#keyset[id, type_id]
membervariables(
int id: @membervariable,
int type_id: @type ref,
string name: string ref
);
#keyset[id, type_id]
globalvariables(
int id: @globalvariable,
int type_id: @type ref,
string name: string ref
);
#keyset[id, type_id]
localvariables(
int id: @localvariable,
int type_id: @type ref,
string name: string ref
);
autoderivation(
unique int var: @variable ref,
int derivation_type: @type ref
);
enumconstants(
unique int id: @enumconstant,
int parent: @usertype ref,
int index: int ref,
int type_id: @type ref,
string name: string ref,
int location: @location_default ref
);
@variable = @localscopevariable | @globalvariable | @membervariable;
@localscopevariable = @localvariable | @parameter;
/*
Built-in types are the fundamental types, e.g., integral, floating, and void.
case @builtintype.kind of
1 = error
| 2 = unknown
| 3 = void
| 4 = boolean
| 5 = char
| 6 = unsigned_char
| 7 = signed_char
| 8 = short
| 9 = unsigned_short
| 10 = signed_short
| 11 = int
| 12 = unsigned_int
| 13 = signed_int
| 14 = long
| 15 = unsigned_long
| 16 = signed_long
| 17 = long_long
| 18 = unsigned_long_long
| 19 = signed_long_long
| 20 = __int8 // Microsoft-specific
| 21 = __int16 // Microsoft-specific
| 22 = __int32 // Microsoft-specific
| 23 = __int64 // Microsoft-specific
| 24 = float
| 25 = double
| 26 = long_double
| 27 = _Complex_float // C99-specific
| 28 = _Complex_double // C99-specific
| 29 = _Complex_long double // C99-specific
| 30 = _Imaginary_float // C99-specific
| 31 = _Imaginary_double // C99-specific
| 32 = _Imaginary_long_double // C99-specific
| 33 = wchar_t // Microsoft-specific
| 34 = decltype_nullptr // C++11
| 35 = __int128
| 36 = unsigned___int128
| 37 = signed___int128
| 38 = __float128
| 39 = _Complex___float128
| 40 = _Decimal32
| 41 = _Decimal64
| 42 = _Decimal128
| 43 = char16_t
| 44 = char32_t
| 45 = _Float32
| 46 = _Float32x
| 47 = _Float64
| 48 = _Float64x
| 49 = _Float128
| 50 = _Float128x
| 51 = char8_t
;
*/
builtintypes(
unique int id: @builtintype,
string name: string ref,
int kind: int ref,
int size: int ref,
int sign: int ref,
int alignment: int ref
);
/*
Derived types are types that are directly derived from existing types and
point to, refer to, transform type data to return a new type.
case @derivedtype.kind of
1 = pointer
| 2 = reference
| 3 = type_with_specifiers
| 4 = array
| 5 = gnu_vector
| 6 = routineptr
| 7 = routinereference
| 8 = rvalue_reference // C++11
// ... 9 type_conforming_to_protocols deprecated
| 10 = block
;
*/
derivedtypes(
unique int id: @derivedtype,
string name: string ref,
int kind: int ref,
int type_id: @type ref
);
pointerishsize(unique int id: @derivedtype ref,
int size: int ref,
int alignment: int ref);
arraysizes(
unique int id: @derivedtype ref,
int num_elements: int ref,
int bytesize: int ref,
int alignment: int ref
);
typedefbase(
unique int id: @usertype ref,
int type_id: @type ref
);
/**
* An instance of the C++11 `decltype` operator. For example:
* ```
* int a;
* decltype(1+a) b;
* ```
* Here `expr` is `1+a`.
*
* Sometimes an additional pair of parentheses around the expression
* would change the semantics of this decltype, e.g.
* ```
* struct A { double x; };
* const A* a = new A();
* decltype( a->x ); // type is double
* decltype((a->x)); // type is const double&
* ```
* (Please consult the C++11 standard for more details).
* `parentheses_would_change_meaning` is `true` iff that is the case.
*/
#keyset[id, expr]
decltypes(
int id: @decltype,
int expr: @expr ref,
int base_type: @type ref,
boolean parentheses_would_change_meaning: boolean ref
);
/*
case @usertype.kind of
1 = struct
| 2 = class
| 3 = union
| 4 = enum
| 5 = typedef // classic C: typedef typedef type name
| 6 = template
| 7 = template_parameter
| 8 = template_template_parameter
| 9 = proxy_class // a proxy class associated with a template parameter
// ... 10 objc_class deprecated
// ... 11 objc_protocol deprecated
// ... 12 objc_category deprecated
| 13 = scoped_enum
| 14 = using_alias // a using name = type style typedef
;
*/
usertypes(
unique int id: @usertype,
string name: string ref,
int kind: int ref
);
usertypesize(
unique int id: @usertype ref,
int size: int ref,
int alignment: int ref
);
usertype_final(unique int id: @usertype ref);
usertype_uuid(
unique int id: @usertype ref,
string uuid: string ref
);
mangled_name(
unique int id: @declaration ref,
int mangled_name : @mangledname
);
is_pod_class(unique int id: @usertype ref);
is_standard_layout_class(unique int id: @usertype ref);
is_complete(unique int id: @usertype ref);
is_class_template(unique int id: @usertype ref);
class_instantiation(
int to: @usertype ref,
int from: @usertype ref
);
class_template_argument(
int type_id: @usertype ref,
int index: int ref,
int arg_type: @type ref
);
class_template_argument_value(
int type_id: @usertype ref,
int index: int ref,
int arg_value: @expr ref
);
is_proxy_class_for(
unique int id: @usertype ref,
unique int templ_param_id: @usertype ref
);
type_mentions(
unique int id: @type_mention,
int type_id: @type ref,
int location: @location ref,
// a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there.
int kind: int ref
);
is_function_template(unique int id: @function ref);
function_instantiation(
unique int to: @function ref,
int from: @function ref
);
function_template_argument(
int function_id: @function ref,
int index: int ref,
int arg_type: @type ref
);
function_template_argument_value(
int function_id: @function ref,
int index: int ref,
int arg_value: @expr ref
);
is_variable_template(unique int id: @variable ref);
variable_instantiation(
unique int to: @variable ref,
int from: @variable ref
);
variable_template_argument(
int variable_id: @variable ref,
int index: int ref,
int arg_type: @type ref
);
variable_template_argument_value(
int variable_id: @variable ref,
int index: int ref,
int arg_value: @expr ref
);
/*
Fixed point types
precision(1) = short, precision(2) = default, precision(3) = long
is_unsigned(1) = unsigned is_unsigned(2) = signed
is_fract_type(1) = declared with _Fract
saturating(1) = declared with _Sat
*/
/* TODO
fixedpointtypes(
unique int id: @fixedpointtype,
int precision: int ref,
int is_unsigned: int ref,
int is_fract_type: int ref,
int saturating: int ref);
*/
routinetypes(
unique int id: @routinetype,
int return_type: @type ref
);
routinetypeargs(
int routine: @routinetype ref,
int index: int ref,
int type_id: @type ref
);
ptrtomembers(
unique int id: @ptrtomember,
int type_id: @type ref,
int class_id: @type ref
);
/*
specifiers for types, functions, and variables
"public",
"protected",
"private",
"const",
"volatile",
"static",
"pure",
"virtual",
"sealed", // Microsoft
"__interface", // Microsoft
"inline",
"explicit",
"near", // near far extension
"far", // near far extension
"__ptr32", // Microsoft
"__ptr64", // Microsoft
"__sptr", // Microsoft
"__uptr", // Microsoft
"dllimport", // Microsoft
"dllexport", // Microsoft
"thread", // Microsoft
"naked", // Microsoft
"microsoft_inline", // Microsoft
"forceinline", // Microsoft
"selectany", // Microsoft
"nothrow", // Microsoft
"novtable", // Microsoft
"noreturn", // Microsoft
"noinline", // Microsoft
"noalias", // Microsoft
"restrict", // Microsoft
*/
specifiers(
unique int id: @specifier,
unique string str: string ref
);
typespecifiers(
int type_id: @type ref,
int spec_id: @specifier ref
);
funspecifiers(
int func_id: @function ref,
int spec_id: @specifier ref
);
varspecifiers(
int var_id: @accessible ref,
int spec_id: @specifier ref
);
attributes(
unique int id: @attribute,
int kind: int ref,
string name: string ref,
string name_space: string ref,
int location: @location_default ref
);
case @attribute.kind of
0 = @gnuattribute
| 1 = @stdattribute
| 2 = @declspec
| 3 = @msattribute
| 4 = @alignas
// ... 5 @objc_propertyattribute deprecated
;
attribute_args(
unique int id: @attribute_arg,
int kind: int ref,
int attribute: @attribute ref,
int index: int ref,
int location: @location_default ref
);
case @attribute_arg.kind of
0 = @attribute_arg_empty
| 1 = @attribute_arg_token
| 2 = @attribute_arg_constant
| 3 = @attribute_arg_type
| 4 = @attribute_arg_constant_expr
;
attribute_arg_value(
unique int arg: @attribute_arg ref,
string value: string ref
);
attribute_arg_type(
unique int arg: @attribute_arg ref,
int type_id: @type ref
);
attribute_arg_constant(
unique int arg: @attribute_arg ref,
int constant: @expr ref
)
attribute_arg_name(
unique int arg: @attribute_arg ref,
string name: string ref
);
typeattributes(
int type_id: @type ref,
int spec_id: @attribute ref
);
funcattributes(
int func_id: @function ref,
int spec_id: @attribute ref
);
varattributes(
int var_id: @accessible ref,
int spec_id: @attribute ref
);
stmtattributes(
int stmt_id: @stmt ref,
int spec_id: @attribute ref
);
@type = @builtintype
| @derivedtype
| @usertype
/* TODO | @fixedpointtype */
| @routinetype
| @ptrtomember
| @decltype;
unspecifiedtype(
unique int type_id: @type ref,
int unspecified_type_id: @type ref
);
member(
int parent: @type ref,
int index: int ref,
int child: @member ref
);
@enclosingfunction_child = @usertype | @variable | @namespace
enclosingfunction(
unique int child: @enclosingfunction_child ref,
int parent: @function ref
);
derivations(
unique int derivation: @derivation,
int sub: @type ref,
int index: int ref,
int super: @type ref,
int location: @location_default ref
);
derspecifiers(
int der_id: @derivation ref,
int spec_id: @specifier ref
);
/**
* Contains the byte offset of the base class subobject within the derived
* class. Only holds for non-virtual base classes, but see table
* `virtual_base_offsets` for offsets of virtual base class subobjects.
*/
direct_base_offsets(
unique int der_id: @derivation ref,
int offset: int ref
);
/**
* Contains the byte offset of the virtual base class subobject for class
* `super` within a most-derived object of class `sub`. `super` can be either a
* direct or indirect base class.
*/
#keyset[sub, super]
virtual_base_offsets(
int sub: @usertype ref,
int super: @usertype ref,
int offset: int ref
);
frienddecls(
unique int id: @frienddecl,
int type_id: @type ref,
int decl_id: @declaration ref,
int location: @location_default ref
);
@declaredtype = @usertype ;
@declaration = @function
| @declaredtype
| @variable
| @enumconstant
| @frienddecl;
@member = @membervariable
| @function
| @declaredtype
| @enumconstant;
@locatable = @diagnostic
| @declaration
| @ppd_include
| @ppd_define
| @macroinvocation
/*| @funcall*/
| @xmllocatable
| @attribute
| @attribute_arg;
@namedscope = @namespace | @usertype;
@element = @locatable
| @file
| @folder
| @specifier
| @type
| @expr
| @namespace
| @initialiser
| @stmt
| @derivation
| @comment
| @preprocdirect
| @fun_decl
| @var_decl
| @type_decl
| @namespace_decl
| @using
| @namequalifier
| @specialnamequalifyingelement
| @static_assert
| @type_mention
| @lambdacapture;
@exprparent = @element;
comments(
unique int id: @comment,
string contents: string ref,
int location: @location_default ref
);
commentbinding(
int id: @comment ref,
int element: @element ref
);
exprconv(
int converted: @expr ref,
unique int conversion: @expr ref
);
compgenerated(unique int id: @element ref);
/**
* `destructor_call` destructs the `i`'th entity that should be
* destructed following `element`. Note that entities should be
* destructed in reverse construction order, so for a given `element`
* these should be called from highest to lowest `i`.
*/
#keyset[element, destructor_call]
#keyset[element, i]
synthetic_destructor_call(
int element: @element ref,
int i: int ref,
int destructor_call: @routineexpr ref
);
namespaces(
unique int id: @namespace,
string name: string ref
);
namespace_inline(
unique int id: @namespace ref
);
namespacembrs(
int parentid: @namespace ref,
unique int memberid: @namespacembr ref
);
@namespacembr = @declaration | @namespace;
exprparents(
int expr_id: @expr ref,
int child_index: int ref,
int parent_id: @exprparent ref
);
expr_isload(unique int expr_id: @expr ref);
@cast = @c_style_cast
| @const_cast
| @dynamic_cast
| @reinterpret_cast
| @static_cast
;
/*
case @conversion.kind of
0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast
| 1 = @bool_conversion // conversion to 'bool'
| 2 = @base_class_conversion // a derived-to-base conversion
| 3 = @derived_class_conversion // a base-to-derived conversion
| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member
| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member
| 6 = @glvalue_adjust // an adjustment of the type of a glvalue
| 7 = @prvalue_adjust // an adjustment of the type of a prvalue
;
*/
/**
* Describes the semantics represented by a cast expression. This is largely
* independent of the source syntax of the cast, so it is separate from the
* regular expression kind.
*/
conversionkinds(
unique int expr_id: @cast ref,
int kind: int ref
);
@conversion = @cast
| @array_to_pointer
| @parexpr
| @reference_to
| @ref_indirect
| @temp_init
;
/*
case @funbindexpr.kind of
0 = @normal_call // a normal call
| 1 = @virtual_call // a virtual call
| 2 = @adl_call // a call whose target is only found by ADL
;
*/
iscall(unique int caller: @funbindexpr ref, int kind: int ref);
numtemplatearguments(
unique int expr_id: @expr ref,
int num: int ref
);
specialnamequalifyingelements(
unique int id: @specialnamequalifyingelement,
unique string name: string ref
);
@namequalifiableelement = @expr | @namequalifier;
@namequalifyingelement = @namespace
| @specialnamequalifyingelement
| @usertype;
namequalifiers(
unique int id: @namequalifier,
unique int qualifiableelement: @namequalifiableelement ref,
int qualifyingelement: @namequalifyingelement ref,
int location: @location_default ref
);
varbind(
int expr: @varbindexpr ref,
int var: @accessible ref
);
funbind(
int expr: @funbindexpr ref,
int fun: @function ref
);
@any_new_expr = @new_expr
| @new_array_expr;
@new_or_delete_expr = @any_new_expr
| @delete_expr
| @delete_array_expr;
@prefix_crement_expr = @preincrexpr | @predecrexpr;
@postfix_crement_expr = @postincrexpr | @postdecrexpr;
@increment_expr = @preincrexpr | @postincrexpr;
@decrement_expr = @predecrexpr | @postdecrexpr;
@crement_expr = @increment_expr | @decrement_expr;
@un_arith_op_expr = @arithnegexpr
| @unaryplusexpr
| @conjugation
| @realpartexpr
| @imagpartexpr
| @crement_expr
;
@un_bitwise_op_expr = @complementexpr;
@un_log_op_expr = @notexpr;
@un_op_expr = @address_of
| @indirect
| @un_arith_op_expr
| @un_bitwise_op_expr
| @builtinaddressof
| @vec_fill
| @un_log_op_expr
| @co_await
| @co_yield
;
@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr;
@cmp_op_expr = @eq_op_expr | @rel_op_expr;
@eq_op_expr = @eqexpr | @neexpr;
@rel_op_expr = @gtexpr
| @ltexpr
| @geexpr
| @leexpr
| @spaceshipexpr
;
@bin_bitwise_op_expr = @lshiftexpr
| @rshiftexpr
| @andexpr
| @orexpr
| @xorexpr
;
@p_arith_op_expr = @paddexpr
| @psubexpr
| @pdiffexpr
;
@bin_arith_op_expr = @addexpr
| @subexpr
| @mulexpr
| @divexpr
| @remexpr
| @jmulexpr
| @jdivexpr
| @fjaddexpr
| @jfaddexpr
| @fjsubexpr
| @jfsubexpr
| @minexpr
| @maxexpr
| @p_arith_op_expr
;
@bin_op_expr = @bin_arith_op_expr
| @bin_bitwise_op_expr
| @cmp_op_expr
| @bin_log_op_expr
;
@op_expr = @un_op_expr
| @bin_op_expr
| @assign_expr
| @conditionalexpr
;
@assign_arith_expr = @assignaddexpr
| @assignsubexpr
| @assignmulexpr
| @assigndivexpr
| @assignremexpr
;
@assign_bitwise_expr = @assignandexpr
| @assignorexpr
| @assignxorexpr
| @assignlshiftexpr
| @assignrshiftexpr
| @assignpaddexpr
| @assignpsubexpr
;
@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr
@assign_expr = @assignexpr | @assign_op_expr
/*
case @allocator.form of
0 = plain
| 1 = alignment
;
*/
/**
* The allocator function associated with a `new` or `new[]` expression.
* The `form` column specified whether the allocation call contains an alignment
* argument.
*/
expr_allocator(
unique int expr: @any_new_expr ref,
int func: @function ref,
int form: int ref
);
/*
case @deallocator.form of
0 = plain
| 1 = size
| 2 = alignment
| 3 = size_and_alignment
;
*/
/**
* The deallocator function associated with a `delete`, `delete[]`, `new`, or
* `new[]` expression. For a `new` or `new[]` expression, the deallocator is the
* one used to free memory if the initialization throws an exception.
* The `form` column specifies whether the deallocation call contains a size
* argument, and alignment argument, or both.
*/
expr_deallocator(
unique int expr: @new_or_delete_expr ref,
int func: @function ref,
int form: int ref
);
/**
* Holds if the `@conditionalexpr` is of the two operand form
* `guard ? : false`.
*/
expr_cond_two_operand(
unique int cond: @conditionalexpr ref
);
/**
* The guard of `@conditionalexpr` `guard ? true : false`
*/
expr_cond_guard(
unique int cond: @conditionalexpr ref,
int guard: @expr ref
);
/**
* The expression used when the guard of `@conditionalexpr`
* `guard ? true : false` holds. For the two operand form
* `guard ?: false` consider using `expr_cond_guard` instead.
*/
expr_cond_true(
unique int cond: @conditionalexpr ref,
int true: @expr ref
);
/**
* The expression used when the guard of `@conditionalexpr`
* `guard ? true : false` does not hold.
*/
expr_cond_false(
unique int cond: @conditionalexpr ref,
int false: @expr ref
);
/** A string representation of the value. */
values(
unique int id: @value,
string str: string ref
);
/** The actual text in the source code for the value, if any. */
valuetext(
unique int id: @value ref,
string text: string ref
);
valuebind(
int val: @value ref,
unique int expr: @expr ref
);
fieldoffsets(
unique int id: @variable ref,
int byteoffset: int ref,
int bitoffset: int ref
);
bitfield(
unique int id: @variable ref,
int bits: int ref,
int declared_bits: int ref
);
/* TODO
memberprefix(
int member: @expr ref,
int prefix: @expr ref
);
*/
/*
kind(1) = mbrcallexpr
kind(2) = mbrptrcallexpr
kind(3) = mbrptrmbrcallexpr
kind(4) = ptrmbrptrmbrcallexpr
kind(5) = mbrreadexpr // x.y
kind(6) = mbrptrreadexpr // p->y
kind(7) = mbrptrmbrreadexpr // x.*pm
kind(8) = mbrptrmbrptrreadexpr // x->*pm
kind(9) = staticmbrreadexpr // static x.y
kind(10) = staticmbrptrreadexpr // static p->y
*/
/* TODO
memberaccess(
int member: @expr ref,
int kind: int ref
);
*/
initialisers(
unique int init: @initialiser,
int var: @accessible ref,
unique int expr: @expr ref,
int location: @location_expr ref
);
braced_initialisers(
int init: @initialiser ref
);
/**
* An ancestor for the expression, for cases in which we cannot
* otherwise find the expression's parent.
*/
expr_ancestor(
int exp: @expr ref,
int ancestor: @element ref
);
exprs(
unique int id: @expr,
int kind: int ref,
int location: @location_expr ref
);
/*
case @value.category of
1 = prval
| 2 = xval
| 3 = lval
;
*/
expr_types(
int id: @expr ref,
int typeid: @type ref,
int value_category: int ref
);
case @expr.kind of
1 = @errorexpr
| 2 = @address_of // & AddressOfExpr
| 3 = @reference_to // ReferenceToExpr (implicit?)
| 4 = @indirect // * PointerDereferenceExpr
| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?)
// ...
| 8 = @array_to_pointer // (???)
| 9 = @vacuous_destructor_call // VacuousDestructorCall
// ...
| 11 = @assume // Microsoft
| 12 = @parexpr
| 13 = @arithnegexpr
| 14 = @unaryplusexpr
| 15 = @complementexpr
| 16 = @notexpr
| 17 = @conjugation // GNU ~ operator
| 18 = @realpartexpr // GNU __real
| 19 = @imagpartexpr // GNU __imag
| 20 = @postincrexpr
| 21 = @postdecrexpr
| 22 = @preincrexpr
| 23 = @predecrexpr
| 24 = @conditionalexpr
| 25 = @addexpr
| 26 = @subexpr
| 27 = @mulexpr
| 28 = @divexpr
| 29 = @remexpr
| 30 = @jmulexpr // C99 mul imaginary
| 31 = @jdivexpr // C99 div imaginary
| 32 = @fjaddexpr // C99 add real + imaginary
| 33 = @jfaddexpr // C99 add imaginary + real
| 34 = @fjsubexpr // C99 sub real - imaginary
| 35 = @jfsubexpr // C99 sub imaginary - real
| 36 = @paddexpr // pointer add (pointer + int or int + pointer)
| 37 = @psubexpr // pointer sub (pointer - integer)
| 38 = @pdiffexpr // difference between two pointers
| 39 = @lshiftexpr
| 40 = @rshiftexpr
| 41 = @andexpr
| 42 = @orexpr
| 43 = @xorexpr
| 44 = @eqexpr
| 45 = @neexpr
| 46 = @gtexpr
| 47 = @ltexpr
| 48 = @geexpr
| 49 = @leexpr
| 50 = @minexpr // GNU minimum
| 51 = @maxexpr // GNU maximum
| 52 = @assignexpr
| 53 = @assignaddexpr
| 54 = @assignsubexpr
| 55 = @assignmulexpr
| 56 = @assigndivexpr
| 57 = @assignremexpr
| 58 = @assignlshiftexpr
| 59 = @assignrshiftexpr
| 60 = @assignandexpr
| 61 = @assignorexpr
| 62 = @assignxorexpr
| 63 = @assignpaddexpr // assign pointer add
| 64 = @assignpsubexpr // assign pointer sub
| 65 = @andlogicalexpr
| 66 = @orlogicalexpr
| 67 = @commaexpr
| 68 = @subscriptexpr // access to member of an array, e.g., a[5]
// ... 69 @objc_subscriptexpr deprecated
// ... 70 @cmdaccess deprecated
// ...
| 73 = @virtfunptrexpr
| 74 = @callexpr
// ... 75 @msgexpr_normal deprecated
// ... 76 @msgexpr_super deprecated
// ... 77 @atselectorexpr deprecated
// ... 78 @atprotocolexpr deprecated
| 79 = @vastartexpr
| 80 = @vaargexpr
| 81 = @vaendexpr
| 82 = @vacopyexpr
// ... 83 @atencodeexpr deprecated
| 84 = @varaccess
| 85 = @thisaccess
// ... 86 @objc_box_expr deprecated
| 87 = @new_expr
| 88 = @delete_expr
| 89 = @throw_expr
| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2)
| 91 = @braced_init_list
| 92 = @type_id
| 93 = @runtime_sizeof
| 94 = @runtime_alignof
| 95 = @sizeof_pack
| 96 = @expr_stmt // GNU extension
| 97 = @routineexpr
| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....)
| 99 = @offsetofexpr // offsetof ::= type and field
| 100 = @hasassignexpr // __has_assign ::= type
| 101 = @hascopyexpr // __has_copy ::= type
| 102 = @hasnothrowassign // __has_nothrow_assign ::= type
| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type
| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type
| 105 = @hastrivialassign // __has_trivial_assign ::= type
| 106 = @hastrivialconstr // __has_trivial_constructor ::= type
| 107 = @hastrivialcopy // __has_trivial_copy ::= type
| 108 = @hasuserdestr // __has_user_destructor ::= type
| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type
| 110 = @isabstractexpr // __is_abstract ::= type
| 111 = @isbaseofexpr // __is_base_of ::= type type
| 112 = @isclassexpr // __is_class ::= type
| 113 = @isconvtoexpr // __is_convertible_to ::= type type
| 114 = @isemptyexpr // __is_empty ::= type
| 115 = @isenumexpr // __is_enum ::= type
| 116 = @ispodexpr // __is_pod ::= type
| 117 = @ispolyexpr // __is_polymorphic ::= type
| 118 = @isunionexpr // __is_union ::= type
| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type
| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof
// ...
| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type
| 123 = @literal
| 124 = @uuidof
| 127 = @aggregateliteral
| 128 = @delete_array_expr
| 129 = @new_array_expr
// ... 130 @objc_array_literal deprecated
// ... 131 @objc_dictionary_literal deprecated
| 132 = @foldexpr
// ...
| 200 = @ctordirectinit
| 201 = @ctorvirtualinit
| 202 = @ctorfieldinit
| 203 = @ctordelegatinginit
| 204 = @dtordirectdestruct
| 205 = @dtorvirtualdestruct
| 206 = @dtorfielddestruct
// ...
| 210 = @static_cast
| 211 = @reinterpret_cast
| 212 = @const_cast
| 213 = @dynamic_cast
| 214 = @c_style_cast
| 215 = @lambdaexpr
| 216 = @param_ref
| 217 = @noopexpr
// ...
| 294 = @istriviallyconstructibleexpr
| 295 = @isdestructibleexpr
| 296 = @isnothrowdestructibleexpr
| 297 = @istriviallydestructibleexpr
| 298 = @istriviallyassignableexpr
| 299 = @isnothrowassignableexpr
| 300 = @istrivialexpr
| 301 = @isstandardlayoutexpr
| 302 = @istriviallycopyableexpr
| 303 = @isliteraltypeexpr
| 304 = @hastrivialmoveconstructorexpr
| 305 = @hastrivialmoveassignexpr
| 306 = @hasnothrowmoveassignexpr
| 307 = @isconstructibleexpr
| 308 = @isnothrowconstructibleexpr
| 309 = @hasfinalizerexpr
| 310 = @isdelegateexpr
| 311 = @isinterfaceclassexpr
| 312 = @isrefarrayexpr
| 313 = @isrefclassexpr
| 314 = @issealedexpr
| 315 = @issimplevalueclassexpr
| 316 = @isvalueclassexpr
| 317 = @isfinalexpr
| 319 = @noexceptexpr
| 320 = @builtinshufflevector
| 321 = @builtinchooseexpr
| 322 = @builtinaddressof
| 323 = @vec_fill
| 324 = @builtinconvertvector
| 325 = @builtincomplex
| 326 = @spaceshipexpr
| 327 = @co_await
| 328 = @co_yield
| 329 = @temp_init
| 330 = @isassignable
| 331 = @isaggregate
| 332 = @hasuniqueobjectrepresentations
| 333 = @builtinbitcast
| 334 = @builtinshuffle
;
@var_args_expr = @vastartexpr
| @vaendexpr
| @vaargexpr
| @vacopyexpr
;
@builtin_op = @var_args_expr
| @noopexpr
| @offsetofexpr
| @intaddrexpr
| @hasassignexpr
| @hascopyexpr
| @hasnothrowassign
| @hasnothrowconstr
| @hasnothrowcopy
| @hastrivialassign
| @hastrivialconstr
| @hastrivialcopy
| @hastrivialdestructor
| @hasuserdestr
| @hasvirtualdestr
| @isabstractexpr
| @isbaseofexpr
| @isclassexpr
| @isconvtoexpr
| @isemptyexpr
| @isenumexpr
| @ispodexpr
| @ispolyexpr
| @isunionexpr
| @typescompexpr
| @builtinshufflevector
| @builtinconvertvector
| @builtinaddressof
| @istriviallyconstructibleexpr
| @isdestructibleexpr
| @isnothrowdestructibleexpr
| @istriviallydestructibleexpr
| @istriviallyassignableexpr
| @isnothrowassignableexpr
| @isstandardlayoutexpr
| @istriviallycopyableexpr
| @isliteraltypeexpr
| @hastrivialmoveconstructorexpr
| @hastrivialmoveassignexpr
| @hasnothrowmoveassignexpr
| @isconstructibleexpr
| @isnothrowconstructibleexpr
| @hasfinalizerexpr
| @isdelegateexpr
| @isinterfaceclassexpr
| @isrefarrayexpr
| @isrefclassexpr
| @issealedexpr
| @issimplevalueclassexpr
| @isvalueclassexpr
| @isfinalexpr
| @builtinchooseexpr
| @builtincomplex
| @isassignable
| @isaggregate
| @hasuniqueobjectrepresentations
| @builtinbitcast
| @builtinshuffle
;
new_allocated_type(
unique int expr: @new_expr ref,
int type_id: @type ref
);
new_array_allocated_type(
unique int expr: @new_array_expr ref,
int type_id: @type ref
);
/**
* The field being initialized by an initializer expression within an aggregate
* initializer for a class/struct/union.
*/
#keyset[aggregate, field]
aggregate_field_init(
int aggregate: @aggregateliteral ref,
int initializer: @expr ref,
int field: @membervariable ref
);
/**
* The index of the element being initialized by an initializer expression
* within an aggregate initializer for an array.
*/
#keyset[aggregate, element_index]
aggregate_array_init(
int aggregate: @aggregateliteral ref,
int initializer: @expr ref,
int element_index: int ref
);
@ctorinit = @ctordirectinit
| @ctorvirtualinit
| @ctorfieldinit
| @ctordelegatinginit;
@dtordestruct = @dtordirectdestruct
| @dtorvirtualdestruct
| @dtorfielddestruct;
condition_decl_bind(
unique int expr: @condition_decl ref,
unique int decl: @declaration ref
);
typeid_bind(
unique int expr: @type_id ref,
int type_id: @type ref
);
uuidof_bind(
unique int expr: @uuidof ref,
int type_id: @type ref
);
@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof;
sizeof_bind(
unique int expr: @runtime_sizeof_or_alignof ref,
int type_id: @type ref
);
code_block(
unique int block: @literal ref,
unique int routine: @function ref
);
lambdas(
unique int expr: @lambdaexpr ref,
string default_capture: string ref,
boolean has_explicit_return_type: boolean ref
);
lambda_capture(
unique int id: @lambdacapture,
int lambda: @lambdaexpr ref,
int index: int ref,
int field: @membervariable ref,
boolean captured_by_reference: boolean ref,
boolean is_implicit: boolean ref,
int location: @location_default ref
);
@funbindexpr = @routineexpr
| @new_expr
| @delete_expr
| @delete_array_expr
| @ctordirectinit
| @ctorvirtualinit
| @ctordelegatinginit
| @dtordirectdestruct
| @dtorvirtualdestruct;
@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct;
@addressable = @function | @variable ;
@accessible = @addressable | @enumconstant ;
@access = @varaccess | @routineexpr ;
fold(
int expr: @foldexpr ref,
string operator: string ref,
boolean is_left_fold: boolean ref
);
stmts(
unique int id: @stmt,
int kind: int ref,
int location: @location_stmt ref
);
case @stmt.kind of
1 = @stmt_expr
| 2 = @stmt_if
| 3 = @stmt_while
| 4 = @stmt_goto
| 5 = @stmt_label
| 6 = @stmt_return
| 7 = @stmt_block
| 8 = @stmt_end_test_while // do { ... } while ( ... )
| 9 = @stmt_for
| 10 = @stmt_switch_case
| 11 = @stmt_switch
| 13 = @stmt_asm // "asm" statement or the body of an asm function
| 15 = @stmt_try_block
| 16 = @stmt_microsoft_try // Microsoft
| 17 = @stmt_decl
| 18 = @stmt_set_vla_size // C99
| 19 = @stmt_vla_decl // C99
| 25 = @stmt_assigned_goto // GNU
| 26 = @stmt_empty
| 27 = @stmt_continue
| 28 = @stmt_break
| 29 = @stmt_range_based_for // C++11
// ... 30 @stmt_at_autoreleasepool_block deprecated
// ... 31 @stmt_objc_for_in deprecated
// ... 32 @stmt_at_synchronized deprecated
| 33 = @stmt_handler
// ... 34 @stmt_finally_end deprecated
| 35 = @stmt_constexpr_if
| 37 = @stmt_co_return
;
type_vla(
int type_id: @type ref,
int decl: @stmt_vla_decl ref
);
variable_vla(
int var: @variable ref,
int decl: @stmt_vla_decl ref
);
if_initialization(
unique int if_stmt: @stmt_if ref,
int init_id: @stmt ref
);
if_then(
unique int if_stmt: @stmt_if ref,
int then_id: @stmt ref
);
if_else(
unique int if_stmt: @stmt_if ref,
int else_id: @stmt ref
);
constexpr_if_initialization(
unique int constexpr_if_stmt: @stmt_constexpr_if ref,
int init_id: @stmt ref
);
constexpr_if_then(
unique int constexpr_if_stmt: @stmt_constexpr_if ref,
int then_id: @stmt ref
);
constexpr_if_else(
unique int constexpr_if_stmt: @stmt_constexpr_if ref,
int else_id: @stmt ref
);
while_body(
unique int while_stmt: @stmt_while ref,
int body_id: @stmt ref
);
do_body(
unique int do_stmt: @stmt_end_test_while ref,
int body_id: @stmt ref
);
switch_initialization(
unique int switch_stmt: @stmt_switch ref,
int init_id: @stmt ref
);
#keyset[switch_stmt, index]
switch_case(
int switch_stmt: @stmt_switch ref,
int index: int ref,
int case_id: @stmt_switch_case ref
);
switch_body(
unique int switch_stmt: @stmt_switch ref,
int body_id: @stmt ref
);
for_initialization(
unique int for_stmt: @stmt_for ref,
int init_id: @stmt ref
);
for_condition(
unique int for_stmt: @stmt_for ref,
int condition_id: @expr ref
);
for_update(
unique int for_stmt: @stmt_for ref,
int update_id: @expr ref
);
for_body(
unique int for_stmt: @stmt_for ref,
int body_id: @stmt ref
);
@stmtparent = @stmt | @expr_stmt ;
stmtparents(
unique int id: @stmt ref,
int index: int ref,
int parent: @stmtparent ref
);
ishandler(unique int block: @stmt_block ref);
@cfgnode = @stmt | @expr | @function | @initialiser ;
stmt_decl_bind(
int stmt: @stmt_decl ref,
int num: int ref,
int decl: @declaration ref
);
stmt_decl_entry_bind(
int stmt: @stmt_decl ref,
int num: int ref,
int decl_entry: @element ref
);
@functionorblock = @function | @stmt_block;
blockscope(
unique int block: @stmt_block ref,
int enclosing: @functionorblock ref
);
@jump = @stmt_goto | @stmt_break | @stmt_continue;
@jumporlabel = @jump | @stmt_label | @literal;
jumpinfo(
unique int id: @jumporlabel ref,
string str: string ref,
int target: @stmt ref
);
preprocdirects(
unique int id: @preprocdirect,
int kind: int ref,
int location: @location_default ref
);
case @preprocdirect.kind of
0 = @ppd_if
| 1 = @ppd_ifdef
| 2 = @ppd_ifndef
| 3 = @ppd_elif
| 4 = @ppd_else
| 5 = @ppd_endif
| 6 = @ppd_plain_include
| 7 = @ppd_define
| 8 = @ppd_undef
| 9 = @ppd_line
| 10 = @ppd_error
| 11 = @ppd_pragma
| 12 = @ppd_objc_import
| 13 = @ppd_include_next
| 18 = @ppd_warning
;
@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next;
@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif;
preprocpair(
int begin : @ppd_branch ref,
int elseelifend : @preprocdirect ref
);
preproctrue(int branch : @ppd_branch ref);
preprocfalse(int branch : @ppd_branch ref);
preproctext(
unique int id: @preprocdirect ref,
string head: string ref,
string body: string ref
);
includes(
unique int id: @ppd_include ref,
int included: @file ref
);
link_targets(
unique int id: @link_target,
int binary: @file ref
);
link_parent(
int element : @element ref,
int link_target : @link_target ref
);
/* XML Files */
xmlEncoding(unique int id: @file ref, string encoding: string ref);
xmlDTDs(
unique int id: @xmldtd,
string root: string ref,
string publicId: string ref,
string systemId: string ref,
int fileid: @file ref
);
xmlElements(
unique int id: @xmlelement,
string name: string ref,
int parentid: @xmlparent ref,
int idx: int ref,
int fileid: @file ref
);
xmlAttrs(
unique int id: @xmlattribute,
int elementid: @xmlelement ref,
string name: string ref,
string value: string ref,
int idx: int ref,
int fileid: @file ref
);
xmlNs(
int id: @xmlnamespace,
string prefixName: string ref,
string URI: string ref,
int fileid: @file ref
);
xmlHasNs(
int elementId: @xmlnamespaceable ref,
int nsId: @xmlnamespace ref,
int fileid: @file ref
);
xmlComments(
unique int id: @xmlcomment,
string text: string ref,
int parentid: @xmlparent ref,
int fileid: @file ref
);
xmlChars(
unique int id: @xmlcharacters,
string text: string ref,
int parentid: @xmlparent ref,
int idx: int ref,
int isCDATA: int ref,
int fileid: @file ref
);
@xmlparent = @file | @xmlelement;
@xmlnamespaceable = @xmlelement | @xmlattribute;
xmllocations(
int xmlElement: @xmllocatable ref,
int location: @location_default ref
);
@xmllocatable = @xmlcharacters
| @xmlelement
| @xmlcomment
| @xmlattribute
| @xmldtd
| @file
| @xmlnamespace;