============================================
Single const declarations without types
============================================
package main
const zero = 0
const one, two = 1, 2
const three, four, five = 3, 4, 5
----
(source_file
(package_clause (package_identifier))
(const_declaration (const_spec
(identifier)
(expression_list (int_literal))))
(const_declaration (const_spec
(identifier)
(identifier)
(expression_list (int_literal) (int_literal))))
(const_declaration (const_spec
(identifier)
(identifier)
(identifier)
(expression_list (int_literal) (int_literal) (int_literal)))))
============================================
Single const declarations with types
============================================
package main
const zero int = 0
const one, two uint64 = 1, 2
----
(source_file
(package_clause (package_identifier))
(const_declaration (const_spec
(identifier)
(type_identifier)
(expression_list (int_literal))))
(const_declaration (const_spec
(identifier)
(identifier)
(type_identifier)
(expression_list (int_literal) (int_literal)))))
============================================
Grouped const declarations
============================================
package main
const (
zero = 0
one = 1
)
----
(source_file
(package_clause (package_identifier))
(const_declaration
(const_spec
(identifier)
(expression_list (int_literal)))
(const_spec
(identifier)
(expression_list (int_literal)))))
============================================
Const declarations with implicit values
============================================
package main
const (
zero = iota
one
two
)
----
(source_file
(package_clause (package_identifier))
(const_declaration
(const_spec
(identifier)
(expression_list (identifier)))
(const_spec
(identifier))
(const_spec
(identifier))))
============================================
Var declarations without types
============================================
package main
var zero = 0
var one, two = 1, 2
var three, four, five = 3, 4, 5
----
(source_file
(package_clause (package_identifier))
(var_declaration (var_spec
(identifier)
(expression_list (int_literal))))
(var_declaration (var_spec
(identifier)
(identifier)
(expression_list (int_literal) (int_literal))))
(var_declaration (var_spec
(identifier)
(identifier)
(identifier)
(expression_list (int_literal) (int_literal) (int_literal)))))
============================================
Var declarations with types
============================================
package main
var zero int = 0
var one, two uint64 = 1, 2
----
(source_file
(package_clause (package_identifier))
(var_declaration (var_spec
(identifier)
(type_identifier)
(expression_list (int_literal))))
(var_declaration (var_spec
(identifier)
(identifier)
(type_identifier)
(expression_list (int_literal) (int_literal)))))
============================================
Var declarations with no expressions
============================================
package main
var zero int
var one, two uint64
----
(source_file
(package_clause (package_identifier))
(var_declaration (var_spec
(identifier)
(type_identifier)))
(var_declaration (var_spec
(identifier)
(identifier)
(type_identifier))))
============================================
Grouped var declarations
============================================
package main
var (
zero = 0
one = 1
)
----
(source_file
(package_clause (package_identifier))
(var_declaration
(var_spec
(identifier)
(expression_list (int_literal)))
(var_spec
(identifier)
(expression_list (int_literal)))))
============================================
Function declarations
============================================
package main
func f1() {}
func f2(a File, b, c, d Thing) int {}
func f2() (File, Thing) {}
func f2() (result int, err error) {}
---
(source_file
(package_clause (package_identifier))
(function_declaration
(identifier)
(parameter_list)
(block))
(function_declaration
(identifier)
(parameter_list
(parameter_declaration
(identifier)
(type_identifier))
(parameter_declaration
(identifier)
(identifier)
(identifier)
(type_identifier)))
(type_identifier)
(block))
(function_declaration
(identifier)
(parameter_list)
(parameter_list
(parameter_declaration (type_identifier))
(parameter_declaration (type_identifier)))
(block))
(function_declaration
(identifier)
(parameter_list)
(parameter_list
(parameter_declaration (identifier) (type_identifier))
(parameter_declaration (identifier) (type_identifier)))
(block)))
============================================
Single-line function declarations
============================================
package main
func f1() { a() }
func f2() { a(); b() }
func f3() { a(); b(); }
---
(source_file
(package_clause (package_identifier))
(function_declaration
(identifier)
(parameter_list)
(block
(call_expression (identifier) (argument_list))))
(function_declaration
(identifier)
(parameter_list)
(block
(call_expression (identifier) (argument_list))
(call_expression (identifier) (argument_list))))
(function_declaration
(identifier)
(parameter_list)
(block
(call_expression (identifier) (argument_list))
(call_expression (identifier) (argument_list)))))
============================================
Variadic function declarations
============================================
package main
func f1(a ...*int) {}
func f2(a int, b ...int) {}
func f3(...bool) {}
---
(source_file
(package_clause (package_identifier))
(function_declaration
(identifier)
(parameter_list
(variadic_parameter_declaration
(identifier)
(pointer_type (type_identifier))))
(block))
(function_declaration
(identifier)
(parameter_list
(parameter_declaration
(identifier)
(type_identifier))
(variadic_parameter_declaration
(identifier)
(type_identifier)))
(block))
(function_declaration
(identifier)
(parameter_list
(variadic_parameter_declaration (type_identifier)))
(block)))
============================================
Method declarations
============================================
package main
func (self Person) Equals(other Person) bool {}
func (v *Value) ObjxMap(optionalDefault ...(Map)) Map {}
---
(source_file
(package_clause (package_identifier))
(method_declaration
(parameter_list
(parameter_declaration (identifier) (type_identifier)))
(field_identifier)
(parameter_list
(parameter_declaration (identifier) (type_identifier)))
(type_identifier)
(block))
(method_declaration
(parameter_list
(parameter_declaration (identifier) (pointer_type (type_identifier))))
(field_identifier)
(parameter_list
(variadic_parameter_declaration
(identifier)
(parenthesized_type (type_identifier))))
(type_identifier)
(block)))
============================================
Type declarations
============================================
package main
type a b
type (
a b
c d
)
---
(source_file
(package_clause (package_identifier))
(type_declaration
(type_spec (type_identifier) (type_identifier)))
(type_declaration
(type_spec (type_identifier) (type_identifier))
(type_spec (type_identifier) (type_identifier))))