==================
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_body))
			(function_declaration (simple_identifier) (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_body
				(line_string_literal)))
			(function_declaration (simple_identifier) (function_body
				(additive_expression
					(additive_expression
						(line_string_literal)
						(line_string_literal))
					(line_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)))))

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

object Singleton {
	fun test()
}

---

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

==================
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
				(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_body
					(call_expression
						(navigation_expression
							(simple_identifier)
							(navigation_suffix
								(simple_identifier)))
						(call_suffix
							(value_arguments
								(value_argument (integer_literal))))))))))
