============================================
Qualified type names
============================================

type a b.c

---

(source_file
  (type_declaration
    (type_spec
      name: (type_identifier)
      type: (qualified_type
        package: (package_identifier)
        name: (type_identifier)))))

============================================
Array types
============================================

type a [2+2]c

---

(source_file
  (type_declaration
    (type_spec
      name: (type_identifier)
      type: (array_type
        length: (binary_expression
          left: (int_literal)
          right: (int_literal))
        element: (type_identifier)))))

============================================
Slice types
============================================

package main

type a []c
type b [][]d

---

(source_file
  (package_clause (package_identifier))
  (type_declaration
    (type_spec
      (type_identifier)
      (slice_type (type_identifier))))
  (type_declaration
    (type_spec
      (type_identifier)
      (slice_type (slice_type (type_identifier))))))

============================================
Struct types
============================================

package main

type s1 struct {}

type s2 struct { Person }

type s2 struct {
  f, g int
}

type s3 struct {
  // an embedded struct
  p.s1

  // a tag
  h int `json:"h"`
}

---

(source_file
  (package_clause (package_identifier))
  (type_declaration
    (type_spec
      (type_identifier)
      (struct_type (field_declaration_list))))
  (type_declaration
    (type_spec
      (type_identifier)
      (struct_type (field_declaration_list (field_declaration (type_identifier))))))
  (type_declaration
    (type_spec
      (type_identifier)
      (struct_type (field_declaration_list
        (field_declaration
          (field_identifier)
          (field_identifier)
          (type_identifier))))))
  (type_declaration
    (type_spec
      (type_identifier)
      (struct_type (field_declaration_list
        (comment)
        (field_declaration
          (qualified_type (package_identifier) (type_identifier)))
        (comment)
        (field_declaration
          (field_identifier)
          (type_identifier)
          (raw_string_literal)))))))

============================================
Interface types
============================================

package main

type i1 interface {}

type i1 interface { io.Reader }

type i2 interface {
  i1
  io.Reader
  SomeMethod(s string) error
  OtherMethod(int, ...bool) bool
}

---

(source_file
  (package_clause (package_identifier))
  (type_declaration (type_spec
    (type_identifier)
    (interface_type (method_spec_list))))
  (type_declaration (type_spec
    (type_identifier)
    (interface_type (method_spec_list
      (qualified_type (package_identifier) (type_identifier))))))
  (type_declaration (type_spec
    (type_identifier)
    (interface_type (method_spec_list
      (type_identifier)
      (qualified_type (package_identifier) (type_identifier))
      (method_spec
        (field_identifier)
        (parameter_list (parameter_declaration (identifier) (type_identifier)))
        (type_identifier))
      (method_spec
        (field_identifier)
          (parameter_list
            (parameter_declaration (type_identifier))
            (variadic_parameter_declaration (type_identifier))) (type_identifier)))))))

============================================
Map types
============================================

package main

type m1 map[string]error

---

(source_file
  (package_clause (package_identifier))
  (type_declaration
    (type_spec
      (type_identifier)
      (map_type (type_identifier) (type_identifier)))))

============================================
Pointer types
============================================

package main

type (
  p1 *string
  p2 **p1
)

---

(source_file
  (package_clause (package_identifier))
  (type_declaration
    (type_spec
      (type_identifier)
      (pointer_type (type_identifier)))
    (type_spec
      (type_identifier)
      (pointer_type (pointer_type (type_identifier))))))

============================================
Channel types
============================================

package main

type (
  c1 chan<- chan int
  c2 chan<- chan<- struct{}
  c3 chan<- <-chan int
)

---

(source_file
  (package_clause (package_identifier))
  (type_declaration
    (type_spec
      (type_identifier)
      (channel_type (channel_type (type_identifier))))
    (type_spec
      (type_identifier)
      (channel_type (channel_type (struct_type (field_declaration_list)))))
    (type_spec
      (type_identifier)
      (channel_type (channel_type (type_identifier))))))

============================================
Function types
============================================

package main

type (
  a func(int) int
  b func(int, *string) (bool, error)
  c func(int, ...*string) bool
)

---

(source_file
  (package_clause (package_identifier))
  (type_declaration
    (type_spec
      (type_identifier)
      (function_type
        (parameter_list
          (parameter_declaration (type_identifier)))
        (type_identifier)))
    (type_spec
      (type_identifier)
      (function_type
        (parameter_list
          (parameter_declaration (type_identifier))
          (parameter_declaration (pointer_type (type_identifier))))
        (parameter_list
          (parameter_declaration (type_identifier))
          (parameter_declaration (type_identifier)))))
    (type_spec
      (type_identifier)
      (function_type
        (parameter_list
          (parameter_declaration (type_identifier))
          (variadic_parameter_declaration
            (pointer_type (type_identifier))))
        (type_identifier)))))

============================================
Type Aliases
============================================

package main

type H1 = G1
type _ = G2
type _ = struct{}
type (
	A0 = T0
	A1 = int
	A2 = struct{}
	A3 = reflect.Value
	A4 = Value
	A5 = Value
)

---

(source_file
  (package_clause (package_identifier))
  (type_declaration
    (type_alias (type_identifier) (type_identifier)))
  (type_declaration
    (type_alias (type_identifier) (type_identifier)))
  (type_declaration
    (type_alias (type_identifier) (struct_type (field_declaration_list))))
	(type_declaration
    (type_alias (type_identifier) (type_identifier))
    (type_alias (type_identifier) (type_identifier))
    (type_alias (type_identifier) (struct_type (field_declaration_list)))
    (type_alias (type_identifier) (qualified_type (package_identifier) (type_identifier)))
    (type_alias (type_identifier) (type_identifier))
    (type_alias (type_identifier) (type_identifier))))
