{{/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */}}

{{Include "common.tmpl"}}


{{/*
-------------------------------------------------------------------------------
  Emits the fully qualified name (prefixed with the package) of the specified
  type or variable.
-------------------------------------------------------------------------------
*/}}
{{define "Go.QualifiedName"}}{{Global "module"}}{{$.Name}}{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the go type for the provided AST type or expression.
-------------------------------------------------------------------------------
*/}}
{{define "Go.Type"}}
  {{if not (IsType $)}}{{Macro "Go.Type" (TypeOf $)}}
  {{else if IsAny           $}}interface{}
  {{else if IsPseudonym     $}}{{Macro "Go.QualifiedName" $}}
  {{else if IsStaticArray   $}}{{Macro "Go.QualifiedName" $}}
  {{else if IsMap           $}}{{Macro "Go.QualifiedName" $}}
  {{else if IsClass         $}}{{Macro "Go.QualifiedName" $}}
  {{else if IsEnum          $}}{{Macro "Go.QualifiedName" $}}
  {{else if IsPointer       $}}{{Macro "Go.QualifiedName" $}}
  {{else if IsSlice         $}}{{Macro "Go.QualifiedName" $}}
  {{else if IsReference     $}}(*{{Macro "Go.Type" $.To}})
  {{else if IsBool          $}}bool
  {{else if IsInt           $}}int64
  {{else if IsUint          $}}uint64
  {{else if IsChar          $}}byte
  {{else if IsU8            $}}uint8
  {{else if IsS8            $}}int8
  {{else if IsU16           $}}uint16
  {{else if IsS16           $}}int16
  {{else if IsF32           $}}float32
  {{else if IsU32           $}}uint32
  {{else if IsS32           $}}int32
  {{else if IsF64           $}}float64
  {{else if IsU64           $}}uint64
  {{else if IsS64           $}}int64
  {{else if IsString        $}}string
  {{else if IsVoid          $}}void
  {{else}}{{Error "macro Type called with unsupported type: %s" $.Name}}
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the go default value for the provided AST type.
-------------------------------------------------------------------------------
*/}}
{{define "Go.Null"}}
  {{AssertType $ "Type"}}
  {{     if IsPointer       $}}{{Macro "Go.Type" $}}{}
  {{else if IsReference     $}}{{Macro "Go.Type" $}}(nil)
  {{else if IsBool          $}}false
  {{else if IsInt           $}}int(0)
  {{else if IsUint          $}}uint(0)
  {{else if IsS8            $}}int8(0)
  {{else if IsU8            $}}uint8(0)
  {{else if IsS16           $}}int16(0)
  {{else if IsU16           $}}uint16(0)
  {{else if IsS32           $}}int32(0)
  {{else if IsU32           $}}uint32(0)
  {{else if IsF32           $}}float32(0)
  {{else if IsS64           $}}int64(0)
  {{else if IsU64           $}}uint64(0)
  {{else if IsF64           $}}float64(0)
  {{else if IsString        $}}""
  {{else if IsPseudonym     $}}{{Macro "Go.Type" $}}({{Macro "Go.Null" $.To}})
  {{else}}{{Error "macro Type called with unsupported type: %s" $.Name}}
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to decode the specified type and variable name.
  ErrHandler can control what should happen if there's a decode error. By
  default ErrHandler is set to "return err".
-------------------------------------------------------------------------------
*/}}
{{define "Go.Decode"}}
  {{AssertType $.Type       "Type"        }}
  {{AssertType $.Name       "string"      }}
  {{AssertType $.ErrHandler "string" "nil"}}

  {{     if not $.ErrHandler}}{{Macro "Go.Decode" "Type" $.Type "Name" $.Name "ErrHandler" "return err"}}
  {{else if IsStaticArray $.Type}}if err := d.Value(&{{$.Name}}); err != nil { {{$.ErrHandler}} }
  {{else if IsMap         $.Type}}if err := d.Value(&{{$.Name}}); err != nil { {{$.ErrHandler}} }
  {{else if IsClass       $.Type}}if err := d.Value(&{{$.Name}}); err != nil { {{$.ErrHandler}} }
  {{else if IsPointer     $.Type}}if err := d.Value(&{{$.Name}}); err != nil { {{$.ErrHandler}} }
  {{else if IsPseudonym   $.Type}}
    {{$ty := $.Type.To}}
    {{     if IsStaticArray $ty}}if err := d.Value(&{{$.Name}}); err != nil { {{$.ErrHandler}} }
    {{else if IsMap         $ty}}if err := d.Value(&{{$.Name}}); err != nil { {{$.ErrHandler}} }
    {{else if IsClass       $ty}}if err := d.Value(&{{$.Name}}); err != nil { {{$.ErrHandler}} }
    {{else if IsPointer     $ty}}if err := d.Value(&{{$.Name}}); err != nil { {{$.ErrHandler}} }
    {{else}}{{Macro "Go.DecodePOD" "Type" $ty "Name" $.Name "ErrHandler" $.ErrHandler "Cast" $.Type}}
    {{end}}
  {{else}}{{Macro "Go.DecodePOD" "Type" $.Type "Name" $.Name "ErrHandler" $.ErrHandler}}
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to decode the specified Plain-Old-Data type and variable name.
  ErrHandler can control what should happen if there's a decode error. By
  default ErrHandler is set to "return err".
  Cast can be used to cast the value type before assigment to Name.
-------------------------------------------------------------------------------
*/}}
{{define "Go.DecodePOD_cast"}}{{if $}}{{Macro "Go.Type" $}}(v){{else}}v{{end}}{{end}}
{{define "Go.DecodePOD"}}
  {{AssertType $.Type       "Type"        }}
  {{AssertType $.Name       "string"      }}
  {{AssertType $.ErrHandler "string" "nil"}}
  {{AssertType $.Cast       "Type"   "nil"}}

  {{$v        := Macro "Go.DecodePOD_cast" $.Cast}}
  {{$int_size := "ϟs.Architecture.IntegerSize*8"}}

  {{     if IsEnum        $.Type}}if v, err := d.Uint32();  err == nil { {{$.Name}} = {{$.Type.Name}}(v) } else { {{$.ErrHandler}} }
  {{else if IsBool        $.Type}}if v, err := d.Bool();    err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsChar        $.Type}}if v, err := d.Uint8();   err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsU8          $.Type}}if v, err := d.Uint8();   err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsS8          $.Type}}if v, err := d.Int8();    err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsU16         $.Type}}if v, err := d.Uint16();  err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsS16         $.Type}}if v, err := d.Int16();   err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsF32         $.Type}}if v, err := d.Float32(); err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsU32         $.Type}}if v, err := d.Uint32();  err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsS32         $.Type}}if v, err := d.Int32();   err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsF64         $.Type}}if v, err := d.Float64(); err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsU64         $.Type}}if v, err := d.Uint64();  err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsS64         $.Type}}if v, err := d.Int64();   err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsString      $.Type}}if v, err := d.String();  err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsInt         $.Type}}if v, err := binary.ReadInt(d,  {{$int_size}}); err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsUint        $.Type}}if v, err := binary.ReadUint(d, {{$int_size}}); err == nil { {{$.Name}} = {{$v}} } else { {{$.ErrHandler}} }
  {{else if IsVoid        $.Type}}
  {{else}}{{Error "macro Go.DecodePOD '%v' called with unsupported type: %v" $.Name $.Type.Name}}
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to encode the specified type and variable name.
  ErrHandler can control what should happen if there's a encode error. By
  default ErrHandler is set to "return err".
-------------------------------------------------------------------------------
*/}}
{{define "Go.Encode"}}
  {{AssertType $.Type       "Type"        }}
  {{AssertType $.Name       "string"      }}
  {{AssertType $.ErrHandler "string" "nil"}}

  {{$ty       := $.Type | Underlying}}
  {{$int_size := "ϟs.Architecture.IntegerSize*8"}}

  {{     if not $.ErrHandler}}{{Macro "Go.Decode" "Type" $.Type "Name" $.Name "ErrHandler" "return err"}}
  {{else if IsStaticArray $ty}}if err := e.Value(&{{$.Name}});           err != nil { {{$.ErrHandler}} }
  {{else if IsMap         $ty}}if err := e.Value(&{{$.Name}});           err != nil { {{$.ErrHandler}} }
  {{else if IsClass       $ty}}if err := e.Value(&{{$.Name}});           err != nil { {{$.ErrHandler}} }
  {{else if IsPointer     $ty}}if err := e.Value(&{{$.Name}});           err != nil { {{$.ErrHandler}} }
  {{else if IsEnum        $ty}}if err := e.Uint32(uint32({{$.Name}}));   err != nil { {{$.ErrHandler}} }
  {{else if IsBool        $ty}}if err := e.Bool(bool({{$.Name}}));       err != nil { {{$.ErrHandler}} }
  {{else if IsChar        $ty}}if err := e.Uint8(uint8({{$.Name}}));     err != nil { {{$.ErrHandler}} }
  {{else if IsU8          $ty}}if err := e.Uint8(uint8({{$.Name}}));     err != nil { {{$.ErrHandler}} }
  {{else if IsS8          $ty}}if err := e.Int8(int8({{$.Name}}));       err != nil { {{$.ErrHandler}} }
  {{else if IsU16         $ty}}if err := e.Uint16(uint16({{$.Name}}));   err != nil { {{$.ErrHandler}} }
  {{else if IsS16         $ty}}if err := e.Int16(int16({{$.Name}}));     err != nil { {{$.ErrHandler}} }
  {{else if IsF32         $ty}}if err := e.Float32(float32({{$.Name}})); err != nil { {{$.ErrHandler}} }
  {{else if IsU32         $ty}}if err := e.Uint32(uint32({{$.Name}}));   err != nil { {{$.ErrHandler}} }
  {{else if IsS32         $ty}}if err := e.Int32(int32({{$.Name}}));     err != nil { {{$.ErrHandler}} }
  {{else if IsF64         $ty}}if err := e.Float64(float64({{$.Name}})); err != nil { {{$.ErrHandler}} }
  {{else if IsU64         $ty}}if err := e.Uint64(uint64({{$.Name}}));   err != nil { {{$.ErrHandler}} }
  {{else if IsS64         $ty}}if err := e.Int64(int64({{$.Name}}));     err != nil { {{$.ErrHandler}} }
  {{else if IsString      $ty}}if err := e.String(string({{$.Name}}));   err != nil { {{$.ErrHandler}} }
  {{else if IsInt         $ty}}if err := binary.WriteInt(e,  {{$int_size}},  int64({{$.Name}})); err != nil { {{$.ErrHandler}} }
  {{else if IsUint        $ty}}if err := binary.WriteUint(e, {{$int_size}}, uint64({{$.Name}})); err != nil { {{$.ErrHandler}} }
  {{else if IsVoid        $ty}}
  {{else}}{{Error "macro Go.Encode '%v' called with unsupported type: %v" $.Name $.Type.Name}}
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Transforms the given string or identifier into a format used for a public Go
  type or field. Example:
    this_is_go_public -> ThisIsGoPublic
-------------------------------------------------------------------------------
*/}}
{{define "Go.Public"}}
  {{AssertType $ "string"}}

  {{$ | SplitOn "_" | Title}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Transforms the given string or identifier into a format used for a private Go
  type or field. Example:
    this_is_go_private -> thisIsGoPrivate
-------------------------------------------------------------------------------
*/}}
{{define "Go.Private"}}
  {{AssertType $ "string"}}

  {{$ | SplitOn "_" | Title | Join | Untitle}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the expression to lookup the given parameter.
-------------------------------------------------------------------------------
*/}}
{{define "Go.Parameter"}}{{AssertType $ "Parameter"}}{{Macro "Go.Public" $.Name}}{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the name of the specified command's structure.
-------------------------------------------------------------------------------
*/}}
{{define "Go.CmdName"}}
  {{AssertType $ "Function"}}

  {{Macro "Go.Public" (Macro "CmdName" $)}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits all the statements in the given block
-------------------------------------------------------------------------------
*/}}
{{define "Go.Block"}}
  {{ForEach $.Statements "Go.Statement" | JoinWith "\n"}}
  {{/* Assign each local variable of the block to a blank identifier, in case it hasn't been used. */}}
  {{if $locals := ForEach $.Statements "Go.LocalNames"}}
    {{ForEach $locals "Go.Blank" | JoinWith ", "}} = {{$locals | JoinWith ", "}}
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the Go logic to execute the given statement.
  If the global "Go.Statement.Override" is specified then this the macro with
  the specified name is called, otherwise the macro delegates to
  "Go.Statement.Default".
-------------------------------------------------------------------------------
*/}}
{{define "Go.Statement"}}
  {{if $override := Global "Go.Statement.Override"}}
    {{Macro $override $}}
  {{else}}
    {{Macro "Go.Statement.Default" $}}
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the Go logic to execute the given statement.
-------------------------------------------------------------------------------
*/}}
{{define "Go.Statement.Default"}}
  {{     if IsDeclareLocal $}}{{$.Local.Name}} := {{Macro "Go.Read" $.Local.Value}} {{Macro "Go.TypeComment" (TypeOf $.Local)}}
  {{else if IsAssert       $}}
  {{else if IsAssign       $}}{{Macro "Go.Assign" "LHS" $.LHS "Operator" $.Operator "RHS" $.RHS}}
  {{else if IsMapAssign    $}}{{Macro "Go.MapAssign" $}}
  {{else if IsSliceAssign  $}}{{Macro "Go.SliceAssign" $}}
  {{else if IsCopy         $}}{{Macro "Go.Copy" $}}
  {{else if IsReturn       $}}{{Macro "Go.Assign" "LHS" $.Function.Return "Operator" "=" "RHS" $.Value}}
  {{else if IsIteration    $}}{{Macro "Go.Iteration" $}}
  {{else if IsCall         $}}{{Macro "Go.Call" $}}
  {{else if IsRead         $}}
  {{else if IsWrite        $}}
  {{else if IsFence        $}}
  {{else if IsBranch       $}}if {{Macro "Go.Read" $.Condition}} {
    {{Macro "Go.Block" $.True}}
    {{if len $.False.Statements}}
    } else {
      {{Macro "Go.Block" $.False}}
    {{end}}
    }
  {{else if IsSwitch $}}
    switch {{Macro "Go.Read" $.Value}} {
      {{range $c := $.Cases}}
        case {{range $i, $cond := $c.Conditions}}§
          {{if $i}}, {{end}}{{Macro "Go.Read" $cond}}§
          {{end}}:
            {{Macro "Go.Block" $c.Block}}
      {{end}}
      default:
        // TODO: better unmatched handling
        v := {{Macro "Go.Read" $.Value}}
        fmt.Printf("Error: Missing switch case handler for value %T %v", v, v)
    }
  {{else}}{{Error "unsupported statement %T: %v" $ $}}
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to execute an iteration statement
-------------------------------------------------------------------------------
*/}}
{{define "Go.Range"}}
  {{AssertType $.Name "string"}}
  {{AssertType $.Range "BinaryOp"}}
  for {{$.Name}} := {{Macro "Go.Type" $.Range.RHS}}({{Macro "Go.Read" $.Range.LHS}}); {{$.Name}} < {{Macro "Go.Read" $.Range.RHS}}; {{$.Name}}++
{{end}}

{{define "Go.Iteration"}}
  {{AssertType $ "Iteration"}}
  {{     if IsBinaryOp $.Iterable}}
    {{Macro "Go.Range" "Name" $.Iterator.Name "Range" $.Iterable}} {
      {{Macro "Go.Block" $.Block}}
    }
  {{else}}
    for _, {{$.Iterator.Name}} := range {{Macro "Go.Read" $.Iterable}}.Range() {
      {{Macro "Go.Block" $.Block}}
    }
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to execute a call statement
-------------------------------------------------------------------------------
*/}}
{{define "Go.Call"}}
  {{AssertType $ "Call"}}
  {{$args := ForEach $.Arguments "Go.Read" | JoinWith ", "}}
  {{if $.Target.Object}}
    {{Macro "Go.Read" $.Target.Object}}.{{$.Target.Function.Name}}({{$args}})
  {{else}}
    externs{ϟs, ϟd, ϟl}.{{$.Target.Function.Name}}({{$args}})
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to assign the RHS to the LHS
-------------------------------------------------------------------------------
*/}}
{{define "Go.Assign"}}
  {{Macro "Go.Read" $.LHS}} {{$.Operator}} {{Macro "Go.Read" $.RHS}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to copy from Src to Dst
-------------------------------------------------------------------------------
*/}}
{{define "Go.Copy"}}
  {{AssertType $ "Copy"}}
  {{Macro "Go.Read" $.Dst}}.Copy({{Macro "Go.Read" $.Src}}, ϟs, ϟd, ϟl)
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to assign a value to a map index
-------------------------------------------------------------------------------
*/}}
{{define "Go.MapAssign"}}
  {{AssertType $ "MapAssign"}}
  {{if eq $.Operator "="}}{{Macro "Go.Read" $.To.Map}}[{{Macro "Go.Read" $.To.Index}}] = {{Macro "Go.Read" $.Value}}
  {{else}}{{Error "Unsupported MapAssign operator %s" $.Operator}}{{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to assign a value to a slice index
-------------------------------------------------------------------------------
*/}}
{{define "Go.SliceAssign"}}
  {{AssertType $ "SliceAssign"}}
  {{if eq $.Operator "="}}{{Macro "Go.Read" $.To.Slice}}.Index({{Macro "Go.Read" $.To.Index}}, ϟs).Write({{Macro "Go.Read" $.Value}}, ϟs)
  {{else}}{{Error "Unsupported SliceAssign operator %s" $.Operator}}{{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the Go logic to read the value of the specified expression.
  If the global "Go.Read.Override" is specified then this the macro with the
  specified name is called, otherwise the macro delegates to "Go.Read.Default".
-------------------------------------------------------------------------------
*/}}
{{define "Go.Read"}}
  {{if $override := Global "Go.Read.Override"}}
    {{Macro $override $}}
  {{else}}
    {{Macro "Go.Read.Default" $}}
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the Go logic to execute the given statement.
-------------------------------------------------------------------------------
*/}}
{{define "Go.Read.Default"}}
  {{     if IsBoolValue        $}}{{$}}
  {{else if IsNumericValue     $}}{{Macro "Go.Type" $}}({{$}})
  {{else if IsUnaryOp          $}}{{$.Operator}}({{Macro "Go.Read" $.Expression}})
  {{else if IsStringValue      $}}{{printf "%q" $}}
  {{else if IsEnumEntry        $}}{{$.Enum.Name}}_{{$.Name}}
  {{else if IsLocal            $}}{{$.Name}}
  {{else if IsBitTest          $}}(({{Macro "Go.Read" $.Bits}}) & ({{Macro "Go.Read" $.Bitfield}}) != 0)
  {{else if IsBinaryOp         $}}({{Macro "Go.Read" $.LHS}}) {{$.Operator}} ({{Macro "Go.Read" $.RHS}})
  {{else if IsCast             $}}{{Macro "Go.Cast" $}}
  {{else if IsCall             $}}{{Macro "Go.Call" $}}
  {{else if IsUnknown          $}}{{Global "Go.InferredExpression" "1"}}{{Macro "Go.Read" $.Inferred}}{{Global "Go.InferredExpression" ""}}
  {{else if IsObserved         $}}{{Macro "Go.ReadParameter" $.Parameter}}
  {{else if IsMember           $}}{{Macro "Go.Read" $.Object}}.{{Macro "Go.Public" $.Field.Name}}
  {{else if IsGlobal           $}}ϟc.{{Title $.Name}}
  {{else if IsParameter        $}}{{Macro "Go.ReadParameter" $}}
  {{else if IsMapIndex         $}}{{Macro "Go.Read" $.Map}}.Get({{Macro "Go.Read" $.Index}})
  {{else if IsMapContains      $}}{{Macro "Go.Read" $.Map}}.Contains({{Macro "Go.Read" $.Key}})
  {{else if IsLength           $}}{{Macro "Go.Type" $.Type}}({{Macro "Go.ReadLength" $.Object}})
  {{else if IsNull             $}}{{Macro "Go.Null" $.Type}}
  {{else if IsNew              $}}new {{Macro "Go.Type" $.Type}}
  {{else if IsSliceIndex       $}}{{Macro "Go.Read" $.Slice  }}.Index({{Macro "Go.Read" $.Index}}, ϟs).Read(ϟs, ϟd, ϟl)
  {{else if IsSliceRange       $}}{{Macro "Go.Read" $.Slice  }}.Slice({{Macro "Go.Read" $.Range.LHS}}, {{Macro "Go.Read" $.Range.RHS}}, ϟs)
  {{else if IsPointerRange     $}}{{Macro "Go.Read" $.Pointer}}.Slice({{Macro "Go.Read" $.Range.LHS}}, {{Macro "Go.Read" $.Range.RHS}}, ϟs)
  {{else if IsClone            $}}{{Macro "Go.Read" $.Slice  }}.Clone(ϟs)
  {{else if IsMake             $}}Make{{Macro "Go.Type" $.Type}}({{Macro "Go.Read" $.Size}}, ϟs)
  {{else if IsSelect           $}}
    func() (result {{Macro "Go.Type" $}}) {
      switch {{Macro "Go.Read" $.Value}} {
        {{range $c := $.Choices}}
          case {{range $i, $cond := $c.Conditions}}§
            {{if $i}}, {{end}}{{Macro "Go.Read" $cond}}§
            {{end}}:
              return {{Macro "Go.Read" $c.Expression}}
        {{end}}
      default:
        // TODO: better unmatched handling
        panic(fmt.Errorf("Unmatched switch(%v) in atom %T", {{Macro "Go.Read" $.Value}}, ϟa))
        return result
      }
    }()
  {{else if IsClassInitializer $}}func(){{Macro "Go.Type" $}}{
    s := {{Macro "Go.Type" $}}{}
    s.Init()
    {{range $f := $.Fields}}
      s.{{$f.Field.Name}} = {{Macro "Go.Read" $f.Value}}
    {{end}}
    return s
  }()
  {{else if IsCreate $}}func(){{Macro "Go.Type" $}}{
    s := &{{Macro "Go.Type" (Unpack $.Type).To}}{}
    s.Init()
    {{range $f := $.Initializer.Fields}}
      s.{{$f.Field.Name}} = {{Macro "Go.Read" $f.Value}}
    {{end}}
    return s
  }()
  {{else}}{{Error "macro Go.Read called with unsupported type: %T" $}}
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to cast a value to another type
-------------------------------------------------------------------------------
*/}}
{{define "Go.Cast"}}
  {{AssertType $ "Cast"}}

  {{$src_ty := $.Object | TypeOf | Underlying | Unpack}}
  {{$dst_ty := $.Type | Underlying}}
  {{$src    := Macro "Go.Read" $.Object}}

  {{/* T* -> number */}}{{if and (IsPointer $src_ty) (IsNumericType $dst_ty)}}
    {{Macro "Go.Type" $.Type}}({{$src}}.Address)
  {{/* T[] -> T* */}}{{else if and (IsSlice $src_ty) (IsPointer $dst_ty)}}
    {{Macro "Go.Type" $.Type}}({{$src}}.Index(0, ϟs))
  {{/* char[] -> string */}}{{else if and (IsSlice $src_ty) (IsString $dst_ty)}}
    string({{$src}}.Read(ϟs, ϟd, ϟl))
  {{/* string[] -> char[] */}}{{else if and (IsString $src_ty) (IsSlice $dst_ty)}}
    Make{{Macro "Go.Type" $.Type}}FromString({{$src}}, ϟs)
  {{else}}
    {{Macro "Go.Type" $.Type}}({{$src}})
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to read the value of the specified expression
-------------------------------------------------------------------------------
*/}}
{{define "Go.ReadParameter"}}
  {{AssertType $ "Parameter"}}

  ϟa.{{Macro "Go.Public" $.Name}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits a comment displaying the specified type
-------------------------------------------------------------------------------
*/}}
{{define "Go.TypeComment"}}
  {{AssertType $ "Type"}}

  // {{$.Name}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the logic to read the length of the specified expression
-------------------------------------------------------------------------------
*/}}
{{define "Go.ReadLength"}}
  len({{Macro "Go.Read" $}})
{{end}}


{{/*
-------------------------------------------------------------------------------
  If the given statement is a local variable declaration, return its name.
-------------------------------------------------------------------------------
*/}}
{{define "Go.LocalNames"}}
  {{if IsDeclareLocal $}}{{$.Local.Name}}{{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits a Go blank identifier, _.
-------------------------------------------------------------------------------
*/}}
{{define "Go.Blank"}}_{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits the size in bytes of the specified type as a uint64
-------------------------------------------------------------------------------
*/}}
{{define "Go.SizeOf"}}
  {{AssertType $ "Type"}}

  {{     if IsPseudonym $}}{{Macro "Go.SizeOf" $.To}}
  {{else if IsVoid      $}}uint64(1)
  {{else if IsBool      $}}uint64(1)
  {{else if IsChar      $}}uint64(1)
  {{else if IsU8        $}}uint64(1)
  {{else if IsS8        $}}uint64(1)
  {{else if IsU16       $}}uint64(2)
  {{else if IsS16       $}}uint64(2)
  {{else if IsF32       $}}uint64(4)
  {{else if IsU32       $}}uint64(4)
  {{else if IsS32       $}}uint64(4)
  {{else if IsF64       $}}uint64(8)
  {{else if IsU64       $}}uint64(8)
  {{else if IsS64       $}}uint64(8)
  {{else if IsEnum      $}}uint64(4)
  {{else if IsString    $}}uint64(ϟs.Architecture.PointerSize)
  {{else if IsPointer   $}}uint64(ϟs.Architecture.PointerSize)
  {{else if IsInt       $}}uint64(ϟs.Architecture.IntegerSize)
  {{else if IsUint      $}}uint64(ϟs.Architecture.IntegerSize)
  {{else                 }}{{Error "macro Go.SizeOf called with unsupported type: %v" $}}
  {{end}}
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits a comment stating that the file is automatically generated.
-------------------------------------------------------------------------------
*/}}
{{define "Go.GeneratedHeader"}}
  {{Copyright "generated" "apic"}}¶
  package {{$}};
{{end}}


{{/*
-------------------------------------------------------------------------------
  Emits a comment block containing the specified text.
-------------------------------------------------------------------------------
*/}}
{{define "Go.CommentHeader"}}
  {{AssertType $ "string"}} {{/* The comment block body text */}}
  ////////////////////////////////////////////////////////////////////////////////
  // {{.}}
  ////////////////////////////////////////////////////////////////////////////////
{{end}}
