================================================================================
Class with bodyless properties
================================================================================

class Foo {
  byte Get { get; }
  char Set { set; }
  uint GetSet { get; set; }
  long SetGet { set; get; }
}

--------------------------------------------------------------------------------

(compilation_unit
  (class_declaration
    name: (identifier)
    body: (declaration_list
      (property_declaration
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration)))
      (property_declaration
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration)))
      (property_declaration
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration)
          (accessor_declaration)))
      (property_declaration
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration)
          (accessor_declaration))))))

================================================================================
Class with init properties
================================================================================

class Person
{
    public string FirstName { get; init; }
}

--------------------------------------------------------------------------------

(compilation_unit
  (class_declaration
    name: (identifier)
    body: (declaration_list
      (property_declaration
        (modifier)
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration)
          (accessor_declaration))))))

================================================================================
Class with single-accessor property bodies
================================================================================

class Foo {
  byte Get { get { return 0xFF; } }
  char Set { set { x = value; } }
}

--------------------------------------------------------------------------------

(compilation_unit
  (class_declaration
    name: (identifier)
    body: (declaration_list
      (property_declaration
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration
            body: (block
              (return_statement
                (integer_literal))))))
      (property_declaration
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration
            body: (block
              (expression_statement
                (assignment_expression
                  left: (identifier)
                  (assignment_operator)
                  right: (identifier))))))))))

================================================================================
Class with double-accessor property bodies
================================================================================

class Foo {
  uint GetSet {
    get { return x; }
    set { x = value; }
  }
  long SetGet {
    set { x = value; }
    get { return x; }
  }
}

--------------------------------------------------------------------------------

(compilation_unit
  (class_declaration
    name: (identifier)
    body: (declaration_list
      (property_declaration
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration
            body: (block
              (return_statement
                (identifier))))
          (accessor_declaration
            body: (block
              (expression_statement
                (assignment_expression
                  left: (identifier)
                  (assignment_operator)
                  right: (identifier)))))))
      (property_declaration
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration
            body: (block
              (expression_statement
                (assignment_expression
                  left: (identifier)
                  (assignment_operator)
                  right: (identifier)))))
          (accessor_declaration
            body: (block
              (return_statement
                (identifier)))))))))

================================================================================
Class with bodyless properties and initializers
================================================================================

class Foo {
  byte Get { get; } = 0x00;
  uint GetSet { get; set; } = 1;
  long SetGet { set; get; } = 2;
}

--------------------------------------------------------------------------------

(compilation_unit
  (class_declaration
    name: (identifier)
    body: (declaration_list
      (property_declaration
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration))
        value: (integer_literal))
      (property_declaration
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration)
          (accessor_declaration))
        value: (integer_literal))
      (property_declaration
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration)
          (accessor_declaration))
        value: (integer_literal)))))

================================================================================
Class with explicit interface properties
================================================================================

class Foo: IFoo {
  byte IFoo.Get { get; }
}

--------------------------------------------------------------------------------

(compilation_unit
  (class_declaration
    name: (identifier)
    bases: (base_list
      (identifier))
    body: (declaration_list
      (property_declaration
        type: (predefined_type)
        (explicit_interface_specifier
          name: (identifier))
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration))))))

================================================================================
Required properties
================================================================================

class A {
  public required int B { get; set; }
}

--------------------------------------------------------------------------------

(compilation_unit
  (class_declaration
    name: (identifier)
    body: (declaration_list
      (property_declaration
        (modifier)
        (modifier)
        type: (predefined_type)
        name: (identifier)
        accessors: (accessor_list
          (accessor_declaration)
          (accessor_declaration))))))
