33"""
44
55
6- def find_top_level_item(top_level, condition):
6+ from typing import Any, Tuple
7+
8+
9+ def find_top_level_item(prefix: list[str], top_level, condition) -> Tuple[list[str], Any] | None:
710 for entry in top_level:
811 item = entry["item"]
912 if condition(item):
10- return item
13+ return (prefix, item)
1114 if item["type"] == "Module":
12- result = find_top_level_item(item["body"], condition)
15+ result = find_top_level_item(prefix + [item["name"]], item["body"], condition)
1316 if result:
1417 return result
1518
1619
17- def find_top_level_item_by_name(top_level, name):
18- return find_top_level_item(
20+ def find_top_level_item_by_name(crate: str, top_level, name: str) -> Tuple[list[str], Any]:
21+ result = find_top_level_item(
22+ [crate],
1923 top_level,
2024 lambda item: "name" in item and item["name"] == name
2125 )
26+ if result:
27+ return result
28+ raise Exception("Item not found: " + name)
2229
2330
2431def get_header(imports: list[str]) -> str:
@@ -30,8 +37,12 @@ def get_header(imports: list[str]) -> str:
3037"""
3138
3239
33- def indent(level: int) -> str:
34- return " " * level
40+ def indent(s: str) -> str:
41+ return "\n".join(
42+ # We do not indent empty lines
43+ " " + line if len(line) > 0 else ""
44+ for line in s.split("\n")
45+ )
3546
3647
3748def paren(with_paren: bool, s: str) -> str:
@@ -51,41 +62,98 @@ def pp_type(with_paren: bool, item) -> str:
5162 path = item["path"]
5263 if path == ["*const"]:
5364 return "Ref.t Pointer.Kind.ConstPointer"
65+ if path == ["bool"]:
66+ return "bool"
5467 return pp_path(path) + ".t"
5568 if item["type"] == "Application":
5669 return paren(
57- with_paren,
70+ with_paren and len(item["tys"]) > 0 ,
5871 " ".join(pp_type(True, ty) for ty in [item["func"]] + item["tys"])
5972 )
6073 return "Unknown type " + item["type"]
6174
6275
63- def pp_type_struct_struct(level: int, item) -> str:
64- result = "Module " + item["name"] + ".\n"
76+ def pp_type_struct_struct(prefix: list[str], item) -> str:
6577 if len(item["ty_params"]) != 0:
6678 ty_params = "(" + " ".join(item["ty_params"]) + ": Set) "
6779 else:
6880 ty_params = ""
6981 ty_params_links = "".join("`{Link " + ty_param + "} " for ty_param in item["ty_params"])
70- result += indent(level + 1) + "Record t " + ty_params + ty_params_links + ": Set := {\n"
71- for field in item["fields"]:
72- result += indent(level + 2) + field[0] + ": " + pp_type(False, field[1]) + ";\n"
73- result += indent(level + 1) + "}.\n"
74- result += indent(level) + "End " + item["name"] + "."
75- return result
82+ return pp_module(item["name"],
83+ "Record t " + ty_params + ty_params_links + ": Set := {\n" +
84+ indent("".join(
85+ field[0] + ": " + pp_type(False, field[1]) + ";\n"
86+ for field in item["fields"]
87+ )) +
88+ "}.\n" +
89+ ("Arguments Build_t {" + " ".join(["_ _"] * len(item["ty_params"])) + "}.\n"
90+ if len(item["ty_params"]) > 0
91+ else ""
92+ ) +
93+ "\n" +
94+ "Global Instance IsLink " + ty_params + ty_params_links + ": Link " +
95+ paren(len(item["ty_params"]) > 0, " ".join(["t"] + item["ty_params"])) +
96+ " := {\n" +
97+ indent(
98+ "to_ty := Ty.path \"" + "::".join(prefix + [item["name"]]) + "\";\n" +
99+ "to_value '(Build_t" + "".join(" " + field[0] for field in item["fields"]) + ") :=\n" +
100+ indent(
101+ "Value.StructRecord \"" + "::".join(prefix + [item["name"]]) + "\" [\n" +
102+ indent(";\n".join(
103+ "(\"" + field[0] + "\", to_value " + field[0] + ")"
104+ for field in item["fields"]
105+ )) + "\n" +
106+ "];\n"
107+ )
108+ ) +
109+ "}."
110+ )
76111
77112
78- def pp_type_struct_tuple(level: int, item) -> str:
79- result = "Module " + item["name"] + ".\n"
113+ def pp_type_struct_tuple(prefix: list[str], item) -> str:
80114 if len(item["ty_params"]) != 0:
81115 ty_params = "(" + " ".join(item["ty_params"]) + ": Set) "
82116 else:
83117 ty_params = ""
84118 ty_params_links = "".join("`{Link " + ty_param + "} " for ty_param in item["ty_params"])
85- result += indent(level + 1) + "Inductive t " + ty_params + ty_params_links + ": Set :=\n"
86- result += \
87- indent(level + 1) + "| Make :" + \
88- "".join(" " + pp_type(False, field) + " ->" for field in item["fields"]) + \
89- " t" + "".join(" " + ty_param for ty_param in item["ty_params"]) + ".\n"
90- result += indent(level) + "End " + item["name"] + "."
91- return result
119+ return pp_module(item["name"],
120+ "Inductive t " + ty_params + ty_params_links + ": Set :=\n" +
121+ "| Make :" +
122+ "".join(
123+ " " + pp_type(False, field) + " ->"
124+ for field in item["fields"]
125+ ) +
126+ " t" + "".join(" " + ty_param for ty_param in item["ty_params"]) + ".\n" +
127+ ("Arguments Make {" + " ".join(["_ _"] * len(item["ty_params"])) + "}.\n"
128+ if len(item["ty_params"]) > 0
129+ else ""
130+ ) +
131+ "\n" +
132+ "Global Instance IsLink " + ty_params + ty_params_links + ": Link " +
133+ paren(len(item["ty_params"]) > 0, " ".join(["t"] + item["ty_params"])) +
134+ " := {\n" +
135+ indent(
136+ "to_ty := Ty.path \"" + "::".join(prefix + [item["name"]]) + "\";\n" +
137+ "to_value '(Make" + "".join(" x" + str(index) for index in range(len(item["fields"]))) + ") :=\n" +
138+ indent(
139+ "Value.StructTuple \"" + "::".join(prefix + [item["name"]]) + "\" [" +
140+ "; ".join("to_value x" + str(index) for index in range(len(item["fields"]))) + "];\n"
141+ )
142+ ) +
143+ "}."
144+ )
145+
146+
147+ def pp_top_level_item(prefix: list[str], item) -> str:
148+ if item["type"] == "TypeStructStruct":
149+ return pp_type_struct_struct(prefix, item)
150+ if item["type"] == "TypeStructTuple":
151+ return pp_type_struct_tuple(prefix, item)
152+ return "Unknown item type " + item["type"]
153+
154+
155+ def pp_module(name: str, content: str) -> str:
156+ return \
157+ "Module " + name + ".\n" + \
158+ indent(content) + "\n" + \
159+ "End " + name + "."
0 commit comments