====
Standard go code in template
====

package ui

type Foobar struct {
	Element int
}

templ MyComponent(slice []Foobar) {
  <hr/>
}

---

(source_file
  (package_clause
    (package_identifier))
  (type_declaration
    (type_spec
      (type_identifier)
      (struct_type
        (field_declaration_list
          (field_declaration
            (field_identifier)
            (type_identifier))))))
  (component_declaration
    (component_identifier)
    (parameter_list
      (parameter_declaration
        (identifier)
        (slice_type
          (type_identifier))))
    (component_block
      (element
        (self_closing_tag
          (element_identifier))))))

====
Only go code in template
====

package ui

var Foo string = "foobar"

type Flag int

const (
  Hello Flag = iota
  Hallo
  Hullo
)

---

(source_file
  (package_clause
    (package_identifier))
    (var_declaration
      (var_spec
        (identifier)
        (type_identifier)
        (expression_list
          (interpreted_string_literal))))
    (type_declaration
      (type_spec
        (type_identifier)
        (type_identifier)))
    (const_declaration
      (const_spec
        (identifier)
        (type_identifier)
        (expression_list
          (identifier)))
      (const_spec
        (identifier))
      (const_spec
        (identifier))))

====
Importing Go code
====

package hello

import "foo"

import (
  "bar"
  "baz"
)

css foo() {}

---

(source_file
  (package_clause
    (package_identifier))
  (import_declaration
    (import_spec
      (interpreted_string_literal)))
  (import_declaration
    (import_spec_list
      (import_spec
        (interpreted_string_literal))
      (import_spec
        (interpreted_string_literal))))
  (css_declaration
    (css_identifier)
    (parameter_list)))

====
Recognize go variable with slice
====

package list

var links = []string{
	"/",
	"/about",
}

type Link struct {
	Name string
	Url  string
}

var advancedLinks = []Link{
	{Name: "Home", Url: "/"},
	{Name: "About", Url: "/about"},
}

---

(source_file
      (package_clause
        (package_identifier))
      (var_declaration
        (var_spec
          (identifier)
          (expression_list
            (composite_literal
              (slice_type
                (type_identifier))
              (literal_value
                (literal_element
                  (interpreted_string_literal))
                (literal_element
                  (interpreted_string_literal)))))))
      (type_declaration
        (type_spec
          (type_identifier)
          (struct_type
            (field_declaration_list
              (field_declaration
                (field_identifier)
                (type_identifier))
              (field_declaration
                (field_identifier)
                (type_identifier))))))
      (var_declaration
        (var_spec
          (identifier)
          (expression_list
            (composite_literal
              (slice_type
                (type_identifier))
              (literal_value
                (literal_element
                  (literal_value
                    (keyed_element
                      (field_identifier)
                      (interpreted_string_literal))
                    (keyed_element
                      (field_identifier)
                      (interpreted_string_literal))))
                (literal_element
                  (literal_value
                    (keyed_element
                      (field_identifier)
                      (interpreted_string_literal))
                    (keyed_element
                      (field_identifier)
                      (interpreted_string_literal))))))))))
