-
Notifications
You must be signed in to change notification settings - Fork 54
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Syntax factory #1530
Syntax factory #1530
Conversation
…statics tests - Uses temp module to remove fresh/invalid calls in statics test - Uses Info error module to create expressions with default no errors
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## dev #1530 +/- ##
==========================================
+ Coverage 50.33% 53.29% +2.95%
==========================================
Files 103 103
Lines 10442 10583 +141
==========================================
+ Hits 5256 5640 +384
+ Misses 5186 4943 -243
|
src/haz3lcore/lang/term/Grammar.re
Outdated
}; | ||
|
||
// pat | ||
let pat_invalid = (~ann=?, s): pat_t(DefaultAnnotation.t) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can also nest modules inside here instead of prepending sort. This works with local open so you could do:
FTemp.(Exp.(list([int(1), int(2), cast(int(3), Typ.int(), Typ.unknown(Internal)))))
test/Test_Statics.re
Outdated
ty_prod([ | ||
ty_tup_label( | ||
ty_label("a"), | ||
ty_prod([ | ||
ty_tup_label( | ||
ty_label("b"), | ||
ty_prod([ | ||
ty_tup_label(ty_label("c"), ty_unknown(Hole(EmptyHole))), | ||
]), | ||
), | ||
]), | ||
), | ||
]), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Example of the fresh calls being removed.
test/Test_Statics.re
Outdated
Common( | ||
TupleLabelError({ | ||
malformed_labels: [], | ||
duplicate_labels: [], | ||
invalid_labels: ["c"], | ||
typ: | ||
TupLabel( | ||
Label("c") |> Typ.fresh, | ||
Int |> Typ.fresh, | ||
) | ||
|> Typ.fresh, | ||
}), | ||
), | ||
), | ||
TupLabel( | ||
error_exp( | ||
Exp(Common(NoType(InvalidLabel("c")))), | ||
Label("c"), | ||
Inconsistent( | ||
FTemp.( | ||
Expectation({ | ||
ana: | ||
ty_parens( | ||
ty_prod([ | ||
ty_int(), | ||
ty_tup_label(ty_label("a"), ty_string()), | ||
]), | ||
), | ||
syn: | ||
ty_prod([ | ||
ty_tup_label(ty_label("c"), ty_int()), | ||
ty_tup_label(ty_label("a"), ty_string()), | ||
]), | ||
}) | ||
), | ||
no_error_exp(Int(1)), | ||
), | ||
), | ||
no_error_exp( | ||
TupLabel( | ||
no_error_exp(Label("a")), | ||
no_error_exp(String("hello")), | ||
), | ||
), | ||
tuple( | ||
~ann= | ||
Some( | ||
Exp( | ||
Common( | ||
TupleLabelError({ | ||
malformed_labels: [], | ||
duplicate_labels: [], | ||
invalid_labels: ["c"], | ||
typ: | ||
FTemp.( | ||
ty_prod([ | ||
ty_tup_label(ty_label("c"), ty_int()), | ||
ty_tup_label(ty_label("a"), ty_string()), | ||
]) | ||
), | ||
}), | ||
), | ||
), | ||
]), | ||
), | ||
), | ||
[ | ||
{ | ||
tup_label( | ||
~ann= | ||
Some( | ||
Exp( | ||
Common( | ||
TupleLabelError({ | ||
malformed_labels: [], | ||
duplicate_labels: [], | ||
invalid_labels: ["c"], | ||
typ: | ||
FTemp.( | ||
ty_tup_label(ty_label("c"), ty_int()) | ||
), | ||
}), | ||
), | ||
), | ||
), | ||
error_exp( | ||
Exp(Common(NoType(InvalidLabel("c")))), | ||
Label("c"), | ||
), | ||
int(1), | ||
); | ||
}, | ||
tup_label(label("a"), string("hello")), | ||
], | ||
), | ||
), | ||
no_error_exp(Bool(true)), | ||
), | ||
bool(true), | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The test is significantly smaller and only 30 out of the remaining ~90 lines are the AST. The rest are the annotations.
d4c597f
to
c5ebe7d
Compare
let tests = ( | ||
"Grammar", | ||
[QCheck_alcotest.to_alcotest(qcheck_map_annotation_test)], | ||
[ | ||
test_case( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added these test cases to walk over all of the expressions, types, patterns, ... to make sure that we can build one for each cls
and the class is in 1-1 correspondence with the term types. This turns out not to be true for types for Constructor.
The tests help ensure cls are in order and that we have the factory functions. I think that's good enough for now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe I'll find a way to derive both in the future.
module type DefaultAnnotation = { | ||
type t; | ||
let default_value: unit => t; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You could have 2 types here t
for the type of the annotation and another type s
that could be used in the factory methods below and require a default_value : option(s) -> t
as part of the builder. I haven't bothered but for optional annotations it allows the people calling the builder to use a different type like not provide Some
constructors.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
leave as a comment in the file
module type DefaultAnnotation = { | ||
type t; | ||
let default_value: unit => t; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
leave as a comment in the file
Add factory functions for AST
Adds a bunch of helper functions for building up the AST with default annotations.
Replaces the constructors in tests with the new helper functions to remove fresh calls. Also moved builtins.re and transition.re to use the new functions.