tree-sitter-c-sharp/corpus/expressions.txt
2024-03-25 23:16:07 +01:00

3458 lines
107 KiB
Plaintext

================================================================================
Assignment to Prefix Unary Expressions
================================================================================
a = +a;
a = -a;
a = !a;
a = ~a;
a = ++a;
a = --a;
a = a++;
a = a--;
a = a!;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (prefix_unary_expression
(identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (prefix_unary_expression
(identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (prefix_unary_expression
(identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (prefix_unary_expression
(identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (prefix_unary_expression
(identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (prefix_unary_expression
(identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (postfix_unary_expression
(identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (postfix_unary_expression
(identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (postfix_unary_expression
(identifier))))))
================================================================================
Assignment to Binary Expressions
================================================================================
a = a + a;
a = a - a;
a = a * a;
a = a / a;
a = a % a;
a = a & a;
a = a | a;
a = a ^ a;
a = a >> a;
a = a << a;
a = a >>> a;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier))))))
================================================================================
Assignment to Binary Equality Expressions
================================================================================
a = a == b;
a = a != b;
a = a < b;
a = a <= b;
a = a > b;
a = a >= b;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier)))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (identifier))))))
================================================================================
Assignment Binary Expressions
================================================================================
a += a;
a -= a;
a *= a;
a /= a;
a %= a;
a++;
a--;
a <<= a;
a >>= a;
a >>>= a;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (identifier))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (identifier))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (identifier))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (identifier))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (identifier))))
(global_statement
(expression_statement
(postfix_unary_expression
(identifier))))
(global_statement
(expression_statement
(postfix_unary_expression
(identifier))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (identifier))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (identifier))))
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (identifier)))))
================================================================================
Assignment LValue types
================================================================================
a = 1;
a.b = 1;
a[b] = 1;
(a, b) = (1, 2);
(var a, b) = (1, 2);
var x = new A
{
a = 1,
[b] = 1
};
(a) = 1;
*p = 0;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (integer_literal))))
(global_statement
(expression_statement
(assignment_expression
left: (member_access_expression
expression: (identifier)
name: (identifier))
(assignment_operator)
right: (integer_literal))))
(global_statement
(expression_statement
(assignment_expression
left: (element_access_expression
expression: (identifier)
subscript: (bracketed_argument_list
(argument
(identifier))))
(assignment_operator)
right: (integer_literal))))
(global_statement
(expression_statement
(assignment_expression
left: (tuple_expression
(argument
(identifier))
(argument
(identifier)))
(assignment_operator)
right: (tuple_expression
(argument
(integer_literal))
(argument
(integer_literal))))))
(global_statement
(expression_statement
(assignment_expression
left: (tuple_expression
(argument
(declaration_expression
type: (implicit_type)
name: (identifier)))
(argument
(identifier)))
(assignment_operator)
right: (tuple_expression
(argument
(integer_literal))
(argument
(integer_literal))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(object_creation_expression
type: (identifier)
initializer: (initializer_expression
(assignment_expression
left: (identifier)
(assignment_operator)
right: (integer_literal))
(assignment_expression
left: (element_binding_expression
(bracketed_argument_list
(argument
(identifier))))
(assignment_operator)
right: (integer_literal)))))))))
(global_statement
(expression_statement
(assignment_expression
left: (parenthesized_expression
(identifier))
(assignment_operator)
right: (integer_literal))))
(global_statement
(expression_statement
(assignment_expression
left: (prefix_unary_expression
(identifier))
(assignment_operator)
right: (integer_literal)))))
================================================================================
Ternary Expression
================================================================================
class Foo {
void Test() {
var y = x ? "foo" : "bar";
}
}
--------------------------------------------------------------------------------
(compilation_unit
(class_declaration
name: (identifier)
body: (declaration_list
(method_declaration
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(conditional_expression
condition: (identifier)
consequence: (string_literal
(string_literal_fragment))
alternative: (string_literal
(string_literal_fragment))))))))))))
================================================================================
Binary Expressions
================================================================================
class Foo {
void Test() {
var b = x == y;
var i = 1 + 2;
}
}
--------------------------------------------------------------------------------
(compilation_unit
(class_declaration
name: (identifier)
body: (declaration_list
(method_declaration
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(binary_expression
left: (identifier)
right: (identifier))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(binary_expression
left: (integer_literal)
right: (integer_literal)))))))))))
================================================================================
Ternary expressions is type
================================================================================
var t = x is int
? a
: b;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(conditional_expression
condition: (is_expression
left: (identifier)
right: (predefined_type))
consequence: (identifier)
alternative: (identifier))))))))
================================================================================
Ternary expressions is nullable type
================================================================================
var u = x is int?
? a
: b;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(conditional_expression
condition: (is_expression
left: (identifier)
right: (nullable_type
type: (predefined_type)))
consequence: (identifier)
alternative: (identifier))))))))
================================================================================
Prefix-Unary Expressions
================================================================================
class Foo {
void Test() {
++x;
--y;
}
}
--------------------------------------------------------------------------------
(compilation_unit
(class_declaration
name: (identifier)
body: (declaration_list
(method_declaration
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(prefix_unary_expression
(identifier)))
(expression_statement
(prefix_unary_expression
(identifier))))))))
================================================================================
Cast expressions
================================================================================
void Test() {
a = (B)c + (C)d;
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (cast_expression
type: (identifier)
value: (identifier))
right: (cast_expression
type: (identifier)
value: (identifier)))))))))
================================================================================
Cast expression of array access
================================================================================
b = (float)a[0];
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (cast_expression
type: (predefined_type)
value: (element_access_expression
expression: (identifier)
subscript: (bracketed_argument_list
(argument
(integer_literal)))))))))
================================================================================
Cast with parenthesized expression
================================================================================
var o = (A.A)(a.a.a);
var o = (Int32)(1);
var o = (Int32)(1);
var o = (Int32)((1));
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(cast_expression
type: (qualified_name
qualifier: (identifier)
name: (identifier))
value: (parenthesized_expression
(member_access_expression
expression: (member_access_expression
expression: (identifier)
name: (identifier))
name: (identifier)))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(cast_expression
type: (identifier)
value: (parenthesized_expression
(integer_literal))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(cast_expression
type: (identifier)
value: (parenthesized_expression
(integer_literal))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(cast_expression
type: (identifier)
value: (parenthesized_expression
(parenthesized_expression
(integer_literal))))))))))
================================================================================
Precedence of unary prefix operator and element access
================================================================================
b = +a[0];
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (prefix_unary_expression
(element_access_expression
expression: (identifier)
subscript: (bracketed_argument_list
(argument
(integer_literal)))))))))
================================================================================
Precedence of switch_expression and binary_expression
================================================================================
b = 2 * a switch
{
1 => 1,
_ => 0,
};
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (integer_literal)
right: (switch_expression
(identifier)
(switch_expression_arm
(constant_pattern
(integer_literal))
(integer_literal))
(switch_expression_arm
(discard)
(integer_literal))))))))
================================================================================
Anonymous object creation with empty body
================================================================================
void b() {
var x = new {
};
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(anonymous_object_creation_expression)))))))))
================================================================================
Target-type object creation
================================================================================
void b() {
Friend friend = new("hi");
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (identifier)
(variable_declarator
name: (identifier)
(equals_value_clause
(implicit_object_creation_expression
(argument_list
(argument
(string_literal
(string_literal_fragment)))))))))))))
================================================================================
Anonymous object creation with single unnamed
================================================================================
void b() {
var x = new {
args
};
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(anonymous_object_creation_expression
(identifier))))))))))
================================================================================
Anonymous object creation with single named
================================================================================
void b() {
var x = new {
test = "This"
};
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(anonymous_object_creation_expression
(name_equals
(identifier))
(string_literal
(string_literal_fragment)))))))))))
================================================================================
Checked expressions
================================================================================
void b() {
var three = checked(1 + 2);
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(checked_expression
(binary_expression
left: (integer_literal)
right: (integer_literal)))))))))))
================================================================================
Object creation expressions
================================================================================
void b() {
new C.D(1, "hi");
a = new E
{
Foo = bar,
};
b = new E(1);
c = new E(1) { };
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(object_creation_expression
type: (qualified_name
qualifier: (identifier)
name: (identifier))
arguments: (argument_list
(argument
(integer_literal))
(argument
(string_literal
(string_literal_fragment))))))
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (object_creation_expression
type: (identifier)
initializer: (initializer_expression
(assignment_expression
left: (identifier)
(assignment_operator)
right: (identifier))))))
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (object_creation_expression
type: (identifier)
arguments: (argument_list
(argument
(integer_literal))))))
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (object_creation_expression
type: (identifier)
arguments: (argument_list
(argument
(integer_literal)))
initializer: (initializer_expression))))))))
================================================================================
Named parameters in constructors
================================================================================
void b() {
var z = new C(a: 1, b: "hi");
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(object_creation_expression
type: (identifier)
arguments: (argument_list
(argument
name: (name_colon
name: (identifier))
(integer_literal))
(argument
name: (name_colon
name: (identifier))
(string_literal
(string_literal_fragment)))))))))))))
================================================================================
Named parameters in method calls
================================================================================
void b() {
z = A.B(a: 1, b: "hi");
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (invocation_expression
function: (member_access_expression
expression: (identifier)
name: (identifier))
arguments: (argument_list
(argument
name: (name_colon
name: (identifier))
(integer_literal))
(argument
name: (name_colon
name: (identifier))
(string_literal
(string_literal_fragment)))))))))))
================================================================================
Named parameters using contextually reserved words
================================================================================
void b() {
resultNode = B(from: 1, into: "hi");
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (invocation_expression
function: (identifier)
arguments: (argument_list
(argument
name: (name_colon
name: (identifier))
(integer_literal))
(argument
name: (name_colon
name: (identifier))
(string_literal
(string_literal_fragment)))))))))))
================================================================================
Anonymous method expressions
================================================================================
void a() {
var d = delegate(int a) {
return a;
};
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(anonymous_method_expression
parameters: (parameter_list
(parameter
type: (predefined_type)
name: (identifier)))
(block
(return_statement
(identifier))))))))))))
================================================================================
Anonymous method expression with discard parameters
================================================================================
void a() {
var d = delegate(int _, int _) {
return a;
};
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(anonymous_method_expression
parameters: (parameter_list
(parameter
type: (predefined_type)
name: (identifier))
(parameter
type: (predefined_type)
name: (identifier)))
(block
(return_statement
(identifier))))))))))))
================================================================================
Anonymous method expression with modifiers
================================================================================
void m() {
var a = static delegate(int a) { return a; };
var b = async delegate(int a) { return a; };
var c = async static delegate(int a) { return a; };
var d = static async delegate(int a) { return a; };
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(anonymous_method_expression
(modifier)
parameters: (parameter_list
(parameter
type: (predefined_type)
name: (identifier)))
(block
(return_statement
(identifier))))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(anonymous_method_expression
(modifier)
parameters: (parameter_list
(parameter
type: (predefined_type)
name: (identifier)))
(block
(return_statement
(identifier))))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(anonymous_method_expression
(modifier)
(modifier)
parameters: (parameter_list
(parameter
type: (predefined_type)
name: (identifier)))
(block
(return_statement
(identifier))))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(anonymous_method_expression
(modifier)
(modifier)
parameters: (parameter_list
(parameter
type: (predefined_type)
name: (identifier)))
(block
(return_statement
(identifier))))))))))))
================================================================================
Lambda expressions
================================================================================
void a() {
var l = x => x + 1;
var l = (A a, B b) => { return a.c(b); };
var l = RetType (A a, B b) => { return 1; };
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(lambda_expression
parameters: (implicit_parameter_list
(parameter
name: (identifier)))
body: (binary_expression
left: (identifier)
right: (integer_literal)))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(lambda_expression
parameters: (parameter_list
(parameter
type: (identifier)
name: (identifier))
(parameter
type: (identifier)
name: (identifier)))
body: (block
(return_statement
(invocation_expression
function: (member_access_expression
expression: (identifier)
name: (identifier))
arguments: (argument_list
(argument
(identifier)))))))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(lambda_expression
type: (identifier)
parameters: (parameter_list
(parameter
type: (identifier)
name: (identifier))
(parameter
type: (identifier)
name: (identifier)))
body: (block
(return_statement
(integer_literal))))))))))))
================================================================================
Async Lambda
================================================================================
void a()
{
Do(async () => {});
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(invocation_expression
function: (identifier)
arguments: (argument_list
(argument
(lambda_expression
(modifier)
parameters: (parameter_list)
body: (initializer_expression))))))))))
================================================================================
Lambda expression with modifiers
================================================================================
void a() {
var lam = static x => x + 1;
var bda = async x => x + 1;
var syn = async static x => x + 1;
var txt = static async x => x + 1;
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(lambda_expression
(modifier)
parameters: (implicit_parameter_list
(parameter
name: (identifier)))
body: (binary_expression
left: (identifier)
right: (integer_literal)))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(lambda_expression
(modifier)
parameters: (implicit_parameter_list
(parameter
name: (identifier)))
body: (binary_expression
left: (identifier)
right: (integer_literal)))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(lambda_expression
(modifier)
(modifier)
parameters: (implicit_parameter_list
(parameter
name: (identifier)))
body: (binary_expression
left: (identifier)
right: (integer_literal)))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(lambda_expression
(modifier)
(modifier)
parameters: (implicit_parameter_list
(parameter
name: (identifier)))
body: (binary_expression
left: (identifier)
right: (integer_literal)))))))))))
================================================================================
Lambda expression with discard parameters
================================================================================
void a() {
var lam = (_, _) => 0;
var bda = (int _, int _) => 0;
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(lambda_expression
parameters: (parameter_list
(parameter
name: (identifier))
(parameter
name: (identifier)))
body: (integer_literal))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(lambda_expression
parameters: (parameter_list
(parameter
type: (predefined_type)
name: (identifier))
(parameter
type: (predefined_type)
name: (identifier)))
body: (integer_literal))))))))))
================================================================================
Lambda expression with ref modifier
================================================================================
MyIntDelegate a = (ref int i) => i + 1;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (identifier)
(variable_declarator
name: (identifier)
(equals_value_clause
(lambda_expression
parameters: (parameter_list
(parameter
(parameter_modifier)
type: (predefined_type)
name: (identifier)))
body: (binary_expression
left: (identifier)
right: (integer_literal)))))))))
================================================================================
Invocation expressions
================================================================================
void a() {
b(c, in d, out e, ref f, out var g);
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(invocation_expression
function: (identifier)
arguments: (argument_list
(argument
(identifier))
(argument
(identifier))
(argument
(identifier))
(argument
(identifier))
(argument
(declaration_expression
type: (implicit_type)
name: (identifier))))))))))
================================================================================
Tuple expressions
================================================================================
void a() {
b = (c, d: "e");
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (tuple_expression
(argument
(identifier))
(argument
name: (name_colon
name: (identifier))
(string_literal
(string_literal_fragment))))))))))
================================================================================
Implicit array creation
================================================================================
void b() {
var z = new [] { 1, 2, 3 };
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(implicit_array_creation_expression
(initializer_expression
(integer_literal)
(integer_literal)
(integer_literal)))))))))))
================================================================================
Implicit multi array creation
================================================================================
void b() {
var z = new [,] { { 1, 1 }, { 2, 2 }, { 3, 3 } };
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(implicit_array_creation_expression
(initializer_expression
(initializer_expression
(integer_literal)
(integer_literal))
(initializer_expression
(integer_literal)
(integer_literal))
(initializer_expression
(integer_literal)
(integer_literal))))))))))))
================================================================================
Stackalloc implicit array
================================================================================
void b() {
var z = stackalloc [] { 1, 2, 3 };
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(implicit_stack_alloc_array_creation_expression
(initializer_expression
(integer_literal)
(integer_literal)
(integer_literal)))))))))))
================================================================================
Stackalloc explicit array
================================================================================
void b() {
var z = stackalloc int[] { 1, 2, 3 };
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(stack_alloc_array_creation_expression
type: (array_type
type: (predefined_type)
rank: (array_rank_specifier))
(initializer_expression
(integer_literal)
(integer_literal)
(integer_literal)))))))))))
================================================================================
Explicit array creation
================================================================================
void b() {
var z = new int[3] { 1, 2, 3 };
var b = new byte[,] { { 1, 2 }, { 2, 3 } };
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(array_creation_expression
type: (array_type
type: (predefined_type)
rank: (array_rank_specifier
(integer_literal)))
(initializer_expression
(integer_literal)
(integer_literal)
(integer_literal)))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(array_creation_expression
type: (array_type
type: (predefined_type)
rank: (array_rank_specifier))
(initializer_expression
(initializer_expression
(integer_literal)
(integer_literal))
(initializer_expression
(integer_literal)
(integer_literal))))))))))))
================================================================================
Explicit multi array creation
================================================================================
void b() {
var z = new int[3,2] { { 1, 1 }, { 2, 2 }, { 3, 3 } };
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(array_creation_expression
type: (array_type
type: (predefined_type)
rank: (array_rank_specifier
(integer_literal)
(integer_literal)))
(initializer_expression
(initializer_expression
(integer_literal)
(integer_literal))
(initializer_expression
(integer_literal)
(integer_literal))
(initializer_expression
(integer_literal)
(integer_literal))))))))))))
================================================================================
Array of named tuple
================================================================================
void a() {
var z = new (string b, string c)[3];
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(array_creation_expression
type: (array_type
type: (tuple_type
(tuple_element
type: (predefined_type)
name: (identifier))
(tuple_element
type: (predefined_type)
name: (identifier)))
rank: (array_rank_specifier
(integer_literal))))))))))))
================================================================================
Makeref
================================================================================
void b() {
var gp = __makeref(g);
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(make_ref_expression
(identifier))))))))))
================================================================================
Postfix unary
================================================================================
void b() {
a--;
a++;
var b=a!;
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(postfix_unary_expression
(identifier)))
(expression_statement
(postfix_unary_expression
(identifier)))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(postfix_unary_expression
(identifier))))))))))
================================================================================
__reftype
================================================================================
void b() {
var z = __reftype(g);
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(ref_type_expression
(identifier))))))))))
================================================================================
__refvalue
================================================================================
void b() {
var z = __refvalue(g, int);
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(ref_value_expression
value: (identifier)
type: (predefined_type))))))))))
================================================================================
sizeof
================================================================================
void b() {
var z = sizeof(int);
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(size_of_expression
type: (predefined_type))))))))))
================================================================================
typeof
================================================================================
void b() {
var y = typeof(int);
var z = typeof(List<string>.Enumerator);
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(type_of_expression
type: (predefined_type))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(type_of_expression
type: (qualified_name
qualifier: (generic_name
name: (identifier)
type_arguments: (type_argument_list
(predefined_type)))
name: (identifier)))))))))))
================================================================================
switch expression
================================================================================
void b() {
var r = operation switch {
1 => "one",
2 => "two",
_ => "more"
};
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(switch_expression
(identifier)
(switch_expression_arm
(constant_pattern
(integer_literal))
(string_literal
(string_literal_fragment)))
(switch_expression_arm
(constant_pattern
(integer_literal))
(string_literal
(string_literal_fragment)))
(switch_expression_arm
(discard)
(string_literal
(string_literal_fragment))))))))))))
================================================================================
switch expression with trailing comma
================================================================================
void b() {
var r = operation switch {
1 => "one",
2 => "two",
_ => "more",
};
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(switch_expression
(identifier)
(switch_expression_arm
(constant_pattern
(integer_literal))
(string_literal
(string_literal_fragment)))
(switch_expression_arm
(constant_pattern
(integer_literal))
(string_literal
(string_literal_fragment)))
(switch_expression_arm
(discard)
(string_literal
(string_literal_fragment))))))))))))
================================================================================
switch expression return
================================================================================
string b(Object operation) =>
operation switch {
1 => "one",
_ => "more",
};
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list
(parameter
type: (identifier)
name: (identifier)))
body: (arrow_expression_clause
(switch_expression
(identifier)
(switch_expression_arm
(constant_pattern
(integer_literal))
(string_literal
(string_literal_fragment)))
(switch_expression_arm
(discard)
(string_literal
(string_literal_fragment))))))))
================================================================================
switch expression with patterns
================================================================================
string b(Object operation) =>
operation switch {
Declaration d => "declaration",
Simple => "simple (constant)",
{ } => "nothing",
var z => "var",
null => "constant",
int => "type"
};
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list
(parameter
type: (identifier)
name: (identifier)))
body: (arrow_expression_clause
(switch_expression
(identifier)
(switch_expression_arm
(declaration_pattern
type: (identifier)
name: (identifier))
(string_literal
(string_literal_fragment)))
(switch_expression_arm
(constant_pattern
(identifier))
(string_literal
(string_literal_fragment)))
(switch_expression_arm
(recursive_pattern
(property_pattern_clause))
(string_literal
(string_literal_fragment)))
(switch_expression_arm
(var_pattern
name: (identifier))
(string_literal
(string_literal_fragment)))
(switch_expression_arm
(constant_pattern
(null_literal))
(string_literal
(string_literal_fragment)))
(switch_expression_arm
(type_pattern
type: (predefined_type))
(string_literal
(string_literal_fragment))))))))
================================================================================
await Expression
================================================================================
class Foo {
void Test() {
await x;
}
}
--------------------------------------------------------------------------------
(compilation_unit
(class_declaration
name: (identifier)
body: (declaration_list
(method_declaration
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(await_expression
(identifier))))))))
================================================================================
throw expression
================================================================================
class Foo {
void Test() {
x = x ?? throw y;
}
}
--------------------------------------------------------------------------------
(compilation_unit
(class_declaration
name: (identifier)
body: (declaration_list
(method_declaration
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (identifier)
right: (throw_expression
(identifier))))))))))
================================================================================
Pecedence with OR and XOR
================================================================================
b = 4 | 5 ^ 6;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (binary_expression
left: (integer_literal)
right: (binary_expression
left: (integer_literal)
right: (integer_literal)))))))
================================================================================
range expressions full
================================================================================
class Foo {
void Test() {
var a = b[1..4];
var c = 1..^4;
}
}
--------------------------------------------------------------------------------
(compilation_unit
(class_declaration
name: (identifier)
body: (declaration_list
(method_declaration
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(element_access_expression
expression: (identifier)
subscript: (bracketed_argument_list
(argument
(range_expression
(integer_literal)
(integer_literal)))))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(range_expression
(integer_literal)
(prefix_unary_expression
(integer_literal))))))))))))
================================================================================
range expressions partial
================================================================================
class Foo {
void Test() {
var a = b[..4];
var c = ^1..;
var d = b[..];
}
}
--------------------------------------------------------------------------------
(compilation_unit
(class_declaration
name: (identifier)
body: (declaration_list
(method_declaration
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(element_access_expression
expression: (identifier)
subscript: (bracketed_argument_list
(argument
(range_expression
(integer_literal)))))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(range_expression
(prefix_unary_expression
(integer_literal)))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(element_access_expression
expression: (identifier)
subscript: (bracketed_argument_list
(argument
(range_expression)))))))))))))
================================================================================
cast expression
================================================================================
class Foo {
void Test() {
x = (int) y;
}
}
--------------------------------------------------------------------------------
(compilation_unit
(class_declaration
name: (identifier)
body: (declaration_list
(method_declaration
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(assignment_expression
left: (identifier)
(assignment_operator)
right: (cast_expression
type: (predefined_type)
value: (identifier)))))))))
================================================================================
Generic type name no type args
================================================================================
var d = typeof(Dictionary<,>);
var t = typeof(Tuple<,,,>);
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(type_of_expression
type: (generic_name
name: (identifier)
type_arguments: (type_argument_list))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(type_of_expression
type: (generic_name
name: (identifier)
type_arguments: (type_argument_list)))))))))
================================================================================
default expression
================================================================================
var a = default(int);
int b = default;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(default_expression
type: (predefined_type)))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (predefined_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(default_expression)))))))
================================================================================
Ref local declaration and ref expression
================================================================================
ref VeryLargeStruct reflocal = ref veryLargeStruct;
ref var elementRef = ref arr[0];
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (ref_type
type: (identifier))
(variable_declarator
name: (identifier)
(equals_value_clause
(ref_expression
(identifier)))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (ref_type
type: (implicit_type))
(variable_declarator
name: (identifier)
(equals_value_clause
(ref_expression
(element_access_expression
expression: (identifier)
subscript: (bracketed_argument_list
(argument
(integer_literal)))))))))))
================================================================================
Element binding expression
================================================================================
var x = new Dictionary<string,int> { ["a"] = 65 };
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(object_creation_expression
type: (generic_name
name: (identifier)
type_arguments: (type_argument_list
(predefined_type)
(predefined_type)))
initializer: (initializer_expression
(assignment_expression
left: (element_binding_expression
(bracketed_argument_list
(argument
(string_literal
(string_literal_fragment)))))
(assignment_operator)
right: (integer_literal))))))))))
================================================================================
Member access expression (methods)
================================================================================
void Test(int value) {
value.ToString();
double.IsInfinity(value);
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list
(parameter
type: (predefined_type)
name: (identifier)))
body: (block
(expression_statement
(invocation_expression
function: (member_access_expression
expression: (identifier)
name: (identifier))
arguments: (argument_list)))
(expression_statement
(invocation_expression
function: (member_access_expression
expression: (predefined_type)
name: (identifier))
arguments: (argument_list
(argument
(identifier)))))))))
================================================================================
Member access expression (properties)
================================================================================
void Test(int value) {
var x = string.Empty;
var z = B<int>.Something;
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list
(parameter
type: (predefined_type)
name: (identifier)))
body: (block
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(member_access_expression
expression: (predefined_type)
name: (identifier))))))
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(member_access_expression
expression: (generic_name
name: (identifier)
type_arguments: (type_argument_list
(predefined_type)))
name: (identifier))))))))))
================================================================================
is expression
================================================================================
var b = s is string;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_expression
left: (identifier)
right: (predefined_type))))))))
================================================================================
is pattern
================================================================================
var b = s is string s2;
var c = s is "test";
var a = 1 is int.MaxValue;
var d = a is nameof(a);
var e = a is (int)b;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (declaration_pattern
type: (predefined_type)
name: (identifier))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (constant_pattern
(string_literal
(string_literal_fragment)))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (integer_literal)
pattern: (constant_pattern
(member_access_expression
expression: (predefined_type)
name: (identifier)))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (constant_pattern
(invocation_expression
function: (identifier)
arguments: (argument_list
(argument
(identifier)))))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (constant_pattern
(cast_expression
type: (predefined_type)
value: (identifier))))))))))
================================================================================
Precedence between is operator and conditional_expression
================================================================================
int a = 1 is Object ? 1 : 2;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (predefined_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(conditional_expression
condition: (is_pattern_expression
expression: (integer_literal)
pattern: (constant_pattern
(identifier)))
consequence: (integer_literal)
alternative: (integer_literal))))))))
================================================================================
Precedence between is operator and as operator
================================================================================
//var a = new object() is null as Object == false; // this parses with wrong precedence
var a = new object() is null as Object;
var b = true == 1 as int? is int;
--------------------------------------------------------------------------------
(compilation_unit
(comment)
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(as_expression
left: (is_pattern_expression
expression: (object_creation_expression
type: (predefined_type)
arguments: (argument_list))
pattern: (constant_pattern
(null_literal)))
right: (identifier)))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(binary_expression
left: (boolean_literal)
right: (is_expression
left: (as_expression
left: (integer_literal)
right: (nullable_type
type: (predefined_type)))
right: (predefined_type)))))))))
================================================================================
Discard pattern
================================================================================
void Do() {
DateTime.TryParse(dateString, out _);
}
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_function_statement
type: (predefined_type)
name: (identifier)
parameters: (parameter_list)
body: (block
(expression_statement
(invocation_expression
function: (member_access_expression
expression: (identifier)
name: (identifier))
arguments: (argument_list
(argument
(identifier))
(argument
(identifier)))))))))
================================================================================
Null-forgiving operator
================================================================================
var x = name!.Length;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(member_access_expression
expression: (postfix_unary_expression
(identifier))
name: (identifier))))))))
================================================================================
Negated pattern
================================================================================
var x = name is not null;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (negated_pattern
(constant_pattern
(null_literal))))))))))
================================================================================
Parenthesized pattern
================================================================================
var x = name is (var a);
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (parenthesized_pattern
(var_pattern
name: (identifier))))))))))
================================================================================
Pattern Combinators and relational pattern
================================================================================
var x = c is < '0' or >= 'A' and <= 'Z';
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (or_pattern
left: (relational_pattern
(character_literal
(character_literal_unescaped)))
right: (and_pattern
left: (relational_pattern
(character_literal
(character_literal_unescaped)))
right: (relational_pattern
(character_literal
(character_literal_unescaped))))))))))))
================================================================================
Precedence of prefix_unary_expression and invocation_expression
================================================================================
var x = !this.Call();
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(prefix_unary_expression
(invocation_expression
function: (member_access_expression
expression: (this_expression)
name: (identifier))
arguments: (argument_list)))))))))
================================================================================
Property patterns
================================================================================
var x = operand is ILiteralOperation { ConstantValue: { HasValue: true, Value: null } };
var x = operand is ILiteralOperation { ConstantValue.HasValue: true, ConstantValue.Value: null};
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (recursive_pattern
type: (identifier)
(property_pattern_clause
(subpattern
(expression_colon
(identifier))
(recursive_pattern
(property_pattern_clause
(subpattern
(expression_colon
(identifier))
(constant_pattern
(boolean_literal)))
(subpattern
(expression_colon
(identifier))
(constant_pattern
(null_literal))))))))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (recursive_pattern
type: (identifier)
(property_pattern_clause
(subpattern
(expression_colon
(member_access_expression
expression: (identifier)
name: (identifier)))
(constant_pattern
(boolean_literal)))
(subpattern
(expression_colon
(member_access_expression
expression: (identifier)
name: (identifier)))
(constant_pattern
(null_literal))))))))))))
================================================================================
Positional patterns
================================================================================
var a = p is var (x, y);
var c = p is (var x, var y) { x: 0 };
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (var_pattern
(parenthesized_variable_designation
name: (identifier)
name: (identifier)))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (recursive_pattern
(positional_pattern_clause
(subpattern
(var_pattern
name: (identifier)))
(subpattern
(var_pattern
name: (identifier))))
(property_pattern_clause
(subpattern
(expression_colon
(identifier))
(constant_pattern
(integer_literal))))))))))))
================================================================================
Type patterns
================================================================================
var b = o is int or string; //is_pattern_expression with type_pattern
var c = o is int; //is_expression with type
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (or_pattern
left: (type_pattern
type: (predefined_type))
right: (type_pattern
type: (predefined_type)))))))))
(comment)
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_expression
left: (identifier)
right: (predefined_type)))))))
(comment))
================================================================================
List patterns
================================================================================
var a = p is [1,2,x,] and [] or [2,..];
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(is_pattern_expression
expression: (identifier)
pattern: (or_pattern
left: (and_pattern
left: (list_pattern
(constant_pattern
(integer_literal))
(constant_pattern
(integer_literal))
(constant_pattern
(identifier)))
right: (list_pattern))
right: (list_pattern
(constant_pattern
(integer_literal))
(slice_pattern))))))))))
================================================================================
Conditional expression with member accesses
================================================================================
var a = b ? c.A + d.A : e.A + f.A;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(conditional_expression
condition: (identifier)
consequence: (binary_expression
left: (member_access_expression
expression: (identifier)
name: (identifier))
right: (member_access_expression
expression: (identifier)
name: (identifier)))
alternative: (binary_expression
left: (member_access_expression
expression: (identifier)
name: (identifier))
right: (member_access_expression
expression: (identifier)
name: (identifier))))))))))
================================================================================
Conditional access expression
================================================================================
var a = b?.Something;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(conditional_access_expression
condition: (identifier)
(member_binding_expression
name: (identifier)))))))))
================================================================================
Conditional access to element (should be implicit_element_access)
================================================================================
var x = dict?["a"];
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(conditional_access_expression
condition: (identifier)
(element_binding_expression
(bracketed_argument_list
(argument
(string_literal
(string_literal_fragment))))))))))))
================================================================================
Conditional access expression with member binding
================================================================================
if (a?.B != 1) { }
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(if_statement
condition: (binary_expression
left: (conditional_access_expression
condition: (identifier)
(member_binding_expression
name: (identifier)))
right: (integer_literal))
consequence: (block))))
================================================================================
Conditional access expression with simple member access
================================================================================
if ((p as Person[])?[0]._Age != 1) { }
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(if_statement
condition: (binary_expression
left: (member_access_expression
expression: (conditional_access_expression
condition: (parenthesized_expression
(as_expression
left: (identifier)
right: (array_type
type: (identifier)
rank: (array_rank_specifier))))
(element_binding_expression
(bracketed_argument_list
(argument
(integer_literal)))))
name: (identifier))
right: (integer_literal))
consequence: (block))))
================================================================================
Null-coalescing operator is right-associative
================================================================================
var a = b ?? c ?? d;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(binary_expression
left: (identifier)
right: (binary_expression
left: (identifier)
right: (identifier)))))))))
================================================================================
Precedence between null-coalescing operator and conditional OR
================================================================================
var a = b ?? c || d ?? e;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(binary_expression
left: (identifier)
right: (binary_expression
left: (binary_expression
left: (identifier)
right: (identifier))
right: (identifier)))))))))
================================================================================
Precedence between null-coalescing operator and conditional operator
================================================================================
var a = b ?? c ? d ?? e : f ?? g;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(conditional_expression
condition: (binary_expression
left: (identifier)
right: (identifier))
consequence: (binary_expression
left: (identifier)
right: (identifier))
alternative: (binary_expression
left: (identifier)
right: (identifier)))))))))
================================================================================
Precedence between range and switch
================================================================================
var a = 3..4 switch
{
_ => true
};
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(switch_expression
(range_expression
(integer_literal)
(integer_literal))
(switch_expression_arm
(discard)
(boolean_literal)))))))))
================================================================================
Precedence between unary and switch
================================================================================
var a = -3 switch
{
_ => true
};
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(switch_expression
(prefix_unary_expression
(integer_literal))
(switch_expression_arm
(discard)
(boolean_literal)))))))))
================================================================================
Precedence between range and as operator
================================================================================
var a = 3..4 as Range;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(as_expression
left: (range_expression
(integer_literal)
(integer_literal))
right: (identifier))))))))
================================================================================
Precedence between is and comparison operators
================================================================================
var allowedValuesList = someObj is null
? default
: new object();
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(conditional_expression
condition: (is_pattern_expression
expression: (identifier)
pattern: (constant_pattern
(null_literal)))
consequence: (default_expression)
alternative: (object_creation_expression
type: (predefined_type)
arguments: (argument_list)))))))))
================================================================================
Nameof expressions
================================================================================
var x = nameof(A);
var x = nameof(A<B>);
var x = nameof(A.B);
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(invocation_expression
function: (identifier)
arguments: (argument_list
(argument
(identifier)))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(invocation_expression
function: (identifier)
arguments: (argument_list
(argument
(generic_name
name: (identifier)
type_arguments: (type_argument_list
(identifier)))))))))))
(global_statement
(local_declaration_statement
(variable_declaration
type: (implicit_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(invocation_expression
function: (identifier)
arguments: (argument_list
(argument
(member_access_expression
expression: (identifier)
name: (identifier)))))))))))
================================================================================
Generic invocation expression
================================================================================
MyFunction<A,B>(1);
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(expression_statement
(invocation_expression
function: (generic_name
name: (identifier)
type_arguments: (type_argument_list
(identifier)
(identifier)))
arguments: (argument_list
(argument
(integer_literal)))))))
================================================================================
Dereference versus logical and
================================================================================
bool c = (a) && b;
--------------------------------------------------------------------------------
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
type: (predefined_type)
(variable_declarator
name: (identifier)
(equals_value_clause
(binary_expression
left: (parenthesized_expression
(identifier))
right: (identifier))))))))