[m-rev.] for review: improve error reporting for foreign_enum pragmas
Julien Fischer
jfischer at opturion.com
Thu May 19 23:26:26 AEST 2016
Hi Zoltan,
On Thu, 19 May 2016, Zoltan Somogyi wrote:
>> On 18 May 2016, at 11:22, Julien Fischer <jfischer at opturion.com> wrote:
>>
>> @@ -737,42 +725,72 @@ parse_export_enum_attr(VarSet, Term, MaybeAttribute) :-
>> parse_pragma_foreign_enum(VarSet, ErrorTerm, PragmaTerms, Context, SeqNum,
>> MaybeIOM) :-
>> ( if PragmaTerms = [LangTerm, MercuryTypeTerm, ValuesTerm] then
>> +
>> ( if parse_foreign_language(LangTerm, ForeignLang) then
>> - parse_export_enum_type_ctor(MercuryTypeTerm, MaybeTypeCtor),
>> + MaybeForeignLang = ok1(ForeignLang)
>> + else
>> + LangPieces = [words("Error: invalid foreign language in"),
>> + pragma_decl("foreign_enum"), words("declaration."),
>> + nl],
>> + LangSpec = error_spec(severity_error, phase_term_to_parse_tree,
>> + [simple_msg(get_term_context(LangTerm), [always(LangPieces)])]),
>> + MaybeForeignLang = error1([LangSpec])
>> + ),
>
> I think it could help if the message said e.g. "invalid foreign language `charp’
> in …”, so I would call describe_error_term on LangTerm.
Done.
>> + parse_type_ctor_name_arity("foreign_enum", MercuryTypeTerm,
>> + MaybeTypeCtor),
>> +
>> + UnrecognizedPieces =
>> + [words("Error: expected a valid mapping element")],
>
> I would say explicitly what the "mapping element” is supposed
> to be, i.e. what it maps to what. I would do that by giving a template,
> since it is not obvious e.g what should separate the source and target
> entities.
I'll do that as a separate change -- I was intending to rework the code
for parsing the third argument of foreign_enum pragmas so we could
return more accurate error messages anyway. (The existing code has
a tendency to simply fail if it detects an error and output the above
error.)
>> + % XXX the following doesn't check that foreign values are sensible
>> + % (e.g. it should reject the empty string).
>
> Would it be easy to add that check?
As part of the above reworking, yes.
>> + convert_maybe_list("mapping elements", yes(VarSet), ValuesTerm,
>> + parse_sym_name_string_pair(VarSet, PairContextPieces),
>> + UnrecognizedPieces, MaybeValues0),
>> + (
>> + MaybeValues0 = ok1(Values),
>
> The convention I have been using for code like this, where the initial
> part of the code conditionally puts a value into a maybe1 and the later
> part takes it out again, is to name the first appearance of the variable
> a 0 suffix. So I would rename Values to Values0, and the later ValuesPrime
> to plain Values.
Done.
>> diff --git a/tests/invalid/invalid_pragma.err_exp b/tests/invalid/invalid_pragma.err_exp
>> new file mode 100644
>> index 0000000..6a9fe32
>> --- /dev/null
>> +++ b/tests/invalid/invalid_pragma.err_exp
>> @@ -0,0 +1,2 @@
>> +invalid_pragma.m:006: Error: a `:- pragma' declaration should have the form
>> +invalid_pragma.m:006: `:- pragma pragma_name(pragma_arguments).’
>
> It may help if this continued “`1235’ is not a valid/recognized pragma name”.
I'll look at this one separately too.
Julien.
More information about the reviews
mailing list