// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package compile

import (
	"v.io/v23/vdl"
	"v.io/v23/vdlroot/vdltool"
)

var (
	// The BuiltInPackage and BuiltInFile are used to hold the built-ins.
	BuiltInPackage = newPackage("", "_builtin", "_builtin", vdltool.Config{})
	BuiltInFile    = &File{BaseName: "_builtin.vdl"}
)

func init() {
	// Link the BuiltIn{Package,File} to each other before defining built-ins.
	BuiltInPackage.Files = []*File{BuiltInFile}
	BuiltInFile.Package = BuiltInPackage
	// Built-in types
	builtInType("any", vdl.AnyType)
	builtInType("bool", vdl.BoolType)
	builtInType("byte", vdl.ByteType)
	builtInType("uint16", vdl.Uint16Type)
	builtInType("uint32", vdl.Uint32Type)
	builtInType("uint64", vdl.Uint64Type)
	builtInType("int16", vdl.Int16Type)
	builtInType("int32", vdl.Int32Type)
	builtInType("int64", vdl.Int64Type)
	builtInType("float32", vdl.Float32Type)
	builtInType("float64", vdl.Float64Type)
	builtInType("complex64", vdl.Complex64Type)
	builtInType("complex128", vdl.Complex128Type)
	builtInType("string", vdl.StringType)
	builtInType("typeobject", vdl.TypeObjectType)
	builtInType("error", vdl.ErrorType)
	// Built-in consts
	builtInConst("nil", NilConst)
	builtInConst("true", TrueConst)
	builtInConst("false", FalseConst)
}

func builtInType(name string, t *vdl.Type) {
	def := &TypeDef{
		NamePos:  NamePos{Name: name},
		Exported: true,
		Type:     t,
		File:     BuiltInFile,
	}
	addTypeDef(def, nil)
}

func builtInConst(name string, v *vdl.Value) {
	def := &ConstDef{
		NamePos:  NamePos{Name: name},
		Exported: true,
		Value:    v,
		File:     BuiltInFile,
	}
	addConstDef(def, nil)
}
