================================================================================
Classes
================================================================================

class Empty
class Empty2 {}

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

(source_file
  (class_declaration
    (type_identifier))
  (class_declaration
    (type_identifier)
    (class_body)))

================================================================================
Class with methods
================================================================================

class HelloWorld {
  fun a() {}

  fun b() {}
}

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

(source_file
  (class_declaration
    (type_identifier)
    (class_body
      (function_declaration
       (simple_identifier)
       (function_value_parameters)
       (function_body))
      (function_declaration
       (simple_identifier)
       (function_value_parameters)
       (function_body)))))

================================================================================
Generic class
================================================================================

class Container<T> {}

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

(source_file
  (class_declaration
    (type_identifier)
    (type_parameters
      (type_parameter
        (type_identifier)))
    (class_body)))

================================================================================
Class with methods and expressions
================================================================================

class Strings {
  fun aString() = "Hello World!"

  fun anotherString() = "Hello" + " " + "World"
}

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

(source_file
  (class_declaration
    (type_identifier)
    (class_body
      (function_declaration
       (simple_identifier)
       (function_value_parameters)
       (function_body
        (string_literal)))
      (function_declaration
       (simple_identifier)
       (function_value_parameters)
       (function_body
        (additive_expression
          (additive_expression
              (string_literal)
              (string_literal))
            (string_literal)))))))

================================================================================
Class with modifiers
================================================================================

internal open class Test {
  private abstract inline fun test()
}

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

(source_file
  (class_declaration
    (modifiers
      (visibility_modifier)
      (inheritance_modifier))
    (type_identifier)
    (class_body
      (function_declaration
        (modifiers
         (visibility_modifier)
         (inheritance_modifier)
         (function_modifier))
        (simple_identifier)
        (function_value_parameters)))))

================================================================================
Objects
================================================================================

object Singleton {
  fun test()
}

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

(source_file
  (object_declaration
    (type_identifier)
    (class_body
      (function_declaration
       (simple_identifier)
       (function_value_parameters)))))

================================================================================
Primary constructors
================================================================================

data class Vector2D(
  val x: Int,
  val y: Int
)

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

(source_file
  (class_declaration
    (modifiers
      (class_modifier))
    (type_identifier)
    (primary_constructor
      (class_parameter
        (simple_identifier)
        (user_type
          (type_identifier)))
      (class_parameter
        (simple_identifier)
        (user_type
          (type_identifier))))))

================================================================================
Inheritance
================================================================================

class A : B() {}

class C(param: Int) : D(param)

class D : SomeInterface

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

(source_file
  (class_declaration
    (type_identifier)
    (delegation_specifier
      (constructor_invocation
        (user_type
          (type_identifier))
        (value_arguments)))
    (class_body))
  (class_declaration
    (type_identifier)
    (primary_constructor
      (class_parameter
        (simple_identifier)
        (user_type
          (type_identifier))))
    (delegation_specifier
      (constructor_invocation
        (user_type
          (type_identifier))
        (value_arguments
          (value_argument
            (simple_identifier))))))
  (class_declaration
    (type_identifier)
    (delegation_specifier
      (user_type
        (type_identifier)))))

================================================================================
Properties
================================================================================

class Something {
  val x: Int = 4
  var y: Int?
  val z: Int get() = x
}

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

(source_file
  (class_declaration
    (type_identifier)
    (class_body
      (property_declaration
        (variable_declaration
          (simple_identifier)
          (user_type
            (type_identifier)))
        (integer_literal))
      (property_declaration
        (variable_declaration
          (simple_identifier)
          (nullable_type
            (user_type
              (type_identifier)))))
      (property_declaration
        (variable_declaration
          (simple_identifier)
          (user_type
            (type_identifier)))
        (getter
          (function_body
            (simple_identifier)))))))

================================================================================
Constructor delegation calls
================================================================================

class Test(x: Int, y: Int) {
  constructor() : this(0, 0)
}

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

(source_file
  (class_declaration
    (type_identifier)
    (primary_constructor
      (class_parameter
        (simple_identifier)
        (user_type
          (type_identifier)))
      (class_parameter
        (simple_identifier)
        (user_type
          (type_identifier))))
    (class_body
      (secondary_constructor (function_value_parameters)
        (constructor_delegation_call
          (value_arguments
            (value_argument
              (integer_literal))
            (value_argument
              (integer_literal))))))))

================================================================================
Enum classes
================================================================================

enum class Suit {
  DIAMONDS, CLOVERS, HEARTS, SPADES
}

enum class Color(val rgb: Int) {
  RED(0xFF0000),
  GREEN(0x00FF00),
  BLUE(0x0000FF);

  override fun toString() = rgb.toString(16)
}

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

(source_file
  (class_declaration
    (type_identifier)
    (enum_class_body
      (enum_entry
        (simple_identifier))
      (enum_entry
        (simple_identifier))
      (enum_entry
        (simple_identifier))
      (enum_entry
        (simple_identifier))))
  (class_declaration
    (type_identifier)
    (primary_constructor
      (class_parameter
        (simple_identifier)
        (user_type
          (type_identifier))))
    (enum_class_body
      (enum_entry
        (simple_identifier)
        (value_arguments
          (value_argument
            (hex_literal))))
      (enum_entry
        (simple_identifier)
        (value_arguments
          (value_argument
            (hex_literal))))
      (enum_entry
        (simple_identifier)
        (value_arguments
          (value_argument
            (hex_literal))))
      (function_declaration
        (modifiers
          (member_modifier))
        (simple_identifier)
        (function_value_parameters)
        (function_body
          (call_expression
            (navigation_expression
              (simple_identifier)
              (navigation_suffix
                (simple_identifier)))
            (call_suffix
              (value_arguments
                (value_argument
                  (integer_literal))))))))))

================================================================================
Data class with hanging comma
================================================================================

data class JwtConfiguration(
   val audience: String,
   val realm: String,
)

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

(source_file
  (class_declaration
    (modifiers
      (class_modifier))
    (type_identifier)
    (primary_constructor
      (class_parameter
        (simple_identifier)
        (user_type
          (type_identifier)))
      (class_parameter
        (simple_identifier)
        (user_type
          (type_identifier))))))

================================================================================
Value class: https://kotlinlang.org/docs/inline-classes.html
================================================================================

@JvmInline
value class Password(private val s: String)

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

(source_file
  (class_declaration
    (modifiers
      (annotation
        (user_type
          (type_identifier)))
      (class_modifier))
    (type_identifier)
    (primary_constructor
      (class_parameter
        (modifiers
          (visibility_modifier))
        (simple_identifier)
        (user_type
          (type_identifier))))))
