Skip to content

Commit 6ff4baa

Browse files
committed
ForeignRefs polished
1 parent 09c75b4 commit 6ff4baa

File tree

2 files changed

+95
-105
lines changed

2 files changed

+95
-105
lines changed

experimental/prolog/lb-compiler/kind_check.pl

Lines changed: 55 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -116,102 +116,43 @@
116116
ctx(ctx(ModuleName, TyName, Sol, []), kind, K).
117117

118118
ctx(ctx(ModuleName, TyName, Sol, _Args), kind, K) :-
119-
%print_message(informational, ctx(kind, ModuleName-TyName-K)),
119+
print_message(informational, ctx(kind, ModuleName-TyName-K)),
120120
first(ModuleName-TyName-K, Sol).
121121

122-
ctx(ctx(ModuleName, TyName, _Sol, Args), arg('.lambdabuffers.compiler.TyVar'{
123-
var_name: _{
124-
name: VarName,
125-
source_info: VnSi
126-
},
127-
source_info: TvSi
128-
}),K) :-
129-
%print_message(informational, ctx(arg(VarName), ModuleName-TyName-K)),
130-
first(
131-
'.lambdabuffers.compiler.TyArg'{
132-
arg_name: _{name: VarName, source_info: _},
133-
arg_kind: K
134-
},
135-
Args
136-
) -> true;
122+
ctx(ctx(ModuleName, TyName, _Sol, Args), arg(TyVar),K) :-
123+
print_message(informational, ctx(arg(TyVar.var_name.name), ModuleName-TyName-K)),
137124
(
138-
throw(error(missing_ty_var(
139-
ModuleName,
140-
TyName,
141-
'.lambdabuffers.compiler.TyVar'{
142-
var_name: _{
143-
name: VarName,
144-
source_info: VnSi
145-
},
146-
source_info: TvSi
147-
},
148-
Args))
149-
)
125+
first(_{
126+
arg_name: _{name: TyVar.var_name.name, source_info: _},
127+
arg_kind: K
128+
},
129+
Args
130+
) -> true;
131+
throw(error(missing_ty_var(ModuleName, TyName,TyVar,Args)))
150132
).
151133

152-
ctx(ctx(ModuleName, TyName, Sol, _Args), ref('.lambdabuffers.compiler.TyRef'{
153-
local_ty_ref: _{
154-
ty_name: _{
155-
name: LocalTyName,
156-
source_info: LtnSi
157-
},
158-
source_info: Si
159-
}
160-
}
161-
), K) :-
162-
first(ModuleName-_{name: LocalTyName, source_info:_}-K, Sol) -> print_message(informational, ctx(local_ref(LocalTyName), ModuleName-TyName-K)), true;
134+
ctx(ctx(ModuleName, TyName, Sol, _Args), ref(TyRef), K) :-
135+
_{ local_ty_ref: LTyRef } :< TyRef,
136+
print_message(informational, ctx(local_ref(LTyRef), ModuleName-TyName-K)),
163137
(
164-
throw(error(missing_ty_ref(
165-
ModuleName,
166-
TyName,
167-
'.lambdabuffers.compiler.TyRef'{
168-
local_ty_ref: '.lambdabuffers.compiler.TyRef.Local'{
169-
ty_name: '.lambdabuffers.compiler.TyRef.TyName'{
170-
name: LocalTyName,
171-
source_info: LtnSi
172-
},
173-
source_info: Si
174-
}
175-
},
176-
Sol)
177-
))
138+
find_sol(Sol, ModuleName, LTyRef.ty_name, K) -> true;
139+
throw(error(missing_ty_ref(ModuleName, TyName, TyRef,Sol)))
178140
).
179141

180-
ctx(ctx(ModuleName, TyName, Sol, _Args), ref(
181-
'.lambdabuffers.compiler.TyRef'{
182-
foreign_ty_ref: _{
183-
ty_name: _{
184-
name: ForeignTyName,
185-
source_info: FtnSi
186-
},
187-
module_name: _{
188-
name: ForeignModuleName,
189-
source_info: FmnSi
190-
},
191-
source_info: Si
192-
}
193-
}
194-
), K) :-
195-
first(_{name: ForeignModuleName, source_info:_}-_{name: ForeignTyName, source_info: _}-K, Sol) -> true;
142+
ctx(ctx(ModuleName, TyName, Sol, _Args), ref(TyRef), K) :-
143+
_{ foreign_ty_ref: FTyRef } :< TyRef,
144+
print_message(informational, ctx(foreign_ref(FTyRef), ModuleName-TyName-K)),
196145
(
197-
throw(error(missing_ty_ref(
198-
ModuleName,
199-
TyName,
200-
'.lambdabuffers.compiler.TyRef'{
201-
foreign_ty_ref: {
202-
ty_name: {
203-
name: ForeignTyName,
204-
source_info: FtnSi
205-
},
206-
module_name: {
207-
name: ForeignModuleName,
208-
source_info: FmnSi
209-
},
210-
source_info: Si
211-
}
212-
},
213-
Sol)
214-
))
146+
find_sol(Sol, FTyRef.module_name, FTyRef.ty_name, K) -> true;
147+
throw(error(missing_ty_ref(ModuleName, TyName, TyRef, Sol)))
148+
).
149+
150+
find_sol([Mn-Tn-K_|Sol], ModuleName, TyName, K) :-
151+
pretty_module_name(ModuleName, ModuleName_),
152+
pretty_module_name(Mn, Mn_),
153+
(
154+
ModuleName_ = Mn_, TyName.name = Tn.name -> K=K_, true;
155+
find_sol(Sol, ModuleName, TyName, K)
215156
).
216157

217158
kind_check_ty(Ctx, '.lambdabuffers.compiler.Ty'{ty_var: TyVar}, K) :-
@@ -321,8 +262,6 @@
321262
"Mod"-"Foo"-(((*)->(*))->(*))
322263
]).
323264

324-
325-
326265
test("\nmodule Mod\nsum Foo", [ ]) :-
327266
sum([], TyBody),
328267
ty_def_body("Foo", TyBody, TyDef),
@@ -479,6 +418,26 @@
479418
kind_check(CompIn, Solution),
480419
print_solution(Solution).
481420

421+
test("\nmodule ModFoo\nsum Foo = MkFoo Bar\nmodule ModBar\nopaque Bar", [ ]) :-
422+
ty_def_opaque("Bar", BarTyDef),
423+
mod("ModBar", [BarTyDef], ModBar),
424+
ty_foreign_ref_(["ModBar"], "Bar", BarTyRef),
425+
ntuple([BarTyRef], MkFooProd),
426+
constr("MkFoo", MkFooProd, MkFooConstr),
427+
sum([MkFooConstr], FooTyBody),
428+
ty_def_body("Foo", FooTyBody, FooTyDef),
429+
mod("ModFoo", [FooTyDef], ModFoo),
430+
comp_input([ModFoo, ModBar], CompIn),
431+
kind_check(CompIn, Solution),
432+
print_solution(Solution),
433+
pretty_solution(Solution, [
434+
"ModFoo"-"Foo"-(*),
435+
"ModFoo"-"Foo'Sum"-((*)->(*)),
436+
"ModFoo"-"Foo'Sum'MkFoo"-((*)->(*)),
437+
"ModBar"-"Bar"-(*)
438+
]).
439+
440+
482441
:- end_tests(kind_check).
483442

484443
:- multifile prolog:message//1.
@@ -491,9 +450,14 @@
491450
].
492451

493452
prolog:message(missing_ty_ref(ModuleName, TyName, _{foreign_ty_ref: ForeignTyRef}, _Sol))
494-
--> {pretty_module_name(ModuleName, Mn)},[
453+
--> {
454+
pretty_module_name(ModuleName, Mn),
455+
pretty_foreign_ty_ref(ForeignTyRef, FTyRef)
456+
457+
},
458+
[
495459
'Error while kind checking type ~w.~w: Missing foreign type reference ~w '-[
496-
Mn, TyName.name, ForeignTyRef.ty_name.name
460+
Mn, TyName.name, FTyRef
497461
]
498462
].
499463

experimental/prolog/lb-compiler/proto_aux.pl

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
ty_def_abs/3,
77
ty_local_ref/2,
88
ty_local_ref_/2,
9+
ty_foreign_ref/3,
10+
ty_foreign_ref_/3,
911
ty_app/3,
1012
ty_abs/3,
1113
ty_arg/3,
@@ -21,7 +23,8 @@
2123
pretty_solution/2,
2224
print_solution/1,
2325
pretty_kind/2,
24-
pretty_module_name/2
26+
pretty_module_name/2,
27+
pretty_foreign_ty_ref/2
2528
]).
2629

2730
:- use_module(compiler_pb).
@@ -50,6 +53,24 @@
5053
ty_local_ref_(TyName, Ty) :-
5154
ty_local_ref('.lambdabuffers.compiler.TyName'{ name: TyName, source_info: _}, Ty).
5255

56+
ty_foreign_ref(ModName, TyName, '.lambdabuffers.compiler.Ty'{
57+
ty_ref: '.lambdabuffers.compiler.TyRef'{
58+
foreign_ty_ref: '.lambdabuffers.compiler.TyRef.Foreign'{
59+
ty_name: TyName,
60+
module_name: ModName,
61+
source_info: _
62+
}
63+
}
64+
}).
65+
66+
ty_foreign_ref_(ModName, TyName, Ty) :-
67+
findall('.lambdabuffers.compiler.ModuleNamePart'{ name: P, source_info: _}, member(P, ModName), Ps),
68+
ty_foreign_ref(
69+
'.lambdabuffers.compiler.ModuleName'{ parts: Ps, source_info: _},
70+
'.lambdabuffers.compiler.TyName'{ name: TyName, source_info: _},
71+
Ty).
72+
73+
5374
ty_app(TyF, TyArgs, '.lambdabuffers.compiler.Ty'{
5475
ty_app: '.lambdabuffers.compiler.TyApp'{
5576
ty_func: TyF,
@@ -76,46 +97,47 @@
7697
module_name: '.lambdabuffers.compiler.ModuleName'{
7798
parts: ['.lambdabuffers.compiler.ModuleNamePart'{
7899
name: ModuleName,
79-
source_info: _Todo
80-
}]
100+
source_info: _
101+
}],
102+
source_info: _
81103
},
82-
source_info: _Todo,
104+
source_info: _,
83105
type_defs: TyDefs
84106
}).
85107

86108
ty_def_body(TyName, TyBody, '.lambdabuffers.compiler.TyDef'{
87-
ty_name: '.lambdabuffers.compiler.TyName'{ name: TyName, source_info: _Todo },
109+
ty_name: '.lambdabuffers.compiler.TyName'{ name: TyName, source_info: _ },
88110
ty_body: TyBody,
89-
source_info: _Todo
111+
source_info: _
90112
}).
91113

92114
ty_def_abs(TyName, TyAbs, '.lambdabuffers.compiler.TyDef'{
93-
ty_name: '.lambdabuffers.compiler.TyName'{ name: TyName, source_info: _Todo },
115+
ty_name: '.lambdabuffers.compiler.TyName'{ name: TyName, source_info: _ },
94116
ty_abs: TyAbs,
95-
source_info: _Todo
117+
source_info: _
96118
}).
97119

98-
opaque('.lambdabuffers.compiler.TyBody'{ opaque: '.lambdabuffers.compiler.Opaque'{ source_info: _Todo }}).
120+
opaque('.lambdabuffers.compiler.TyBody'{ opaque: '.lambdabuffers.compiler.Opaque'{ source_info: _ }}).
99121

100-
sum(Cons, '.lambdabuffers.compiler.TyBody'{ sum: '.lambdabuffers.compiler.Sum'{ constructors: Cons, source_info: _Todo }}).
122+
sum(Cons, '.lambdabuffers.compiler.TyBody'{ sum: '.lambdabuffers.compiler.Sum'{ constructors: Cons, source_info: _ }}).
101123

102124
constr(ConstrName, Prod, '.lambdabuffers.compiler.Constructor'{
103125
constr_name: '.lambdabuffers.compiler.ConstrName'{
104126
name: ConstrName,
105127
source_info: _},
106128
product: Prod,
107-
source_info: _Todo }).
129+
source_info: _ }).
108130

109131
ntuple(Fields, '.lambdabuffers.compiler.Product'{
110132
ntuple: '.lambdabuffers.compiler.Product.NTuple'{
111133
fields: Fields,
112-
source_info: _Todo
134+
source_info: _
113135
},
114-
source_info: _Todo
136+
source_info: _
115137
}).
116138

117139
ty_arg(ArgName, ArgKind, '.lambdabuffers.compiler.TyArg'{
118-
arg_name: '.lambdabuffers.compiler.VarName'{ name: ArgName, source_info: _Todo },
140+
arg_name: '.lambdabuffers.compiler.VarName'{ name: ArgName, source_info: _ },
119141
arg_kind: ArgKind,
120142
source_info: _
121143
}).
@@ -164,3 +186,7 @@
164186
print_solution(Solution) :-
165187
pretty_solution(Solution, Solution_),
166188
maplist(writeln, Solution_).
189+
190+
pretty_foreign_ty_ref(FTyRef, FTyRef_) :-
191+
pretty_module_name(FTyRef.module_name, Mn),
192+
atomics_to_string([Mn, FTyRef.ty_name.name], ".", FTyRef_).

0 commit comments

Comments
 (0)