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

@deprecated("Use D", "1.0") class C {}

---

(compilation_unit
  (class_definition
    (annotation (type_identifier) (arguments (string) (string)))
    (identifier)
    (template_body)))

================================
Declarations and definitions
================================

class A(x: String) {
  @transient @volatile var y: Int
  @transient @volatile val z = x

  @throws(Error)
  @deprecated(message = "Don't use this", since = "1.0")
  def foo() {}
}

---

(compilation_unit
  (class_definition (identifier)
    (class_parameters (class_parameter (identifier) (type_identifier)))
    (template_body
      (var_declaration
        (annotation (type_identifier))
        (annotation (type_identifier))
        (identifier) (type_identifier))
      (val_definition
        (annotation (type_identifier))
        (annotation (type_identifier))
        (identifier) (identifier))
      (function_definition
        (annotation (type_identifier) (arguments (identifier)))
        (annotation (type_identifier)
          (arguments
            (assignment_expression (identifier) (string))
            (assignment_expression (identifier) (string))))
        (identifier) (parameters) (block)))))

================================
Parameters
================================

class A(@one x: String) {
  def foo(@another x: Int) {}
}

---

(compilation_unit
  (class_definition (identifier)
    (class_parameters
      (class_parameter
        (annotation (type_identifier)) (identifier) (type_identifier)))
    (template_body
      (function_definition
        (identifier)
        (parameters (parameter
                      (annotation (type_identifier))
                      (identifier) (type_identifier)))
        (block)))))

================================
Types
================================

trait Function0[@specialized(Unit, Int, Double) T] {
  def apply: T
}

---

(compilation_unit
  (trait_definition (identifier)
    (type_parameters
      (annotation (type_identifier) (arguments (identifier) (identifier) (identifier))) (identifier))
    (template_body (function_declaration (identifier) (type_identifier)))))
