package sema
import (
"github.com/marzeq/qk/parser"
"github.com/marzeq/qk/shared"
"github.com/marzeq/qk/symbols"
"github.com/marzeq/qk/types"
)
func (a *Analyser) resolveTypeNode(n parser.TypeNode) types.Type {
switch t := n.(type) {
case *parser.NamedTypeNode:
if info, ok := a.aliases[t.Name]; ok {
return a.resolveAlias(info, t)
}
if t.ModName == "" {
sym, ok := a.current.Resolve(t.Name)
if !ok || sym.Kind != symbols.SymbolKindType {
a.errorf(t, "unknown type %q", t.Name)
return types.ErrorType{}
}
return sym.TypeInfo
}
modSym, ok := a.current.Resolve(t.ModName)
if !ok || modSym.Kind != symbols.SymbolKindModule {
a.errorf(t, "unknown module %q", t.ModName)
return types.ErrorType{}
}
sym, ok := modSym.Module.Scope.Resolve(t.Name)
if !ok || sym.Kind != symbols.SymbolKindType {
a.errorf(t, "unknown type %q in module %q", t.Name, t.ModName)
return types.ErrorType{}
}
return sym.TypeInfo
case *parser.PointerTypeNode:
return types.PointerType{
Base: a.resolveTypeNode(t.BaseType),
}
case *parser.SliceTypeNode:
return types.SliceType{
Base: a.resolveTypeNode(t.ElementType),
Size: t.Size,
}
case *parser.StructTypeNode:
fields := []shared.Pair[string, types.Type]{}
for _, f := range t.Fields {
fields = append(fields, shared.Pair[string, types.Type]{
L: f.Name,
R: a.resolveTypeNode(f.Type),
})
}
return types.StructType{
Fields: fields,
}
}
a.errorf(n, "unsupported type node")
return types.ErrorType{}
}