/* This is a dummy line to alter the dbscheme, so we can make a database upgrade * without actually changing any of the dbscheme predicates. It contains a date * to allow for such updates in the future as well. * * 2021-07-14 * * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a * previously seen state (matching a previously seen SHA), which would make the upgrade * mechanism not work properly. */ /** * An invocation of the compiler. Note that more than one file may be * compiled per invocation. For example, this command compiles three * source files: * * csc f1.cs f2.cs f3.cs * * The `id` simply identifies the invocation, while `cwd` is the working * directory from which the compiler was invoked. */ compilations( 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 * * csc f1.cs f2.cs f3.cs * * then typically there will be rows for * * num | arg * --- | --- * 0 | --compiler * 1 | *path to compiler* * 2 | --cil * 3 | f1.cs * 4 | f2.cs * 5 | f3.cs */ #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 * * csc f1.cs f2.cs f3.cs * * then there will be rows for * * num | arg * --- | --- * 0 | f1.cs * 1 | f2.cs * 2 | f3.cs */ #keyset[id, num] compilation_compiling_files( int id : @compilation ref, int num : int ref, int file : @file ref ); /** * The references used by a compiler invocation. * If `id` is for the compiler invocation * * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll * * then there will be rows for * * num | arg * --- | --- * 0 | ref1.dll * 1 | ref2.dll * 2 | ref3.dll */ #keyset[id, num] compilation_referencing_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( unique int diagnostic : @diagnostic ref, int compilation : @compilation ref, int file_number : int ref, int file_number_diagnostic_number : 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 ); extractor_messages( unique int id: @extractor_message, int severity: int ref, string origin : string ref, string text : string ref, string entity : string ref, int location: @location_default ref, string stack_trace : string 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 ); compilation_assembly( unique int id : @compilation ref, int assembly: @assembly ref ) /* * External artifacts */ externalDefects( unique int id: @externalDefect, string queryPath: string ref, int location: @location ref, string message: string ref, float severity: float ref); externalMetrics( unique int id: @externalMetric, string queryPath: string ref, int location: @location ref, float value: float ref); externalData( int id: @externalDataElement, string path: string ref, int column: int ref, string value: string ref); snapshotDate( unique date snapshotDate: date ref); sourceLocationPrefix( string prefix: string ref); /* * Duplicate code */ duplicateCode( unique int id: @duplication, string relativePath: string ref, int equivClass: int ref); similarCode( unique int id: @similarity, string relativePath: string ref, int equivClass: int ref); @duplication_or_similarity = @duplication | @similarity tokens( int id: @duplication_or_similarity ref, int offset: int ref, int beginLine: int ref, int beginColumn: int ref, int endLine: int ref, int endColumn: int ref); /* * C# dbscheme */ /** ELEMENTS **/ @element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration | @using_directive | @type_parameter_constraints | @external_element | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; @declaration = @callable | @generic | @assignable | @namespace; @named_element = @namespace | @declaration; @declaration_with_accessors = @property | @indexer | @event; @assignable = @variable | @assignable_with_accessors | @event; @assignable_with_accessors = @property | @indexer; @external_element = @externalMetric | @externalDefect | @externalDataElement; @attributable = @assembly | @field | @parameter | @operator | @method | @constructor | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors | @local_function; /** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ @location = @location_default | @assembly; locations_default( unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, int endLine: int ref, int endColumn: int ref); locations_mapped( unique int id: @location_default ref, int mapped_to: @location_default ref); @sourceline = @file | @callable | @xmllocatable; numlines( int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); assemblies( unique int id: @assembly, int file: @file ref, string fullname: string ref, string name: string ref, string version: string 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); file_extraction_mode( unique int file: @file ref, int mode: int ref /* 0 = normal, 1 = standalone extractor */ ); /** NAMESPACES **/ @type_container = @namespace | @type; namespaces( unique int id: @namespace, string name: string ref); namespace_declarations( unique int id: @namespace_declaration, int namespace_id: @namespace ref); namespace_declaration_location( unique int id: @namespace_declaration ref, int loc: @location ref); parent_namespace( unique int child_id: @type_container ref, int namespace_id: @namespace ref); @declaration_or_directive = @namespace_declaration | @type | @using_directive; parent_namespace_declaration( int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes int namespace_id: @namespace_declaration ref); @using_directive = @using_namespace_directive | @using_static_directive; using_global( unique int id: @using_directive ref ); using_namespace_directives( unique int id: @using_namespace_directive, int namespace_id: @namespace ref); using_static_directives( unique int id: @using_static_directive, int type_id: @type_or_ref ref); using_directive_location( unique int id: @using_directive ref, int loc: @location ref); @preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if | @directive_elif | @directive_else | @directive_endif; @conditional_directive = @directive_if | @directive_elif; @branch_directive = @directive_if | @directive_elif | @directive_else; directive_ifs( unique int id: @directive_if, int branchTaken: int ref, /* 0: false, 1: true */ int conditionValue: int ref); /* 0: false, 1: true */ directive_elifs( unique int id: @directive_elif, int branchTaken: int ref, /* 0: false, 1: true */ int conditionValue: int ref, /* 0: false, 1: true */ int parent: @directive_if ref, int index: int ref); directive_elses( unique int id: @directive_else, int branchTaken: int ref, /* 0: false, 1: true */ int parent: @directive_if ref, int index: int ref); #keyset[id, start] directive_endifs( unique int id: @directive_endif, unique int start: @directive_if ref); directive_define_symbols( unique int id: @define_symbol_expr ref, string name: string ref); directive_regions( unique int id: @directive_region, string name: string ref); #keyset[id, start] directive_endregions( unique int id: @directive_endregion, unique int start: @directive_region ref); directive_lines( unique int id: @directive_line, int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ directive_line_value( unique int id: @directive_line ref, int line: int ref); directive_line_file( unique int id: @directive_line ref, int file: @file ref); directive_line_offset( unique int id: @directive_line ref, int offset: int ref); directive_line_span( unique int id: @directive_line ref, int startLine: int ref, int startColumn: int ref, int endLine: int ref, int endColumn: int ref); directive_nullables( unique int id: @directive_nullable, int setting: int ref, /* 0: disable, 1: enable, 2: restore */ int target: int ref); /* 0: none, 1: annotations, 2: warnings */ directive_warnings( unique int id: @directive_warning, string message: string ref); directive_errors( unique int id: @directive_error, string message: string ref); directive_undefines( unique int id: @directive_undefine, string name: string ref); directive_defines( unique int id: @directive_define, string name: string ref); pragma_checksums( unique int id: @pragma_checksum, int file: @file ref, string guid: string ref, string bytes: string ref); pragma_warnings( unique int id: @pragma_warning, int kind: int ref /* 0 = disable, 1 = restore */); #keyset[id, index] pragma_warning_error_codes( int id: @pragma_warning ref, string errorCode: string ref, int index: int ref); preprocessor_directive_location( unique int id: @preprocessor_directive ref, int loc: @location ref); preprocessor_directive_compilation( unique int id: @preprocessor_directive ref, int compilation: @compilation ref); preprocessor_directive_active( unique int id: @preprocessor_directive ref, int active: int ref); /* 0: false, 1: true */ /** TYPES **/ types( unique int id: @type, int kind: int ref, string name: string ref); case @type.kind of 1 = @bool_type | 2 = @char_type | 3 = @decimal_type | 4 = @sbyte_type | 5 = @short_type | 6 = @int_type | 7 = @long_type | 8 = @byte_type | 9 = @ushort_type | 10 = @uint_type | 11 = @ulong_type | 12 = @float_type | 13 = @double_type | 14 = @enum_type | 15 = @struct_type | 17 = @class_type | 19 = @interface_type | 20 = @delegate_type | 21 = @null_type | 22 = @type_parameter | 23 = @pointer_type | 24 = @nullable_type | 25 = @array_type | 26 = @void_type | 27 = @int_ptr_type | 28 = @uint_ptr_type | 29 = @dynamic_type | 30 = @arglist_type | 31 = @unknown_type | 32 = @tuple_type | 33 = @function_pointer_type ; @simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; @integral_type = @signed_integral_type | @unsigned_integral_type; @signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; @unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; @floating_point_type = @float_type | @double_type; @value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type | @uint_ptr_type | @tuple_type; @ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type | @dynamic_type; @value_or_ref_type = @value_type | @ref_type; typerefs( unique int id: @typeref, string name: string ref); typeref_type( int id: @typeref ref, unique int typeId: @type ref); @type_or_ref = @type | @typeref; array_element_type( unique int array: @array_type ref, int dimension: int ref, int rank: int ref, int element: @type_or_ref ref); nullable_underlying_type( unique int nullable: @nullable_type ref, int underlying: @type_or_ref ref); pointer_referent_type( unique int pointer: @pointer_type ref, int referent: @type_or_ref ref); enum_underlying_type( unique int enum_id: @enum_type ref, int underlying_type_id: @type_or_ref ref); delegate_return_type( unique int delegate_id: @delegate_type ref, int return_type_id: @type_or_ref ref); function_pointer_return_type( unique int function_pointer_id: @function_pointer_type ref, int return_type_id: @type_or_ref ref); extend( int sub: @type ref, int super: @type_or_ref ref); anonymous_types( unique int id: @type ref); @interface_or_ref = @interface_type | @typeref; implement( int sub: @type ref, int super: @type_or_ref ref); type_location( int id: @type ref, int loc: @location ref); tuple_underlying_type( unique int tuple: @tuple_type ref, int struct: @type_or_ref ref); #keyset[tuple, index] tuple_element( int tuple: @tuple_type ref, int index: int ref, unique int field: @field ref); attributes( unique int id: @attribute, int type_id: @type_or_ref ref, int target: @attributable ref); attribute_location( int id: @attribute ref, int loc: @location ref); @type_mention_parent = @element | @type_mention; type_mention( unique int id: @type_mention, int type_id: @type_or_ref ref, int parent: @type_mention_parent ref); type_mention_location( unique int id: @type_mention ref, int loc: @location ref); @has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; /** * A direct annotation on an entity, for example `string? x;`. * * Annotations: * 2 = reftype is not annotated "!" * 3 = reftype is annotated "?" * 4 = readonly ref type / in parameter * 5 = ref type parameter, return or local variable * 6 = out parameter * * Note that the annotation depends on the element it annotates. * @assignable: The annotation is on the type of the assignable, for example the variable type. * @type_parameter: The annotation is on the reftype constraint * @callable: The annotation is on the return type * @array_type: The annotation is on the element type */ type_annotation(int id: @has_type_annotation ref, int annotation: int ref); nullability(unique int nullability: @nullability, int kind: int ref); case @nullability.kind of 0 = @oblivious | 1 = @not_annotated | 2 = @annotated ; #keyset[parent, index] nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); /** * The nullable flow state of an expression, as determined by Roslyn. * 0 = none (default, not populated) * 1 = not null * 2 = maybe null */ expr_flowstate(unique int id: @expr ref, int state: int ref); /** GENERICS **/ @generic = @type | @method | @local_function; type_parameters( unique int id: @type_parameter ref, int index: int ref, int generic_id: @generic ref, int variance: int ref /* none = 0, out = 1, in = 2 */); #keyset[constructed_id, index] type_arguments( int id: @type_or_ref ref, int index: int ref, int constructed_id: @generic_or_ref ref); @generic_or_ref = @generic | @typeref; constructed_generic( unique int constructed: @generic ref, int generic: @generic_or_ref ref); type_parameter_constraints( unique int id: @type_parameter_constraints, int param_id: @type_parameter ref); type_parameter_constraints_location( int id: @type_parameter_constraints ref, int loc: @location ref); general_type_parameter_constraints( int id: @type_parameter_constraints ref, int kind: int ref /* class = 1, struct = 2, new = 3 */); specific_type_parameter_constraints( int id: @type_parameter_constraints ref, int base_id: @type_or_ref ref); specific_type_parameter_nullability( int id: @type_parameter_constraints ref, int base_id: @type_or_ref ref, int nullability: @nullability ref); /** FUNCTION POINTERS */ function_pointer_calling_conventions( int id: @function_pointer_type ref, int kind: int ref); #keyset[id, index] has_unmanaged_calling_conventions( int id: @function_pointer_type ref, int index: int ref, int conv_id: @type_or_ref ref); /** MODIFIERS */ @modifiable = @modifiable_direct | @event_accessor; @modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; modifiers( unique int id: @modifier, string name: string ref); has_modifiers( int id: @modifiable_direct ref, int mod_id: @modifier ref); compiler_generated(unique int id: @modifiable_direct ref); /** MEMBERS **/ @member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; @named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; @virtualizable = @method | @property | @indexer | @event; exprorstmt_name( unique int parent_id: @named_exprorstmt ref, string name: string ref); nested_types( unique int id: @type ref, int declaring_type_id: @type ref, int unbound_id: @type ref); properties( unique int id: @property, string name: string ref, int declaring_type_id: @type ref, int type_id: @type_or_ref ref, int unbound_id: @property ref); property_location( int id: @property ref, int loc: @location ref); indexers( unique int id: @indexer, string name: string ref, int declaring_type_id: @type ref, int type_id: @type_or_ref ref, int unbound_id: @indexer ref); indexer_location( int id: @indexer ref, int loc: @location ref); accessors( unique int id: @accessor, int kind: int ref, string name: string ref, int declaring_member_id: @member ref, int unbound_id: @accessor ref); case @accessor.kind of 1 = @getter | 2 = @setter ; init_only_accessors( unique int id: @accessor ref); accessor_location( int id: @accessor ref, int loc: @location ref); events( unique int id: @event, string name: string ref, int declaring_type_id: @type ref, int type_id: @type_or_ref ref, int unbound_id: @event ref); event_location( int id: @event ref, int loc: @location ref); event_accessors( unique int id: @event_accessor, int kind: int ref, string name: string ref, int declaring_event_id: @event ref, int unbound_id: @event_accessor ref); case @event_accessor.kind of 1 = @add_event_accessor | 2 = @remove_event_accessor ; event_accessor_location( int id: @event_accessor ref, int loc: @location ref); operators( unique int id: @operator, string name: string ref, string symbol: string ref, int declaring_type_id: @type ref, int type_id: @type_or_ref ref, int unbound_id: @operator ref); operator_location( int id: @operator ref, int loc: @location ref); constant_value( int id: @variable ref, string value: string ref); /** CALLABLES **/ @callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; @callable_accessor = @accessor | @event_accessor; methods( unique int id: @method, string name: string ref, int declaring_type_id: @type ref, int type_id: @type_or_ref ref, int unbound_id: @method ref); method_location( int id: @method ref, int loc: @location ref); constructors( unique int id: @constructor, string name: string ref, int declaring_type_id: @type ref, int unbound_id: @constructor ref); constructor_location( int id: @constructor ref, int loc: @location ref); destructors( unique int id: @destructor, string name: string ref, int declaring_type_id: @type ref, int unbound_id: @destructor ref); destructor_location( int id: @destructor ref, int loc: @location ref); overrides( int id: @callable ref, int base_id: @callable ref); explicitly_implements( int id: @member ref, int interface_id: @interface_or_ref ref); local_functions( unique int id: @local_function, string name: string ref, int return_type: @type ref, int unbound_id: @local_function ref); local_function_stmts( unique int fn: @local_function_stmt ref, int stmt: @local_function ref); /** VARIABLES **/ @variable = @local_scope_variable | @field; @local_scope_variable = @local_variable | @parameter; fields( unique int id: @field, int kind: int ref, string name: string ref, int declaring_type_id: @type ref, int type_id: @type_or_ref ref, int unbound_id: @field ref); case @field.kind of 1 = @addressable_field | 2 = @constant ; field_location( int id: @field ref, int loc: @location ref); localvars( unique int id: @local_variable, int kind: int ref, string name: string ref, int implicitly_typed: int ref /* 0 = no, 1 = yes */, int type_id: @type_or_ref ref, int parent_id: @local_var_decl_expr ref); case @local_variable.kind of 1 = @addressable_local_variable | 2 = @local_constant | 3 = @local_variable_ref ; localvar_location( unique int id: @local_variable ref, int loc: @location ref); @parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; #keyset[name, parent_id] #keyset[index, parent_id] params( unique int id: @parameter, string name: string ref, int type_id: @type_or_ref ref, int index: int ref, int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ int parent_id: @parameterizable ref, int unbound_id: @parameter ref); param_location( int id: @parameter ref, int loc: @location ref); /** STATEMENTS **/ @exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; statements( unique int id: @stmt, int kind: int ref); #keyset[index, parent] stmt_parent( unique int stmt: @stmt ref, int index: int ref, int parent: @control_flow_element ref); @top_level_stmt_parent = @callable; // [index, parent] is not a keyset because the same parent may be compiled multiple times stmt_parent_top_level( unique int stmt: @stmt ref, int index: int ref, int parent: @top_level_stmt_parent ref); case @stmt.kind of 1 = @block_stmt | 2 = @expr_stmt | 3 = @if_stmt | 4 = @switch_stmt | 5 = @while_stmt | 6 = @do_stmt | 7 = @for_stmt | 8 = @foreach_stmt | 9 = @break_stmt | 10 = @continue_stmt | 11 = @goto_stmt | 12 = @goto_case_stmt | 13 = @goto_default_stmt | 14 = @throw_stmt | 15 = @return_stmt | 16 = @yield_stmt | 17 = @try_stmt | 18 = @checked_stmt | 19 = @unchecked_stmt | 20 = @lock_stmt | 21 = @using_block_stmt | 22 = @var_decl_stmt | 23 = @const_decl_stmt | 24 = @empty_stmt | 25 = @unsafe_stmt | 26 = @fixed_stmt | 27 = @label_stmt | 28 = @catch | 29 = @case_stmt | 30 = @local_function_stmt | 31 = @using_decl_stmt ; @using_stmt = @using_block_stmt | @using_decl_stmt; @labeled_stmt = @label_stmt | @case; @decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; @cond_stmt = @if_stmt | @switch_stmt; @loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; @jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt | @yield_stmt; @goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; stmt_location( unique int id: @stmt ref, int loc: @location ref); catch_type( unique int catch_id: @catch ref, int type_id: @type_or_ref ref, int kind: int ref /* explicit = 1, implicit = 2 */); foreach_stmt_info( unique int id: @foreach_stmt ref, int kind: int ref /* non-async = 1, async = 2 */); @foreach_symbol = @method | @property | @type_or_ref; #keyset[id, kind] foreach_stmt_desugar( int id: @foreach_stmt ref, int symbol: @foreach_symbol ref, int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); /** EXPRESSIONS **/ expressions( unique int id: @expr, int kind: int ref, int type_id: @type_or_ref ref); #keyset[index, parent] expr_parent( unique int expr: @expr ref, int index: int ref, int parent: @control_flow_element ref); @top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; @top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; // [index, parent] is not a keyset because the same parent may be compiled multiple times expr_parent_top_level( unique int expr: @expr ref, int index: int ref, int parent: @top_level_exprorstmt_parent ref); case @expr.kind of /* literal */ 1 = @bool_literal_expr | 2 = @char_literal_expr | 3 = @decimal_literal_expr | 4 = @int_literal_expr | 5 = @long_literal_expr | 6 = @uint_literal_expr | 7 = @ulong_literal_expr | 8 = @float_literal_expr | 9 = @double_literal_expr | 10 = @string_literal_expr | 11 = @null_literal_expr /* primary & unary */ | 12 = @this_access_expr | 13 = @base_access_expr | 14 = @local_variable_access_expr | 15 = @parameter_access_expr | 16 = @field_access_expr | 17 = @property_access_expr | 18 = @method_access_expr | 19 = @event_access_expr | 20 = @indexer_access_expr | 21 = @array_access_expr | 22 = @type_access_expr | 23 = @typeof_expr | 24 = @method_invocation_expr | 25 = @delegate_invocation_expr | 26 = @operator_invocation_expr | 27 = @cast_expr | 28 = @object_creation_expr | 29 = @explicit_delegate_creation_expr | 30 = @implicit_delegate_creation_expr | 31 = @array_creation_expr | 32 = @default_expr | 33 = @plus_expr | 34 = @minus_expr | 35 = @bit_not_expr | 36 = @log_not_expr | 37 = @post_incr_expr | 38 = @post_decr_expr | 39 = @pre_incr_expr | 40 = @pre_decr_expr /* multiplicative */ | 41 = @mul_expr | 42 = @div_expr | 43 = @rem_expr /* additive */ | 44 = @add_expr | 45 = @sub_expr /* shift */ | 46 = @lshift_expr | 47 = @rshift_expr /* relational */ | 48 = @lt_expr | 49 = @gt_expr | 50 = @le_expr | 51 = @ge_expr /* equality */ | 52 = @eq_expr | 53 = @ne_expr /* logical */ | 54 = @bit_and_expr | 55 = @bit_xor_expr | 56 = @bit_or_expr | 57 = @log_and_expr | 58 = @log_or_expr /* type testing */ | 59 = @is_expr | 60 = @as_expr /* null coalescing */ | 61 = @null_coalescing_expr /* conditional */ | 62 = @conditional_expr /* assignment */ | 63 = @simple_assign_expr | 64 = @assign_add_expr | 65 = @assign_sub_expr | 66 = @assign_mul_expr | 67 = @assign_div_expr | 68 = @assign_rem_expr | 69 = @assign_and_expr | 70 = @assign_xor_expr | 71 = @assign_or_expr | 72 = @assign_lshift_expr | 73 = @assign_rshift_expr /* more */ | 74 = @object_init_expr | 75 = @collection_init_expr | 76 = @array_init_expr | 77 = @checked_expr | 78 = @unchecked_expr | 79 = @constructor_init_expr | 80 = @add_event_expr | 81 = @remove_event_expr | 82 = @par_expr | 83 = @local_var_decl_expr | 84 = @lambda_expr | 85 = @anonymous_method_expr | 86 = @namespace_expr /* dynamic */ | 92 = @dynamic_element_access_expr | 93 = @dynamic_member_access_expr /* unsafe */ | 100 = @pointer_indirection_expr | 101 = @address_of_expr | 102 = @sizeof_expr /* async */ | 103 = @await_expr /* C# 6.0 */ | 104 = @nameof_expr | 105 = @interpolated_string_expr | 106 = @unknown_expr /* C# 7.0 */ | 107 = @throw_expr | 108 = @tuple_expr | 109 = @local_function_invocation_expr | 110 = @ref_expr | 111 = @discard_expr /* C# 8.0 */ | 112 = @range_expr | 113 = @index_expr | 114 = @switch_expr | 115 = @recursive_pattern_expr | 116 = @property_pattern_expr | 117 = @positional_pattern_expr | 118 = @switch_case_expr | 119 = @assign_coalesce_expr | 120 = @suppress_nullable_warning_expr | 121 = @namespace_access_expr /* C# 9.0 */ | 122 = @lt_pattern_expr | 123 = @gt_pattern_expr | 124 = @le_pattern_expr | 125 = @ge_pattern_expr | 126 = @not_pattern_expr | 127 = @and_pattern_expr | 128 = @or_pattern_expr | 129 = @function_pointer_invocation_expr | 130 = @with_expr /* Preprocessor */ | 999 = @define_symbol_expr ; @switch = @switch_stmt | @switch_expr; @case = @case_stmt | @switch_case_expr; @pattern_match = @case | @is_expr; @unary_pattern_expr = @not_pattern_expr; @relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; @binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; @integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; @real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; @literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr | @string_literal_expr | @null_literal_expr; @assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; @assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; @assign_event_expr = @add_event_expr | @remove_event_expr; @assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr | @assign_rem_expr @assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr | @assign_lshift_expr | @assign_rshift_expr; @member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; @access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; @element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; @local_variable_access = @local_variable_access_expr | @local_var_decl_expr; @local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; @variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; @assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr | @event_access_expr | @dynamic_member_access_expr; @objectorcollection_init_expr = @object_init_expr | @collection_init_expr; @delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; @bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; @incr_op_expr = @pre_incr_expr | @post_incr_expr; @decr_op_expr = @pre_decr_expr | @post_decr_expr; @mut_op_expr = @incr_op_expr | @decr_op_expr; @un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; @arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; @ternary_log_op_expr = @conditional_expr; @bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; @un_log_op_expr = @log_not_expr; @log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; @bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr | @rshift_expr; @un_bit_op_expr = @bit_not_expr; @bit_expr = @un_bit_op_expr | @bin_bit_op_expr; @equality_op_expr = @eq_expr | @ne_expr; @rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; @comp_expr = @equality_op_expr | @rel_op_expr; @op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; @ternary_op = @ternary_log_op_expr; @bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; @un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr | @pointer_indirection_expr | @address_of_expr; @anonymous_function_expr = @lambda_expr | @anonymous_method_expr; @call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr | @delegate_invocation_expr | @object_creation_expr | @call_access_expr | @local_function_invocation_expr | @function_pointer_invocation_expr; @call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; @late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; @throw_element = @throw_expr | @throw_stmt; @implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; implicitly_typed_array_creation( unique int id: @array_creation_expr ref); explicitly_sized_array_creation( unique int id: @array_creation_expr ref); stackalloc_array_creation( unique int id: @array_creation_expr ref); implicitly_typed_object_creation( unique int id: @implicitly_typeable_object_creation_expr ref); mutator_invocation_mode( unique int id: @operator_invocation_expr ref, int mode: int ref /* prefix = 1, postfix = 2*/); expr_compiler_generated( unique int id: @expr ref); expr_value( unique int id: @expr ref, string value: string ref); expr_call( unique int caller_id: @expr ref, int target_id: @callable ref); expr_access( unique int accesser_id: @access_expr ref, int target_id: @accessible ref); @accessible = @method | @assignable | @local_function | @namespace; expr_location( unique int id: @expr ref, int loc: @location ref); dynamic_member_name( unique int id: @late_bindable_expr ref, string name: string ref); @qualifiable_expr = @member_access_expr | @method_invocation_expr | @element_access_expr; conditional_access( unique int id: @qualifiable_expr ref); expr_argument( unique int id: @expr ref, int mode: int ref); /* mode is the same as params: value = 0, ref = 1, out = 2 */ expr_argument_name( unique int id: @expr ref, string name: string ref); /** CONTROL/DATA FLOW **/ @control_flow_element = @stmt | @expr; /* 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; /* Comments */ commentline( unique int id: @commentline, int kind: int ref, string text: string ref, string rawtext: string ref); case @commentline.kind of 0 = @singlelinecomment | 1 = @xmldoccomment | 2 = @multilinecomment; commentline_location( unique int id: @commentline ref, int loc: @location ref); commentblock( unique int id : @commentblock); commentblock_location( unique int id: @commentblock ref, int loc: @location ref); commentblock_binding( int id: @commentblock ref, int entity: @element ref, int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ commentblock_child( int id: @commentblock ref, int commentline: @commentline ref, int index: int ref); /* ASP.NET */ case @asp_element.kind of 0=@asp_close_tag | 1=@asp_code | 2=@asp_comment | 3=@asp_data_binding | 4=@asp_directive | 5=@asp_open_tag | 6=@asp_quoted_string | 7=@asp_text | 8=@asp_xml_directive; @asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; asp_elements( unique int id: @asp_element, int kind: int ref, int loc: @location ref); asp_comment_server(unique int comment: @asp_comment ref); asp_code_inline(unique int code: @asp_code ref); asp_directive_attribute( int directive: @asp_directive ref, int index: int ref, string name: string ref, int value: @asp_quoted_string ref); asp_directive_name( unique int directive: @asp_directive ref, string name: string ref); asp_element_body( unique int element: @asp_element ref, string body: string ref); asp_tag_attribute( int tag: @asp_open_tag ref, int index: int ref, string name: string ref, int attribute: @asp_attribute ref); asp_tag_name( unique int tag: @asp_open_tag ref, string name: string ref); asp_tag_isempty(int tag: @asp_open_tag ref); /* Common Intermediate Language - CIL */ case @cil_instruction.opcode of 0 = @cil_nop | 1 = @cil_break | 2 = @cil_ldarg_0 | 3 = @cil_ldarg_1 | 4 = @cil_ldarg_2 | 5 = @cil_ldarg_3 | 6 = @cil_ldloc_0 | 7 = @cil_ldloc_1 | 8 = @cil_ldloc_2 | 9 = @cil_ldloc_3 | 10 = @cil_stloc_0 | 11 = @cil_stloc_1 | 12 = @cil_stloc_2 | 13 = @cil_stloc_3 | 14 = @cil_ldarg_s | 15 = @cil_ldarga_s | 16 = @cil_starg_s | 17 = @cil_ldloc_s | 18 = @cil_ldloca_s | 19 = @cil_stloc_s | 20 = @cil_ldnull | 21 = @cil_ldc_i4_m1 | 22 = @cil_ldc_i4_0 | 23 = @cil_ldc_i4_1 | 24 = @cil_ldc_i4_2 | 25 = @cil_ldc_i4_3 | 26 = @cil_ldc_i4_4 | 27 = @cil_ldc_i4_5 | 28 = @cil_ldc_i4_6 | 29 = @cil_ldc_i4_7 | 30 = @cil_ldc_i4_8 | 31 = @cil_ldc_i4_s | 32 = @cil_ldc_i4 | 33 = @cil_ldc_i8 | 34 = @cil_ldc_r4 | 35 = @cil_ldc_r8 | 37 = @cil_dup | 38 = @cil_pop | 39 = @cil_jmp | 40 = @cil_call | 41 = @cil_calli | 42 = @cil_ret | 43 = @cil_br_s | 44 = @cil_brfalse_s | 45 = @cil_brtrue_s | 46 = @cil_beq_s | 47 = @cil_bge_s | 48 = @cil_bgt_s | 49 = @cil_ble_s | 50 = @cil_blt_s | 51 = @cil_bne_un_s | 52 = @cil_bge_un_s | 53 = @cil_bgt_un_s | 54 = @cil_ble_un_s | 55 = @cil_blt_un_s | 56 = @cil_br | 57 = @cil_brfalse | 58 = @cil_brtrue | 59 = @cil_beq | 60 = @cil_bge | 61 = @cil_bgt | 62 = @cil_ble | 63 = @cil_blt | 64 = @cil_bne_un | 65 = @cil_bge_un | 66 = @cil_bgt_un | 67 = @cil_ble_un | 68 = @cil_blt_un | 69 = @cil_switch | 70 = @cil_ldind_i1 | 71 = @cil_ldind_u1 | 72 = @cil_ldind_i2 | 73 = @cil_ldind_u2 | 74 = @cil_ldind_i4 | 75 = @cil_ldind_u4 | 76 = @cil_ldind_i8 | 77 = @cil_ldind_i | 78 = @cil_ldind_r4 | 79 = @cil_ldind_r8 | 80 = @cil_ldind_ref | 81 = @cil_stind_ref | 82 = @cil_stind_i1 | 83 = @cil_stind_i2 | 84 = @cil_stind_i4 | 85 = @cil_stind_i8 | 86 = @cil_stind_r4 | 87 = @cil_stind_r8 | 88 = @cil_add | 89 = @cil_sub | 90 = @cil_mul | 91 = @cil_div | 92 = @cil_div_un | 93 = @cil_rem | 94 = @cil_rem_un | 95 = @cil_and | 96 = @cil_or | 97 = @cil_xor | 98 = @cil_shl | 99 = @cil_shr | 100 = @cil_shr_un | 101 = @cil_neg | 102 = @cil_not | 103 = @cil_conv_i1 | 104 = @cil_conv_i2 | 105 = @cil_conv_i4 | 106 = @cil_conv_i8 | 107 = @cil_conv_r4 | 108 = @cil_conv_r8 | 109 = @cil_conv_u4 | 110 = @cil_conv_u8 | 111 = @cil_callvirt | 112 = @cil_cpobj | 113 = @cil_ldobj | 114 = @cil_ldstr | 115 = @cil_newobj | 116 = @cil_castclass | 117 = @cil_isinst | 118 = @cil_conv_r_un | 121 = @cil_unbox | 122 = @cil_throw | 123 = @cil_ldfld | 124 = @cil_ldflda | 125 = @cil_stfld | 126 = @cil_ldsfld | 127 = @cil_ldsflda | 128 = @cil_stsfld | 129 = @cil_stobj | 130 = @cil_conv_ovf_i1_un | 131 = @cil_conv_ovf_i2_un | 132 = @cil_conv_ovf_i4_un | 133 = @cil_conv_ovf_i8_un | 134 = @cil_conv_ovf_u1_un | 135 = @cil_conv_ovf_u2_un | 136 = @cil_conv_ovf_u4_un | 137 = @cil_conv_ovf_u8_un | 138 = @cil_conv_ovf_i_un | 139 = @cil_conv_ovf_u_un | 140 = @cil_box | 141 = @cil_newarr | 142 = @cil_ldlen | 143 = @cil_ldelema | 144 = @cil_ldelem_i1 | 145 = @cil_ldelem_u1 | 146 = @cil_ldelem_i2 | 147 = @cil_ldelem_u2 | 148 = @cil_ldelem_i4 | 149 = @cil_ldelem_u4 | 150 = @cil_ldelem_i8 | 151 = @cil_ldelem_i | 152 = @cil_ldelem_r4 | 153 = @cil_ldelem_r8 | 154 = @cil_ldelem_ref | 155 = @cil_stelem_i | 156 = @cil_stelem_i1 | 157 = @cil_stelem_i2 | 158 = @cil_stelem_i4 | 159 = @cil_stelem_i8 | 160 = @cil_stelem_r4 | 161 = @cil_stelem_r8 | 162 = @cil_stelem_ref | 163 = @cil_ldelem | 164 = @cil_stelem | 165 = @cil_unbox_any | 179 = @cil_conv_ovf_i1 | 180 = @cil_conv_ovf_u1 | 181 = @cil_conv_ovf_i2 | 182 = @cil_conv_ovf_u2 | 183 = @cil_conv_ovf_i4 | 184 = @cil_conv_ovf_u4 | 185 = @cil_conv_ovf_i8 | 186 = @cil_conv_ovf_u8 | 194 = @cil_refanyval | 195 = @cil_ckinfinite | 198 = @cil_mkrefany | 208 = @cil_ldtoken | 209 = @cil_conv_u2 | 210 = @cil_conv_u1 | 211 = @cil_conv_i | 212 = @cil_conv_ovf_i | 213 = @cil_conv_ovf_u | 214 = @cil_add_ovf | 215 = @cil_add_ovf_un | 216 = @cil_mul_ovf | 217 = @cil_mul_ovf_un | 218 = @cil_sub_ovf | 219 = @cil_sub_ovf_un | 220 = @cil_endfinally | 221 = @cil_leave | 222 = @cil_leave_s | 223 = @cil_stind_i | 224 = @cil_conv_u | 65024 = @cil_arglist | 65025 = @cil_ceq | 65026 = @cil_cgt | 65027 = @cil_cgt_un | 65028 = @cil_clt | 65029 = @cil_clt_un | 65030 = @cil_ldftn | 65031 = @cil_ldvirtftn | 65033 = @cil_ldarg | 65034 = @cil_ldarga | 65035 = @cil_starg | 65036 = @cil_ldloc | 65037 = @cil_ldloca | 65038 = @cil_stloc | 65039 = @cil_localloc | 65041 = @cil_endfilter | 65042 = @cil_unaligned | 65043 = @cil_volatile | 65044 = @cil_tail | 65045 = @cil_initobj | 65046 = @cil_constrained | 65047 = @cil_cpblk | 65048 = @cil_initblk | 65050 = @cil_rethrow | 65052 = @cil_sizeof | 65053 = @cil_refanytype | 65054 = @cil_readonly ; // CIL ignored instructions @cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; // CIL local/parameter/field access @cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; @cil_starg_any = @cil_starg | @cil_starg_s; @cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; @cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; @cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; @cil_stfld_any = @cil_stfld | @cil_stsfld; @cil_local_access = @cil_stloc_any | @cil_ldloc_any; @cil_arg_access = @cil_starg_any | @cil_ldarg_any; @cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; @cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; @cil_stack_access = @cil_local_access | @cil_arg_access; @cil_field_access = @cil_ldfld_any | @cil_stfld_any; @cil_access = @cil_read_access | @cil_write_access; // CIL constant/literal instructions @cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; @cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; @cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; @cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; // Control flow @cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; @cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; @cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; @cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; @cil_leave_any = @cil_leave | @cil_leave_s; @cil_jump = @cil_unconditional_jump | @cil_conditional_jump; // CIL call instructions @cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; // CIL expression instructions @cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | @cil_newarr | @cil_ldtoken | @cil_sizeof | @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; @cil_unary_expr = @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | @cil_ldind | @cil_unbox; @cil_conversion_operation = @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | @cil_conv_i | @cil_conv_u | @cil_conv_r_un; @cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; @cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; @cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; @cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; @cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | @cil_sub_ovf | @cil_sub_ovf_un; @cil_unary_bitwise_operation = @cil_not; @cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; @cil_unary_arithmetic_operation = @cil_neg; @cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; // Elements that retrieve an address of something @cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; // CIL array instructions @cil_read_array = @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; @cil_write_array = @cil_stelem | @cil_stelem_ref | @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | @cil_stelem_r4 | @cil_stelem_r8; @cil_throw_any = @cil_throw | @cil_rethrow; #keyset[impl, index] cil_instruction( unique int id: @cil_instruction, int opcode: int ref, int index: int ref, int impl: @cil_method_implementation ref); cil_jump( unique int instruction: @cil_jump ref, int target: @cil_instruction ref); cil_access( unique int instruction: @cil_instruction ref, int target: @cil_accessible ref); cil_value( unique int instruction: @cil_literal ref, string value: string ref); #keyset[instruction, index] cil_switch( int instruction: @cil_switch ref, int index: int ref, int target: @cil_instruction ref); cil_instruction_location( unique int id: @cil_instruction ref, int loc: @location ref); cil_type_location( int id: @cil_type ref, int loc: @location ref); cil_method_location( int id: @cil_method ref, int loc: @location ref); @cil_namespace = @namespace; @cil_type_container = @cil_type | @cil_namespace | @cil_method; case @cil_type.kind of 0 = @cil_valueorreftype | 1 = @cil_typeparameter | 2 = @cil_array_type | 3 = @cil_pointer_type | 4 = @cil_function_pointer_type ; cil_type( unique int id: @cil_type, string name: string ref, int kind: int ref, int parent: @cil_type_container ref, int sourceDecl: @cil_type ref); cil_pointer_type( unique int id: @cil_pointer_type ref, int pointee: @cil_type ref); cil_array_type( unique int id: @cil_array_type ref, int element_type: @cil_type ref, int rank: int ref); cil_function_pointer_return_type( unique int id: @cil_function_pointer_type ref, int return_type: @cil_type ref); cil_method( unique int id: @cil_method, string name: string ref, int parent: @cil_type ref, int return_type: @cil_type ref); cil_method_source_declaration( unique int method: @cil_method ref, int source: @cil_method ref); cil_method_implementation( unique int id: @cil_method_implementation, int method: @cil_method ref, int location: @assembly ref); cil_implements( int id: @cil_method ref, int decl: @cil_method ref); #keyset[parent, name] cil_field( unique int id: @cil_field, int parent: @cil_type ref, string name: string ref, int field_type: @cil_type ref); @cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; @cil_named_element = @cil_declaration | @cil_namespace; @cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; @cil_accessible = @cil_declaration; @cil_variable = @cil_field | @cil_stack_variable; @cil_stack_variable = @cil_local_variable | @cil_parameter; @cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; @cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; @cil_parameterizable = @cil_method | @cil_function_pointer_type; @cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_method | @cil_function_pointer_type; #keyset[parameterizable, index] cil_parameter( unique int id: @cil_parameter, int parameterizable: @cil_parameterizable ref, int index: int ref, int param_type: @cil_type ref); cil_parameter_in(unique int id: @cil_parameter ref); cil_parameter_out(unique int id: @cil_parameter ref); cil_setter(unique int prop: @cil_property ref, int method: @cil_method ref); #keyset[id, modifier] cil_custom_modifiers( int id: @cil_custom_modifier_receiver ref, int modifier: @cil_type ref, int kind: int ref); // modreq: 1, modopt: 0 cil_type_annotation( int id: @cil_has_type_annotation ref, int annotation: int ref); cil_getter(unique int prop: @cil_property ref, int method: @cil_method ref); cil_adder(unique int event: @cil_event ref, int method: @cil_method ref); cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); cil_property( unique int id: @cil_property, int parent: @cil_type ref, string name: string ref, int property_type: @cil_type ref); #keyset[parent, name] cil_event(unique int id: @cil_event, int parent: @cil_type ref, string name: string ref, int event_type: @cil_type ref); #keyset[impl, index] cil_local_variable( unique int id: @cil_local_variable, int impl: @cil_method_implementation ref, int index: int ref, int var_type: @cil_type ref); cil_function_pointer_calling_conventions( int id: @cil_function_pointer_type ref, int kind: int ref); // CIL handlers (exception handlers etc). case @cil_handler.kind of 0 = @cil_catch_handler | 1 = @cil_filter_handler | 2 = @cil_finally_handler | 4 = @cil_fault_handler ; #keyset[impl, index] cil_handler( unique int id: @cil_handler, int impl: @cil_method_implementation ref, int index: int ref, int kind: int ref, int try_start: @cil_instruction ref, int try_end: @cil_instruction ref, int handler_start: @cil_instruction ref); cil_handler_filter( unique int id: @cil_handler ref, int filter_start: @cil_instruction ref); cil_handler_type( unique int id: @cil_handler ref, int catch_type: @cil_type ref); @cil_controlflow_node = @cil_entry_point | @cil_instruction; @cil_entry_point = @cil_method_implementation | @cil_handler; @cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; cil_method_stack_size( unique int method: @cil_method_implementation ref, int size: int ref); // CIL modifiers cil_public(int id: @cil_member ref); cil_private(int id: @cil_member ref); cil_protected(int id: @cil_member ref); cil_internal(int id: @cil_member ref); cil_static(int id: @cil_member ref); cil_sealed(int id: @cil_member ref); cil_virtual(int id: @cil_method ref); cil_abstract(int id: @cil_member ref); cil_class(int id: @cil_type ref); cil_interface(int id: @cil_type ref); cil_security(int id: @cil_member ref); cil_requiresecobject(int id: @cil_method ref); cil_specialname(int id: @cil_method ref); cil_newslot(int id: @cil_method ref); cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); #keyset[unbound, index] cil_type_parameter( int unbound: @cil_member ref, int index: int ref, int param: @cil_typeparameter ref); #keyset[bound, index] cil_type_argument( int bound: @cil_member ref, int index: int ref, int t: @cil_type ref); // CIL type parameter constraints cil_typeparam_covariant(int tp: @cil_typeparameter ref); cil_typeparam_contravariant(int tp: @cil_typeparameter ref); cil_typeparam_class(int tp: @cil_typeparameter ref); cil_typeparam_struct(int tp: @cil_typeparameter ref); cil_typeparam_new(int tp: @cil_typeparameter ref); cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); // CIL attributes cil_attribute( unique int attributeid: @cil_attribute, int element: @cil_declaration ref, int constructor: @cil_method ref); #keyset[attribute_id, param] cil_attribute_named_argument( int attribute_id: @cil_attribute ref, string param: string ref, string value: string ref); #keyset[attribute_id, index] cil_attribute_positional_argument( int attribute_id: @cil_attribute ref, int index: int ref, string value: string ref); // Common .Net data model covering both C# and CIL // Common elements @dotnet_element = @element | @cil_element; @dotnet_named_element = @named_element | @cil_named_element; @dotnet_callable = @callable | @cil_method; @dotnet_variable = @variable | @cil_variable; @dotnet_field = @field | @cil_field; @dotnet_parameter = @parameter | @cil_parameter; @dotnet_declaration = @declaration | @cil_declaration; @dotnet_member = @member | @cil_member; @dotnet_event = @event | @cil_event; @dotnet_property = @property | @cil_property | @indexer; @dotnet_parameterizable = @parameterizable | @cil_parameterizable; // Common types @dotnet_type = @type | @cil_type; @dotnet_call = @call | @cil_call_any; @dotnet_throw = @throw_element | @cil_throw_any; @dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; @dotnet_typeparameter = @type_parameter | @cil_typeparameter; @dotnet_array_type = @array_type | @cil_array_type; @dotnet_pointer_type = @pointer_type | @cil_pointer_type; @dotnet_type_parameter = @type_parameter | @cil_typeparameter; @dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; // Attributes @dotnet_attribute = @attribute | @cil_attribute; // Expressions @dotnet_expr = @expr | @cil_expr; // Literals @dotnet_literal = @literal_expr | @cil_literal; @dotnet_string_literal = @string_literal_expr | @cil_ldstr; @dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; @dotnet_float_literal = @float_literal_expr | @cil_ldc_r; @dotnet_null_literal = @null_literal_expr | @cil_ldnull; @metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | @callable | @value_or_ref_type | @void_type; #keyset[entity, location] metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref)