// 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("int8", vdl.Int8Type)
	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)
}
