diff --git a/CHANGELOG.md b/CHANGELOG.md index 522c0e06a..60bdc7745 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ -# v1.10.3-alpha0 +# v1.10.3-alpha1 * Add `int.of_type(..)` to convert an ID to a stored intance, pr #466. +* Improve error message when typing `f()!=x`, ambiguous operator, pr #468. # v1.10.2 diff --git a/inc/cleri/parse.h b/inc/cleri/parse.h index 49dd397f0..019af035e 100644 --- a/inc/cleri/parse.h +++ b/inc/cleri/parse.h @@ -48,6 +48,7 @@ cleri_parse_t * cleri_parse2( int flags); void cleri_parse_free(cleri_parse_t * pr); void cleri_parse_expect_start(cleri_parse_t * pr); +void cleri_parse_line_pos(cleri_parse_t * pr, size_t * line, size_t * pos); int cleri_parse_strn( char * s, size_t n, diff --git a/inc/ti/version.h b/inc/ti/version.h index 71a55ffa4..77fd11506 100644 --- a/inc/ti/version.h +++ b/inc/ti/version.h @@ -25,7 +25,7 @@ * "-rc0" * "" */ -#define TI_VERSION_PRE_RELEASE "-alpha0" +#define TI_VERSION_PRE_RELEASE "-alpha1" #define TI_MAINTAINER \ "Jeroen van der Heijden " diff --git a/itest/test_advanced.py b/itest/test_advanced.py index 733cc50fe..e2c202b7e 100755 --- a/itest/test_advanced.py +++ b/itest/test_advanced.py @@ -3174,6 +3174,13 @@ async def test_wse_shortcut_str(self, client: Client): """) self.assertEqual(res, "||nse()!=0&&wse()!=0") + # pr #468 + with self.assertRaisesRegex( + SyntaxError, + r"error at line 1, position 6, ambiguous operator `!=`, " + r"add a space between `\)` and `!=` to resolve"): + await client.query('test()!=0;') + if __name__ == '__main__': run_test(TestAdvanced()) diff --git a/src/cleri/parse.c b/src/cleri/parse.c index 27f082eb1..4447d5231 100644 --- a/src/cleri/parse.c +++ b/src/cleri/parse.c @@ -132,7 +132,7 @@ void cleri_parse_expect_start(cleri_parse_t * pr) pr->expect = pr->expecting->required; } -static void parse__line_pos(cleri_parse_t * pr, size_t * line, size_t * pos) +void cleri_parse_line_pos(cleri_parse_t * pr, size_t * line, size_t * pos) { size_t n = pr->pos; const char * pt = pr->str; @@ -210,10 +210,12 @@ int cleri_parse_strn( { return snprintf(s, n, "parsed successfully"); } + /* make sure expecting is at start */ cleri_parse_expect_start(pr); - parse__line_pos(pr, &line, &pos); + /* get line and position */ + cleri_parse_line_pos(pr, &line, &pos); rc = snprintf(s, n, "error at line %zu, position %zu", line, pos); if (rc < 0) diff --git a/src/ti/query.c b/src/ti/query.c index 21104b3a3..cebaed634 100644 --- a/src/ti/query.c +++ b/src/ti/query.c @@ -526,8 +526,35 @@ static inline int ti_query_investigate(ti_query_t * query, ex_t * e) return e->nr; } +/* improve error message, pr #468 */ +static int query__test_ambiguous_ne(ti_query_t * query, ex_t * e) +{ + cleri_parse_t * pr = query->with.parseres; + size_t pos = pr->pos; + const char * str = pr->str; + if (!pr->is_valid && + pos >= 4 && + str[pos] == '=' && + str[pos-1] == '!' && + str[pos-2] == ')') + { + size_t line, pos; + cleri_parse_expect_start(pr); + cleri_parse_line_pos(pr, &line, &pos); + ex_set(e, EX_SYNTAX_ERROR, + "error at line %zu, position %zu, ambiguous operator `!=`, " + "add a space between `)` and `!=` to resolve", + line, pos-1); + return e->nr; + } + return 0; +} + static int query__syntax_err(ti_query_t * query, ex_t * e) { + if (query__test_ambiguous_ne(query, e)) + return e->nr; + int i = cleri_parse_strn( e->msg, EX_MAX_SZ,