====
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))))))

====
Go comments inside template
====

package ui

templ MyComponent() {
    // single line comment
    <br/>
    /* multi line comment */
}

---

(source_file
  (package_clause
    (package_identifier))
  (component_declaration
    (component_identifier)
    (parameter_list)
    (component_block
      (comment)
      (element
        (self_closing_tag
          (element_identifier)))
      (comment))))

====
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
          (iota)))
      (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
                  (literal_element
                    (identifier))
                  (literal_element
                    (interpreted_string_literal)))
                (keyed_element
                  (literal_element
                    (identifier))
                  (literal_element
                    (interpreted_string_literal)))))
            (literal_element
              (literal_value
                (keyed_element
                  (literal_element
                    (identifier))
                  (literal_element
                    (interpreted_string_literal)))
                (keyed_element
                  (literal_element
                    (identifier))
                  (literal_element
                    (interpreted_string_literal)))))))))))
