diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/Opcode.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/Opcode.qll index c4134d240ab..b4def7fe4ae 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/Opcode.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/Opcode.qll @@ -30,6 +30,7 @@ private newtype TOpcode = TNegate() or TShiftLeft() or TShiftRight() or + TUnsignedShiftRight() or TBitAnd() or TBitOr() or TBitXor() or @@ -652,6 +653,15 @@ module Opcode { final override string toString() { result = "ShiftRight" } } + /** + * The `Opcode` for a `UnsignedShiftRightInstruction`. + * + * See the `UnsignedShiftRightInstruction` documentation for more details. + */ + class UnsignedShiftRight extends BinaryBitwiseOpcode, TUnsignedShiftRight { + final override string toString() { result = "UnsignedShiftRight" } + } + /** * The `Opcode` for a `BitAndInstruction`. * diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll index 7afe954023b..0aa7c552638 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll @@ -1204,6 +1204,17 @@ class ShiftRightInstruction extends BinaryBitwiseInstruction { ShiftRightInstruction() { this.getOpcode() instanceof Opcode::ShiftRight } } +/** + * An instruction that shifts its left operand to the right by the number of bits specified by its + * right operand. + * + * Both operands must have an integer type. The result has the same type as the left operand. + * The leftmost bits are zero-filled. + */ +class UnsignedShiftRightInstruction extends BinaryBitwiseInstruction { + UnsignedShiftRightInstruction() { this.getOpcode() instanceof Opcode::UnsignedShiftRight } +} + /** * An instruction that performs a binary arithmetic operation involving at least one pointer * operand. diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll index 7afe954023b..0aa7c552638 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll @@ -1204,6 +1204,17 @@ class ShiftRightInstruction extends BinaryBitwiseInstruction { ShiftRightInstruction() { this.getOpcode() instanceof Opcode::ShiftRight } } +/** + * An instruction that shifts its left operand to the right by the number of bits specified by its + * right operand. + * + * Both operands must have an integer type. The result has the same type as the left operand. + * The leftmost bits are zero-filled. + */ +class UnsignedShiftRightInstruction extends BinaryBitwiseInstruction { + UnsignedShiftRightInstruction() { this.getOpcode() instanceof Opcode::UnsignedShiftRight } +} + /** * An instruction that performs a binary arithmetic operation involving at least one pointer * operand. diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll index 7afe954023b..0aa7c552638 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll @@ -1204,6 +1204,17 @@ class ShiftRightInstruction extends BinaryBitwiseInstruction { ShiftRightInstruction() { this.getOpcode() instanceof Opcode::ShiftRight } } +/** + * An instruction that shifts its left operand to the right by the number of bits specified by its + * right operand. + * + * Both operands must have an integer type. The result has the same type as the left operand. + * The leftmost bits are zero-filled. + */ +class UnsignedShiftRightInstruction extends BinaryBitwiseInstruction { + UnsignedShiftRightInstruction() { this.getOpcode() instanceof Opcode::UnsignedShiftRight } +} + /** * An instruction that performs a binary arithmetic operation involving at least one pointer * operand. diff --git a/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/expressions.ql b/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/expressions.ql new file mode 100644 index 00000000000..6afabce797e --- /dev/null +++ b/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/expressions.ql @@ -0,0 +1,13 @@ +class Expression extends @expr { + string toString() { none() } +} + +class TypeOrRef extends @type_or_ref { + string toString() { none() } +} + +from Expression e, int k, int kind, TypeOrRef t +where + expressions(e, k, t) and + if k = [133, 134] then kind = 106 else kind = k +select e, kind, t diff --git a/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/old.dbscheme b/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/old.dbscheme new file mode 100644 index 00000000000..d0fba103f7d --- /dev/null +++ b/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/old.dbscheme @@ -0,0 +1,2069 @@ +/* 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 | f1.cs + * 3 | f2.cs + * 4 | 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 +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @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; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** 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 kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +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 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 +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_expr +| 133 = @urshift_expr +| 134 = @assign_urshift_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 | @assign_urshift_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 | @urshift_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); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref 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) diff --git a/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/semmlecode.csharp.dbscheme b/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..83aca6b3e4f --- /dev/null +++ b/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/semmlecode.csharp.dbscheme @@ -0,0 +1,2067 @@ +/* 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 | f1.cs + * 3 | f2.cs + * 4 | 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 +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @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; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** 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 kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +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 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 +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_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); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref 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) diff --git a/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/upgrade.properties b/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/upgrade.properties new file mode 100644 index 00000000000..d3e8b5e6318 --- /dev/null +++ b/csharp/downgrades/d0fba103f7dee477dd7d9f6c038518b3f683b2c7/upgrade.properties @@ -0,0 +1,3 @@ +description: Remove unsigned right shift and unsigned right shift assignment expression kinds. +compatibility: backwards +expressions.rel: run expressions.qlo \ No newline at end of file diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs index 6e0380da693..3984e7c00cf 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs @@ -240,7 +240,7 @@ namespace Semmle.Extraction.CSharp.Entities var callType = GetCallType(Context, node); if (callType == CallType.Dynamic) { - UserOperator.OperatorSymbol(method.Name, out var operatorName); + UserOperator.TryGetOperatorSymbol(method.Name, out var operatorName); trapFile.dynamic_member_name(this, operatorName); return; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs index 553d6d8349a..cbd7afbc9fa 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs @@ -71,6 +71,8 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions return ExprKind.ASSIGN_LSHIFT; case SyntaxKind.GreaterThanGreaterThanEqualsToken: return ExprKind.ASSIGN_RSHIFT; + case SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken: + return ExprKind.ASSIGN_URSHIFT; case SyntaxKind.QuestionQuestionEqualsToken: return ExprKind.ASSIGN_COALESCE; default: @@ -141,6 +143,8 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions return ExprKind.REM; case ExprKind.ASSIGN_RSHIFT: return ExprKind.RSHIFT; + case ExprKind.ASSIGN_URSHIFT: + return ExprKind.URSHIFT; case ExprKind.ASSIGN_SUB: return ExprKind.SUB; case ExprKind.ASSIGN_XOR: diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Binary.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Binary.cs index 5153c856a25..45d43ac94c0 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Binary.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Binary.cs @@ -50,6 +50,7 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions case SyntaxKind.BarBarToken: return ExprKind.LOG_OR; case SyntaxKind.GreaterThanEqualsToken: return ExprKind.GE; case SyntaxKind.GreaterThanGreaterThanToken: return ExprKind.RSHIFT; + case SyntaxKind.GreaterThanGreaterThanGreaterThanToken: return ExprKind.URSHIFT; case SyntaxKind.LessThanLessThanToken: return ExprKind.LSHIFT; case SyntaxKind.CaretToken: return ExprKind.BIT_XOR; case SyntaxKind.QuestionQuestionToken: return ExprKind.NULL_COALESCING; diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs index a92715c4e1c..57e9dd47ef3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs @@ -38,6 +38,7 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions case SyntaxKind.IsExpression: case SyntaxKind.AsExpression: case SyntaxKind.RightShiftExpression: + case SyntaxKind.UnsignedRightShiftExpression: case SyntaxKind.LeftShiftExpression: case SyntaxKind.ExclusiveOrExpression: case SyntaxKind.CoalesceExpression: @@ -76,6 +77,7 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions case SyntaxKind.ExclusiveOrAssignmentExpression: case SyntaxKind.LeftShiftAssignmentExpression: case SyntaxKind.RightShiftAssignmentExpression: + case SyntaxKind.UnsignedRightShiftAssignmentExpression: case SyntaxKind.DivideAssignmentExpression: case SyntaxKind.ModuloAssignmentExpression: case SyntaxKind.CoalesceAssignmentExpression: diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs index 536af5065ed..f478d991919 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs @@ -61,8 +61,7 @@ namespace Semmle.Extraction.CSharp.Entities containingType = Symbol.ContainingType; if (containingType is not null) { - var containingNamedType = containingType as INamedTypeSymbol; - return containingNamedType is null || + return containingType is not INamedTypeSymbol containingNamedType || !containingNamedType.GetMembers(Symbol.Name).Contains(Symbol); } @@ -83,7 +82,7 @@ namespace Semmle.Extraction.CSharp.Entities /// /// The method name. /// The converted operator name. - public static bool OperatorSymbol(string methodName, out string operatorName) + public static bool TryGetOperatorSymbol(string methodName, out string operatorName) { var success = true; switch (methodName) @@ -147,6 +146,9 @@ namespace Semmle.Extraction.CSharp.Entities case "op_RightShift": operatorName = ">>"; break; + case "op_UnsignedRightShift": + operatorName = ">>>"; + break; case "op_LeftShift": operatorName = "<<"; break; @@ -166,7 +168,7 @@ namespace Semmle.Extraction.CSharp.Entities var match = Regex.Match(methodName, "^op_Checked(.*)$"); if (match.Success) { - OperatorSymbol("op_" + match.Groups[1], out var uncheckedName); + TryGetOperatorSymbol("op_" + match.Groups[1], out var uncheckedName); operatorName = "checked " + uncheckedName; break; } @@ -190,7 +192,7 @@ namespace Semmle.Extraction.CSharp.Entities return OperatorSymbol(cx, method.ExplicitInterfaceImplementations.First()); var methodName = method.Name; - if (!OperatorSymbol(methodName, out var result)) + if (!TryGetOperatorSymbol(methodName, out var result)) cx.ModelError(method, $"Unhandled operator name in OperatorSymbol(): '{methodName}'"); return result; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Kinds/ExprKind.cs b/csharp/extractor/Semmle.Extraction.CSharp/Kinds/ExprKind.cs index a56ccf4c746..ef0b9412ef4 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Kinds/ExprKind.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Kinds/ExprKind.cs @@ -127,6 +127,8 @@ namespace Semmle.Extraction.Kinds WITH = 130, LIST_PATTERN = 131, SLICE_PATTERN = 132, + URSHIFT = 133, + ASSIGN_URSHIFT = 134, DEFINE_SYMBOL = 999, } } diff --git a/csharp/ql/lib/change-notes/2023-01-11-unsigned-right-shift.md b/csharp/ql/lib/change-notes/2023-01-11-unsigned-right-shift.md new file mode 100644 index 00000000000..6c644b8b2fb --- /dev/null +++ b/csharp/ql/lib/change-notes/2023-01-11-unsigned-right-shift.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* C# 11: Added support for the unsigned right shift `>>>` and unsigned right shift assignment `>>>=` operators. \ No newline at end of file diff --git a/csharp/ql/lib/semmle/code/csharp/Callable.qll b/csharp/ql/lib/semmle/code/csharp/Callable.qll index bc8e1294adb..ea88f814bce 100644 --- a/csharp/ql/lib/semmle/code/csharp/Callable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Callable.qll @@ -636,8 +636,9 @@ class TrueOperator extends UnaryOperator { * (`SubOperator`), a multiplication operator (`MulOperator`), a division * operator (`DivOperator`), a remainder operator (`RemOperator`), an and * operator (`AndOperator`), an or operator (`OrOperator`), an xor - * operator (`XorOperator`), a left shift operator (`LShiftOperator`), - * a right shift operator (`RShiftOperator`), an equals operator (`EQOperator`), + * operator (`XorOperator`), a left shift operator (`LeftShiftOperator`), + * a right shift operator (`RightShiftOperator`), an unsigned right shift + * operator(`UnsignedRightShiftOperator`), an equals operator (`EQOperator`), * a not equals operator (`NEOperator`), a lesser than operator (`LTOperator`), * a greater than operator (`GTOperator`), a less than or equals operator * (`LEOperator`), or a greater than or equals operator (`GEOperator`). @@ -791,14 +792,17 @@ class XorOperator extends BinaryOperator { * } * ``` */ -class LShiftOperator extends BinaryOperator { - LShiftOperator() { this.getName() = "<<" } +class LeftShiftOperator extends BinaryOperator { + LeftShiftOperator() { this.getName() = "<<" } override string getFunctionName() { result = "op_LeftShift" } - override string getAPrimaryQlClass() { result = "LShiftOperator" } + override string getAPrimaryQlClass() { result = "LeftShiftOperator" } } +/** DEPRECATED: Alias for LeftShiftOperator. */ +deprecated class LShiftOperator = LeftShiftOperator; + /** * A user-defined right shift operator (`>>`), for example * @@ -808,12 +812,32 @@ class LShiftOperator extends BinaryOperator { * } * ``` */ -class RShiftOperator extends BinaryOperator { - RShiftOperator() { this.getName() = ">>" } +class RightShiftOperator extends BinaryOperator { + RightShiftOperator() { this.getName() = ">>" } override string getFunctionName() { result = "op_RightShift" } - override string getAPrimaryQlClass() { result = "RShiftOperator" } + override string getAPrimaryQlClass() { result = "RightShiftOperator" } +} + +/** DEPRECATED: Alias for RightShiftOperator. */ +deprecated class RShiftOperator = RightShiftOperator; + +/** + * A user-defined unsigned right shift operator (`>>>`), for example + * + * ```csharp + * public static Widget operator >>>(Widget lhs, Widget rhs) { + * ... + * } + * ``` + */ +class UnsignedRightShiftOperator extends BinaryOperator { + UnsignedRightShiftOperator() { this.getName() = ">>>" } + + override string getFunctionName() { result = "op_UnsignedRightShift" } + + override string getAPrimaryQlClass() { result = "UnsignedRightShiftOperator" } } /** diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll index b919d143a39..5b2a39ad6c9 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll @@ -105,7 +105,7 @@ private predicate evenlyDivisibleExpr(Expr e, int factor) { exists(ConstantIntegerExpr c, int k | k = c.getIntValue() | e.(MulExpr).getAnOperand() = c and factor = k.abs() and factor >= 2 or - e.(LShiftExpr).getRhs() = c and factor = 2.pow(k) and k > 0 + e.(LeftShiftExpr).getRhs() = c and factor = 2.pow(k) and k > 0 or e.(BitwiseAndExpr).getAnOperand() = c and factor = max(int f | andmaskFactor(k, f)) ) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll index 74aee61e690..4a9c3cdbe6d 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll @@ -30,7 +30,7 @@ module Private { class MulExpr = RU::ExprNode::MulExpr; - class LShiftExpr = RU::ExprNode::LShiftExpr; + class LeftShiftExpr = RU::ExprNode::LeftShiftExpr; predicate guardDirectlyControlsSsaRead = RU::guardControlsSsaRead/3; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll index ce7637ccd92..fe4505b6e2e 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll @@ -391,17 +391,24 @@ module ExprNode { } /** A left-shift operation. */ - class LShiftExpr extends BinaryOperation { - override CS::LShiftExpr e; + class LeftShiftExpr extends BinaryOperation { + override CS::LeftShiftExpr e; - override TLShiftOp getOp() { any() } + override TLeftShiftOp getOp() { any() } } /** A right-shift operation. */ - class RShiftExpr extends BinaryOperation { - override CS::RShiftExpr e; + class RightShiftExpr extends BinaryOperation { + override CS::RightShiftExpr e; - override TRShiftOp getOp() { any() } + override TRightShiftOp getOp() { any() } + } + + /** An unsigned right-shift operation. */ + class UnsignedRightShiftExpr extends BinaryOperation { + override CS::UnsignedRightShiftExpr e; + + override TUnsignedRightShiftOp getOp() { any() } } /** A conditional expression. */ diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/Sign.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/Sign.qll index b2058a27114..649b4216996 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/Sign.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/Sign.qll @@ -18,9 +18,9 @@ newtype TBinarySignOperation = TBitAndOp() or TBitOrOp() or TBitXorOp() or - TLShiftOp() or - TRShiftOp() or - TURShiftOp() + TLeftShiftOp() or + TRightShiftOp() or + TUnsignedRightShiftOp() /** Class representing expression signs (+, -, 0). */ class Sign extends TSign { @@ -271,10 +271,10 @@ class Sign extends TSign { or op = TBitXorOp() and result = bitxor(s) or - op = TLShiftOp() and result = lshift(s) + op = TLeftShiftOp() and result = lshift(s) or - op = TRShiftOp() and result = rshift(s) + op = TRightShiftOp() and result = rshift(s) or - op = TURShiftOp() and result = urshift(s) + op = TUnsignedRightShiftOp() and result = urshift(s) } } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll index 9102bf29131..5b61ca54682 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll @@ -211,8 +211,9 @@ private module Impl { not e.getExpr() instanceof BitwiseAndExpr and not e.getExpr() instanceof BitwiseOrExpr and not e.getExpr() instanceof BitwiseXorExpr and - not e.getExpr() instanceof LShiftExpr and - not e.getExpr() instanceof RShiftExpr and + not e.getExpr() instanceof LeftShiftExpr and + not e.getExpr() instanceof RightShiftExpr and + not e.getExpr() instanceof UnsignedRightShiftExpr and not e.getExpr() instanceof ConditionalExpr and not e.getExpr() instanceof RefExpr and not e.getExpr() instanceof LocalVariableDeclAndInitExpr and diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll index 562a4dd9cd5..14da6da266f 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll @@ -150,8 +150,9 @@ class AssignRemExpr extends AssignArithmeticOperation, @assign_rem_expr { * operation (`AssignAndExpr`), a bitwise-or assignment * operation (`AssignOrExpr`), a bitwise exclusive-or assignment * operation (`AssignXorExpr`), a left-shift assignment - * operation (`AssignLShiftExpr`), or a right-shift assignment - * operation (`AssignRShiftExpr`). + * operation (`AssignLeftShiftExpr`), or a right-shift assignment + * operation (`AssignRightShiftExpr`), or an unsigned right-shift assignment + * operation (`AssignUnsignedRightShiftExpr`). */ class AssignBitwiseOperation extends AssignOperation, @assign_bitwise_expr { } @@ -185,19 +186,34 @@ class AssignXorExpr extends AssignBitwiseOperation, @assign_xor_expr { /** * A left-shift assignment operation, for example `x <<= y`. */ -class AssignLShiftExpr extends AssignBitwiseOperation, @assign_lshift_expr { +class AssignLeftShiftExpr extends AssignBitwiseOperation, @assign_lshift_expr { override string getOperator() { result = "<<=" } - override string getAPrimaryQlClass() { result = "AssignLShiftExpr" } + override string getAPrimaryQlClass() { result = "AssignLeftShiftExpr" } } +/** DEPRECATED: Alias for AssignLeftShipExpr. */ +deprecated class AssignLShiftExpr = AssignLeftShiftExpr; + /** * A right-shift assignment operation, for example `x >>= y`. */ -class AssignRShiftExpr extends AssignBitwiseOperation, @assign_rshift_expr { +class AssignRightShiftExpr extends AssignBitwiseOperation, @assign_rshift_expr { override string getOperator() { result = ">>=" } - override string getAPrimaryQlClass() { result = "AssignRShiftExpr" } + override string getAPrimaryQlClass() { result = "AssignRightShiftExpr" } +} + +/** DEPRECATED: Alias for AssignRightShiftExpr. */ +deprecated class AssignRShiftExpr = AssignRightShiftExpr; + +/** + * An unsigned right-shift assignment operation, for example `x >>>= y`. + */ +class AssignUnsighedRightShiftExpr extends AssignBitwiseOperation, @assign_urshift_expr { + override string getOperator() { result = ">>>=" } + + override string getAPrimaryQlClass() { result = "AssignUnsighedRightShiftExpr" } } /** diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/BitwiseOperation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/BitwiseOperation.qll index a23da710465..d32485a51f8 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/BitwiseOperation.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/BitwiseOperation.qll @@ -31,7 +31,8 @@ class ComplementExpr extends UnaryBitwiseOperation, @bit_not_expr { * A binary bitwise operation. Either a bitwise-and operation * (`BitwiseAndExpr`), a bitwise-or operation (`BitwiseOrExpr`), * a bitwise exclusive-or operation (`BitwiseXorExpr`), a left-shift - * operation (`LShiftExpr`), or a right-shift operation (`RShiftExpr`). + * operation (`LeftShiftExpr`), a right-shift operation (`RightShiftExpr`), + * or an unsigned right-shift operation (`UnsignedRightShiftExpr`). */ class BinaryBitwiseOperation extends BitwiseOperation, BinaryOperation, @bin_bit_op_expr { override string getOperator() { none() } @@ -40,19 +41,34 @@ class BinaryBitwiseOperation extends BitwiseOperation, BinaryOperation, @bin_bit /** * A left-shift operation, for example `x << y`. */ -class LShiftExpr extends BinaryBitwiseOperation, @lshift_expr { +class LeftShiftExpr extends BinaryBitwiseOperation, @lshift_expr { override string getOperator() { result = "<<" } - override string getAPrimaryQlClass() { result = "LShiftExpr" } + override string getAPrimaryQlClass() { result = "LeftShiftExpr" } } +/** DEPRECATED: Alias for LeftShiftExpr. */ +deprecated class LShiftExpr = LeftShiftExpr; + /** * A right-shift operation, for example `x >> y`. */ -class RShiftExpr extends BinaryBitwiseOperation, @rshift_expr { +class RightShiftExpr extends BinaryBitwiseOperation, @rshift_expr { override string getOperator() { result = ">>" } - override string getAPrimaryQlClass() { result = "RShiftExpr" } + override string getAPrimaryQlClass() { result = "RightShiftExpr" } +} + +/** DEPRECATED: Alias for RightShiftExpr. */ +deprecated class RShiftExpr = RightShiftExpr; + +/** + * An unsigned right-shift operation, for example `x >>> y`. + */ +class UnsignedRightShiftExpr extends BinaryBitwiseOperation, @urshift_expr { + override string getOperator() { result = ">>>" } + + override string getAPrimaryQlClass() { result = "UnsignedRightShiftExpr" } } /** diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme b/csharp/ql/lib/semmlecode.csharp.dbscheme index 83aca6b3e4f..d0fba103f7d 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme @@ -1137,6 +1137,8 @@ case @expr.kind of /* C# 11.0 */ | 131 = @list_pattern_expr | 132 = @slice_pattern_expr +| 133 = @urshift_expr +| 134 = @assign_urshift_expr /* Preprocessor */ | 999 = @define_symbol_expr ; @@ -1160,7 +1162,7 @@ case @expr.kind of @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; + | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_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; @@ -1191,7 +1193,7 @@ case @expr.kind of @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; + | @rshift_expr | @urshift_expr; @un_bit_op_expr = @bit_not_expr; @bit_expr = @un_bit_op_expr | @bin_bit_op_expr; diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme.stats b/csharp/ql/lib/semmlecode.csharp.dbscheme.stats index 04516487ee9..b7c93de7353 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme.stats +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme.stats @@ -17,12 +17,12 @@ 0 - @assembly - 14676 + @file + 106540 - @file - 106541 + @assembly + 14676 @folder @@ -30,35 +30,31 @@ @namespace - 500337 + 500332 @namespace_declaration - 42810 + 42809 @using_namespace_directive - 223779 + 223777 @using_static_directive 3484 - - @directive_if - 16750 - @directive_elif 275 - @directive_else - 5439 + @directive_if + 16749 - @location_default - 137912010 + @directive_else + 5439 @directive_endif @@ -92,6 +88,10 @@ @directive_undefine 55 + + @location_default + 137911541 + @directive_define 66 @@ -106,7 +106,7 @@ @typeref - 4815264 + 4815219 @bool_type @@ -162,23 +162,23 @@ @enum_type - 204056 + 204054 @struct_type - 1036578 + 1036568 @class_type - 5157996 + 5157948 @interface_type - 3246154 + 3246124 @delegate_type - 1214025 + 1214014 @null_type @@ -186,7 +186,7 @@ @type_parameter - 991372 + 991363 @pointer_type @@ -198,7 +198,7 @@ @array_type - 116793 + 116792 @void_type @@ -222,7 +222,7 @@ @tuple_type - 37858 + 37857 @function_pointer_type @@ -232,26 +232,26 @@ @uint_ptr_type 0 - - @type_mention - 2667838 - @attribute_default - 14361364 + 14361230 @attribute_return - 224363 + 224361 @attribute_assembly - 52426 + 52425 @attribute_module 53 + + @type_mention + 2667808 + @oblivious 21291 @@ -266,7 +266,7 @@ @type_parameter_constraints - 991372 + 991363 @modifier @@ -274,19 +274,19 @@ @property - 6642412 + 6642350 @indexer - 105719 + 105718 @getter - 6738210 + 6738147 @setter - 1177149 + 1177138 @event @@ -302,15 +302,15 @@ @operator - 629721 + 629715 @method - 20454980 + 20454789 @constructor - 5991233 + 5991176 @destructor @@ -322,15 +322,15 @@ @addressable_field - 11102837 + 11102733 @constant - 3873680 + 3873643 @addressable_local_variable - 497829 + 497825 @local_constant @@ -342,19 +342,19 @@ @parameter - 37386455 + 37386105 @block_stmt - 643009 + 643003 @expr_stmt - 698450 + 698444 @if_stmt - 299700 + 299697 @switch_stmt @@ -366,7 +366,7 @@ @do_stmt - 1916 + 1915 @for_stmt @@ -374,15 +374,15 @@ @foreach_stmt - 26826 + 26825 @break_stmt - 106776 + 106775 @continue_stmt - 8596 + 8595 @goto_stmt @@ -394,11 +394,11 @@ @throw_stmt - 157116 + 157106 @return_stmt - 301790 + 301787 @yield_stmt @@ -426,7 +426,7 @@ @var_decl_stmt - 449250 + 449246 @const_decl_stmt @@ -446,7 +446,7 @@ @case_stmt - 118515 + 118513 @goto_default_stmt @@ -466,19 +466,19 @@ @using_decl_stmt - 11564 + 11563 @bool_literal_expr - 472283 + 472278 @char_literal_expr - 61271 + 61270 @int_literal_expr - 3354291 + 3354259 @long_literal_expr @@ -490,27 +490,27 @@ @ulong_literal_expr - 3300 + 3299 @float_literal_expr - 109488 + 109487 @double_literal_expr - 54800 + 54799 @string_literal_expr - 2171269 + 2171248 @null_literal_expr - 215382 + 215366 @this_access_expr - 857625 + 857617 @base_access_expr @@ -518,19 +518,19 @@ @local_variable_access_expr - 1451844 + 1451830 @parameter_access_expr - 841262 + 841254 @field_access_expr - 1097227 + 1097217 @property_access_expr - 1242991 + 1242979 @method_access_expr @@ -550,15 +550,15 @@ @type_access_expr - 1243003 + 1242991 @typeof_expr - 597670 + 597664 @method_invocation_expr - 1078551 + 1078542 @delegate_invocation_expr @@ -566,15 +566,15 @@ @operator_invocation_expr - 596656 + 596650 @cast_expr - 781499 + 781491 @object_creation_expr - 202927 + 202926 @explicit_delegate_creation_expr @@ -586,11 +586,11 @@ @array_creation_expr - 565044 + 565039 @default_expr - 669657 + 669651 @minus_expr @@ -598,7 +598,7 @@ @log_not_expr - 60763 + 60762 @post_incr_expr @@ -618,7 +618,7 @@ @mul_expr - 9154 + 9153 @div_expr @@ -630,11 +630,11 @@ @add_expr - 72534 + 72533 @sub_expr - 25994 + 25993 @lshift_expr @@ -646,11 +646,11 @@ @lt_expr - 34251 + 34250 @gt_expr - 20968 + 20967 @le_expr @@ -658,15 +658,15 @@ @ge_expr - 12159 + 12158 @eq_expr - 135300 + 135298 @ne_expr - 117244 + 117243 @bit_and_expr @@ -682,7 +682,7 @@ @log_and_expr - 51646 + 51645 @log_or_expr @@ -690,7 +690,7 @@ @is_expr - 19997 + 19994 @as_expr @@ -702,11 +702,11 @@ @conditional_expr - 34750 + 34749 @simple_assign_expr - 1223633 + 1223622 @assign_add_expr @@ -726,7 +726,7 @@ @object_init_expr - 163090 + 163088 @collection_init_expr @@ -734,7 +734,7 @@ @array_init_expr - 564188 + 564183 @checked_expr @@ -746,7 +746,7 @@ @constructor_init_expr - 42947 + 42945 @add_event_expr @@ -758,11 +758,11 @@ @local_var_decl_expr - 499277 + 499273 @lambda_expr - 200792 + 200791 @anonymous_method_expr @@ -778,7 +778,7 @@ @nameof_expr - 50715 + 50714 @interpolated_string_expr @@ -794,15 +794,15 @@ @discard_expr - 30087 + 30086 @define_symbol_expr - 32513 + 32512 @decimal_literal_expr - 157044 + 157042 @plus_expr @@ -886,11 +886,11 @@ @recursive_pattern_expr - 3150 + 3146 @property_pattern_expr - 2543 + 2533 @positional_pattern_expr @@ -898,7 +898,7 @@ @switch_case_expr - 660643 + 660636 @assign_coalesce_expr @@ -906,7 +906,7 @@ @suppress_nullable_warning_expr - 25801 + 25799 @namespace_access_expr @@ -930,7 +930,7 @@ @not_pattern_expr - 2910 + 2909 @and_pattern_expr @@ -938,7 +938,7 @@ @or_pattern_expr - 2477 + 2476 @function_pointer_invocation_expr @@ -956,17 +956,25 @@ @slice_pattern_expr 18 + + @urshift_expr + 50 + + + @assign_urshift_expr + 2 + @xmldtd 58 @xmlelement - 60596893 + 60596686 @xmlattribute - 41517960 + 41517819 @xmlnamespace @@ -978,23 +986,23 @@ @xmlcharacters - 45379511 + 45379357 @singlelinecomment - 673827 + 673821 @xmldoccomment - 1226196 + 1226185 @multilinecomment - 82948 + 82947 @commentblock - 374970 + 374967 @asp_close_tag @@ -1022,7 +1030,7 @@ @asp_quoted_string - 47186 + 47185 @asp_text @@ -1034,15 +1042,15 @@ @cil_valueorreftype - 10427087 + 10426990 @cil_typeparameter - 1773609 + 1773592 @cil_array_type - 181790 + 181788 @cil_pointer_type @@ -1050,135 +1058,139 @@ @cil_function_pointer_type - 39912 + 39911 + + + @cil_method + 39373409 @cil_nop - 1327129 + 1327046 @cil_ldarg_0 - 53581819 + 53581318 @cil_ldarg_1 - 20969699 + 20969503 @cil_ldarg_2 - 7471514 + 7471444 @cil_ldarg_3 - 3234755 + 3234725 @cil_ldloc_0 - 17598601 + 17598436 @cil_ldloc_1 - 9495219 + 9495130 @cil_ldloc_2 - 6739302 + 6739239 @cil_ldloc_3 - 4230971 + 4230931 @cil_stloc_0 - 8735189 + 8735107 @cil_stloc_1 - 5003935 + 5003888 @cil_stloc_2 - 3618151 + 3618117 @cil_stloc_3 - 2480277 + 2480254 @cil_ldarg_s - 3414862 + 3414830 @cil_ldarga_s - 1248318 + 1248307 @cil_starg_s - 270382 + 270379 @cil_ldloc_s - 14457162 + 14457027 @cil_ldloca_s - 9786184 + 9786093 @cil_stloc_s - 9038705 + 9038620 @cil_ldnull - 5794381 + 5794327 @cil_ldc_i4_m1 - 871537 + 871529 @cil_ldc_i4_0 - 10862959 + 10862858 @cil_ldc_i4_1 - 8606701 + 8606621 @cil_ldc_i4_2 - 1948578 + 1948560 @cil_ldc_i4_3 - 1073526 + 1073516 @cil_ldc_i4_4 - 985880 + 985870 @cil_ldc_i4_5 - 578416 + 578411 @cil_ldc_i4_6 - 334080 + 334076 @cil_ldc_i4_7 - 296812 + 296809 @cil_ldc_i4_8 - 444583 + 444579 @cil_ldc_i4_s - 5378885 + 5378835 @cil_ldc_i4 - 2836653 + 2836626 @cil_ldc_i8 @@ -1186,23 +1198,23 @@ @cil_ldc_r4 - 31066 + 31065 @cil_ldc_r8 - 238341 + 238339 @cil_dup - 9272617 + 9272530 @cil_pop - 3880176 + 3880140 @cil_call - 48855176 + 48854719 @cil_calli @@ -1210,43 +1222,43 @@ @cil_ret - 31661234 + 31660937 @cil_br_s - 5776958 + 5776904 @cil_brfalse_s - 10010144 + 10010051 @cil_brtrue_s - 9349219 + 9349132 @cil_beq_s - 1588452 + 1588437 @cil_bge_s - 302364 + 302361 @cil_bgt_s - 237898 + 237896 @cil_ble_s - 342112 + 342109 @cil_blt_s - 581015 + 581009 @cil_bne_un_s - 2310181 + 2310159 @cil_bge_un_s @@ -1254,11 +1266,11 @@ @cil_bgt_un_s - 101083 + 101082 @cil_ble_un_s - 98691 + 98690 @cil_blt_un_s @@ -1266,23 +1278,23 @@ @cil_br - 1432176 + 1432163 @cil_brfalse - 953957 + 953948 @cil_brtrue - 803794 + 803786 @cil_beq - 420014 + 420010 @cil_bge - 34905 + 34904 @cil_bgt @@ -1294,11 +1306,11 @@ @cil_blt - 95206 + 95205 @cil_bne_un - 210730 + 210728 @cil_bge_un @@ -1318,7 +1330,7 @@ @cil_switch - 272685 + 272683 @cil_ldind_i1 @@ -1326,7 +1338,7 @@ @cil_ldind_u1 - 90068 + 90067 @cil_ldind_u2 @@ -1334,7 +1346,7 @@ @cil_ldind_i4 - 219353 + 219351 @cil_ldind_u4 @@ -1354,15 +1366,15 @@ @cil_ldind_ref - 190974 + 190972 @cil_stind_ref - 325516 + 325513 @cil_stind_i1 - 144847 + 144846 @cil_stind_i2 @@ -1370,7 +1382,7 @@ @cil_stind_i4 - 441482 + 441478 @cil_stind_i8 @@ -1386,19 +1398,19 @@ @cil_add - 2691805 + 2691780 @cil_sub - 1007112 + 1007103 @cil_mul - 426481 + 426477 @cil_div - 85048 + 85047 @cil_div_un @@ -1414,31 +1426,31 @@ @cil_and - 506036 + 506032 @cil_or - 225791 + 225789 @cil_xor - 192185 + 192183 @cil_shl - 118122 + 118121 @cil_shr - 60626 + 60625 @cil_shr_un - 114815 + 114814 @cil_neg - 29501 + 29500 @cil_not @@ -1454,11 +1466,11 @@ @cil_conv_i4 - 534002 + 533997 @cil_conv_i8 - 309038 + 309035 @cil_conv_r4 @@ -1474,11 +1486,11 @@ @cil_conv_u8 - 142987 + 142985 @cil_callvirt - 41217611 + 41217225 @cil_cpobj @@ -1486,23 +1498,23 @@ @cil_ldobj - 163865 + 163863 @cil_ldstr - 11254978 + 11254873 @cil_newobj - 12728409 + 12728290 @cil_castclass - 1803967 + 1803950 @cil_isinst - 2744724 + 2744698 @cil_conv_r_un @@ -1514,23 +1526,23 @@ @cil_throw - 1827943 + 1827881 @cil_ldfld - 23008966 + 23008751 @cil_ldflda - 1951443 + 1951424 @cil_stfld - 11363976 + 11363870 @cil_ldsfld - 10513996 + 10513898 @cil_ldsflda @@ -1538,7 +1550,7 @@ @cil_stsfld - 2599167 + 2599143 @cil_stobj @@ -1546,19 +1558,19 @@ @cil_box - 1419832 + 1419819 @cil_newarr - 1603690 + 1603675 @cil_ldlen - 570295 + 570290 @cil_ldelema - 714434 + 714427 @cil_ldelem_i1 @@ -1566,7 +1578,7 @@ @cil_ldelem_u1 - 104863 + 104862 @cil_ldelem_i2 @@ -1578,15 +1590,15 @@ @cil_ldelem_i4 - 158254 + 158253 @cil_ldelem_u4 - 130732 + 130730 @cil_ldelem_i8 - 64583 + 64582 @cil_ldelem_i @@ -1602,7 +1614,7 @@ @cil_ldelem_ref - 344799 + 344796 @cil_stelem_i @@ -1610,7 +1622,7 @@ @cil_stelem_i1 - 75244 + 75243 @cil_stelem_i2 @@ -1618,11 +1630,11 @@ @cil_stelem_i4 - 173108 + 173106 @cil_stelem_i8 - 31007 + 31006 @cil_stelem_r8 @@ -1630,19 +1642,19 @@ @cil_stelem_ref - 4221551 + 4221511 @cil_ldelem - 35909 + 35908 @cil_stelem - 208190 + 208188 @cil_unbox_any - 227651 + 227649 @cil_conv_ovf_u1 @@ -1658,7 +1670,7 @@ @cil_ldtoken - 1020371 + 1020362 @cil_conv_u2 @@ -1666,11 +1678,11 @@ @cil_conv_u1 - 238253 + 238250 @cil_conv_i - 34285 + 34284 @cil_conv_ovf_i @@ -1690,15 +1702,15 @@ @cil_endfinally - 1967891 + 1967873 @cil_leave - 692729 + 692723 @cil_leave_s - 3134203 + 3134174 @cil_stind_i @@ -1706,11 +1718,11 @@ @cil_conv_u - 114135 + 114134 @cil_ceq - 930037 + 930028 @cil_cgt @@ -1718,11 +1730,11 @@ @cil_cgt_un - 355253 + 355250 @cil_clt - 75775 + 75774 @cil_clt_un @@ -1730,7 +1742,7 @@ @cil_ldftn - 2883016 + 2882989 @cil_ldvirtftn @@ -1762,15 +1774,15 @@ @cil_volatile - 55222 + 55221 @cil_initobj - 950709 + 950700 @cil_constrained - 758376 + 758368 @cil_cpblk @@ -1782,7 +1794,7 @@ @cil_rethrow - 72025 + 72024 @cil_sizeof @@ -1914,7 +1926,7 @@ @cil_ldloca - 78758 + 78757 @cil_tail @@ -1924,37 +1936,33 @@ @cil_refanytype 13 - - @cil_method - 39373777 - @cil_method_implementation - 27073001 + 27072747 @cil_field - 15899467 + 15899318 @cil_parameter - 75119038 - - - @cil_property - 6002749 + 75118336 @cil_event - 70696 + 70695 + + + @cil_property + 6002693 @cil_local_variable - 23026507 + 23026292 @cil_catch_handler - 400819 + 400815 @cil_filter_handler @@ -1962,15 +1970,15 @@ @cil_finally_handler - 1662456 + 1662440 @cil_fault_handler - 305435 + 305432 @cil_attribute - 5874527 + 5874473 @@ -2320,7 +2328,7 @@ compilation_compiling_files - 49881 + 49880 id @@ -2640,7 +2648,7 @@ 1 2 - 49836 + 49835 2 @@ -2661,7 +2669,7 @@ 1 2 - 49836 + 49835 2 @@ -2676,7 +2684,7 @@ compilation_referencing_files - 719519 + 719512 id @@ -2910,57 +2918,62 @@ 1 5 - 630 + 574 5 6 - 1159 + 1148 6 7 - 900 + 957 7 - 22 + 21 + 540 + + + 21 + 27 574 - 22 - 28 - 574 + 27 + 32 + 540 - 28 - 35 - 517 - - - 35 + 32 42 529 - 42 - 58 + 43 + 59 551 - 58 - 67 - 608 + 59 + 66 + 495 - 67 - 70 + 66 + 69 + 506 + + + 69 + 73 585 - 70 - 77 - 416 + 73 + 82 + 45 @@ -3037,62 +3050,62 @@ 2 5 - 585 + 562 5 6 - 630 + 495 6 7 - 641 + 788 7 - 10 + 9 + 596 + + + 9 + 19 675 - 10 - 20 - 686 - - - 20 - 28 - 675 - - - 28 - 35 - 619 - - - 35 - 51 + 19 + 25 574 - 51 - 68 - 439 + 25 + 32 + 596 - 68 - 70 - 484 + 32 + 38 + 608 - 70 + 38 + 67 + 517 + + + 67 + 69 + 517 + + + 69 72 - 574 + 630 72 - 78 - 304 + 77 + 326 @@ -3118,7 +3131,7 @@ seconds - 11226 + 11530 @@ -3164,12 +3177,12 @@ 6 7 - 11 + 22 7 8 - 2206 + 2195 @@ -3215,8 +3228,8 @@ 12 - 997 - 998 + 1024 + 1025 11 @@ -3263,19 +3276,24 @@ 12 - 138 - 139 + 143 + 144 11 - 144 - 145 + 146 + 147 11 - 152 - 153 - 22 + 155 + 156 + 11 + + + 157 + 158 + 11 197 @@ -3296,7 +3314,7 @@ 1 2 - 9007 + 9345 2 @@ -3306,12 +3324,12 @@ 3 5 - 945 + 1035 5 - 10 - 247 + 8 + 123 @@ -3327,7 +3345,7 @@ 1 2 - 11226 + 11530 @@ -3343,17 +3361,17 @@ 1 2 - 9570 + 9874 2 3 - 1328 + 1429 3 5 - 326 + 225 @@ -4412,7 +4430,7 @@ 1 2 - 31693 + 31692 2 @@ -4481,7 +4499,7 @@ 1 2 - 31693 + 31692 2 @@ -4539,7 +4557,7 @@ 1 2 - 40646 + 40645 2 @@ -4560,7 +4578,7 @@ 1 2 - 40646 + 40645 2 @@ -4581,7 +4599,7 @@ 1 2 - 40646 + 40645 2 @@ -5357,7 +5375,7 @@ cpu_seconds - 1936 + 2060 elapsed_seconds @@ -5407,17 +5425,12 @@ 1 2 - 1666 + 1925 2 - 3 - 258 - - - 3 4 - 11 + 135 @@ -5433,17 +5446,12 @@ 1 2 - 1666 + 1925 2 - 3 - 258 - - - 3 4 - 11 + 135 @@ -5688,19 +5696,19 @@ locations_default - 137912010 + 137911541 id - 137912010 + 137911541 file - 73412 + 73411 beginLine - 328702 + 328701 beginColumn @@ -5708,7 +5716,7 @@ endLine - 331303 + 331302 endColumn @@ -5726,7 +5734,7 @@ 1 2 - 137912010 + 137911541 @@ -5742,7 +5750,7 @@ 1 2 - 137912010 + 137911541 @@ -5758,7 +5766,7 @@ 1 2 - 137912010 + 137911541 @@ -5774,7 +5782,7 @@ 1 2 - 137912010 + 137911541 @@ -5790,7 +5798,7 @@ 1 2 - 137912010 + 137911541 @@ -5963,7 +5971,7 @@ 1 6 - 5045 + 5044 6 @@ -6099,7 +6107,7 @@ 2417 135652 - 5197 + 5196 @@ -6196,7 +6204,7 @@ 4 5 - 21425 + 21424 5 @@ -6520,7 +6528,7 @@ 57 78 - 24880 + 24879 78 @@ -6953,7 +6961,7 @@ 2 3 - 76464 + 76463 3 @@ -7151,7 +7159,7 @@ 1 2 - 10090 + 10089 2 @@ -7345,15 +7353,15 @@ locations_mapped - 135223 + 135221 id - 135223 + 135221 mapped_to - 83194 + 83193 @@ -7367,7 +7375,7 @@ 1 2 - 135223 + 135221 @@ -7383,7 +7391,7 @@ 1 2 - 31212 + 31211 2 @@ -7403,11 +7411,11 @@ numlines - 60897147 + 60896940 element_id - 60897038 + 60896831 num_lines @@ -7433,7 +7441,7 @@ 1 2 - 60896930 + 60896723 2 @@ -7454,7 +7462,7 @@ 1 2 - 60896932 + 60896725 2 @@ -7475,7 +7483,7 @@ 1 2 - 60897026 + 60896819 2 @@ -8076,7 +8084,7 @@ 1 2 - 14588 + 14587 3 @@ -8097,7 +8105,7 @@ 1 2 - 14588 + 14587 3 @@ -8150,7 +8158,7 @@ 1 2 - 14588 + 14587 3 @@ -8171,7 +8179,7 @@ 1 2 - 14588 + 14587 3 @@ -8382,15 +8390,15 @@ files - 106541 + 106540 id - 106541 + 106540 name - 106541 + 106540 @@ -8404,7 +8412,7 @@ 1 2 - 106541 + 106540 @@ -8420,7 +8428,7 @@ 1 2 - 106541 + 106540 @@ -8478,7 +8486,7 @@ containerparent - 143755 + 143753 parent @@ -8486,7 +8494,7 @@ child - 143755 + 143753 @@ -8546,7 +8554,7 @@ 1 2 - 143755 + 143753 @@ -8604,15 +8612,15 @@ namespaces - 500337 + 500332 id - 500337 + 500332 name - 86288 + 86287 @@ -8626,7 +8634,7 @@ 1 2 - 500337 + 500332 @@ -8647,7 +8655,7 @@ 2 3 - 52830 + 52829 3 @@ -8692,11 +8700,11 @@ namespace_declarations - 42810 + 42809 id - 42810 + 42809 namespace_id @@ -8714,7 +8722,7 @@ 1 2 - 42810 + 42809 @@ -8775,15 +8783,15 @@ namespace_declaration_location - 42810 + 42809 id - 42810 + 42809 loc - 42810 + 42809 @@ -8797,7 +8805,7 @@ 1 2 - 42810 + 42809 @@ -8813,7 +8821,7 @@ 1 2 - 42810 + 42809 @@ -8823,15 +8831,15 @@ parent_namespace - 9856437 + 9856345 child_id - 9856437 + 9856345 namespace_id - 314826 + 314823 @@ -8845,7 +8853,7 @@ 1 2 - 9856437 + 9856345 @@ -8861,12 +8869,12 @@ 1 2 - 81977 + 81976 2 3 - 44857 + 44856 3 @@ -8876,7 +8884,7 @@ 4 5 - 21321 + 21320 5 @@ -8891,7 +8899,7 @@ 8 12 - 28556 + 28555 12 @@ -8901,7 +8909,7 @@ 19 44 - 23831 + 23830 44 @@ -8938,7 +8946,7 @@ 1 2 - 53097 + 53096 2 @@ -8995,11 +9003,11 @@ using_namespace_directives - 223779 + 223777 id - 223779 + 223777 namespace_id @@ -9017,7 +9025,7 @@ 1 2 - 223779 + 223777 @@ -9136,15 +9144,15 @@ using_directive_location - 223959 + 223957 id - 223959 + 223957 loc - 223846 + 223844 @@ -9158,7 +9166,7 @@ 1 2 - 223959 + 223957 @@ -9174,7 +9182,7 @@ 1 2 - 223734 + 223732 2 @@ -9189,11 +9197,11 @@ directive_ifs - 16750 + 16749 id - 16750 + 16749 branchTaken @@ -9215,7 +9223,7 @@ 1 2 - 16750 + 16749 @@ -9231,7 +9239,7 @@ 1 2 - 16750 + 16749 @@ -10057,7 +10065,7 @@ start - 16750 + 16749 @@ -10087,7 +10095,7 @@ 1 2 - 16750 + 16749 @@ -10097,11 +10105,11 @@ directive_define_symbols - 32513 + 32512 id - 32513 + 32512 name @@ -10119,7 +10127,7 @@ 1 2 - 32513 + 32512 @@ -11632,15 +11640,15 @@ preprocessor_directive_location - 79638 + 79637 id - 79638 + 79637 loc - 79638 + 79637 @@ -11654,7 +11662,7 @@ 1 2 - 79638 + 79637 @@ -11670,7 +11678,7 @@ 1 2 - 79638 + 79637 @@ -11680,11 +11688,11 @@ preprocessor_directive_compilation - 79638 + 79637 id - 79638 + 79637 compilation @@ -11702,7 +11710,7 @@ 1 2 - 79638 + 79637 @@ -11753,11 +11761,11 @@ preprocessor_directive_active - 79638 + 79637 id - 79638 + 79637 active @@ -11775,7 +11783,7 @@ 1 2 - 79638 + 79637 @@ -11806,11 +11814,11 @@ types - 11520193 + 11520085 id - 11520193 + 11520085 kind @@ -11818,7 +11826,7 @@ name - 3497046 + 3497013 @@ -11832,7 +11840,7 @@ 1 2 - 11520193 + 11520085 @@ -11848,7 +11856,7 @@ 1 2 - 11520193 + 11520085 @@ -11951,17 +11959,17 @@ 1 2 - 3141586 + 3141557 2 5 - 274812 + 274809 5 21597 - 80648 + 80647 @@ -11977,7 +11985,7 @@ 1 2 - 3468460 + 3468428 2 @@ -11992,15 +12000,15 @@ typerefs - 4815264 + 4815219 id - 4815264 + 4815219 name - 3370389 + 3370358 @@ -12014,7 +12022,7 @@ 1 2 - 4815264 + 4815219 @@ -12030,12 +12038,12 @@ 1 2 - 3128415 + 3128386 2 11806 - 241973 + 241971 @@ -12045,15 +12053,15 @@ typeref_type - 4775132 + 4775087 id - 4775132 + 4775087 typeId - 4775132 + 4775087 @@ -12067,7 +12075,7 @@ 1 2 - 4775132 + 4775087 @@ -12083,7 +12091,7 @@ 1 2 - 4775132 + 4775087 @@ -12093,11 +12101,11 @@ array_element_type - 116793 + 116792 array - 116793 + 116792 dimension @@ -12109,7 +12117,7 @@ element - 116409 + 116408 @@ -12123,7 +12131,7 @@ 1 2 - 116793 + 116792 @@ -12139,7 +12147,7 @@ 1 2 - 116793 + 116792 @@ -12155,7 +12163,7 @@ 1 2 - 116793 + 116792 @@ -12317,7 +12325,7 @@ 1 2 - 116084 + 116083 2 @@ -12338,7 +12346,7 @@ 1 2 - 116409 + 116408 @@ -12354,7 +12362,7 @@ 1 2 - 116084 + 116083 2 @@ -12465,11 +12473,11 @@ enum_underlying_type - 204056 + 204054 enum_id - 204056 + 204054 underlying_type_id @@ -12487,7 +12495,7 @@ 1 2 - 204056 + 204054 @@ -12548,15 +12556,15 @@ delegate_return_type - 1214025 + 1214014 delegate_id - 1214025 + 1214014 return_type_id - 609581 + 609575 @@ -12570,7 +12578,7 @@ 1 2 - 1214025 + 1214014 @@ -12586,12 +12594,12 @@ 1 2 - 578365 + 578359 2 2134 - 31216 + 31215 @@ -12669,15 +12677,15 @@ extend - 3912749 + 3912712 sub - 3912749 + 3912712 super - 608567 + 608561 @@ -12691,7 +12699,7 @@ 1 2 - 3912749 + 3912712 @@ -12707,12 +12715,12 @@ 1 2 - 412779 + 412775 2 3 - 97451 + 97450 3 @@ -12722,12 +12730,12 @@ 5 107 - 45654 + 45653 107 31892 - 1447 + 1446 @@ -12748,15 +12756,15 @@ implement - 12929395 + 12929274 sub - 4515705 + 4515663 super - 2758958 + 2758932 @@ -12770,32 +12778,32 @@ 1 2 - 1532610 + 1532595 2 3 - 1232578 + 1232567 3 4 - 844694 + 844686 4 6 - 367567 + 367564 6 9 - 339011 + 339008 9 32 - 199243 + 199241 @@ -12811,27 +12819,27 @@ 1 2 - 1324507 + 1324495 2 3 - 815340 + 815333 3 5 - 236392 + 236390 5 6 - 215396 + 215394 6 90747 - 167320 + 167318 @@ -12841,11 +12849,11 @@ type_location - 6161742 + 6161685 id - 6071408 + 6071351 loc @@ -12863,7 +12871,7 @@ 1 2 - 6041080 + 6041024 2 @@ -12944,15 +12952,15 @@ tuple_underlying_type - 37858 + 37857 tuple - 37858 + 37857 struct - 37858 + 37857 @@ -12966,7 +12974,7 @@ 1 2 - 37858 + 37857 @@ -12982,7 +12990,7 @@ 1 2 - 37858 + 37857 @@ -12992,7 +13000,7 @@ tuple_element - 99961 + 99960 tuple @@ -13004,7 +13012,7 @@ field - 99961 + 99960 @@ -13322,7 +13330,7 @@ 1 2 - 99961 + 99960 @@ -13338,7 +13346,7 @@ 1 2 - 99961 + 99960 @@ -13348,11 +13356,11 @@ attributes - 14554229 + 14554093 id - 14554229 + 14554093 kind @@ -13364,7 +13372,7 @@ target - 12720347 + 12720228 @@ -13378,7 +13386,7 @@ 1 2 - 14554229 + 14554093 @@ -13394,7 +13402,7 @@ 1 2 - 14554229 + 14554093 @@ -13410,7 +13418,7 @@ 1 2 - 14554229 + 14554093 @@ -13534,7 +13542,7 @@ 14 23 - 1447 + 1446 23 @@ -13544,7 +13552,7 @@ 40 86 - 1447 + 1446 88 @@ -13651,7 +13659,7 @@ 152 380 - 1447 + 1446 385 @@ -13677,12 +13685,12 @@ 1 2 - 11789749 + 11789638 2 3520 - 930598 + 930589 @@ -13698,7 +13706,7 @@ 1 2 - 12664594 + 12664475 2 @@ -13719,12 +13727,12 @@ 1 2 - 11960465 + 11960353 2 29 - 759882 + 759875 @@ -13734,11 +13742,11 @@ attribute_location - 14556089 + 14555953 id - 14554229 + 14554093 loc @@ -13756,7 +13764,7 @@ 1 2 - 14552752 + 14552616 2 @@ -13847,19 +13855,19 @@ type_mention - 2667838 + 2667808 id - 2667838 + 2667808 type_id - 76163 + 76156 parent - 2110780 + 2110766 @@ -13873,7 +13881,7 @@ 1 2 - 2667838 + 2667808 @@ -13889,7 +13897,7 @@ 1 2 - 2667838 + 2667808 @@ -13905,17 +13913,17 @@ 1 2 - 13028 + 13027 2 3 - 14823 + 14820 3 4 - 8378 + 8377 4 @@ -13930,7 +13938,7 @@ 6 7 - 5252 + 5251 7 @@ -13945,17 +13953,17 @@ 16 36 - 5803 + 5802 36 - 760 - 5714 + 758 + 5711 - 762 + 759 97094 - 360 + 362 @@ -13971,12 +13979,12 @@ 1 2 - 23361 + 23359 2 3 - 12267 + 12264 3 @@ -13986,7 +13994,7 @@ 4 5 - 6013 + 6012 5 @@ -14001,7 +14009,7 @@ 8 13 - 5964 + 5963 13 @@ -14010,13 +14018,13 @@ 30 - 609 - 5714 + 607 + 5711 - 612 - 73794 - 383 + 608 + 73798 + 385 @@ -14032,17 +14040,17 @@ 1 2 - 1801358 + 1801339 2 3 - 219426 + 219408 3 613 - 89995 + 90019 @@ -14058,12 +14066,12 @@ 1 2 - 2067454 + 2067445 2 38 - 43325 + 43320 @@ -14073,15 +14081,15 @@ type_mention_location - 2667838 + 2667808 id - 2667838 + 2667808 loc - 2358635 + 2358655 @@ -14095,7 +14103,7 @@ 1 2 - 2667838 + 2667808 @@ -14111,12 +14119,12 @@ 1 2 - 2217587 + 2217592 2 205 - 141048 + 141062 @@ -14126,11 +14134,11 @@ type_annotation - 1259639 + 1259627 id - 1259639 + 1259627 annotation @@ -14148,7 +14156,7 @@ 1 2 - 1259639 + 1259627 @@ -14543,15 +14551,15 @@ type_nullability - 44405235 + 44404820 id - 44402076 + 44401660 nullability - 28113 + 28112 @@ -14565,7 +14573,7 @@ 1 2 - 44399034 + 44398619 2 @@ -14586,7 +14594,7 @@ 1 2 - 10129 + 10128 2 @@ -14596,7 +14604,7 @@ 3 4 - 2894 + 2893 4 @@ -14636,11 +14644,11 @@ expr_flowstate - 5429110 + 5429197 id - 5429110 + 5429197 state @@ -14658,7 +14666,7 @@ 1 2 - 5429110 + 5429197 @@ -14672,13 +14680,13 @@ 12 - 223701 - 223702 + 223736 + 223737 2 - 2337771 - 2337772 + 2337938 + 2337939 2 @@ -14689,11 +14697,11 @@ type_parameters - 991372 + 991363 id - 991372 + 991363 index @@ -14701,7 +14709,7 @@ generic_id - 758317 + 758309 variance @@ -14719,7 +14727,7 @@ 1 2 - 991372 + 991363 @@ -14735,7 +14743,7 @@ 1 2 - 991372 + 991363 @@ -14751,7 +14759,7 @@ 1 2 - 991372 + 991363 @@ -14915,12 +14923,12 @@ 1 2 - 592797 + 592792 2 3 - 137258 + 137257 3 @@ -14941,12 +14949,12 @@ 1 2 - 592797 + 592792 2 3 - 137258 + 137257 3 @@ -14967,7 +14975,7 @@ 1 2 - 757135 + 757128 2 @@ -15060,11 +15068,11 @@ type_arguments - 24843956 + 24843724 id - 789924 + 789917 index @@ -15072,7 +15080,7 @@ constructed_id - 2591723 + 2591698 @@ -15086,17 +15094,17 @@ 1 2 - 216091 + 216089 2 3 - 548605 + 548600 3 8 - 25228 + 25227 @@ -15112,22 +15120,22 @@ 1 2 - 82752 + 82751 2 3 - 587919 + 587914 3 10 - 61303 + 61302 10 3477 - 57949 + 57948 @@ -15325,37 +15333,37 @@ 1 2 - 408050 + 408047 2 3 - 1236259 + 1236248 3 19 - 213081 + 213079 19 24 - 198798 + 198796 24 28 - 230194 + 230192 28 31 - 221032 + 221030 31 33 - 84306 + 84305 @@ -15371,37 +15379,37 @@ 1 2 - 403306 + 403302 2 3 - 1238582 + 1238571 3 19 - 215502 + 215500 19 24 - 198798 + 198796 24 28 - 230194 + 230192 28 31 - 221032 + 221030 31 33 - 84306 + 84305 @@ -15411,15 +15419,15 @@ constructed_generic - 5258135 + 5258085 constructed - 5258135 + 5258085 generic - 108318 + 108317 @@ -15433,7 +15441,7 @@ 1 2 - 5258135 + 5258085 @@ -15459,7 +15467,7 @@ 3 4 - 10631 + 10630 4 @@ -15489,7 +15497,7 @@ 149 19826 - 3396 + 3395 @@ -15499,15 +15507,15 @@ type_parameter_constraints - 991372 + 991363 id - 991372 + 991363 param_id - 991372 + 991363 @@ -15521,7 +15529,7 @@ 1 2 - 991372 + 991363 @@ -15537,7 +15545,7 @@ 1 2 - 991372 + 991363 @@ -15583,11 +15591,11 @@ general_type_parameter_constraints - 283258 + 283256 id - 282033 + 282031 kind @@ -15605,7 +15613,7 @@ 1 2 - 280808 + 280806 2 @@ -15656,11 +15664,11 @@ specific_type_parameter_constraints - 302127 + 302125 id - 295217 + 295214 base_id @@ -15678,7 +15686,7 @@ 1 2 - 290167 + 290165 2 @@ -15699,7 +15707,7 @@ 1 2 - 24776 + 24775 2 @@ -15739,7 +15747,7 @@ specific_type_parameter_nullability - 35626 + 35625 id @@ -16126,11 +16134,11 @@ has_modifiers - 100736682 + 100735739 id - 66663238 + 66662615 mod_id @@ -16148,17 +16156,17 @@ 1 2 - 34234237 + 34233917 2 3 - 30788810 + 30788522 3 5 - 1640190 + 1640174 @@ -16249,11 +16257,11 @@ compiler_generated - 1278339 + 1278327 id - 1278339 + 1278327 @@ -16348,19 +16356,19 @@ nested_types - 2161819 + 2161798 id - 2161819 + 2161798 declaring_type_id - 867580 + 867572 unbound_id - 1812914 + 1812897 @@ -16374,7 +16382,7 @@ 1 2 - 2161819 + 2161798 @@ -16390,7 +16398,7 @@ 1 2 - 2161819 + 2161798 @@ -16406,12 +16414,12 @@ 1 2 - 507720 + 507715 2 3 - 151344 + 151343 3 @@ -16447,27 +16455,27 @@ 1 2 - 509816 + 509812 2 3 - 152023 + 152022 3 4 - 71848 + 71847 4 6 - 65587 + 65586 6 26 - 65085 + 65084 26 @@ -16488,12 +16496,12 @@ 1 2 - 1746795 + 1746779 2 490 - 66119 + 66118 @@ -16509,7 +16517,7 @@ 1 2 - 1757397 + 1757380 2 @@ -16524,27 +16532,27 @@ properties - 6642412 + 6642350 id - 6642412 + 6642350 name - 1540642 + 1540628 declaring_type_id - 1854464 + 1854447 type_id - 737232 + 737225 unbound_id - 5942802 + 5942747 @@ -16558,7 +16566,7 @@ 1 2 - 6642412 + 6642350 @@ -16574,7 +16582,7 @@ 1 2 - 6642412 + 6642350 @@ -16590,7 +16598,7 @@ 1 2 - 6642412 + 6642350 @@ -16606,7 +16614,7 @@ 1 2 - 6642412 + 6642350 @@ -16622,27 +16630,27 @@ 1 2 - 972266 + 972257 2 3 - 248204 + 248202 3 4 - 95265 + 95264 4 8 - 124087 + 124086 8 8341 - 100817 + 100816 @@ -16658,27 +16666,27 @@ 1 2 - 972266 + 972257 2 3 - 248559 + 248556 3 4 - 95118 + 95117 4 8 - 124412 + 124411 8 4889 - 100286 + 100285 @@ -16694,12 +16702,12 @@ 1 2 - 1346951 + 1346938 2 3 - 111448 + 111447 3 @@ -16720,12 +16728,12 @@ 1 2 - 980741 + 980732 2 3 - 254051 + 254049 3 @@ -16735,12 +16743,12 @@ 4 8 - 120130 + 120129 8 7118 - 90275 + 90274 @@ -16756,37 +16764,37 @@ 1 2 - 660127 + 660121 2 3 - 435281 + 435277 3 4 - 247023 + 247021 4 5 - 156837 + 156835 5 7 - 156010 + 156008 7 14 - 142130 + 142129 14 2090 - 57053 + 57052 @@ -16802,37 +16810,37 @@ 1 2 - 762392 + 762385 2 3 - 334641 + 334637 3 4 - 247407 + 247405 4 5 - 159435 + 159434 5 7 - 155951 + 155949 7 14 - 139916 + 139914 14 2090 - 54720 + 54719 @@ -16848,27 +16856,27 @@ 1 2 - 764990 + 764983 2 3 - 530281 + 530276 3 4 - 228389 + 228387 4 5 - 122552 + 122550 5 9 - 154563 + 154561 9 @@ -16889,37 +16897,37 @@ 1 2 - 660127 + 660121 2 3 - 435281 + 435277 3 4 - 247023 + 247021 4 5 - 156837 + 156835 5 7 - 156010 + 156008 7 14 - 142130 + 142129 14 2090 - 57053 + 57052 @@ -16935,17 +16943,17 @@ 1 2 - 402738 + 402734 2 3 - 152023 + 152022 3 4 - 49375 + 49374 4 @@ -16955,7 +16963,7 @@ 7 32 - 55340 + 55339 32 @@ -16976,12 +16984,12 @@ 1 2 - 589136 + 589130 2 3 - 82449 + 82448 3 @@ -17007,12 +17015,12 @@ 1 2 - 421756 + 421752 2 3 - 145733 + 145732 3 @@ -17027,7 +17035,7 @@ 7 51 - 55399 + 55398 51 @@ -17048,12 +17056,12 @@ 1 2 - 404923 + 404920 2 3 - 154268 + 154266 3 @@ -17063,12 +17071,12 @@ 4 7 - 62575 + 62574 7 40 - 55399 + 55398 40 @@ -17089,12 +17097,12 @@ 1 2 - 5841365 + 5841310 2 1206 - 101437 + 101436 @@ -17110,7 +17118,7 @@ 1 2 - 5942802 + 5942747 @@ -17126,12 +17134,12 @@ 1 2 - 5841365 + 5841310 2 1206 - 101437 + 101436 @@ -17147,12 +17155,12 @@ 1 2 - 5921038 + 5920983 2 1206 - 21764 + 21763 @@ -17162,15 +17170,15 @@ property_location - 6657089 + 6657027 id - 6642412 + 6642350 loc - 10926 + 10955 @@ -17184,7 +17192,7 @@ 1 2 - 6631840 + 6631778 2 @@ -17205,7 +17213,7 @@ 1 5 - 885 + 915 5 @@ -17280,11 +17288,11 @@ indexers - 105719 + 105718 id - 105719 + 105718 name @@ -17292,7 +17300,7 @@ declaring_type_id - 92814 + 92813 type_id @@ -17314,7 +17322,7 @@ 1 2 - 105719 + 105718 @@ -17330,7 +17338,7 @@ 1 2 - 105719 + 105718 @@ -17346,7 +17354,7 @@ 1 2 - 105719 + 105718 @@ -17362,7 +17370,7 @@ 1 2 - 105719 + 105718 @@ -17563,7 +17571,7 @@ 1 2 - 92726 + 92725 2 @@ -17584,7 +17592,7 @@ 1 2 - 86731 + 86730 2 @@ -17688,7 +17696,7 @@ 1 2 - 14027 + 14026 2 @@ -17818,7 +17826,7 @@ 1 2 - 35968 + 35967 2 @@ -17833,11 +17841,11 @@ indexer_location - 106044 + 106043 id - 105719 + 105718 loc @@ -17855,7 +17863,7 @@ 1 2 - 105394 + 105393 2 @@ -17926,11 +17934,11 @@ accessors - 7915360 + 7915286 id - 7915360 + 7915286 kind @@ -17938,15 +17946,15 @@ name - 2102196 + 2102177 declaring_member_id - 6746921 + 6746858 unbound_id - 7039570 + 7039504 @@ -17960,7 +17968,7 @@ 1 2 - 7915360 + 7915286 @@ -17976,7 +17984,7 @@ 1 2 - 7915360 + 7915286 @@ -17992,7 +18000,7 @@ 1 2 - 7915360 + 7915286 @@ -18008,7 +18016,7 @@ 1 2 - 7915360 + 7915286 @@ -18108,27 +18116,27 @@ 1 2 - 1367179 + 1367166 2 3 - 330831 + 330828 3 5 - 191653 + 191651 5 17 - 160587 + 160586 17 3385 - 51944 + 51943 @@ -18144,7 +18152,7 @@ 1 2 - 2102196 + 2102177 @@ -18160,27 +18168,27 @@ 1 2 - 1367179 + 1367166 2 3 - 330831 + 330828 3 5 - 191653 + 191651 5 17 - 160587 + 160586 17 3385 - 51944 + 51943 @@ -18196,22 +18204,22 @@ 1 2 - 1382003 + 1381990 2 3 - 339690 + 339687 3 5 - 189616 + 189614 5 24 - 158786 + 158784 24 @@ -18232,12 +18240,12 @@ 1 2 - 5578483 + 5578431 2 3 - 1168438 + 1168427 @@ -18253,12 +18261,12 @@ 1 2 - 5578483 + 5578431 2 3 - 1168438 + 1168427 @@ -18274,12 +18282,12 @@ 1 2 - 5578483 + 5578431 2 3 - 1168438 + 1168427 @@ -18295,12 +18303,12 @@ 1 2 - 5578483 + 5578431 2 3 - 1168438 + 1168427 @@ -18316,12 +18324,12 @@ 1 2 - 6919853 + 6919788 2 1206 - 119717 + 119716 @@ -18337,7 +18345,7 @@ 1 2 - 7039570 + 7039504 @@ -18353,7 +18361,7 @@ 1 2 - 7039570 + 7039504 @@ -18369,12 +18377,12 @@ 1 2 - 6919853 + 6919788 2 1206 - 119717 + 119716 @@ -18395,15 +18403,15 @@ accessor_location - 7933078 + 7933004 id - 7915360 + 7915286 loc - 10926 + 10955 @@ -18417,7 +18425,7 @@ 1 2 - 7901923 + 7901849 2 @@ -18438,67 +18446,67 @@ 1 6 - 885 + 944 6 - 12 + 13 + 974 + + + 13 + 26 + 856 + + + 26 + 43 826 - 12 - 22 + 44 + 68 826 - 22 - 38 - 885 - - - 38 - 66 - 915 - - - 67 - 105 + 68 + 106 826 - 105 - 161 + 116 + 167 826 - 164 - 269 + 168 + 273 + 856 + + + 275 + 373 826 - 269 - 361 + 373 + 492 826 - 364 - 464 + 517 + 1154 826 - 477 - 1105 + 1167 + 2661 826 - 1105 - 2387 - 826 - - - 2455 + 2853 13984 - 797 + 708 @@ -18520,7 +18528,7 @@ declaring_type_id - 33842 + 33841 type_id @@ -18528,7 +18536,7 @@ unbound_id - 70637 + 70636 @@ -18791,7 +18799,7 @@ 3 4 - 3396 + 3395 4 @@ -18945,7 +18953,7 @@ 3 262 - 1447 + 1446 @@ -19007,7 +19015,7 @@ 3 4 - 3396 + 3395 4 @@ -19033,7 +19041,7 @@ 1 2 - 68127 + 68126 2 @@ -19054,7 +19062,7 @@ 1 2 - 70637 + 70636 @@ -19070,7 +19078,7 @@ 1 2 - 68127 + 68126 2 @@ -19199,11 +19207,11 @@ event_accessors - 160823 + 160822 id - 160823 + 160822 kind @@ -19211,7 +19219,7 @@ name - 68688 + 68687 declaring_event_id @@ -19219,7 +19227,7 @@ unbound_id - 141274 + 141273 @@ -19233,7 +19241,7 @@ 1 2 - 160823 + 160822 @@ -19249,7 +19257,7 @@ 1 2 - 160823 + 160822 @@ -19265,7 +19273,7 @@ 1 2 - 160823 + 160822 @@ -19281,7 +19289,7 @@ 1 2 - 160823 + 160822 @@ -19397,7 +19405,7 @@ 1 2 - 68688 + 68687 @@ -19549,7 +19557,7 @@ 1 2 - 136254 + 136253 2 @@ -19570,7 +19578,7 @@ 1 2 - 141274 + 141273 @@ -19586,7 +19594,7 @@ 1 2 - 141274 + 141273 @@ -19602,7 +19610,7 @@ 1 2 - 136254 + 136253 2 @@ -19617,11 +19625,11 @@ event_accessor_location - 160823 + 160822 id - 160823 + 160822 loc @@ -19639,7 +19647,7 @@ 1 2 - 160823 + 160822 @@ -19710,11 +19718,11 @@ operators - 629721 + 629715 id - 629721 + 629715 name @@ -19726,11 +19734,11 @@ declaring_type_id - 75488 + 75487 type_id - 30578 + 30577 unbound_id @@ -19748,7 +19756,7 @@ 1 2 - 629721 + 629715 @@ -19764,7 +19772,7 @@ 1 2 - 629721 + 629715 @@ -19780,7 +19788,7 @@ 1 2 - 629721 + 629715 @@ -19796,7 +19804,7 @@ 1 2 - 629721 + 629715 @@ -19812,7 +19820,7 @@ 1 2 - 629721 + 629715 @@ -20443,7 +20451,7 @@ 7 16 - 5808 + 5807 16 @@ -20552,7 +20560,7 @@ 7 16 - 5808 + 5807 16 @@ -20813,7 +20821,7 @@ 1 2 - 66686 + 66685 2 @@ -20871,7 +20879,7 @@ 1 2 - 66686 + 66685 2 @@ -20917,15 +20925,15 @@ operator_location - 1210557 + 1210545 id - 586251 + 586245 loc - 10667 + 10683 @@ -20944,12 +20952,12 @@ 2 3 - 567174 + 567169 3 7 - 15248 + 15247 @@ -20985,7 +20993,7 @@ 39 50 - 916 + 899 52 @@ -21010,7 +21018,7 @@ 79 83 - 850 + 867 85 @@ -21025,12 +21033,12 @@ 97 279 - 801 + 834 - 345 - 17300 - 65 + 664 + 17251 + 49 @@ -21040,15 +21048,15 @@ constant_value - 3875422 + 3875386 id - 3873680 + 3873643 value - 1314319 + 1314307 @@ -21062,7 +21070,7 @@ 1 2 - 3872528 + 3872492 2 @@ -21083,17 +21091,17 @@ 1 2 - 1062512 + 1062502 2 3 - 130820 + 130819 3 10 - 101821 + 101820 10 @@ -21108,27 +21116,27 @@ methods - 20454980 + 20454789 id - 20454980 + 20454789 name - 5761337 + 5761283 declaring_type_id - 4275208 + 4275168 type_id - 1360564 + 1360551 unbound_id - 16901323 + 16901165 @@ -21142,7 +21150,7 @@ 1 2 - 20454980 + 20454789 @@ -21158,7 +21166,7 @@ 1 2 - 20454980 + 20454789 @@ -21174,7 +21182,7 @@ 1 2 - 20454980 + 20454789 @@ -21190,7 +21198,7 @@ 1 2 - 20454980 + 20454789 @@ -21206,22 +21214,22 @@ 1 2 - 4128352 + 4128313 2 3 - 674804 + 674798 3 5 - 458551 + 458547 5 26 - 434749 + 434745 26 @@ -21242,22 +21250,22 @@ 1 2 - 4308282 + 4308242 2 3 - 587629 + 587624 3 6 - 515220 + 515216 6 10142 - 350203 + 350200 @@ -21273,17 +21281,17 @@ 1 2 - 5249541 + 5249492 2 7 - 440360 + 440356 7 2905 - 71434 + 71433 @@ -21299,22 +21307,22 @@ 1 2 - 4191695 + 4191656 2 3 - 694589 + 694583 3 5 - 457960 + 457956 5 8458 - 417090 + 417086 @@ -21330,42 +21338,42 @@ 1 2 - 1491562 + 1491548 2 3 - 954902 + 954893 3 4 - 425388 + 425384 4 5 - 301773 + 301770 5 6 - 243096 + 243093 6 9 - 373828 + 373824 9 18 - 328971 + 328968 18 8066 - 155685 + 155684 @@ -21381,37 +21389,37 @@ 1 2 - 1548261 + 1548246 2 3 - 987947 + 987937 3 4 - 436728 + 436724 4 5 - 342466 + 342463 5 6 - 264771 + 264769 6 10 - 361484 + 361481 10 70 - 320850 + 320847 70 @@ -21432,32 +21440,32 @@ 1 2 - 2042987 + 2042968 2 3 - 1046683 + 1046673 3 4 - 428371 + 428367 4 5 - 350735 + 350731 5 10 - 321559 + 321556 10 848 - 84871 + 84870 @@ -21473,42 +21481,42 @@ 1 2 - 1491592 + 1491578 2 3 - 954872 + 954863 3 4 - 425388 + 425384 4 5 - 301773 + 301770 5 6 - 243096 + 243093 6 9 - 373828 + 373824 9 18 - 328971 + 328968 18 8066 - 155685 + 155684 @@ -21524,32 +21532,32 @@ 1 2 - 771576 + 771569 2 3 - 224580 + 224578 3 4 - 98868 + 98867 4 7 - 120691 + 120690 7 23 - 102766 + 102765 23 192615 - 42081 + 42080 @@ -21565,22 +21573,22 @@ 1 2 - 948848 + 948839 2 3 - 179546 + 179544 3 5 - 116380 + 116379 5 27 - 102235 + 102234 27 @@ -21601,22 +21609,22 @@ 1 2 - 883290 + 883282 2 3 - 215160 + 215158 3 4 - 88798 + 88797 4 9 - 108554 + 108553 9 @@ -21637,22 +21645,22 @@ 1 2 - 774322 + 774315 2 3 - 226381 + 226379 3 4 - 99163 + 99162 4 7 - 121607 + 121605 7 @@ -21662,7 +21670,7 @@ 24 167300 - 36913 + 36912 @@ -21678,12 +21686,12 @@ 1 2 - 16368679 + 16368526 2 3017 - 532643 + 532638 @@ -21699,7 +21707,7 @@ 1 2 - 16901323 + 16901165 @@ -21715,12 +21723,12 @@ 1 2 - 16368797 + 16368644 2 3017 - 532525 + 532520 @@ -21736,12 +21744,12 @@ 1 2 - 16731877 + 16731720 2 1636 - 169446 + 169445 @@ -21751,11 +21759,11 @@ method_location - 20553553 + 20553361 id - 20454980 + 20454789 loc @@ -21773,7 +21781,7 @@ 1 2 - 20387030 + 20386839 2 @@ -21864,23 +21872,23 @@ constructors - 5991233 + 5991176 id - 5991233 + 5991176 name - 2792770 + 2792744 declaring_type_id - 4484787 + 4484745 unbound_id - 5562625 + 5562573 @@ -21894,7 +21902,7 @@ 1 2 - 5991233 + 5991176 @@ -21910,7 +21918,7 @@ 1 2 - 5991233 + 5991176 @@ -21926,7 +21934,7 @@ 1 2 - 5991233 + 5991176 @@ -21942,17 +21950,17 @@ 1 2 - 2023704 + 2023685 2 3 - 507720 + 507715 3 7 - 213388 + 213386 7 @@ -21973,17 +21981,17 @@ 1 2 - 2556289 + 2556265 2 6 - 210435 + 210433 6 11806 - 26046 + 26045 @@ -21999,17 +22007,17 @@ 1 2 - 2053914 + 2053895 2 3 - 509344 + 509339 3 10 - 211291 + 211289 10 @@ -22030,17 +22038,17 @@ 1 2 - 3341745 + 3341713 2 3 - 968752 + 968743 3 55 - 174289 + 174288 @@ -22056,7 +22064,7 @@ 1 2 - 4484787 + 4484745 @@ -22072,17 +22080,17 @@ 1 2 - 3341745 + 3341713 2 3 - 968752 + 968743 3 55 - 174289 + 174288 @@ -22098,7 +22106,7 @@ 1 2 - 5506044 + 5505993 2 @@ -22119,7 +22127,7 @@ 1 2 - 5562625 + 5562573 @@ -22135,7 +22143,7 @@ 1 2 - 5506044 + 5505993 2 @@ -22150,11 +22158,11 @@ constructor_location - 6040667 + 6040610 id - 5991233 + 5991176 loc @@ -22172,7 +22180,7 @@ 1 2 - 5971329 + 5971273 2 @@ -22526,7 +22534,7 @@ 1 2 - 6290 + 6289 2 @@ -22582,15 +22590,15 @@ overrides - 4832155 + 4832110 id - 4832155 + 4832110 base_id - 1569700 + 1569685 @@ -22604,7 +22612,7 @@ 1 2 - 4832155 + 4832110 @@ -22620,22 +22628,22 @@ 1 2 - 1071371 + 1071361 2 3 - 247171 + 247169 3 5 - 127336 + 127334 5 44 - 117738 + 117737 44 @@ -22650,15 +22658,15 @@ explicitly_implements - 1824372 + 1824355 id - 1823811 + 1823794 interface_id - 134836 + 134835 @@ -22672,7 +22680,7 @@ 1 2 - 1823250 + 1823233 2 @@ -22693,7 +22701,7 @@ 1 2 - 69072 + 69071 2 @@ -22713,12 +22721,12 @@ 6 10 - 10188 + 10187 10 35 - 10188 + 10187 35 @@ -23077,11 +23085,11 @@ fields - 14976517 + 14976377 id - 14976517 + 14976377 kind @@ -23089,19 +23097,19 @@ name - 6219416 + 6219358 declaring_type_id - 3386631 + 3386599 type_id - 2968123 + 2968095 unbound_id - 14485511 + 14485376 @@ -23115,7 +23123,7 @@ 1 2 - 14976517 + 14976377 @@ -23131,7 +23139,7 @@ 1 2 - 14976517 + 14976377 @@ -23147,7 +23155,7 @@ 1 2 - 14976517 + 14976377 @@ -23163,7 +23171,7 @@ 1 2 - 14976517 + 14976377 @@ -23179,7 +23187,7 @@ 1 2 - 14976517 + 14976377 @@ -23300,22 +23308,22 @@ 1 2 - 4898363 + 4898317 2 3 - 694826 + 694819 3 8 - 467558 + 467554 8 12308 - 158668 + 158666 @@ -23331,12 +23339,12 @@ 1 2 - 6076724 + 6076667 2 3 - 142691 + 142690 @@ -23352,22 +23360,22 @@ 1 2 - 4898363 + 4898317 2 3 - 694855 + 694849 3 8 - 467528 + 467524 8 12308 - 158668 + 158666 @@ -23383,17 +23391,17 @@ 1 2 - 5453627 + 5453576 2 3 - 467587 + 467583 3 12308 - 298200 + 298197 @@ -23409,22 +23417,22 @@ 1 2 - 4931319 + 4931273 2 3 - 696538 + 696532 3 10 - 479636 + 479631 10 12308 - 111921 + 111920 @@ -23440,42 +23448,42 @@ 1 2 - 934142 + 934133 2 3 - 866074 + 866066 3 4 - 480847 + 480842 4 5 - 296428 + 296425 5 6 - 198859 + 198857 6 8 - 247466 + 247464 8 15 - 263619 + 263617 15 6823 - 99193 + 99192 @@ -23491,12 +23499,12 @@ 1 2 - 3183076 + 3183047 2 3 - 203554 + 203552 @@ -23512,42 +23520,42 @@ 1 2 - 934142 + 934133 2 3 - 866103 + 866095 3 4 - 480817 + 480813 4 5 - 296428 + 296425 5 6 - 198859 + 198857 6 8 - 247466 + 247464 8 15 - 263619 + 263617 15 6823 - 99193 + 99192 @@ -23563,32 +23571,32 @@ 1 2 - 1290399 + 1290387 2 3 - 940550 + 940541 3 4 - 442309 + 442305 4 5 - 234473 + 234470 5 8 - 310957 + 310954 8 524 - 167940 + 167939 @@ -23604,42 +23612,42 @@ 1 2 - 934142 + 934133 2 3 - 866074 + 866066 3 4 - 480847 + 480842 4 5 - 296428 + 296425 5 6 - 198859 + 198857 6 8 - 247466 + 247464 8 15 - 263619 + 263617 15 6823 - 99193 + 99192 @@ -23655,22 +23663,22 @@ 1 2 - 2017945 + 2017927 2 3 - 365766 + 365762 3 5 - 273335 + 273332 5 14 - 225436 + 225434 14 @@ -23691,12 +23699,12 @@ 1 2 - 2881953 + 2881926 2 3 - 86170 + 86169 @@ -23712,22 +23720,22 @@ 1 2 - 2161080 + 2161060 2 3 - 352477 + 352474 3 5 - 233675 + 233673 5 33041 - 220889 + 220887 @@ -23743,22 +23751,22 @@ 1 2 - 2240193 + 2240172 2 3 - 357172 + 357169 3 6 - 229600 + 229598 6 19141 - 141156 + 141155 @@ -23774,27 +23782,27 @@ 1 2 - 2022907 + 2022888 2 3 - 368453 + 368450 3 5 - 271356 + 271354 5 15 - 228626 + 228623 15 56593 - 76779 + 76778 @@ -23810,12 +23818,12 @@ 1 2 - 14401378 + 14401244 2 1016 - 84132 + 84131 @@ -23831,7 +23839,7 @@ 1 2 - 14485511 + 14485376 @@ -23847,7 +23855,7 @@ 1 2 - 14485511 + 14485376 @@ -23863,12 +23871,12 @@ 1 2 - 14401378 + 14401244 2 1016 - 84132 + 84131 @@ -23884,7 +23892,7 @@ 1 2 - 14459317 + 14459182 2 @@ -23899,11 +23907,11 @@ field_location - 14965266 + 14965126 id - 14877383 + 14877243 loc @@ -23921,12 +23929,12 @@ 1 2 - 14824434 + 14824296 2 22 - 52948 + 52947 @@ -24017,11 +24025,11 @@ localvars - 499216 + 499212 id - 499216 + 499212 kind @@ -24029,7 +24037,7 @@ name - 91306 + 91305 implicitly_typed @@ -24041,7 +24049,7 @@ parent_id - 499216 + 499212 @@ -24055,7 +24063,7 @@ 1 2 - 499216 + 499212 @@ -24071,7 +24079,7 @@ 1 2 - 499216 + 499212 @@ -24087,7 +24095,7 @@ 1 2 - 499216 + 499212 @@ -24103,7 +24111,7 @@ 1 2 - 499216 + 499212 @@ -24119,7 +24127,7 @@ 1 2 - 499216 + 499212 @@ -24240,7 +24248,7 @@ 1 2 - 57798 + 57797 2 @@ -24276,7 +24284,7 @@ 1 2 - 91122 + 91121 2 @@ -24318,7 +24326,7 @@ 1 2 - 78906 + 78905 2 @@ -24344,7 +24352,7 @@ 1 2 - 57798 + 57797 2 @@ -24593,7 +24601,7 @@ 1 2 - 18824 + 18823 2 @@ -24660,7 +24668,7 @@ 1 2 - 499216 + 499212 @@ -24676,7 +24684,7 @@ 1 2 - 499216 + 499212 @@ -24692,7 +24700,7 @@ 1 2 - 499216 + 499212 @@ -24708,7 +24716,7 @@ 1 2 - 499216 + 499212 @@ -24724,7 +24732,7 @@ 1 2 - 499216 + 499212 @@ -24734,15 +24742,15 @@ localvar_location - 499216 + 499212 id - 499216 + 499212 loc - 499216 + 499212 @@ -24756,7 +24764,7 @@ 1 2 - 499216 + 499212 @@ -24772,7 +24780,7 @@ 1 2 - 499216 + 499212 @@ -24782,19 +24790,19 @@ params - 37386455 + 37386105 id - 37386455 + 37386105 name - 2196576 + 2196556 type_id - 2827941 + 2827915 index @@ -24806,11 +24814,11 @@ parent_id - 20722350 + 20722157 unbound_id - 30114153 + 30113872 @@ -24824,7 +24832,7 @@ 1 2 - 37386455 + 37386105 @@ -24840,7 +24848,7 @@ 1 2 - 37386455 + 37386105 @@ -24856,7 +24864,7 @@ 1 2 - 37386455 + 37386105 @@ -24872,7 +24880,7 @@ 1 2 - 37386455 + 37386105 @@ -24888,7 +24896,7 @@ 1 2 - 37386455 + 37386105 @@ -24904,7 +24912,7 @@ 1 2 - 37386455 + 37386105 @@ -24920,37 +24928,37 @@ 1 2 - 981598 + 981588 2 3 - 381535 + 381532 3 4 - 185481 + 185480 4 6 - 196585 + 196583 6 10 - 173876 + 173874 10 25 - 165666 + 165665 25 74292 - 111832 + 111831 @@ -24966,22 +24974,22 @@ 1 2 - 1784417 + 1784401 2 3 - 214156 + 214154 3 13 - 166995 + 166994 13 13366 - 31007 + 31006 @@ -24997,22 +25005,22 @@ 1 2 - 1518996 + 1518982 2 3 - 374596 + 374592 3 4 - 146294 + 146293 4 21 - 156689 + 156688 @@ -25028,12 +25036,12 @@ 1 2 - 2031234 + 2031215 2 6 - 164928 + 164927 6 @@ -25054,37 +25062,37 @@ 1 2 - 981598 + 981588 2 3 - 381535 + 381532 3 4 - 185481 + 185480 4 6 - 196585 + 196583 6 10 - 173876 + 173874 10 25 - 165666 + 165665 25 74292 - 111832 + 111831 @@ -25100,37 +25108,37 @@ 1 2 - 1002151 + 1002142 2 3 - 388504 + 388501 3 4 - 199951 + 199950 4 6 - 201103 + 201101 6 10 - 166050 + 166049 10 35 - 166670 + 166669 35 63585 - 72143 + 72142 @@ -25146,37 +25154,37 @@ 1 2 - 1386197 + 1386184 2 3 - 410623 + 410619 3 4 - 235861 + 235858 4 5 - 175736 + 175735 5 8 - 215278 + 215276 8 19 - 219383 + 219380 19 90397 - 184861 + 184860 @@ -25192,22 +25200,22 @@ 1 2 - 1901536 + 1901518 2 3 - 477539 + 477535 3 4 - 203436 + 203434 4 13 - 212650 + 212648 13 @@ -25228,22 +25236,22 @@ 1 2 - 2062921 + 2062901 2 3 - 482589 + 482585 3 6 - 239670 + 239668 6 54 - 42760 + 42759 @@ -25259,12 +25267,12 @@ 1 2 - 2663278 + 2663253 2 6 - 164662 + 164661 @@ -25280,37 +25288,37 @@ 1 2 - 1428366 + 1428353 2 3 - 383720 + 383717 3 4 - 237012 + 237010 4 5 - 173403 + 173402 5 9 - 247850 + 247848 9 24 - 214362 + 214360 24 74138 - 143223 + 143222 @@ -25326,37 +25334,37 @@ 1 2 - 1394672 + 1394659 2 3 - 412158 + 412155 3 4 - 252280 + 252277 4 5 - 174703 + 174701 5 8 - 225377 + 225375 8 19 - 214185 + 214183 19 84336 - 154563 + 154561 @@ -25964,27 +25972,27 @@ 1 2 - 11717399 + 11717289 2 3 - 5233890 + 5233841 3 4 - 2032032 + 2032013 4 8 - 1570586 + 1570571 8 56 - 168442 + 168441 @@ -26000,27 +26008,27 @@ 1 2 - 11717369 + 11717259 2 3 - 5233890 + 5233841 3 4 - 2032032 + 2032013 4 8 - 1570616 + 1570601 8 56 - 168442 + 168441 @@ -26036,22 +26044,22 @@ 1 2 - 12389722 + 12389607 2 3 - 5150023 + 5149975 3 4 - 1884349 + 1884331 4 43 - 1298255 + 1298242 @@ -26067,27 +26075,27 @@ 1 2 - 11717399 + 11717289 2 3 - 5233890 + 5233841 3 4 - 2032032 + 2032013 4 8 - 1570586 + 1570571 8 56 - 168442 + 168441 @@ -26103,12 +26111,12 @@ 1 2 - 19796358 + 19796173 2 5 - 925991 + 925983 @@ -26124,27 +26132,27 @@ 1 2 - 11717399 + 11717289 2 3 - 5233890 + 5233841 3 4 - 2032032 + 2032013 4 8 - 1570586 + 1570571 8 56 - 168442 + 168441 @@ -26160,12 +26168,12 @@ 1 2 - 29105919 + 29105646 2 17584 - 1008234 + 1008225 @@ -26181,7 +26189,7 @@ 1 2 - 30114065 + 30113783 2 @@ -26202,12 +26210,12 @@ 1 2 - 29808925 + 29808646 2 9835 - 305228 + 305225 @@ -26223,7 +26231,7 @@ 1 2 - 30114153 + 30113872 @@ -26239,7 +26247,7 @@ 1 2 - 30114153 + 30113872 @@ -26255,12 +26263,12 @@ 1 2 - 29105919 + 29105646 2 17584 - 1008234 + 1008225 @@ -26270,11 +26278,11 @@ param_location - 37558973 + 37558621 id - 37386071 + 37385721 loc @@ -26292,12 +26300,12 @@ 1 2 - 37269041 + 37268692 2 70 - 117029 + 117028 @@ -26383,11 +26391,11 @@ statements - 2457863 + 2457840 id - 2457863 + 2457840 kind @@ -26405,7 +26413,7 @@ 1 2 - 2457863 + 2457840 @@ -26501,11 +26509,11 @@ stmt_parent - 2097112 + 2097092 stmt - 2097112 + 2097092 index @@ -26513,7 +26521,7 @@ parent - 1004054 + 1004045 @@ -26527,7 +26535,7 @@ 1 2 - 2097112 + 2097092 @@ -26543,7 +26551,7 @@ 1 2 - 2097112 + 2097092 @@ -26671,27 +26679,27 @@ 1 2 - 647155 + 647149 2 3 - 190657 + 190656 3 4 - 62747 + 62746 4 9 - 80168 + 80167 9 3407 - 23326 + 23325 @@ -26707,27 +26715,27 @@ 1 2 - 647155 + 647149 2 3 - 190657 + 190656 3 4 - 62747 + 62746 4 9 - 80168 + 80167 9 3407 - 23326 + 23325 @@ -26737,11 +26745,11 @@ stmt_parent_top_level - 360750 + 360747 stmt - 360750 + 360747 index @@ -26749,7 +26757,7 @@ parent - 340705 + 340702 @@ -26763,7 +26771,7 @@ 1 2 - 360750 + 360747 @@ -26779,7 +26787,7 @@ 1 2 - 360750 + 360747 @@ -26827,12 +26835,12 @@ 1 2 - 322204 + 322201 2 5 - 18501 + 18500 @@ -26848,7 +26856,7 @@ 1 2 - 340705 + 340702 @@ -26858,15 +26866,15 @@ stmt_location - 2457857 + 2457834 id - 2457857 + 2457834 loc - 2376792 + 2376770 @@ -26880,7 +26888,7 @@ 1 2 - 2457857 + 2457834 @@ -26896,7 +26904,7 @@ 1 2 - 2300098 + 2300076 2 @@ -27130,7 +27138,7 @@ foreach_stmt_desugar - 133866 + 133865 id @@ -27311,11 +27319,11 @@ expressions - 9729220 + 9729129 id - 9729220 + 9729129 kind @@ -27337,7 +27345,7 @@ 1 2 - 9729220 + 9729129 @@ -27353,7 +27361,7 @@ 1 2 - 9729220 + 9729129 @@ -27562,7 +27570,7 @@ 1 2 - 33100 + 33099 2 @@ -27602,19 +27610,19 @@ expr_parent - 9420716 + 9420628 expr - 9420716 + 9420628 index - 32816 + 32815 parent - 6308266 + 6308207 @@ -27628,7 +27636,7 @@ 1 2 - 9420716 + 9420628 @@ -27644,7 +27652,7 @@ 1 2 - 9420716 + 9420628 @@ -27665,7 +27673,7 @@ 4 5 - 17079 + 17078 5 @@ -27711,7 +27719,7 @@ 4 5 - 17079 + 17078 5 @@ -27752,17 +27760,17 @@ 1 2 - 4096813 + 4096774 2 3 - 1896471 + 1896453 3 22534 - 314982 + 314979 @@ -27778,17 +27786,17 @@ 1 2 - 4096813 + 4096774 2 3 - 1896471 + 1896453 3 22534 - 314982 + 314979 @@ -27798,11 +27806,11 @@ expr_parent_top_level - 5483306 + 5483254 expr - 5483306 + 5483254 index @@ -27810,7 +27818,7 @@ parent - 3999864 + 3999827 @@ -27824,7 +27832,7 @@ 1 2 - 5483306 + 5483254 @@ -27840,7 +27848,7 @@ 1 2 - 5483306 + 5483254 @@ -27998,17 +28006,17 @@ 1 2 - 3335573 + 3335541 2 3 - 383809 + 383805 3 14 - 280481 + 280479 @@ -28024,17 +28032,17 @@ 1 2 - 3339559 + 3339528 2 3 - 380649 + 380646 3 12 - 279655 + 279652 @@ -28141,26 +28149,26 @@ expr_compiler_generated - 9719652 + 9719561 id - 9719652 + 9719561 expr_value - 6749402 + 6749339 id - 6749402 + 6749339 value - 838197 + 838189 @@ -28174,7 +28182,7 @@ 1 2 - 6749402 + 6749339 @@ -28190,17 +28198,17 @@ 1 2 - 578711 + 578706 2 3 - 137760 + 137759 3 4 - 66857 + 66856 4 @@ -28215,15 +28223,15 @@ expr_call - 1585560 + 1585545 caller_id - 1585560 + 1585545 target_id - 207402 + 207400 @@ -28237,7 +28245,7 @@ 1 2 - 1585560 + 1585545 @@ -28253,17 +28261,17 @@ 1 2 - 110904 + 110903 2 3 - 41217 + 41218 3 4 - 15565 + 15563 4 @@ -28288,15 +28296,15 @@ expr_access - 3615705 + 3615672 accesser_id - 3615705 + 3615672 target_id - 874845 + 874837 @@ -28310,7 +28318,7 @@ 1 2 - 3615705 + 3615672 @@ -28326,32 +28334,32 @@ 1 2 - 292104 + 292101 2 3 - 190758 + 190756 3 4 - 134524 + 134523 4 5 - 82548 + 82547 5 7 - 80286 + 80285 7 15 - 68016 + 68015 15 @@ -28366,15 +28374,15 @@ expr_location - 9729220 + 9729129 id - 9729220 + 9729129 loc - 7546334 + 7546264 @@ -28388,7 +28396,7 @@ 1 2 - 9729220 + 9729129 @@ -28404,17 +28412,17 @@ 1 2 - 6528710 + 6528648 2 3 - 981628 + 981619 3 9211 - 35996 + 35995 @@ -28576,11 +28584,11 @@ expr_argument_name - 731798 + 731791 id - 731798 + 731791 name @@ -28598,7 +28606,7 @@ 1 2 - 731798 + 731791 @@ -29248,11 +29256,11 @@ xmlElements - 60596893 + 60596686 id - 60596893 + 60596686 name @@ -29260,7 +29268,7 @@ parentid - 24508816 + 24508733 idx @@ -29282,7 +29290,7 @@ 1 2 - 60596893 + 60596686 @@ -29298,7 +29306,7 @@ 1 2 - 60596893 + 60596686 @@ -29314,7 +29322,7 @@ 1 2 - 60596893 + 60596686 @@ -29330,7 +29338,7 @@ 1 2 - 60596893 + 60596686 @@ -29520,27 +29528,27 @@ 1 2 - 14236583 + 14236534 2 3 - 4770003 + 4769987 3 4 - 2178795 + 2178787 4 6 - 2111342 + 2111335 6 17196 - 1212092 + 1212088 @@ -29556,22 +29564,22 @@ 1 2 - 16928804 + 16928747 2 3 - 4145902 + 4145888 3 4 - 2094945 + 2094938 4 125 - 1339163 + 1339158 @@ -29587,27 +29595,27 @@ 1 2 - 14236583 + 14236534 2 3 - 4770003 + 4769987 3 4 - 2178795 + 2178787 4 6 - 2111342 + 2111335 6 17196 - 1212092 + 1212088 @@ -29623,7 +29631,7 @@ 1 2 - 24508816 + 24508733 @@ -30211,15 +30219,15 @@ xmlAttrs - 41517960 + 41517819 id - 41517960 + 41517819 elementid - 41169454 + 41169314 name @@ -30227,7 +30235,7 @@ value - 884047 + 884044 idx @@ -30249,7 +30257,7 @@ 1 2 - 41517960 + 41517819 @@ -30265,7 +30273,7 @@ 1 2 - 41517960 + 41517819 @@ -30281,7 +30289,7 @@ 1 2 - 41517960 + 41517819 @@ -30297,7 +30305,7 @@ 1 2 - 41517960 + 41517819 @@ -30313,7 +30321,7 @@ 1 2 - 41517960 + 41517819 @@ -30329,7 +30337,7 @@ 1 2 - 40983430 + 40983290 2 @@ -30350,7 +30358,7 @@ 1 2 - 40983430 + 40983290 2 @@ -30371,12 +30379,12 @@ 1 2 - 40983630 + 40983491 2 13 - 185823 + 185822 @@ -30392,7 +30400,7 @@ 1 2 - 40983430 + 40983290 2 @@ -30413,7 +30421,7 @@ 1 2 - 41169454 + 41169314 @@ -30714,7 +30722,7 @@ 2 3 - 308689 + 308688 3 @@ -30739,12 +30747,12 @@ 8 13 - 75195 + 75194 13 29 - 70437 + 70436 29 @@ -30775,7 +30783,7 @@ 2 3 - 308696 + 308695 3 @@ -30785,12 +30793,12 @@ 4 5 - 76925 + 76924 5 6 - 38840 + 38839 6 @@ -30815,7 +30823,7 @@ 150 471089 - 33754 + 33753 @@ -30831,7 +30839,7 @@ 1 2 - 781511 + 781509 2 @@ -30857,7 +30865,7 @@ 1 2 - 882313 + 882310 2 @@ -30883,7 +30891,7 @@ 2 3 - 365376 + 365375 3 @@ -30913,7 +30921,7 @@ 28 159 - 69846 + 69845 159 @@ -31461,7 +31469,7 @@ 2 3 - 20057 + 20056 3 @@ -31481,7 +31489,7 @@ 6 71 - 3414 + 3413 @@ -31994,11 +32002,11 @@ xmlHasNs - 501577 + 501573 elementId - 501577 + 501573 nsId @@ -32020,7 +32028,7 @@ 1 2 - 501577 + 501573 @@ -32036,7 +32044,7 @@ 1 2 - 501577 + 501573 @@ -32516,19 +32524,19 @@ xmlChars - 45379511 + 45379357 id - 45379511 + 45379357 text - 1700662 + 1700656 parentid - 28480349 + 28480252 idx @@ -32554,7 +32562,7 @@ 1 2 - 45379511 + 45379357 @@ -32570,7 +32578,7 @@ 1 2 - 45379511 + 45379357 @@ -32586,7 +32594,7 @@ 1 2 - 45379511 + 45379357 @@ -32602,7 +32610,7 @@ 1 2 - 45379511 + 45379357 @@ -32618,7 +32626,7 @@ 1 2 - 45379511 + 45379357 @@ -32639,7 +32647,7 @@ 2 3 - 421882 + 421881 3 @@ -32659,12 +32667,12 @@ 6 8 - 141441 + 141440 8 9 - 87852 + 87851 9 @@ -32674,7 +32682,7 @@ 12 15 - 83186 + 83185 15 @@ -32705,12 +32713,12 @@ 1 2 - 165834 + 165833 2 3 - 421942 + 421941 3 @@ -32720,7 +32728,7 @@ 4 5 - 175866 + 175865 5 @@ -32740,7 +32748,7 @@ 9 12 - 148677 + 148676 12 @@ -32755,12 +32763,12 @@ 19 54 - 127684 + 127683 54 918936 - 93732 + 93731 @@ -32776,12 +32784,12 @@ 1 2 - 1668609 + 1668603 2 33 - 32053 + 32052 @@ -32797,7 +32805,7 @@ 1 2 - 1700660 + 1700654 2 @@ -32823,12 +32831,12 @@ 2 3 - 498940 + 498938 3 4 - 94931 + 94930 4 @@ -32843,12 +32851,12 @@ 6 8 - 145526 + 145525 8 10 - 153688 + 153687 10 @@ -32863,7 +32871,7 @@ 17 14127 - 118981 + 118980 @@ -32879,22 +32887,22 @@ 1 2 - 17038280 + 17038222 2 3 - 8292992 + 8292964 3 4 - 2084035 + 2084028 4 61 - 1065041 + 1065037 @@ -32910,22 +32918,22 @@ 1 2 - 17040164 + 17040106 2 3 - 8301726 + 8301698 3 4 - 2100188 + 2100181 4 47 - 1038269 + 1038266 @@ -32941,22 +32949,22 @@ 1 2 - 17038280 + 17038222 2 3 - 8292992 + 8292964 3 4 - 2084035 + 2084028 4 61 - 1065041 + 1065037 @@ -32972,7 +32980,7 @@ 1 2 - 28479968 + 28479871 2 @@ -32993,7 +33001,7 @@ 1 2 - 28480349 + 28480252 @@ -33688,15 +33696,15 @@ xmllocations - 147551916 + 147551414 xmlElement - 147546832 + 147546330 location - 128989681 + 128989242 @@ -33710,7 +33718,7 @@ 1 2 - 147546786 + 147546284 2 @@ -33731,17 +33739,17 @@ 1 2 - 110766476 + 110766100 2 3 - 18041929 + 18041868 3 15 - 181275 + 181274 @@ -33751,11 +33759,11 @@ commentline - 1542316 + 1542302 id - 1542316 + 1542302 kind @@ -33763,11 +33771,11 @@ text - 576331 + 576326 rawtext - 581672 + 581666 @@ -33781,7 +33789,7 @@ 1 2 - 1542316 + 1542302 @@ -33797,7 +33805,7 @@ 1 2 - 1542316 + 1542302 @@ -33813,7 +33821,7 @@ 1 2 - 1542316 + 1542302 @@ -33907,7 +33915,7 @@ 1 2 - 482114 + 482110 2 @@ -33917,7 +33925,7 @@ 3 21079 - 40791 + 40790 @@ -33933,7 +33941,7 @@ 1 2 - 574463 + 574458 2 @@ -33954,12 +33962,12 @@ 1 2 - 572802 + 572797 2 40 - 3529 + 3528 @@ -33975,12 +33983,12 @@ 1 2 - 487842 + 487837 2 3 - 52897 + 52896 3 @@ -34001,7 +34009,7 @@ 1 2 - 581672 + 581666 @@ -34017,7 +34025,7 @@ 1 2 - 581672 + 581666 @@ -34027,15 +34035,15 @@ commentline_location - 1542316 + 1542302 id - 1542316 + 1542302 loc - 1542316 + 1542302 @@ -34049,7 +34057,7 @@ 1 2 - 1542316 + 1542302 @@ -34065,7 +34073,7 @@ 1 2 - 1542316 + 1542302 @@ -34075,26 +34083,26 @@ commentblock - 374970 + 374967 id - 374970 + 374967 commentblock_location - 374970 + 374967 id - 374970 + 374967 loc - 374970 + 374967 @@ -34108,7 +34116,7 @@ 1 2 - 374970 + 374967 @@ -34124,7 +34132,7 @@ 1 2 - 374970 + 374967 @@ -34134,15 +34142,15 @@ commentblock_binding - 1356034 + 1356021 id - 374970 + 374967 entity - 587088 + 587083 bindtype @@ -34165,12 +34173,12 @@ 2 3 - 86989 + 86988 3 4 - 264873 + 264871 @@ -34186,17 +34194,17 @@ 1 3 - 23382 + 23381 3 4 - 86715 + 86714 4 5 - 264873 + 264871 @@ -34212,17 +34220,17 @@ 1 2 - 415337 + 415333 2 3 - 139839 + 139837 3 524 - 31912 + 31911 @@ -34238,17 +34246,17 @@ 1 2 - 222402 + 222400 2 3 - 230404 + 230402 3 4 - 124694 + 124693 4 @@ -34325,15 +34333,15 @@ commentblock_child - 1901595 + 1901577 id - 374970 + 374967 commentline - 1541684 + 1541669 index @@ -34351,17 +34359,17 @@ 1 2 - 116560 + 116559 2 3 - 36356 + 36355 3 4 - 86073 + 86072 4 @@ -34371,12 +34379,12 @@ 5 6 - 48132 + 48131 6 10 - 32865 + 32864 10 @@ -34402,7 +34410,7 @@ 2 3 - 114183 + 114182 3 @@ -34448,7 +34456,7 @@ 1 2 - 1541684 + 1541669 @@ -34464,12 +34472,12 @@ 1 2 - 1181773 + 1181761 2 3 - 359911 + 359907 @@ -34581,11 +34589,11 @@ asp_elements - 148402 + 148401 id - 148402 + 148401 kind @@ -34593,7 +34601,7 @@ loc - 148402 + 148401 @@ -34607,7 +34615,7 @@ 1 2 - 148402 + 148401 @@ -34623,7 +34631,7 @@ 1 2 - 148402 + 148401 @@ -34751,7 +34759,7 @@ 1 2 - 148402 + 148401 @@ -34767,7 +34775,7 @@ 1 2 - 148402 + 148401 @@ -35368,11 +35376,11 @@ asp_element_body - 118618 + 118617 element - 118618 + 118617 body @@ -35390,7 +35398,7 @@ 1 2 - 118618 + 118617 @@ -36216,11 +36224,11 @@ cil_instruction - 504260704 + 504255988 id - 504260704 + 504255988 opcode @@ -36228,11 +36236,11 @@ index - 1697213 + 1697197 impl - 23978900 + 23978675 @@ -36246,7 +36254,7 @@ 1 2 - 504260704 + 504255988 @@ -36262,7 +36270,7 @@ 1 2 - 504260704 + 504255988 @@ -36278,7 +36286,7 @@ 1 2 - 504260704 + 504255988 @@ -36522,47 +36530,47 @@ 1 2 - 352005 + 352001 2 3 - 5788 + 5787 3 4 - 466938 + 466933 4 5 - 116203 + 116201 5 6 - 205090 + 205088 6 15 - 83276 + 83275 15 16 - 145172 + 145171 16 20 - 144670 + 144669 20 126 - 127395 + 127393 126 @@ -36583,42 +36591,42 @@ 1 2 - 713164 + 713158 2 3 - 246078 + 246076 3 4 - 152584 + 152583 4 7 - 101880 + 101879 7 9 - 152496 + 152494 9 11 - 130052 + 130051 11 29 - 129462 + 129461 29 177 - 71493 + 71492 @@ -36634,47 +36642,47 @@ 1 2 - 352005 + 352001 2 3 - 5788 + 5787 3 4 - 466938 + 466933 4 5 - 116203 + 116201 5 6 - 205090 + 205088 6 15 - 83276 + 83275 15 16 - 145172 + 145171 16 20 - 144670 + 144669 20 126 - 127395 + 127393 126 @@ -36695,57 +36703,57 @@ 1 3 - 1768175 + 1768159 3 4 - 5292243 + 5292193 4 5 - 2487040 + 2487016 5 6 - 1620227 + 1620212 6 8 - 1895748 + 1895730 8 11 - 1892411 + 1892393 11 16 - 1968659 + 1968640 16 23 - 1813062 + 1813045 23 35 - 1856944 + 1856927 35 67 - 1825790 + 1825773 67 57474 - 1558597 + 1558582 @@ -36761,52 +36769,52 @@ 1 3 - 1771808 + 1771791 3 4 - 5485048 + 5484997 4 5 - 2836594 + 2836567 5 6 - 2484441 + 2484418 6 7 - 1600973 + 1600958 7 9 - 2124669 + 2124649 9 12 - 2168581 + 2168561 12 16 - 2034335 + 2034316 16 24 - 1878207 + 1878189 24 77 - 1594240 + 1594225 @@ -36822,57 +36830,57 @@ 1 3 - 1768175 + 1768159 3 4 - 5292243 + 5292193 4 5 - 2487040 + 2487016 5 6 - 1620227 + 1620212 6 8 - 1895748 + 1895730 8 11 - 1892411 + 1892393 11 16 - 1968659 + 1968640 16 23 - 1813062 + 1813045 23 35 - 1856944 + 1856927 35 67 - 1825790 + 1825773 67 57474 - 1558597 + 1558582 @@ -36882,15 +36890,15 @@ cil_jump - 38654205 + 38653843 instruction - 38654205 + 38653843 target - 29345826 + 29345551 @@ -36904,7 +36912,7 @@ 1 2 - 38654205 + 38653843 @@ -36920,17 +36928,17 @@ 1 2 - 24482485 + 24482256 2 3 - 3200027 + 3199997 3 473 - 1663312 + 1663297 @@ -36940,15 +36948,15 @@ cil_access - 205357557 + 205355636 instruction - 205357557 + 205355636 target - 48924367 + 48923909 @@ -36962,7 +36970,7 @@ 1 2 - 205357557 + 205355636 @@ -36978,32 +36986,32 @@ 1 2 - 20166732 + 20166543 2 3 - 12282703 + 12282589 3 4 - 5954349 + 5954293 4 5 - 3067877 + 3067849 5 8 - 4125074 + 4125035 8 72956 - 3327629 + 3327598 @@ -37013,15 +37021,15 @@ cil_value - 19775953 + 19775768 instruction - 19775953 + 19775768 value - 4923700 + 4923654 @@ -37035,7 +37043,7 @@ 1 2 - 19775953 + 19775768 @@ -37051,22 +37059,22 @@ 1 2 - 3687282 + 3687248 2 3 - 676753 + 676747 3 7 - 372292 + 372289 7 182148 - 187371 + 187370 @@ -37076,19 +37084,19 @@ cil_switch - 4070472 + 4070434 instruction - 272685 + 272683 index - 141510 + 141509 target - 1795403 + 1795386 @@ -37107,17 +37115,17 @@ 3 4 - 75037 + 75036 4 5 - 45979 + 45978 5 6 - 32454 + 32453 6 @@ -37168,12 +37176,12 @@ 2 3 - 33340 + 33339 3 4 - 96919 + 96918 4 @@ -37219,7 +37227,7 @@ 6 7 - 70489 + 70488 7 @@ -37234,7 +37242,7 @@ 15 655 - 10631 + 10630 688 @@ -37260,7 +37268,7 @@ 6 7 - 70489 + 70488 7 @@ -37275,7 +37283,7 @@ 15 645 - 10631 + 10630 675 @@ -37296,12 +37304,12 @@ 1 2 - 1771690 + 1771673 2 18 - 23713 + 23712 @@ -37317,12 +37325,12 @@ 1 2 - 1596219 + 1596204 2 6 - 141422 + 141420 6 @@ -37379,15 +37387,15 @@ cil_type_location - 4842462 + 4842416 id - 4842462 + 4842416 loc - 14588 + 14587 @@ -37401,7 +37409,7 @@ 1 2 - 4842462 + 4842416 @@ -37477,11 +37485,11 @@ cil_method_location - 29356250 + 29355975 id - 29356250 + 29355975 loc @@ -37499,7 +37507,7 @@ 1 2 - 29356250 + 29355975 @@ -37590,15 +37598,15 @@ cil_type - 12399763 + 12399647 id - 12399763 + 12399647 name - 3497607 + 3497574 kind @@ -37606,11 +37614,11 @@ parent - 2509483 + 2509459 sourceDecl - 6934884 + 6934819 @@ -37624,7 +37632,7 @@ 1 2 - 12399763 + 12399647 @@ -37640,7 +37648,7 @@ 1 2 - 12399763 + 12399647 @@ -37656,7 +37664,7 @@ 1 2 - 12399763 + 12399647 @@ -37672,7 +37680,7 @@ 1 2 - 12399763 + 12399647 @@ -37688,17 +37696,17 @@ 1 2 - 3073163 + 3073135 2 4 - 292855 + 292852 4 45085 - 131588 + 131587 @@ -37714,7 +37722,7 @@ 1 2 - 3497607 + 3497574 @@ -37730,12 +37738,12 @@ 1 2 - 3232334 + 3232303 2 48 - 262409 + 262406 48 @@ -37756,17 +37764,17 @@ 1 2 - 3194150 + 3194121 2 5 - 271947 + 271945 5 45085 - 31509 + 31508 @@ -37921,27 +37929,27 @@ 1 2 - 1632423 + 1632408 2 3 - 460795 + 460791 3 5 - 196792 + 196790 5 28 - 189025 + 189023 28 56074 - 30446 + 30445 @@ -37957,22 +37965,22 @@ 1 2 - 1641164 + 1641149 2 3 - 468149 + 468144 3 5 - 196821 + 196819 5 38 - 188671 + 188669 38 @@ -37993,12 +38001,12 @@ 1 2 - 2470739 + 2470716 2 4 - 38744 + 38743 @@ -38014,22 +38022,22 @@ 1 2 - 1640633 + 1640617 2 3 - 467971 + 467967 3 5 - 196821 + 196819 5 38 - 188700 + 188698 38 @@ -38050,12 +38058,12 @@ 1 2 - 6636063 + 6636001 2 23276 - 298820 + 298817 @@ -38071,7 +38079,7 @@ 1 2 - 6934884 + 6934819 @@ -38087,7 +38095,7 @@ 1 2 - 6934884 + 6934819 @@ -38103,12 +38111,12 @@ 1 2 - 6836960 + 6836896 2 1652 - 97923 + 97922 @@ -38166,15 +38174,15 @@ cil_array_type - 181790 + 181788 id - 181790 + 181788 element_type - 181199 + 181198 rank @@ -38192,7 +38200,7 @@ 1 2 - 181790 + 181788 @@ -38208,7 +38216,7 @@ 1 2 - 181790 + 181788 @@ -38224,7 +38232,7 @@ 1 2 - 180668 + 180666 2 @@ -38245,7 +38253,7 @@ 1 2 - 180668 + 180666 2 @@ -38385,23 +38393,23 @@ cil_method - 39373777 + 39373409 id - 39373777 + 39373409 name - 7889520 + 7889447 parent - 7602010 + 7601939 return_type - 3365930 + 3365899 @@ -38415,7 +38423,7 @@ 1 2 - 39373777 + 39373409 @@ -38431,7 +38439,7 @@ 1 2 - 39373777 + 39373409 @@ -38447,7 +38455,7 @@ 1 2 - 39373777 + 39373409 @@ -38463,27 +38471,27 @@ 1 2 - 5260940 + 5260891 2 3 - 1204170 + 1204159 3 5 - 695180 + 695174 5 19 - 592856 + 592851 19 206309 - 136372 + 136371 @@ -38499,22 +38507,22 @@ 1 2 - 5492194 + 5492143 2 3 - 1123167 + 1123157 3 5 - 645244 + 645238 5 48 - 591941 + 591935 48 @@ -38535,17 +38543,17 @@ 1 2 - 7115788 + 7115722 2 5 - 616717 + 616711 5 10798 - 157014 + 157012 @@ -38561,37 +38569,37 @@ 1 2 - 2404058 + 2404036 2 3 - 1743783 + 1743767 3 4 - 872216 + 872208 4 5 - 624395 + 624389 5 7 - 648758 + 648752 7 11 - 655048 + 655042 11 39 - 572894 + 572888 39 @@ -38612,37 +38620,37 @@ 1 2 - 2458365 + 2458342 2 3 - 1772487 + 1772470 3 4 - 893892 + 893883 4 5 - 633550 + 633544 5 7 - 698104 + 698097 7 11 - 599442 + 599436 11 3640 - 546168 + 546163 @@ -38658,32 +38666,32 @@ 1 2 - 3242994 + 3242964 2 3 - 2011094 + 2011076 3 4 - 858366 + 858358 4 5 - 456927 + 456923 5 7 - 614059 + 614054 7 12757 - 418567 + 418563 @@ -38699,27 +38707,27 @@ 1 2 - 2033124 + 2033105 2 3 - 586123 + 586118 3 4 - 222572 + 222570 4 8 - 285561 + 285558 8 508819 - 238548 + 238546 @@ -38735,22 +38743,22 @@ 1 2 - 2303713 + 2303692 2 3 - 542595 + 542590 3 5 - 273778 + 273775 5 78481 - 245842 + 245840 @@ -38766,27 +38774,27 @@ 1 2 - 2200592 + 2200572 2 3 - 562588 + 562582 3 4 - 209874 + 209872 4 9 - 261818 + 261816 9 207300 - 131056 + 131055 @@ -38796,15 +38804,15 @@ cil_method_source_declaration - 34929152 + 34928825 method - 34929152 + 34928825 source - 30419382 + 30419098 @@ -38818,7 +38826,7 @@ 1 2 - 34929152 + 34928825 @@ -38834,12 +38842,12 @@ 1 2 - 28648401 + 28648133 2 981 - 1770981 + 1770964 @@ -38849,15 +38857,15 @@ cil_method_implementation - 27073001 + 27072747 id - 27073001 + 27072747 method - 27049967 + 27049714 location @@ -38875,7 +38883,7 @@ 1 2 - 27073001 + 27072747 @@ -38891,7 +38899,7 @@ 1 2 - 27073001 + 27072747 @@ -38907,12 +38915,12 @@ 1 2 - 27047073 + 27046820 2 27 - 2894 + 2893 @@ -38928,7 +38936,7 @@ 1 2 - 27049967 + 27049714 @@ -39090,15 +39098,15 @@ cil_implements - 1403915 + 1403902 id - 1403325 + 1403311 decl - 259544 + 259542 @@ -39112,7 +39120,7 @@ 1 2 - 1402734 + 1402721 2 @@ -39133,12 +39141,12 @@ 1 2 - 169860 + 169858 2 3 - 42701 + 42700 3 @@ -39148,12 +39156,12 @@ 4 10 - 19815 + 19814 10 3161 - 10129 + 10128 @@ -39163,23 +39171,23 @@ cil_field - 15899467 + 15899318 id - 15899467 + 15899318 parent - 3685983 + 3685949 name - 6243572 + 6243513 field_type - 3062916 + 3062888 @@ -39193,7 +39201,7 @@ 1 2 - 15899467 + 15899318 @@ -39209,7 +39217,7 @@ 1 2 - 15899467 + 15899318 @@ -39225,7 +39233,7 @@ 1 2 - 15899467 + 15899318 @@ -39241,42 +39249,42 @@ 1 2 - 1083833 + 1083822 2 3 - 913352 + 913344 3 4 - 486546 + 486542 4 5 - 328173 + 328170 5 6 - 220977 + 220975 6 8 - 262556 + 262554 8 15 - 285797 + 285794 15 6824 - 104745 + 104744 @@ -39292,42 +39300,42 @@ 1 2 - 1083833 + 1083822 2 3 - 913352 + 913344 3 4 - 486546 + 486542 4 5 - 328173 + 328170 5 6 - 220977 + 220975 6 8 - 262556 + 262554 8 15 - 285797 + 285794 15 6824 - 104745 + 104744 @@ -39343,32 +39351,32 @@ 1 2 - 1248614 + 1248602 2 3 - 1218965 + 1218953 3 4 - 465934 + 465929 4 5 - 247702 + 247700 5 8 - 323921 + 323918 8 524 - 180845 + 180843 @@ -39384,22 +39392,22 @@ 1 2 - 4788627 + 4788582 2 3 - 792897 + 792889 3 8 - 498152 + 498147 8 13940 - 163894 + 163893 @@ -39415,22 +39423,22 @@ 1 2 - 4788627 + 4788582 2 3 - 792897 + 792889 3 8 - 498152 + 498147 8 13940 - 163894 + 163893 @@ -39446,17 +39454,17 @@ 1 2 - 5453746 + 5453695 2 3 - 488968 + 488963 3 12921 - 300858 + 300855 @@ -39472,27 +39480,27 @@ 1 2 - 1844158 + 1844140 2 3 - 591203 + 591197 3 4 - 171750 + 171748 4 7 - 244247 + 244245 7 58308 - 211557 + 211555 @@ -39508,22 +39516,22 @@ 1 2 - 2063098 + 2063079 2 3 - 593654 + 593648 3 6 - 251807 + 251805 6 22697 - 154356 + 154355 @@ -39539,22 +39547,22 @@ 1 2 - 2244002 + 2243981 2 3 - 356316 + 356313 3 5 - 237987 + 237985 5 33056 - 224609 + 224607 @@ -39564,15 +39572,15 @@ cil_parameter - 75119038 + 75118336 id - 75119038 + 75118336 parameterizable - 37743421 + 37743068 index @@ -39580,7 +39588,7 @@ param_type - 9706924 + 9706833 @@ -39594,7 +39602,7 @@ 1 2 - 75119038 + 75118336 @@ -39610,7 +39618,7 @@ 1 2 - 75119038 + 75118336 @@ -39626,7 +39634,7 @@ 1 2 - 75119038 + 75118336 @@ -39642,27 +39650,27 @@ 1 2 - 16498466 + 16498312 2 3 - 12068636 + 12068523 3 4 - 5792078 + 5792024 4 7 - 2932037 + 2932009 7 57 - 452202 + 452198 @@ -39678,27 +39686,27 @@ 1 2 - 16498466 + 16498312 2 3 - 12068636 + 12068523 3 4 - 5792078 + 5792024 4 7 - 2932037 + 2932009 7 57 - 452202 + 452198 @@ -39714,22 +39722,22 @@ 1 2 - 16985988 + 16985829 2 3 - 12300274 + 12300159 3 4 - 5685768 + 5685715 4 43 - 2771390 + 2771364 @@ -39928,42 +39936,42 @@ 1 2 - 2729575 + 2729549 2 3 - 2863142 + 2863115 3 4 - 1063663 + 1063653 4 5 - 653955 + 653949 5 7 - 740805 + 740798 7 11 - 735224 + 735217 11 36 - 733481 + 733474 36 108909 - 187076 + 187074 @@ -39979,42 +39987,42 @@ 1 2 - 2768466 + 2768441 2 3 - 2861370 + 2861343 3 4 - 1055365 + 1055355 4 5 - 645096 + 645090 5 7 - 739919 + 739912 7 11 - 731916 + 731909 11 37 - 728668 + 728661 37 89965 - 176120 + 176119 @@ -40030,17 +40038,17 @@ 1 2 - 6826329 + 6826265 2 3 - 2083267 + 2083248 3 6 - 729111 + 729104 6 @@ -40055,37 +40063,37 @@ cil_parameter_in - 358354 + 358350 id - 358354 + 358350 cil_parameter_out - 683899 + 683893 id - 683899 + 683893 cil_setter - 1074353 + 1074343 prop - 1074353 + 1074343 method - 1074353 + 1074343 @@ -40099,7 +40107,7 @@ 1 2 - 1074353 + 1074343 @@ -40115,7 +40123,7 @@ 1 2 - 1074353 + 1074343 @@ -40125,11 +40133,11 @@ cil_custom_modifiers - 217995 + 217993 id - 197796 + 197794 modifier @@ -40151,7 +40159,7 @@ 1 2 - 177744 + 177743 2 @@ -40172,12 +40180,12 @@ 1 2 - 196349 + 196347 2 3 - 1447 + 1446 @@ -40341,11 +40349,11 @@ cil_type_annotation - 1751904 + 1751888 id - 1751904 + 1751888 annotation @@ -40363,7 +40371,7 @@ 1 2 - 1751904 + 1751888 @@ -40389,15 +40397,15 @@ cil_getter - 5994363 + 5994307 prop - 5994363 + 5994307 method - 5994363 + 5994307 @@ -40411,7 +40419,7 @@ 1 2 - 5994363 + 5994307 @@ -40427,7 +40435,7 @@ 1 2 - 5994363 + 5994307 @@ -40437,15 +40445,15 @@ cil_adder - 70696 + 70695 event - 70696 + 70695 method - 70873 + 70872 @@ -40459,7 +40467,7 @@ 1 2 - 70696 + 70695 @@ -40475,7 +40483,7 @@ 1 2 - 70873 + 70872 @@ -40485,15 +40493,15 @@ cil_remover - 70696 + 70695 event - 70696 + 70695 method - 70873 + 70872 @@ -40507,7 +40515,7 @@ 1 2 - 70696 + 70695 @@ -40523,7 +40531,7 @@ 1 2 - 70873 + 70872 @@ -40581,23 +40589,23 @@ cil_property - 6002749 + 6002693 id - 6002749 + 6002693 parent - 1591435 + 1591420 name - 1540967 + 1540952 property_type - 706667 + 706661 @@ -40611,7 +40619,7 @@ 1 2 - 6002749 + 6002693 @@ -40627,7 +40635,7 @@ 1 2 - 6002749 + 6002693 @@ -40643,7 +40651,7 @@ 1 2 - 6002749 + 6002693 @@ -40659,32 +40667,32 @@ 1 2 - 521629 + 521624 2 3 - 392402 + 392399 3 4 - 215484 + 215482 4 5 - 137258 + 137257 5 7 - 139502 + 139501 7 13 - 124442 + 124440 13 @@ -40705,37 +40713,37 @@ 1 2 - 624838 + 624832 2 3 - 291408 + 291405 3 4 - 215544 + 215542 4 5 - 136520 + 136518 5 7 - 139738 + 139737 7 13 - 124087 + 124086 13 2090 - 59297 + 59296 @@ -40751,27 +40759,27 @@ 1 2 - 615625 + 615619 2 3 - 481851 + 481846 3 4 - 202137 + 202135 4 5 - 101053 + 101052 5 8 - 125268 + 125267 8 @@ -40792,27 +40800,27 @@ 1 2 - 979206 + 979196 2 3 - 254760 + 254758 3 4 - 95118 + 95117 4 8 - 120248 + 120247 8 7161 - 91633 + 91632 @@ -40828,27 +40836,27 @@ 1 2 - 979206 + 979196 2 3 - 255203 + 255201 3 4 - 95177 + 95176 4 8 - 120219 + 120218 8 3695 - 91161 + 91160 @@ -40864,17 +40872,17 @@ 1 2 - 1346862 + 1346849 2 3 - 113161 + 113160 3 1330 - 80943 + 80942 @@ -40890,17 +40898,17 @@ 1 2 - 410209 + 410206 2 3 - 125239 + 125238 3 4 - 46038 + 46037 4 @@ -40910,7 +40918,7 @@ 7 34 - 53096 + 53095 34 @@ -40931,12 +40939,12 @@ 1 2 - 430172 + 430168 2 3 - 118831 + 118830 3 @@ -40951,12 +40959,12 @@ 7 64 - 53007 + 53006 64 17546 - 4843 + 4842 @@ -40972,12 +40980,12 @@ 1 2 - 559812 + 559806 2 3 - 81534 + 81533 3 @@ -40997,15 +41005,15 @@ cil_event - 70696 + 70695 id - 70696 + 70695 parent - 30062 + 30061 name @@ -41013,7 +41021,7 @@ event_type - 21380 + 21379 @@ -41027,7 +41035,7 @@ 1 2 - 70696 + 70695 @@ -41043,7 +41051,7 @@ 1 2 - 70696 + 70695 @@ -41059,7 +41067,7 @@ 1 2 - 70696 + 70695 @@ -41075,7 +41083,7 @@ 1 2 - 16478 + 16477 2 @@ -41116,7 +41124,7 @@ 1 2 - 16478 + 16477 2 @@ -41157,7 +41165,7 @@ 1 2 - 19815 + 19814 2 @@ -41265,7 +41273,7 @@ 1 2 - 30121 + 30120 2 @@ -41296,7 +41304,7 @@ 2 3 - 4341 + 4340 3 @@ -41378,15 +41386,15 @@ cil_local_variable - 23026507 + 23026292 id - 23026507 + 23026292 impl - 6649736 + 6649674 index @@ -41394,7 +41402,7 @@ var_type - 2957964 + 2957937 @@ -41408,7 +41416,7 @@ 1 2 - 23026507 + 23026292 @@ -41424,7 +41432,7 @@ 1 2 - 23026507 + 23026292 @@ -41440,7 +41448,7 @@ 1 2 - 23026507 + 23026292 @@ -41456,37 +41464,37 @@ 1 2 - 2714986 + 2714961 2 3 - 1154972 + 1154961 3 4 - 783477 + 783469 4 5 - 524995 + 524990 5 6 - 385197 + 385193 6 9 - 558778 + 558773 9 29 - 498801 + 498797 29 @@ -41507,37 +41515,37 @@ 1 2 - 2714986 + 2714961 2 3 - 1154972 + 1154961 3 4 - 783477 + 783469 4 5 - 524995 + 524990 5 6 - 385197 + 385193 6 9 - 558778 + 558773 9 29 - 498801 + 498797 29 @@ -41558,37 +41566,37 @@ 1 2 - 2973084 + 2973056 2 3 - 1271618 + 1271606 3 4 - 818854 + 818847 4 5 - 500130 + 500126 5 7 - 537339 + 537334 7 16 - 498831 + 498826 16 163 - 49877 + 49876 @@ -41762,27 +41770,27 @@ 1 2 - 1877350 + 1877333 2 3 - 375954 + 375950 3 4 - 175411 + 175410 4 7 - 232849 + 232846 7 29 - 223664 + 223662 29 @@ -41803,27 +41811,27 @@ 1 2 - 1959652 + 1959634 2 3 - 358679 + 358675 3 5 - 267754 + 267751 5 12 - 222070 + 222068 12 44190 - 149808 + 149807 @@ -41839,27 +41847,27 @@ 1 2 - 2018536 + 2018517 2 3 - 391103 + 391099 3 4 - 185275 + 185273 4 8 - 239434 + 239432 8 217 - 123615 + 123614 @@ -41869,11 +41877,11 @@ cil_function_pointer_calling_conventions - 39912 + 39911 id - 39912 + 39911 kind @@ -41891,7 +41899,7 @@ 1 2 - 39912 + 39911 @@ -41922,15 +41930,15 @@ cil_handler - 2378514 + 2378492 id - 2378514 + 2378492 impl - 1552395 + 1552381 index @@ -41942,15 +41950,15 @@ try_start - 2323145 + 2323123 try_end - 2349486 + 2349464 handler_start - 2378514 + 2378492 @@ -41964,7 +41972,7 @@ 1 2 - 2378514 + 2378492 @@ -41980,7 +41988,7 @@ 1 2 - 2378514 + 2378492 @@ -41996,7 +42004,7 @@ 1 2 - 2378514 + 2378492 @@ -42012,7 +42020,7 @@ 1 2 - 2378514 + 2378492 @@ -42028,7 +42036,7 @@ 1 2 - 2378514 + 2378492 @@ -42044,7 +42052,7 @@ 1 2 - 2378514 + 2378492 @@ -42060,22 +42068,22 @@ 1 2 - 1142805 + 1142795 2 3 - 247407 + 247405 3 5 - 119658 + 119656 5 83 - 42524 + 42523 @@ -42091,22 +42099,22 @@ 1 2 - 1142805 + 1142795 2 3 - 247407 + 247405 3 5 - 119658 + 119656 5 83 - 42524 + 42523 @@ -42122,12 +42130,12 @@ 1 2 - 1453556 + 1453543 2 4 - 98839 + 98838 @@ -42143,17 +42151,17 @@ 1 2 - 1161321 + 1161310 2 3 - 240615 + 240613 3 6 - 125918 + 125917 6 @@ -42174,22 +42182,22 @@ 1 2 - 1153171 + 1153160 2 3 - 244070 + 244068 3 6 - 128989 + 128988 6 83 - 26164 + 26163 @@ -42205,22 +42213,22 @@ 1 2 - 1142805 + 1142795 2 3 - 247407 + 247405 3 5 - 119658 + 119656 5 83 - 42524 + 42523 @@ -42758,12 +42766,12 @@ 1 2 - 2279616 + 2279595 2 9 - 43528 + 43527 @@ -42779,7 +42787,7 @@ 1 2 - 2323145 + 2323123 @@ -42795,12 +42803,12 @@ 1 2 - 2279616 + 2279595 2 9 - 43528 + 43527 @@ -42816,7 +42824,7 @@ 1 2 - 2305987 + 2305966 2 @@ -42837,7 +42845,7 @@ 1 2 - 2299727 + 2299705 2 @@ -42858,12 +42866,12 @@ 1 2 - 2279616 + 2279595 2 9 - 43528 + 43527 @@ -42879,7 +42887,7 @@ 1 2 - 2326836 + 2326814 2 @@ -42900,7 +42908,7 @@ 1 2 - 2349486 + 2349464 @@ -42916,7 +42924,7 @@ 1 2 - 2326836 + 2326814 2 @@ -42937,7 +42945,7 @@ 1 2 - 2347537 + 2347515 2 @@ -42958,7 +42966,7 @@ 1 2 - 2349486 + 2349464 @@ -42974,7 +42982,7 @@ 1 2 - 2326836 + 2326814 2 @@ -42995,7 +43003,7 @@ 1 2 - 2378514 + 2378492 @@ -43011,7 +43019,7 @@ 1 2 - 2378514 + 2378492 @@ -43027,7 +43035,7 @@ 1 2 - 2378514 + 2378492 @@ -43043,7 +43051,7 @@ 1 2 - 2378514 + 2378492 @@ -43059,7 +43067,7 @@ 1 2 - 2378514 + 2378492 @@ -43075,7 +43083,7 @@ 1 2 - 2378514 + 2378492 @@ -43133,11 +43141,11 @@ cil_handler_type - 400819 + 400815 id - 400819 + 400815 catch_type @@ -43155,7 +43163,7 @@ 1 2 - 400819 + 400815 @@ -43216,11 +43224,11 @@ cil_method_stack_size - 27072292 + 27072039 method - 27072292 + 27072039 size @@ -43238,7 +43246,7 @@ 1 2 - 27072292 + 27072039 @@ -43309,121 +43317,121 @@ cil_public - 30557526 + 30557240 id - 30557526 + 30557240 cil_private - 15498766 + 15498621 id - 15498766 + 15498621 cil_protected - 28744228 + 28743959 id - 28744228 + 28743959 cil_internal - 986884 + 986874 id - 986884 + 986874 cil_static - 14521686 + 14521550 id - 14521686 + 14521550 cil_sealed - 6359922 + 6359863 id - 6359922 + 6359863 cil_virtual - 11734704 + 11734594 id - 11734704 + 11734594 cil_abstract - 2826199 + 2826172 id - 2826199 + 2826172 cil_class - 4475041 + 4475000 id - 4475041 + 4475000 cil_interface - 367479 + 367475 id - 367479 + 367475 cil_security - 48814 + 48813 id - 48814 + 48813 @@ -43441,37 +43449,37 @@ cil_specialname - 12520543 + 12520426 id - 12520543 + 12520426 cil_newslot - 7370933 + 7370864 id - 7370933 + 7370864 cil_base_class - 4460424 + 4460382 id - 4460424 + 4460382 base - 462242 + 462238 @@ -43485,7 +43493,7 @@ 1 2 - 4460424 + 4460382 @@ -43501,12 +43509,12 @@ 1 2 - 280600 + 280597 2 3 - 90068 + 90067 3 @@ -43516,7 +43524,7 @@ 4 8 - 38242 + 38241 8 @@ -43531,15 +43539,15 @@ cil_base_interface - 2925894 + 2925867 id - 1244479 + 1244468 base - 538638 + 538633 @@ -43553,32 +43561,32 @@ 1 2 - 703478 + 703472 2 3 - 199095 + 199093 3 4 - 95531 + 95530 4 5 - 46540 + 46539 5 6 - 123792 + 123791 6 32 - 76041 + 76040 @@ -43594,7 +43602,7 @@ 1 2 - 358649 + 358646 2 @@ -43604,12 +43612,12 @@ 3 4 - 31834 + 31833 4 8 - 43203 + 43202 8 @@ -43629,11 +43637,11 @@ cil_enum_underlying_type - 203849 + 203848 id - 203849 + 203848 underlying @@ -43651,7 +43659,7 @@ 1 2 - 203849 + 203848 @@ -43712,11 +43720,11 @@ cil_type_parameter - 1773609 + 1773592 unbound - 1331358 + 1331346 index @@ -43724,7 +43732,7 @@ param - 1773609 + 1773592 @@ -43738,17 +43746,17 @@ 1 2 - 994443 + 994434 2 3 - 282460 + 282457 3 43 - 54454 + 54453 @@ -43764,17 +43772,17 @@ 1 2 - 994443 + 994434 2 3 - 282460 + 282457 3 43 - 54454 + 54453 @@ -43912,7 +43920,7 @@ 1 2 - 1773609 + 1773592 @@ -43928,7 +43936,7 @@ 1 2 - 1773609 + 1773592 @@ -43938,11 +43946,11 @@ cil_type_argument - 11206076 + 11205971 bound - 8383213 + 8383135 index @@ -43950,7 +43958,7 @@ t - 2800094 + 2800068 @@ -43964,17 +43972,17 @@ 1 2 - 5919148 + 5919093 2 3 - 2202955 + 2202934 3 43 - 261109 + 261107 @@ -43990,17 +43998,17 @@ 1 2 - 6030449 + 6030393 2 3 - 2159013 + 2158993 3 43 - 193750 + 193748 @@ -44133,32 +44141,32 @@ 1 2 - 1210194 + 1210183 2 3 - 732418 + 732411 3 4 - 295483 + 295480 4 6 - 237455 + 237453 6 12 - 215160 + 215158 12 14769 - 109381 + 109380 @@ -44174,17 +44182,17 @@ 1 2 - 2254043 + 2254022 2 3 - 502079 + 502075 3 10 - 43971 + 43970 @@ -44285,19 +44293,19 @@ cil_attribute - 5874527 + 5874473 attributeid - 5874527 + 5874473 element - 5184131 + 5184082 constructor - 27995 + 27994 @@ -44311,7 +44319,7 @@ 1 2 - 5874527 + 5874473 @@ -44327,7 +44335,7 @@ 1 2 - 5874527 + 5874473 @@ -44343,12 +44351,12 @@ 1 2 - 4807940 + 4807895 2 3520 - 376190 + 376187 @@ -44364,12 +44372,12 @@ 1 2 - 4812458 + 4812413 2 9 - 371672 + 371669 @@ -44521,11 +44529,11 @@ cil_attribute_named_argument - 261818 + 261816 attribute_id - 161089 + 161088 param @@ -44533,7 +44541,7 @@ value - 119569 + 119568 @@ -44547,7 +44555,7 @@ 1 2 - 97510 + 97509 2 @@ -44562,7 +44570,7 @@ 4 6 - 12137 + 12136 7 @@ -44583,7 +44591,7 @@ 1 2 - 103711 + 103710 2 @@ -44746,7 +44754,7 @@ 1 2 - 101171 + 101170 2 @@ -44772,7 +44780,7 @@ 1 2 - 112925 + 112924 2 @@ -44787,11 +44795,11 @@ cil_attribute_positional_argument - 1757367 + 1757351 attribute_id - 1528150 + 1528136 index @@ -44799,7 +44807,7 @@ value - 440478 + 440474 @@ -44813,12 +44821,12 @@ 1 2 - 1317006 + 1316994 2 3 - 194104 + 194103 3 @@ -44839,12 +44847,12 @@ 1 2 - 1318276 + 1318264 2 3 - 194222 + 194221 3 @@ -44932,12 +44940,12 @@ 1 2 - 324925 + 324922 2 3 - 75273 + 75272 3 @@ -44963,7 +44971,7 @@ 1 2 - 400848 + 400845 2 @@ -44983,19 +44991,19 @@ metadata_handle - 109731032 + 109730006 entity - 109393999 + 109392976 location - 14588 + 14587 handle - 2756447 + 2756422 @@ -45009,12 +45017,12 @@ 1 2 - 109222337 + 109221316 2 495 - 171661 + 171659 @@ -45030,12 +45038,12 @@ 1 2 - 109225527 + 109224505 2 104 - 168472 + 168470 @@ -45198,7 +45206,7 @@ 2 3 - 373149 + 373145 3 @@ -45208,57 +45216,57 @@ 4 5 - 360687 + 360683 5 8 - 210051 + 210049 8 11 - 237367 + 237364 11 15 - 233026 + 233024 15 22 - 101939 + 101938 22 25 - 223103 + 223101 25 39 - 216105 + 216103 39 51 - 211143 + 211142 51 73 - 210317 + 210315 73 137 - 207807 + 207805 137 732 - 169801 + 169799 @@ -45274,62 +45282,62 @@ 1 2 - 373651 + 373647 2 3 - 362134 + 362130 3 4 - 205326 + 205324 4 6 - 242092 + 242089 6 8 - 233026 + 233024 8 11 - 101733 + 101732 11 13 - 223192 + 223190 13 20 - 216134 + 216132 20 26 - 210523 + 210521 26 37 - 210996 + 210994 37 70 - 209903 + 209901 70 495 - 167733 + 167732 diff --git a/csharp/ql/lib/upgrades/83aca6b3e4fa38dd2b97b9b51dfc199a2ba9c7f2/old.dbscheme b/csharp/ql/lib/upgrades/83aca6b3e4fa38dd2b97b9b51dfc199a2ba9c7f2/old.dbscheme new file mode 100644 index 00000000000..83aca6b3e4f --- /dev/null +++ b/csharp/ql/lib/upgrades/83aca6b3e4fa38dd2b97b9b51dfc199a2ba9c7f2/old.dbscheme @@ -0,0 +1,2067 @@ +/* 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 | f1.cs + * 3 | f2.cs + * 4 | 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 +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @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; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** 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 kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +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 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 +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_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); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref 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) diff --git a/csharp/ql/lib/upgrades/83aca6b3e4fa38dd2b97b9b51dfc199a2ba9c7f2/semmlecode.csharp.dbscheme b/csharp/ql/lib/upgrades/83aca6b3e4fa38dd2b97b9b51dfc199a2ba9c7f2/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..d0fba103f7d --- /dev/null +++ b/csharp/ql/lib/upgrades/83aca6b3e4fa38dd2b97b9b51dfc199a2ba9c7f2/semmlecode.csharp.dbscheme @@ -0,0 +1,2069 @@ +/* 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 | f1.cs + * 3 | f2.cs + * 4 | 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 +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @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; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** 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 kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +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 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 +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_expr +| 133 = @urshift_expr +| 134 = @assign_urshift_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 | @assign_urshift_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 | @urshift_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); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref 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) diff --git a/csharp/ql/lib/upgrades/83aca6b3e4fa38dd2b97b9b51dfc199a2ba9c7f2/upgrade.properties b/csharp/ql/lib/upgrades/83aca6b3e4fa38dd2b97b9b51dfc199a2ba9c7f2/upgrade.properties new file mode 100644 index 00000000000..25d7416df1c --- /dev/null +++ b/csharp/ql/lib/upgrades/83aca6b3e4fa38dd2b97b9b51dfc199a2ba9c7f2/upgrade.properties @@ -0,0 +1,2 @@ +description: Add unsigned right shift and unsigned right shift assignment expression kinds. +compatibility: backwards diff --git a/csharp/ql/src/experimental/ir/implementation/Opcode.qll b/csharp/ql/src/experimental/ir/implementation/Opcode.qll index c4134d240ab..b4def7fe4ae 100644 --- a/csharp/ql/src/experimental/ir/implementation/Opcode.qll +++ b/csharp/ql/src/experimental/ir/implementation/Opcode.qll @@ -30,6 +30,7 @@ private newtype TOpcode = TNegate() or TShiftLeft() or TShiftRight() or + TUnsignedShiftRight() or TBitAnd() or TBitOr() or TBitXor() or @@ -652,6 +653,15 @@ module Opcode { final override string toString() { result = "ShiftRight" } } + /** + * The `Opcode` for a `UnsignedShiftRightInstruction`. + * + * See the `UnsignedShiftRightInstruction` documentation for more details. + */ + class UnsignedShiftRight extends BinaryBitwiseOpcode, TUnsignedShiftRight { + final override string toString() { result = "UnsignedShiftRight" } + } + /** * The `Opcode` for a `BitAndInstruction`. * diff --git a/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll b/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll index 7afe954023b..0aa7c552638 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll @@ -1204,6 +1204,17 @@ class ShiftRightInstruction extends BinaryBitwiseInstruction { ShiftRightInstruction() { this.getOpcode() instanceof Opcode::ShiftRight } } +/** + * An instruction that shifts its left operand to the right by the number of bits specified by its + * right operand. + * + * Both operands must have an integer type. The result has the same type as the left operand. + * The leftmost bits are zero-filled. + */ +class UnsignedShiftRightInstruction extends BinaryBitwiseInstruction { + UnsignedShiftRightInstruction() { this.getOpcode() instanceof Opcode::UnsignedShiftRight } +} + /** * An instruction that performs a binary arithmetic operation involving at least one pointer * operand. diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedExpr.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedExpr.qll index 1bcca401565..06391c010b4 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedExpr.qll @@ -1091,9 +1091,11 @@ class TranslatedCast extends TranslatedNonConstantExpr { } private Opcode binaryBitwiseOpcode(BinaryBitwiseOperation expr) { - expr instanceof LShiftExpr and result instanceof Opcode::ShiftLeft + expr instanceof LeftShiftExpr and result instanceof Opcode::ShiftLeft or - expr instanceof RShiftExpr and result instanceof Opcode::ShiftRight + expr instanceof RightShiftExpr and result instanceof Opcode::ShiftRight + or + expr instanceof UnsignedRightShiftExpr and result instanceof Opcode::UnsignedShiftRight or expr instanceof BitwiseAndExpr and result instanceof Opcode::BitAnd or @@ -1377,8 +1379,9 @@ class TranslatedAssignOperation extends TranslatedAssignment { private Type getConvertedLeftOperandType() { if - expr instanceof AssignLShiftExpr or - expr instanceof AssignRShiftExpr + expr instanceof AssignLeftShiftExpr or + expr instanceof AssignRightShiftExpr or + expr instanceof AssignUnsighedRightShiftExpr then result = this.getLeftOperand().getResultType() else // The right operand has already been converted to the type of the op. @@ -1416,9 +1419,11 @@ class TranslatedAssignOperation extends TranslatedAssignment { or expr instanceof AssignXorExpr and result instanceof Opcode::BitXor or - expr instanceof AssignLShiftExpr and result instanceof Opcode::ShiftLeft + expr instanceof AssignLeftShiftExpr and result instanceof Opcode::ShiftLeft or - expr instanceof AssignRShiftExpr and result instanceof Opcode::ShiftRight + expr instanceof AssignRightShiftExpr and result instanceof Opcode::ShiftRight + or + expr instanceof AssignUnsighedRightShiftExpr and result instanceof Opcode::UnsignedShiftRight } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CSharpType resultType) { diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll index 7afe954023b..0aa7c552638 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll @@ -1204,6 +1204,17 @@ class ShiftRightInstruction extends BinaryBitwiseInstruction { ShiftRightInstruction() { this.getOpcode() instanceof Opcode::ShiftRight } } +/** + * An instruction that shifts its left operand to the right by the number of bits specified by its + * right operand. + * + * Both operands must have an integer type. The result has the same type as the left operand. + * The leftmost bits are zero-filled. + */ +class UnsignedShiftRightInstruction extends BinaryBitwiseInstruction { + UnsignedShiftRightInstruction() { this.getOpcode() instanceof Opcode::UnsignedShiftRight } +} + /** * An instruction that performs a binary arithmetic operation involving at least one pointer * operand. diff --git a/csharp/ql/src/experimental/ir/rangeanalysis/SignAnalysis.qll b/csharp/ql/src/experimental/ir/rangeanalysis/SignAnalysis.qll index 44548e0517a..b74f7c90db5 100644 --- a/csharp/ql/src/experimental/ir/rangeanalysis/SignAnalysis.qll +++ b/csharp/ql/src/experimental/ir/rangeanalysis/SignAnalysis.qll @@ -522,6 +522,8 @@ module SignAnalysisCached { i instanceof ShiftRightInstruction and not i.getResultType().(IntegralType) instanceof SignedIntegralType and result = s1.urshift(s2) + or + i instanceof UnsignedShiftRightInstruction and result = s1.urshift(s2) ) or // use hasGuard here? diff --git a/csharp/ql/test/experimental/ir/ir/PrintAst.expected b/csharp/ql/test/experimental/ir/ir/PrintAst.expected index 41b5b6daead..cc96a82bbc1 100644 --- a/csharp/ql/test/experimental/ir/ir/PrintAst.expected +++ b/csharp/ql/test/experimental/ir/ir/PrintAst.expected @@ -118,59 +118,63 @@ array.cs: # 20| 0: [IntLiteral] 1 assignop.cs: # 3| [Class] AssignOp -# 4| 5: [Method] Main -# 4| -1: [TypeMention] Void -# 4| 4: [BlockStmt] {...} -# 5| 0: [LocalVariableDeclStmt] ... ...; -# 5| 0: [LocalVariableDeclAndInitExpr] Int32 a = ... -# 5| -1: [TypeMention] int -# 5| 0: [LocalVariableAccess] access to local variable a -# 5| 1: [IntLiteral] 1 -# 6| 1: [LocalVariableDeclStmt] ... ...; -# 6| 0: [LocalVariableDeclAndInitExpr] Int32 c = ... -# 6| -1: [TypeMention] int -# 6| 0: [LocalVariableAccess] access to local variable c -# 6| 1: [IntLiteral] 1 -# 8| 2: [ExprStmt] ...; -# 8| 0: [AssignAddExpr] ... += ... +# 5| 5: [Method] Main +# 5| -1: [TypeMention] Void +# 6| 4: [BlockStmt] {...} +# 7| 0: [LocalVariableDeclStmt] ... ...; +# 7| 0: [LocalVariableDeclAndInitExpr] Int32 a = ... +# 7| -1: [TypeMention] int +# 7| 0: [LocalVariableAccess] access to local variable a +# 7| 1: [IntLiteral] 1 +# 8| 1: [LocalVariableDeclStmt] ... ...; +# 8| 0: [LocalVariableDeclAndInitExpr] Int32 c = ... +# 8| -1: [TypeMention] int # 8| 0: [LocalVariableAccess] access to local variable c -# 8| 1: [LocalVariableAccess] access to local variable a -# 9| 3: [ExprStmt] ...; -# 9| 0: [AssignSubExpr] ... -= ... -# 9| 0: [LocalVariableAccess] access to local variable c -# 9| 1: [LocalVariableAccess] access to local variable a -# 10| 4: [ExprStmt] ...; -# 10| 0: [AssignMulExpr] ... *= ... +# 8| 1: [IntLiteral] 1 +# 10| 2: [ExprStmt] ...; +# 10| 0: [AssignAddExpr] ... += ... # 10| 0: [LocalVariableAccess] access to local variable c # 10| 1: [LocalVariableAccess] access to local variable a -# 11| 5: [ExprStmt] ...; -# 11| 0: [AssignDivExpr] ... /= ... +# 11| 3: [ExprStmt] ...; +# 11| 0: [AssignSubExpr] ... -= ... # 11| 0: [LocalVariableAccess] access to local variable c # 11| 1: [LocalVariableAccess] access to local variable a -# 12| 6: [ExprStmt] ...; -# 12| 0: [AssignRemExpr] ... %= ... +# 12| 4: [ExprStmt] ...; +# 12| 0: [AssignMulExpr] ... *= ... # 12| 0: [LocalVariableAccess] access to local variable c # 12| 1: [LocalVariableAccess] access to local variable a -# 13| 7: [ExprStmt] ...; -# 13| 0: [AssignLShiftExpr] ... <<= ... +# 13| 5: [ExprStmt] ...; +# 13| 0: [AssignDivExpr] ... /= ... # 13| 0: [LocalVariableAccess] access to local variable c -# 13| 1: [IntLiteral] 2 -# 14| 8: [ExprStmt] ...; -# 14| 0: [AssignRShiftExpr] ... >>= ... +# 13| 1: [LocalVariableAccess] access to local variable a +# 14| 6: [ExprStmt] ...; +# 14| 0: [AssignRemExpr] ... %= ... # 14| 0: [LocalVariableAccess] access to local variable c -# 14| 1: [IntLiteral] 2 -# 15| 9: [ExprStmt] ...; -# 15| 0: [AssignAndExpr] ... &= ... +# 14| 1: [LocalVariableAccess] access to local variable a +# 15| 7: [ExprStmt] ...; +# 15| 0: [AssignLeftShiftExpr] ... <<= ... # 15| 0: [LocalVariableAccess] access to local variable c # 15| 1: [IntLiteral] 2 -# 16| 10: [ExprStmt] ...; -# 16| 0: [AssignXorExpr] ... ^= ... +# 16| 8: [ExprStmt] ...; +# 16| 0: [AssignRightShiftExpr] ... >>= ... # 16| 0: [LocalVariableAccess] access to local variable c # 16| 1: [IntLiteral] 2 -# 17| 11: [ExprStmt] ...; -# 17| 0: [AssignOrExpr] ... |= ... +# 17| 9: [ExprStmt] ...; +# 17| 0: [AssignAndExpr] ... &= ... # 17| 0: [LocalVariableAccess] access to local variable c # 17| 1: [IntLiteral] 2 +# 18| 10: [ExprStmt] ...; +# 18| 0: [AssignXorExpr] ... ^= ... +# 18| 0: [LocalVariableAccess] access to local variable c +# 18| 1: [IntLiteral] 2 +# 19| 11: [ExprStmt] ...; +# 19| 0: [AssignOrExpr] ... |= ... +# 19| 0: [LocalVariableAccess] access to local variable c +# 19| 1: [IntLiteral] 2 +# 20| 12: [ExprStmt] ...; +# 20| 0: [AssignUnsighedRightShiftExpr] ... >>>= ... +# 20| 0: [LocalVariableAccess] access to local variable c +# 20| 1: [IntLiteral] 2 casts.cs: # 1| [Class] Casts_A # 5| [Class] Casts_B diff --git a/csharp/ql/test/experimental/ir/ir/assignop.cs b/csharp/ql/test/experimental/ir/ir/assignop.cs index f5c2a6fa19d..21fdfccbcf9 100644 --- a/csharp/ql/test/experimental/ir/ir/assignop.cs +++ b/csharp/ql/test/experimental/ir/ir/assignop.cs @@ -1,19 +1,22 @@ using System; -class AssignOp { - static void Main() { +class AssignOp +{ + static void Main() + { int a = 1; int c = 1; - - c += a; + + c += a; c -= a; - c *= a; + c *= a; c /= a; - c %= a; - c <<= 2; - c >>= 2; - c &= 2; - c ^= 2; + c %= a; + c <<= 2; + c >>= 2; + c &= 2; + c ^= 2; c |= 2; + c >>>= 2; } } diff --git a/csharp/ql/test/experimental/ir/ir/raw_ir.expected b/csharp/ql/test/experimental/ir/ir/raw_ir.expected index bf639694da5..2461e6602b9 100644 --- a/csharp/ql/test/experimental/ir/ir/raw_ir.expected +++ b/csharp/ql/test/experimental/ir/ir/raw_ir.expected @@ -145,74 +145,79 @@ array.cs: # 13| v13_6(Void) = ExitFunction : assignop.cs: -# 4| System.Void AssignOp.Main() -# 4| Block 0 -# 4| v4_1(Void) = EnterFunction : -# 4| mu4_2() = AliasedDefinition : -# 5| r5_1(glval) = VariableAddress[a] : -# 5| r5_2(Int32) = Constant[1] : -# 5| mu5_3(Int32) = Store[a] : &:r5_1, r5_2 -# 6| r6_1(glval) = VariableAddress[c] : -# 6| r6_2(Int32) = Constant[1] : -# 6| mu6_3(Int32) = Store[c] : &:r6_1, r6_2 -# 8| r8_1(glval) = VariableAddress[a] : -# 8| r8_2(Int32) = Load[a] : &:r8_1, ~m? -# 8| r8_3(glval) = VariableAddress[c] : -# 8| r8_4(Int32) = Load[c] : &:r8_3, ~m? -# 8| r8_5(Int32) = Add : r8_4, r8_2 -# 8| mu8_6(Int32) = Store[c] : &:r8_3, r8_5 -# 9| r9_1(glval) = VariableAddress[a] : -# 9| r9_2(Int32) = Load[a] : &:r9_1, ~m? -# 9| r9_3(glval) = VariableAddress[c] : -# 9| r9_4(Int32) = Load[c] : &:r9_3, ~m? -# 9| r9_5(Int32) = Sub : r9_4, r9_2 -# 9| mu9_6(Int32) = Store[c] : &:r9_3, r9_5 +# 5| System.Void AssignOp.Main() +# 5| Block 0 +# 5| v5_1(Void) = EnterFunction : +# 5| mu5_2() = AliasedDefinition : +# 7| r7_1(glval) = VariableAddress[a] : +# 7| r7_2(Int32) = Constant[1] : +# 7| mu7_3(Int32) = Store[a] : &:r7_1, r7_2 +# 8| r8_1(glval) = VariableAddress[c] : +# 8| r8_2(Int32) = Constant[1] : +# 8| mu8_3(Int32) = Store[c] : &:r8_1, r8_2 # 10| r10_1(glval) = VariableAddress[a] : # 10| r10_2(Int32) = Load[a] : &:r10_1, ~m? # 10| r10_3(glval) = VariableAddress[c] : # 10| r10_4(Int32) = Load[c] : &:r10_3, ~m? -# 10| r10_5(Int32) = Mul : r10_4, r10_2 +# 10| r10_5(Int32) = Add : r10_4, r10_2 # 10| mu10_6(Int32) = Store[c] : &:r10_3, r10_5 # 11| r11_1(glval) = VariableAddress[a] : # 11| r11_2(Int32) = Load[a] : &:r11_1, ~m? # 11| r11_3(glval) = VariableAddress[c] : # 11| r11_4(Int32) = Load[c] : &:r11_3, ~m? -# 11| r11_5(Int32) = Div : r11_4, r11_2 +# 11| r11_5(Int32) = Sub : r11_4, r11_2 # 11| mu11_6(Int32) = Store[c] : &:r11_3, r11_5 # 12| r12_1(glval) = VariableAddress[a] : # 12| r12_2(Int32) = Load[a] : &:r12_1, ~m? # 12| r12_3(glval) = VariableAddress[c] : # 12| r12_4(Int32) = Load[c] : &:r12_3, ~m? -# 12| r12_5(Int32) = Rem : r12_4, r12_2 +# 12| r12_5(Int32) = Mul : r12_4, r12_2 # 12| mu12_6(Int32) = Store[c] : &:r12_3, r12_5 -# 13| r13_1(Int32) = Constant[2] : -# 13| r13_2(glval) = VariableAddress[c] : -# 13| r13_3(Int32) = Load[c] : &:r13_2, ~m? -# 13| r13_4(Int32) = ShiftLeft : r13_3, r13_1 -# 13| mu13_5(Int32) = Store[c] : &:r13_2, r13_4 -# 14| r14_1(Int32) = Constant[2] : -# 14| r14_2(glval) = VariableAddress[c] : -# 14| r14_3(Int32) = Load[c] : &:r14_2, ~m? -# 14| r14_4(Int32) = ShiftRight : r14_3, r14_1 -# 14| mu14_5(Int32) = Store[c] : &:r14_2, r14_4 +# 13| r13_1(glval) = VariableAddress[a] : +# 13| r13_2(Int32) = Load[a] : &:r13_1, ~m? +# 13| r13_3(glval) = VariableAddress[c] : +# 13| r13_4(Int32) = Load[c] : &:r13_3, ~m? +# 13| r13_5(Int32) = Div : r13_4, r13_2 +# 13| mu13_6(Int32) = Store[c] : &:r13_3, r13_5 +# 14| r14_1(glval) = VariableAddress[a] : +# 14| r14_2(Int32) = Load[a] : &:r14_1, ~m? +# 14| r14_3(glval) = VariableAddress[c] : +# 14| r14_4(Int32) = Load[c] : &:r14_3, ~m? +# 14| r14_5(Int32) = Rem : r14_4, r14_2 +# 14| mu14_6(Int32) = Store[c] : &:r14_3, r14_5 # 15| r15_1(Int32) = Constant[2] : # 15| r15_2(glval) = VariableAddress[c] : # 15| r15_3(Int32) = Load[c] : &:r15_2, ~m? -# 15| r15_4(Int32) = BitAnd : r15_3, r15_1 +# 15| r15_4(Int32) = ShiftLeft : r15_3, r15_1 # 15| mu15_5(Int32) = Store[c] : &:r15_2, r15_4 # 16| r16_1(Int32) = Constant[2] : # 16| r16_2(glval) = VariableAddress[c] : # 16| r16_3(Int32) = Load[c] : &:r16_2, ~m? -# 16| r16_4(Int32) = BitXor : r16_3, r16_1 +# 16| r16_4(Int32) = ShiftRight : r16_3, r16_1 # 16| mu16_5(Int32) = Store[c] : &:r16_2, r16_4 # 17| r17_1(Int32) = Constant[2] : # 17| r17_2(glval) = VariableAddress[c] : # 17| r17_3(Int32) = Load[c] : &:r17_2, ~m? -# 17| r17_4(Int32) = BitOr : r17_3, r17_1 +# 17| r17_4(Int32) = BitAnd : r17_3, r17_1 # 17| mu17_5(Int32) = Store[c] : &:r17_2, r17_4 -# 4| v4_3(Void) = ReturnVoid : -# 4| v4_4(Void) = AliasedUse : ~m? -# 4| v4_5(Void) = ExitFunction : +# 18| r18_1(Int32) = Constant[2] : +# 18| r18_2(glval) = VariableAddress[c] : +# 18| r18_3(Int32) = Load[c] : &:r18_2, ~m? +# 18| r18_4(Int32) = BitXor : r18_3, r18_1 +# 18| mu18_5(Int32) = Store[c] : &:r18_2, r18_4 +# 19| r19_1(Int32) = Constant[2] : +# 19| r19_2(glval) = VariableAddress[c] : +# 19| r19_3(Int32) = Load[c] : &:r19_2, ~m? +# 19| r19_4(Int32) = BitOr : r19_3, r19_1 +# 19| mu19_5(Int32) = Store[c] : &:r19_2, r19_4 +# 20| r20_1(Int32) = Constant[2] : +# 20| r20_2(glval) = VariableAddress[c] : +# 20| r20_3(Int32) = Load[c] : &:r20_2, ~m? +# 20| r20_4(Int32) = UnsignedShiftRight : r20_3, r20_1 +# 20| mu20_5(Int32) = Store[c] : &:r20_2, r20_4 +# 5| v5_3(Void) = ReturnVoid : +# 5| v5_4(Void) = AliasedUse : ~m? +# 5| v5_5(Void) = ExitFunction : casts.cs: # 11| System.Void Casts.Main() diff --git a/csharp/ql/test/library-tests/csharp11/Operators.cs b/csharp/ql/test/library-tests/csharp11/Operators.cs new file mode 100644 index 00000000000..d5c4f8be091 --- /dev/null +++ b/csharp/ql/test/library-tests/csharp11/Operators.cs @@ -0,0 +1,20 @@ + +public class MyClass +{ + public void M1() + { + var x1 = 1; + var x2 = x1 >>> 2; + + var y1 = -2; + var y2 = y1 >>> 3; + + var z = -4; + z >>>= 5; + } +} + +public class MyOperatorClass +{ + public static MyOperatorClass operator >>>(MyOperatorClass a, MyOperatorClass b) { return null; } +} \ No newline at end of file diff --git a/csharp/ql/test/library-tests/csharp11/SignAnalysis.cs b/csharp/ql/test/library-tests/csharp11/SignAnalysis.cs new file mode 100644 index 00000000000..09e7ceb9fdc --- /dev/null +++ b/csharp/ql/test/library-tests/csharp11/SignAnalysis.cs @@ -0,0 +1,42 @@ +public class MySignAnalysis +{ + + public void UnsignedRightShiftSign(int x, int y) + { + int z; + if (x == 0) + { + z = x >>> y; + } + + if (y == 0) + { + z = x >>> y; + } + + if (x > 0 && y == 0) + { + z = x >>> y; + } + + if (x > 0 && y > 0) + { + z = x >>> y; + } + + if (x > 0 && y < 0) + { + z = x >>> y; + } + + if (x < 0 && y > 0) + { + z = x >>> y; + } + + if (x < 0 && y < 0) + { + z = x >>> y; + } + } +} \ No newline at end of file diff --git a/csharp/ql/test/library-tests/csharp11/operators.expected b/csharp/ql/test/library-tests/csharp11/operators.expected new file mode 100644 index 00000000000..2c7bda6800d --- /dev/null +++ b/csharp/ql/test/library-tests/csharp11/operators.expected @@ -0,0 +1,8 @@ +binarybitwise +| Operators.cs:7:18:7:25 | ... >>> ... | Operators.cs:7:18:7:19 | access to local variable x1 | Operators.cs:7:25:7:25 | 2 | >>> | UnsignedRightShiftExpr | +| Operators.cs:10:18:10:25 | ... >>> ... | Operators.cs:10:18:10:19 | access to local variable y1 | Operators.cs:10:25:10:25 | 3 | >>> | UnsignedRightShiftExpr | +| Operators.cs:13:9:13:16 | ... >>> ... | Operators.cs:13:9:13:9 | access to local variable z | Operators.cs:13:16:13:16 | 5 | >>> | UnsignedRightShiftExpr | +assignbitwise +| Operators.cs:13:9:13:16 | ... >>>= ... | Operators.cs:13:9:13:9 | access to local variable z | Operators.cs:13:16:13:16 | 5 | >>>= | AssignUnsighedRightShiftExpr | +userdefined +| Operators.cs:19:44:19:46 | >>> | op_UnsignedRightShift | UnsignedRightShiftOperator | diff --git a/csharp/ql/test/library-tests/csharp11/operators.ql b/csharp/ql/test/library-tests/csharp11/operators.ql new file mode 100644 index 00000000000..607efac0c26 --- /dev/null +++ b/csharp/ql/test/library-tests/csharp11/operators.ql @@ -0,0 +1,27 @@ +import csharp + +query predicate binarybitwise( + BinaryBitwiseOperation op, Expr left, Expr right, string name, string qlclass +) { + op.getFile().getStem() = "Operators" and + left = op.getLeftOperand() and + right = op.getRightOperand() and + name = op.getOperator() and + qlclass = op.getAPrimaryQlClass() +} + +query predicate assignbitwise( + AssignBitwiseOperation op, Expr left, Expr right, string name, string qlclass +) { + op.getFile().getStem() = "Operators" and + left = op.getLValue() and + right = op.getRValue() and + name = op.getOperator() and + qlclass = op.getAPrimaryQlClass() +} + +query predicate userdefined(Operator op, string fname, string qlclass) { + op.getFile().getStem() = "Operators" and + fname = op.getFunctionName() and + qlclass = op.getAPrimaryQlClass() +} diff --git a/csharp/ql/test/library-tests/csharp11/signAnalysis.expected b/csharp/ql/test/library-tests/csharp11/signAnalysis.expected new file mode 100644 index 00000000000..952719939ad --- /dev/null +++ b/csharp/ql/test/library-tests/csharp11/signAnalysis.expected @@ -0,0 +1,7 @@ +| SignAnalysis.cs:9:17:9:23 | ... >>> ... | 0 | +| SignAnalysis.cs:14:17:14:23 | ... >>> ... | + - 0 | +| SignAnalysis.cs:19:17:19:23 | ... >>> ... | + | +| SignAnalysis.cs:24:17:24:23 | ... >>> ... | + 0 | +| SignAnalysis.cs:29:17:29:23 | ... >>> ... | + 0 | +| SignAnalysis.cs:34:17:34:23 | ... >>> ... | + - | +| SignAnalysis.cs:39:17:39:23 | ... >>> ... | + - | diff --git a/csharp/ql/test/library-tests/csharp11/signAnalysis.ql b/csharp/ql/test/library-tests/csharp11/signAnalysis.ql new file mode 100644 index 00000000000..2aeb57e29fb --- /dev/null +++ b/csharp/ql/test/library-tests/csharp11/signAnalysis.ql @@ -0,0 +1,9 @@ +import csharp +import semmle.code.csharp.dataflow.internal.rangeanalysis.SignAnalysisCommon as Common + +from ControlFlow::Nodes::ExprNode e, Expr expr +where + e.getExpr() = expr and + expr.getFile().getStem() = "SignAnalysis" and + expr instanceof UnsignedRightShiftExpr +select e, strictconcat(string s | s = Common::exprSign(e).toString() | s, " ") diff --git a/csharp/ql/test/library-tests/indexers/PrintAst.expected b/csharp/ql/test/library-tests/indexers/PrintAst.expected index cd97a04290a..36f15f11909 100644 --- a/csharp/ql/test/library-tests/indexers/PrintAst.expected +++ b/csharp/ql/test/library-tests/indexers/PrintAst.expected @@ -25,7 +25,7 @@ indexers.cs: # 18| -1: [TypeMention] Int32[] # 18| 1: [TypeMention] int # 18| 0: [AddExpr] ... + ... -# 18| 0: [RShiftExpr] ... >> ... +# 18| 0: [RightShiftExpr] ... >> ... # 18| 0: [SubExpr] ... - ... # 18| 0: [ParameterAccess] access to parameter length # 18| 1: [IntLiteral] 1 @@ -68,10 +68,10 @@ indexers.cs: # 32| 0: [BitwiseAndExpr] ... & ... # 32| 0: [ArrayAccess] access to array element # 32| -1: [FieldAccess] access to field bits -# 32| 0: [RShiftExpr] ... >> ... +# 32| 0: [RightShiftExpr] ... >> ... # 32| 0: [ParameterAccess] access to parameter index # 32| 1: [IntLiteral] 5 -# 32| 1: [LShiftExpr] ... << ... +# 32| 1: [LeftShiftExpr] ... << ... # 32| 0: [IntLiteral] 1 # 32| 1: [ParameterAccess] access to parameter index # 32| 1: [IntLiteral] 0 @@ -99,10 +99,10 @@ indexers.cs: # 42| 0: [AssignOrExpr] ... |= ... # 42| 0: [ArrayAccess] access to array element # 42| -1: [FieldAccess] access to field bits -# 42| 0: [RShiftExpr] ... >> ... +# 42| 0: [RightShiftExpr] ... >> ... # 42| 0: [ParameterAccess] access to parameter index # 42| 1: [IntLiteral] 5 -# 42| 1: [LShiftExpr] ... << ... +# 42| 1: [LeftShiftExpr] ... << ... # 42| 0: [IntLiteral] 1 # 42| 1: [ParameterAccess] access to parameter index # 45| 2: [BlockStmt] {...} @@ -110,11 +110,11 @@ indexers.cs: # 46| 0: [AssignAndExpr] ... &= ... # 46| 0: [ArrayAccess] access to array element # 46| -1: [FieldAccess] access to field bits -# 46| 0: [RShiftExpr] ... >> ... +# 46| 0: [RightShiftExpr] ... >> ... # 46| 0: [ParameterAccess] access to parameter index # 46| 1: [IntLiteral] 5 # 46| 1: [ComplementExpr] ~... -# 46| 0: [LShiftExpr] ... << ... +# 46| 0: [LeftShiftExpr] ... << ... # 46| 0: [IntLiteral] 1 # 46| 1: [ParameterAccess] access to parameter index # 53| 2: [Class] CountPrimes diff --git a/java/ql/lib/semmle/code/java/Expr.qll b/java/ql/lib/semmle/code/java/Expr.qll index a10da9ecc9f..78eda1dba8d 100644 --- a/java/ql/lib/semmle/code/java/Expr.qll +++ b/java/ql/lib/semmle/code/java/Expr.qll @@ -366,11 +366,11 @@ class CompileTimeConstantExpr extends Expr { or b instanceof SubExpr and result = v1 - v2 or - b instanceof LShiftExpr and result = v1.bitShiftLeft(v2) + b instanceof LeftShiftExpr and result = v1.bitShiftLeft(v2) or - b instanceof RShiftExpr and result = v1.bitShiftRightSigned(v2) + b instanceof RightShiftExpr and result = v1.bitShiftRightSigned(v2) or - b instanceof URShiftExpr and result = v1.bitShiftRight(v2) + b instanceof UnsignedRightShiftExpr and result = v1.bitShiftRight(v2) or b instanceof AndBitwiseExpr and result = v1.bitAnd(v2) or @@ -623,26 +623,35 @@ class AssignXorExpr extends AssignOp, @assignxorexpr { } /** A compound assignment expression using the `<<=` operator. */ -class AssignLShiftExpr extends AssignOp, @assignlshiftexpr { +class AssignLeftShiftExpr extends AssignOp, @assignlshiftexpr { override string getOp() { result = "<<=" } - override string getAPrimaryQlClass() { result = "AssignLShiftExpr" } + override string getAPrimaryQlClass() { result = "AssignLeftShiftExpr" } } +/** DEPRECATED: Alias for AssignLeftShiftExpr. */ +deprecated class AssignLShiftExpr = AssignLeftShiftExpr; + /** A compound assignment expression using the `>>=` operator. */ -class AssignRShiftExpr extends AssignOp, @assignrshiftexpr { +class AssignRightShiftExpr extends AssignOp, @assignrshiftexpr { override string getOp() { result = ">>=" } - override string getAPrimaryQlClass() { result = "AssignRShiftExpr" } + override string getAPrimaryQlClass() { result = "AssignRightShiftExpr" } } +/** DEPRECATED: Alias for AssignRightShiftExpr. */ +deprecated class AssignRShiftExpr = AssignRightShiftExpr; + /** A compound assignment expression using the `>>>=` operator. */ -class AssignURShiftExpr extends AssignOp, @assignurshiftexpr { +class AssignUnsignedRightShiftExpr extends AssignOp, @assignurshiftexpr { override string getOp() { result = ">>>=" } - override string getAPrimaryQlClass() { result = "AssignURShiftExpr" } + override string getAPrimaryQlClass() { result = "AssignUnsignedRightShiftExpr" } } +/** DEPRECATED: Alias for AssignUnsignedRightShiftExpr. */ +deprecated class AssignURShiftExpr = AssignUnsignedRightShiftExpr; + /** A common super-class to represent constant literals. */ class Literal extends Expr, @literal { /** @@ -904,26 +913,35 @@ class SubExpr extends BinaryExpr, @subexpr { } /** A binary expression using the `<<` operator. */ -class LShiftExpr extends BinaryExpr, @lshiftexpr { +class LeftShiftExpr extends BinaryExpr, @lshiftexpr { override string getOp() { result = " << " } - override string getAPrimaryQlClass() { result = "LShiftExpr" } + override string getAPrimaryQlClass() { result = "LeftShiftExpr" } } +/** DEPRECATED: Alias for LeftShiftExpr. */ +deprecated class LShiftExpr = LeftShiftExpr; + /** A binary expression using the `>>` operator. */ -class RShiftExpr extends BinaryExpr, @rshiftexpr { +class RightShiftExpr extends BinaryExpr, @rshiftexpr { override string getOp() { result = " >> " } - override string getAPrimaryQlClass() { result = "RShiftExpr" } + override string getAPrimaryQlClass() { result = "RightShiftExpr" } } +/** DEPRECATED: Alias for RightShiftExpr. */ +deprecated class RShiftExpr = RightShiftExpr; + /** A binary expression using the `>>>` operator. */ -class URShiftExpr extends BinaryExpr, @urshiftexpr { +class UnsignedRightShiftExpr extends BinaryExpr, @urshiftexpr { override string getOp() { result = " >>> " } - override string getAPrimaryQlClass() { result = "URShiftExpr" } + override string getAPrimaryQlClass() { result = "UnsignedRightShiftExpr" } } +/** DEPRECATED: Alias for UnsignedRightShiftExpr. */ +deprecated class URShiftExpr = UnsignedRightShiftExpr; + /** A binary expression using the `&` operator. */ class AndBitwiseExpr extends BinaryExpr, @andbitexpr { override string getOp() { result = " & " } diff --git a/java/ql/lib/semmle/code/java/dataflow/ModulusAnalysis.qll b/java/ql/lib/semmle/code/java/dataflow/ModulusAnalysis.qll index b919d143a39..5b2a39ad6c9 100644 --- a/java/ql/lib/semmle/code/java/dataflow/ModulusAnalysis.qll +++ b/java/ql/lib/semmle/code/java/dataflow/ModulusAnalysis.qll @@ -105,7 +105,7 @@ private predicate evenlyDivisibleExpr(Expr e, int factor) { exists(ConstantIntegerExpr c, int k | k = c.getIntValue() | e.(MulExpr).getAnOperand() = c and factor = k.abs() and factor >= 2 or - e.(LShiftExpr).getRhs() = c and factor = 2.pow(k) and k > 0 + e.(LeftShiftExpr).getRhs() = c and factor = 2.pow(k) and k > 0 or e.(BitwiseAndExpr).getAnOperand() = c and factor = max(int f | andmaskFactor(k, f)) ) diff --git a/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll b/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll index 835c4a20ac3..aeb79ee99e1 100644 --- a/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll +++ b/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll @@ -528,11 +528,11 @@ private predicate boundFlowStepMul(Expr e2, Expr e1, int factor) { or exists(AssignMulExpr e | e = e2 and e.getDest() = c and e.getRhs() = e1 and factor = k) or - exists(LShiftExpr e | + exists(LeftShiftExpr e | e = e2 and e.getLeftOperand() = e1 and e.getRightOperand() = c and factor = 2.pow(k) ) or - exists(AssignLShiftExpr e | + exists(AssignLeftShiftExpr e | e = e2 and e.getDest() = e1 and e.getRhs() = c and factor = 2.pow(k) ) ) @@ -552,19 +552,19 @@ private predicate boundFlowStepDiv(Expr e2, Expr e1, int factor) { or exists(AssignDivExpr e | e = e2 and e.getDest() = e1 and e.getRhs() = c and factor = k) or - exists(RShiftExpr e | + exists(RightShiftExpr e | e = e2 and e.getLeftOperand() = e1 and e.getRightOperand() = c and factor = 2.pow(k) ) or - exists(AssignRShiftExpr e | + exists(AssignRightShiftExpr e | e = e2 and e.getDest() = e1 and e.getRhs() = c and factor = 2.pow(k) ) or - exists(URShiftExpr e | + exists(UnsignedRightShiftExpr e | e = e2 and e.getLeftOperand() = e1 and e.getRightOperand() = c and factor = 2.pow(k) ) or - exists(AssignURShiftExpr e | + exists(AssignUnsignedRightShiftExpr e | e = e2 and e.getDest() = e1 and e.getRhs() = c and factor = 2.pow(k) ) ) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll index c5d5bc98009..7e13861c0da 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll @@ -72,13 +72,13 @@ module Private { } /** A left shift or an assign-lshift expression. */ - class LShiftExpr extends J::Expr { - LShiftExpr() { this instanceof J::LShiftExpr or this instanceof J::AssignLShiftExpr } + class LeftShiftExpr extends J::Expr { + LeftShiftExpr() { this instanceof J::LeftShiftExpr or this instanceof J::AssignLeftShiftExpr } /** Gets the RHS operand of this shift. */ Expr getRhs() { - result = this.(J::LShiftExpr).getRightOperand() or - result = this.(J::AssignLShiftExpr).getRhs() + result = this.(J::LeftShiftExpr).getRightOperand() or + result = this.(J::AssignLeftShiftExpr).getRhs() } } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/Sign.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/Sign.qll index b2058a27114..649b4216996 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/Sign.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/Sign.qll @@ -18,9 +18,9 @@ newtype TBinarySignOperation = TBitAndOp() or TBitOrOp() or TBitXorOp() or - TLShiftOp() or - TRShiftOp() or - TURShiftOp() + TLeftShiftOp() or + TRightShiftOp() or + TUnsignedRightShiftOp() /** Class representing expression signs (+, -, 0). */ class Sign extends TSign { @@ -271,10 +271,10 @@ class Sign extends TSign { or op = TBitXorOp() and result = bitxor(s) or - op = TLShiftOp() and result = lshift(s) + op = TLeftShiftOp() and result = lshift(s) or - op = TRShiftOp() and result = rshift(s) + op = TRightShiftOp() and result = rshift(s) or - op = TURShiftOp() and result = urshift(s) + op = TUnsignedRightShiftOp() and result = urshift(s) } } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll index b2b63ff3633..59f7f4580a8 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll @@ -102,12 +102,12 @@ module Private { this instanceof J::AssignOrExpr or this instanceof J::XorBitwiseExpr or this instanceof J::AssignXorExpr or - this instanceof J::LShiftExpr or - this instanceof J::AssignLShiftExpr or - this instanceof J::RShiftExpr or - this instanceof J::AssignRShiftExpr or - this instanceof J::URShiftExpr or - this instanceof J::AssignURShiftExpr + this instanceof J::LeftShiftExpr or + this instanceof J::AssignLeftShiftExpr or + this instanceof J::RightShiftExpr or + this instanceof J::AssignRightShiftExpr or + this instanceof J::UnsignedRightShiftExpr or + this instanceof J::AssignUnsignedRightShiftExpr } /** Returns the operation representing this expression. */ @@ -144,17 +144,17 @@ module Private { or this instanceof J::AssignXorExpr and result = TBitXorOp() or - this instanceof J::LShiftExpr and result = TLShiftOp() + this instanceof J::LeftShiftExpr and result = TLeftShiftOp() or - this instanceof J::AssignLShiftExpr and result = TLShiftOp() + this instanceof J::AssignLeftShiftExpr and result = TLeftShiftOp() or - this instanceof J::RShiftExpr and result = TRShiftOp() + this instanceof J::RightShiftExpr and result = TRightShiftOp() or - this instanceof J::AssignRShiftExpr and result = TRShiftOp() + this instanceof J::AssignRightShiftExpr and result = TRightShiftOp() or - this instanceof J::URShiftExpr and result = TURShiftOp() + this instanceof J::UnsignedRightShiftExpr and result = TUnsignedRightShiftOp() or - this instanceof J::AssignURShiftExpr and result = TURShiftOp() + this instanceof J::AssignUnsignedRightShiftExpr and result = TUnsignedRightShiftOp() } Expr getLeftOperand() { diff --git a/java/ql/src/Likely Bugs/Arithmetic/LShiftLargerThanTypeWidth.ql b/java/ql/src/Likely Bugs/Arithmetic/LShiftLargerThanTypeWidth.ql index 92bec98fd5e..f3c0b220080 100644 --- a/java/ql/src/Likely Bugs/Arithmetic/LShiftLargerThanTypeWidth.ql +++ b/java/ql/src/Likely Bugs/Arithmetic/LShiftLargerThanTypeWidth.ql @@ -14,7 +14,7 @@ int integralTypeWidth(IntegralType t) { if t.hasName("long") or t.hasName("Long") then result = 64 else result = 32 } -from LShiftExpr shift, IntegralType t, int v, string typname, int width +from LeftShiftExpr shift, IntegralType t, int v, string typname, int width where shift.getLeftOperand().getType() = t and shift.getRightOperand().(CompileTimeConstantExpr).getIntValue() = v and diff --git a/java/ql/src/Likely Bugs/Arithmetic/WhitespaceContradictsPrecedence.ql b/java/ql/src/Likely Bugs/Arithmetic/WhitespaceContradictsPrecedence.ql index db806ef760c..b0508b8eb38 100644 --- a/java/ql/src/Likely Bugs/Arithmetic/WhitespaceContradictsPrecedence.ql +++ b/java/ql/src/Likely Bugs/Arithmetic/WhitespaceContradictsPrecedence.ql @@ -33,9 +33,9 @@ class ArithmeticExpr extends BinaryExpr { */ class ShiftExpr extends BinaryExpr { ShiftExpr() { - this instanceof LShiftExpr or - this instanceof RShiftExpr or - this instanceof URShiftExpr + this instanceof LeftShiftExpr or + this instanceof RightShiftExpr or + this instanceof UnsignedRightShiftExpr } } diff --git a/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.ql b/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.ql index 964a5a6060a..b4076bee00b 100644 --- a/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.ql +++ b/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.ql @@ -99,7 +99,7 @@ Expr overFlowCand() { | bin instanceof AddExpr or bin instanceof MulExpr or - bin instanceof LShiftExpr + bin instanceof LeftShiftExpr ) or exists(AssignOp op | @@ -109,7 +109,7 @@ Expr overFlowCand() { | op instanceof AssignAddExpr or op instanceof AssignMulExpr or - op instanceof AssignLShiftExpr + op instanceof AssignLeftShiftExpr ) or exists(AddExpr add, CompileTimeConstantExpr c | diff --git a/java/ql/src/Security/CWE/CWE-190/ArithmeticCommon.qll b/java/ql/src/Security/CWE/CWE-190/ArithmeticCommon.qll index 8287ebc869e..122f6b75b4a 100644 --- a/java/ql/src/Security/CWE/CWE-190/ArithmeticCommon.qll +++ b/java/ql/src/Security/CWE/CWE-190/ArithmeticCommon.qll @@ -153,9 +153,9 @@ predicate upcastToWiderType(Expr e) { /** Holds if the result of `exp` has certain bits filtered by a bitwise and. */ private predicate inBitwiseAnd(Expr exp) { exists(AndBitwiseExpr a | a.getAnOperand() = exp) or - inBitwiseAnd(exp.(LShiftExpr).getAnOperand()) or - inBitwiseAnd(exp.(RShiftExpr).getAnOperand()) or - inBitwiseAnd(exp.(URShiftExpr).getAnOperand()) + inBitwiseAnd(exp.(LeftShiftExpr).getAnOperand()) or + inBitwiseAnd(exp.(RightShiftExpr).getAnOperand()) or + inBitwiseAnd(exp.(UnsignedRightShiftExpr).getAnOperand()) } /** Holds if overflow/underflow is irrelevant for this expression. */ diff --git a/java/ql/src/Security/CWE/CWE-681/NumericCastCommon.qll b/java/ql/src/Security/CWE/CWE-681/NumericCastCommon.qll index 4dec14a204f..5a77c0a8d6e 100644 --- a/java/ql/src/Security/CWE/CWE-681/NumericCastCommon.qll +++ b/java/ql/src/Security/CWE/CWE-681/NumericCastCommon.qll @@ -16,10 +16,10 @@ class NumericNarrowingCastExpr extends CastExpr { class RightShiftOp extends Expr { RightShiftOp() { - this instanceof RShiftExpr or - this instanceof URShiftExpr or - this instanceof AssignRShiftExpr or - this instanceof AssignURShiftExpr + this instanceof RightShiftExpr or + this instanceof UnsignedRightShiftExpr or + this instanceof AssignRightShiftExpr or + this instanceof AssignUnsignedRightShiftExpr } private Expr getLhs() { diff --git a/java/ql/test/kotlin/library-tests/exprs/PrintAst.expected b/java/ql/test/kotlin/library-tests/exprs/PrintAst.expected index 78bf583ec0d..3b4cc35d4d4 100644 --- a/java/ql/test/kotlin/library-tests/exprs/PrintAst.expected +++ b/java/ql/test/kotlin/library-tests/exprs/PrintAst.expected @@ -1944,17 +1944,17 @@ exprs.kt: # 15| 1: [VarAccess] y # 16| 5: [LocalVariableDeclStmt] var ...; # 16| 1: [LocalVariableDeclExpr] i6 -# 16| 0: [LShiftExpr] ... << ... +# 16| 0: [LeftShiftExpr] ... << ... # 16| 0: [VarAccess] x # 16| 1: [VarAccess] y # 17| 6: [LocalVariableDeclStmt] var ...; # 17| 1: [LocalVariableDeclExpr] i7 -# 17| 0: [RShiftExpr] ... >> ... +# 17| 0: [RightShiftExpr] ... >> ... # 17| 0: [VarAccess] x # 17| 1: [VarAccess] y # 18| 7: [LocalVariableDeclStmt] var ...; # 18| 1: [LocalVariableDeclExpr] i8 -# 18| 0: [URShiftExpr] ... >>> ... +# 18| 0: [UnsignedRightShiftExpr] ... >>> ... # 18| 0: [VarAccess] x # 18| 1: [VarAccess] y # 19| 8: [LocalVariableDeclStmt] var ...; @@ -2236,17 +2236,17 @@ exprs.kt: # 72| 1: [VarAccess] ly # 73| 59: [LocalVariableDeclStmt] var ...; # 73| 1: [LocalVariableDeclExpr] l6 -# 73| 0: [LShiftExpr] ... << ... +# 73| 0: [LeftShiftExpr] ... << ... # 73| 0: [VarAccess] lx # 73| 1: [VarAccess] y # 74| 60: [LocalVariableDeclStmt] var ...; # 74| 1: [LocalVariableDeclExpr] l7 -# 74| 0: [RShiftExpr] ... >> ... +# 74| 0: [RightShiftExpr] ... >> ... # 74| 0: [VarAccess] lx # 74| 1: [VarAccess] y # 75| 61: [LocalVariableDeclStmt] var ...; # 75| 1: [LocalVariableDeclExpr] l8 -# 75| 0: [URShiftExpr] ... >>> ... +# 75| 0: [UnsignedRightShiftExpr] ... >>> ... # 75| 0: [VarAccess] lx # 75| 1: [VarAccess] y # 76| 62: [LocalVariableDeclStmt] var ...; diff --git a/java/ql/test/kotlin/library-tests/exprs/exprs.expected b/java/ql/test/kotlin/library-tests/exprs/exprs.expected index 5d35293eb22..07d57c444e4 100644 --- a/java/ql/test/kotlin/library-tests/exprs/exprs.expected +++ b/java/ql/test/kotlin/library-tests/exprs/exprs.expected @@ -924,15 +924,15 @@ | exprs.kt:15:18:15:18 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | | exprs.kt:16:9:16:10 | i6 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | | exprs.kt:16:14:16:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | -| exprs.kt:16:14:16:20 | ... << ... | exprs.kt:4:1:142:1 | topLevelMethod | LShiftExpr | +| exprs.kt:16:14:16:20 | ... << ... | exprs.kt:4:1:142:1 | topLevelMethod | LeftShiftExpr | | exprs.kt:16:20:16:20 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | | exprs.kt:17:9:17:10 | i7 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | | exprs.kt:17:14:17:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | -| exprs.kt:17:14:17:20 | ... >> ... | exprs.kt:4:1:142:1 | topLevelMethod | RShiftExpr | +| exprs.kt:17:14:17:20 | ... >> ... | exprs.kt:4:1:142:1 | topLevelMethod | RightShiftExpr | | exprs.kt:17:20:17:20 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | | exprs.kt:18:9:18:10 | i8 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | | exprs.kt:18:14:18:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | -| exprs.kt:18:14:18:21 | ... >>> ... | exprs.kt:4:1:142:1 | topLevelMethod | URShiftExpr | +| exprs.kt:18:14:18:21 | ... >>> ... | exprs.kt:4:1:142:1 | topLevelMethod | UnsignedRightShiftExpr | | exprs.kt:18:21:18:21 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | | exprs.kt:19:9:19:10 | i9 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | | exprs.kt:19:14:19:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | @@ -1162,15 +1162,15 @@ | exprs.kt:72:19:72:20 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | | exprs.kt:73:9:73:10 | l6 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | | exprs.kt:73:14:73:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | -| exprs.kt:73:14:73:21 | ... << ... | exprs.kt:4:1:142:1 | topLevelMethod | LShiftExpr | +| exprs.kt:73:14:73:21 | ... << ... | exprs.kt:4:1:142:1 | topLevelMethod | LeftShiftExpr | | exprs.kt:73:21:73:21 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | | exprs.kt:74:9:74:10 | l7 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | | exprs.kt:74:14:74:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | -| exprs.kt:74:14:74:21 | ... >> ... | exprs.kt:4:1:142:1 | topLevelMethod | RShiftExpr | +| exprs.kt:74:14:74:21 | ... >> ... | exprs.kt:4:1:142:1 | topLevelMethod | RightShiftExpr | | exprs.kt:74:21:74:21 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | | exprs.kt:75:9:75:10 | l8 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | | exprs.kt:75:14:75:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | -| exprs.kt:75:14:75:22 | ... >>> ... | exprs.kt:4:1:142:1 | topLevelMethod | URShiftExpr | +| exprs.kt:75:14:75:22 | ... >>> ... | exprs.kt:4:1:142:1 | topLevelMethod | UnsignedRightShiftExpr | | exprs.kt:75:22:75:22 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | | exprs.kt:76:9:76:10 | l9 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | | exprs.kt:76:14:76:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | diff --git a/java/ql/test/library-tests/constants/PrintAst.expected b/java/ql/test/library-tests/constants/PrintAst.expected index 241d837ea3c..63d59f7287e 100644 --- a/java/ql/test/library-tests/constants/PrintAst.expected +++ b/java/ql/test/library-tests/constants/PrintAst.expected @@ -376,26 +376,26 @@ constants/Values.java: # 62| 43: [LocalVariableDeclStmt] var ...; # 62| 0: [TypeAccess] int # 62| 1: [LocalVariableDeclExpr] lshift -# 62| 0: [LShiftExpr] ... << ... +# 62| 0: [LeftShiftExpr] ... << ... # 62| 0: [IntegerLiteral] 21 # 62| 1: [IntegerLiteral] 2 # 63| 44: [LocalVariableDeclStmt] var ...; # 63| 0: [TypeAccess] int # 63| 1: [LocalVariableDeclExpr] lshift_parameter -# 63| 0: [LShiftExpr] ... << ... +# 63| 0: [LeftShiftExpr] ... << ... # 63| 0: [VarAccess] notConstant # 63| 1: [VarAccess] notConstant # 65| 45: [LocalVariableDeclStmt] var ...; # 65| 0: [TypeAccess] int # 65| 1: [LocalVariableDeclExpr] rshift -# 65| 0: [RShiftExpr] ... >> ... +# 65| 0: [RightShiftExpr] ... >> ... # 65| 0: [MinusExpr] -... # 65| 0: [IntegerLiteral] 1 # 65| 1: [IntegerLiteral] 2 # 66| 46: [LocalVariableDeclStmt] var ...; # 66| 0: [TypeAccess] int # 66| 1: [LocalVariableDeclExpr] urshift -# 66| 0: [URShiftExpr] ... >>> ... +# 66| 0: [UnsignedRightShiftExpr] ... >>> ... # 66| 0: [MinusExpr] -... # 66| 0: [IntegerLiteral] 1 # 66| 1: [IntegerLiteral] 1