================================================================================
Global empty interface
================================================================================

public interface IOne {};

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

(compilation_unit
  (interface_declaration
    (modifier)
    (identifier)
    (declaration_list)))

================================================================================
Interface with properties
================================================================================

interface IOne {
  byte Get { get; }
  char Set { set; }
  uint GetSet { get; set; }
  long SetGet { set; get; }
};

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

(compilation_unit
  (interface_declaration
    (identifier)
    (declaration_list
      (property_declaration
        (predefined_type)
        (identifier)
        (accessor_list
          (accessor_declaration)))
      (property_declaration
        (predefined_type)
        (identifier)
        (accessor_list
          (accessor_declaration)))
      (property_declaration
        (predefined_type)
        (identifier)
        (accessor_list
          (accessor_declaration)
          (accessor_declaration)))
      (property_declaration
        (predefined_type)
        (identifier)
        (accessor_list
          (accessor_declaration)
          (accessor_declaration))))))

================================================================================
Interface with methods
================================================================================

interface IOne {
  void Nothing();
  int Output();
  void Input(string a);
  int InputOutput(string a);
};

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

(compilation_unit
  (interface_declaration
    (identifier)
    (declaration_list
      (method_declaration
        (predefined_type)
        (identifier)
        (parameter_list))
      (method_declaration
        (predefined_type)
        (identifier)
        (parameter_list))
      (method_declaration
        (predefined_type)
        (identifier)
        (parameter_list
          (parameter
            (predefined_type)
            (identifier))))
      (method_declaration
        (predefined_type)
        (identifier)
        (parameter_list
          (parameter
            (predefined_type)
            (identifier)))))))

================================================================================
Interface base single
================================================================================

private interface IOne : ITwo { }

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

(compilation_unit
  (interface_declaration
    (modifier)
    (identifier)
    (base_list
      (identifier))
    (declaration_list)))

================================================================================
Interface base multiple
================================================================================

private interface IOne : ITwo, IThree { }

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

(compilation_unit
  (interface_declaration
    (modifier)
    (identifier)
    (base_list
      (identifier)
      (identifier))
    (declaration_list)))

================================================================================
Interface generic
================================================================================

private interface IOne<T1> : ITwo { }

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

(compilation_unit
  (interface_declaration
    (modifier)
    (identifier)
    (type_parameter_list
      (type_parameter
        (identifier)))
    (base_list
      (identifier))
    (declaration_list)))

================================================================================
Interface generic single constraint
================================================================================

private interface IOne<T1> : ITwo where T1:T2 { }

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

(compilation_unit
  (interface_declaration
    (modifier)
    (identifier)
    (type_parameter_list
      (type_parameter
        (identifier)))
    (base_list
      (identifier))
    (type_parameter_constraints_clause
      (identifier)
      (type_parameter_constraint
        (type_constraint
          (identifier))))
    (declaration_list)))

================================================================================
Interface generic multiple constraints
================================================================================

private interface IOne<T1, T3> : ITwo where T1:T2 where T3:new() { }

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

(compilation_unit
  (interface_declaration
    (modifier)
    (identifier)
    (type_parameter_list
      (type_parameter
        (identifier))
      (type_parameter
        (identifier)))
    (base_list
      (identifier))
    (type_parameter_constraints_clause
      (identifier)
      (type_parameter_constraint
        (type_constraint
          (identifier))))
    (type_parameter_constraints_clause
      (identifier)
      (type_parameter_constraint
        (constructor_constraint)))
    (declaration_list)))

================================================================================
Interface in namespace
================================================================================

namespace A {
  interface IOne : ITwo { }
}

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

(compilation_unit
  (namespace_declaration
    (identifier)
    (declaration_list
      (interface_declaration
        (identifier)
        (base_list
          (identifier))
        (declaration_list)))))

================================================================================
Interface event declarations
================================================================================

interface A {
  event EventHandler<T> SomeEvent;
}

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

(compilation_unit
  (interface_declaration
    (identifier)
    (declaration_list
      (event_field_declaration
        (variable_declaration
          (generic_name
            (identifier)
            (type_argument_list
              (identifier)))
          (variable_declarator
            (identifier)))))))

================================================================================
Interface with indexer
================================================================================

interface A {
  bool this[int index] { get; set; }
}

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

(compilation_unit
  (interface_declaration
    (identifier)
    (declaration_list
      (indexer_declaration
        (predefined_type)
        (bracketed_parameter_list
          (parameter
            (predefined_type)
            (identifier)))
        (accessor_list
          (accessor_declaration)
          (accessor_declaration))))))

================================================================================
Interface with default method
================================================================================

interface MyDefault {
  void Log(string message) {
    Console.WriteLine(message);
  }
}

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

(compilation_unit
  (interface_declaration
    (identifier)
    (declaration_list
      (method_declaration
        (predefined_type)
        (identifier)
        (parameter_list
          (parameter
            (predefined_type)
            (identifier)))
        (block
          (expression_statement
            (invocation_expression
              (member_access_expression
                (identifier)
                (identifier))
              (argument_list
                (argument
                  (identifier))))))))))

================================================================================
Static abstract members
================================================================================

public interface IGetNext<T> where T : IGetNext<T>
{
    static abstract T operator ++(T other);
}

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

(compilation_unit
  (interface_declaration
    (modifier)
    (identifier)
    (type_parameter_list
      (type_parameter
        (identifier)))
    (type_parameter_constraints_clause
      (identifier)
      (type_parameter_constraint
        (type_constraint
          (generic_name
            (identifier)
            (type_argument_list
              (identifier))))))
    (declaration_list
      (operator_declaration
        (modifier)
        (modifier)
        (identifier)
        (parameter_list
          (parameter
            (identifier)
            (identifier)))))))
