package p4spectec

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file expand.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
open Domain.Lib
open Lang
open Il
open Error
open Util.Source

(* Type expansion *)

let rec expand_typ (find_typdef_opt : TId.t -> Typdef.t option) (typ : typ) :
    typ =
  match typ.it with
  | VarT (tid, targs) -> (
      let td_opt = find_typdef_opt tid in
      match td_opt with
      | Some (Defined (tparams, deftyp)) -> (
          match deftyp.it with
          | PlainT _ when List.length targs <> List.length tparams ->
              error typ.at "type arguments do not match"
          | PlainT typ ->
              let theta = TIdMap.of_lists tparams targs in
              let typ = Subst.subst_typ theta typ in
              expand_typ find_typdef_opt typ
          | _ -> typ)
      | Some _ -> typ
      | None -> error typ.at ("type variable " ^ tid.it ^ " is not defined"))
  | _ -> typ