Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
1 change: 1 addition & 0 deletions inc/cleri/parse.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion inc/ti/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
* "-rc0"
* ""
*/
#define TI_VERSION_PRE_RELEASE "-alpha0"
#define TI_VERSION_PRE_RELEASE "-alpha1"

#define TI_MAINTAINER \
"Jeroen van der Heijden <jeroen@cesbit.com>"
Expand Down
7 changes: 7 additions & 0 deletions itest/test_advanced.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())
6 changes: 4 additions & 2 deletions src/cleri/parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down
27 changes: 27 additions & 0 deletions src/ti/query.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading