builtin_ast_package.pony

use "collections/persistent"

use ast = "../ast"
use parser = "../parser"

class val BuiltinAstPackage is AstPackage
  let _package_name: String = "builtin"
  let _locator: String = "pony:builtin"

  let _all_types: List[AstType]

  let _bool_name: String = "Bool"
  let _bool: AstType

  let _string_name: String = "String"
  let _string: AstType

  let _source_loc_name: String = "SourceLoc"
  let _source_loc: AstType

  new val create() =>
    _bool =
      object val is AstType
        let _full_name: String = _package_name + "/" + _bool_name
        let _bool_node: ast.Node = _make_node(_locator, _bool_name)

        fun val name(): String => _bool_name
        fun val full_name(): String => _full_name
        fun val node(): ast.Node => _bool_node
        fun string(): String iso^ => _full_name.clone()
      end

    _string =
      object val is AstType
        let _full_name: String = _package_name + "/" + _string_name
        let _string_node: ast.Node = _make_node(_locator, _string_name)

        fun val name(): String => _string_name
        fun val full_name(): String => _full_name
        fun val node(): ast.Node => _string_node
        fun string(): String iso^ => _full_name.clone()
      end

    _source_loc =
      object val is AstType
        let _full_name: String = _package_name + "/" + _source_loc_name
        let _source_loc_node: ast.Node = _make_node(_locator, _source_loc_name)

        fun val name(): String => _source_loc_name
        fun val full_name(): String => _full_name
        fun val node(): ast.Node => _source_loc_node
        fun string(): String iso^ => _full_name.clone()
      end

    _all_types = Lists[AstType]([
      _bool
      _string
      _source_loc
    ])

  fun tag _make_node(locator': parser.Locator, name': String): ast.Node =>
    let segment = Cons[ReadSeq[U8] val](name', Nil[ReadSeq[U8] val])
    let src_info = ast.SrcInfo(
      locator',
      parser.Loc(segment, 0),
      parser.Loc(segment, name'.size()))
    ast.NodeWith[_BuiltinNode](src_info, [], _BuiltinNode(name'))

  fun name(): String => _package_name
  fun locator(): String => _locator
  fun all_types(): List[AstType] => _all_types

  fun bool_type(): AstType => _bool
  fun string_type(): AstType => _string
  fun source_loc_type(): AstType => _source_loc