package sema

import (
	"github.com/marzeq/qk/parser"
	"github.com/marzeq/qk/types"
)

type aliasState int

const (
	aliasUnseen aliasState = iota
	aliasResolving
	aliasResolved
)

type aliasInfo struct {
	node  *parser.TypeAliasNode
	state aliasState
}

func (a *Analyser) resolveAlias(info *aliasInfo, node parser.Node) types.Type {
	switch info.state {
	case aliasResolving:
		a.errorf(node, "circular type alias detected")
		return types.ErrorType{}

	case aliasResolved:
		return info.node.Symbol.TypeInfo
	}

	info.state = aliasResolving

	resolved := a.resolveTypeNode(info.node.Type)

	info.node.Symbol.TypeInfo = resolved
	info.state = aliasResolved

	return resolved
}