From d627c839bfa2d62e4da9324db62f822114711e51 Mon Sep 17 00:00:00 2001 From: Ge Wang Date: Thu, 3 Oct 2024 21:42:38 -0700 Subject: [PATCH] fix error after multiline string literal; add two unit tests --- src/core/chuck_errmsg.cpp | 30 +++++++++++++------ .../error-after-multiline-string-1.ck | 10 +++++++ .../error-after-multiline-string-1.txt | 6 ++++ .../error-after-multiline-string-2.ck | 10 +++++++ .../error-after-multiline-string-2.txt | 6 ++++ 5 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 src/test/06-Errors/error-after-multiline-string-1.ck create mode 100644 src/test/06-Errors/error-after-multiline-string-1.txt create mode 100644 src/test/06-Errors/error-after-multiline-string-2.ck create mode 100644 src/test/06-Errors/error-after-multiline-string-2.txt diff --git a/src/core/chuck_errmsg.cpp b/src/core/chuck_errmsg.cpp index 043da2731..c0655380f 100644 --- a/src/core/chuck_errmsg.cpp +++ b/src/core/chuck_errmsg.cpp @@ -145,16 +145,28 @@ static IntList intList( t_CKINT i, IntList rest ) void EM_newline( t_CKINT pos, t_CKINT lineNum ) { // debug print - // cerr << "pos: " << pos << " lineNum: " << lineNum << " EM_lineNum: " << EM_lineNum << endl; + // cerr << "pos: " << pos << " lineNum: " << lineNum + // << " EM_lineNum: " << EM_lineNum << endl; - // HACK: this is specifically for multi-line strings - // for( int i = EM_lineNum; i < lineNum; i++ ) - // the_linePos = intList( pos, the_linePos ); - - // set to new line num - EM_lineNum++; - // add to linked list - the_linePos = intList( pos, the_linePos ); + // line num progress + t_CKINT diff = lineNum - EM_lineNum; + // this could happen, apparently, with single-line comments... + if( diff < 1 ) + { + // increment line num + EM_lineNum++; + // add to linked list + the_linePos = intList( pos, the_linePos ); + } + else // diff == 1 (another line of code) or... + // diff > 1 (multi-line string literal, does not call EM_newline until the end) + { + // create nodes for one or more lines + for( int i = EM_lineNum; i < lineNum; i++ ) + the_linePos = intList( pos, the_linePos ); + // set to new line num + EM_lineNum = lineNum; + } } diff --git a/src/test/06-Errors/error-after-multiline-string-1.ck b/src/test/06-Errors/error-after-multiline-string-1.ck new file mode 100644 index 000000000..8da6019a4 --- /dev/null +++ b/src/test/06-Errors/error-after-multiline-string-1.ck @@ -0,0 +1,10 @@ +// test error reporting after a multi-line string literal +// (without trailing one-line comment) +" +multi +line +chuck +string +" => string foo; + +[1,2,3] => int bar[]; // syntax error diff --git a/src/test/06-Errors/error-after-multiline-string-1.txt b/src/test/06-Errors/error-after-multiline-string-1.txt new file mode 100644 index 000000000..2d6325c08 --- /dev/null +++ b/src/test/06-Errors/error-after-multiline-string-1.txt @@ -0,0 +1,6 @@ +error-after-multiline-string-1.ck:10:9: error: cannot resolve operator '=>' on types 'int[]' and 'int[]'... +[10] [1,2,3] => int bar[]; // syntax error + ^ +error-after-multiline-string-1.ck:10:9: error: ...(note: use '@=>' for object reference assignment) +[10] [1,2,3] => int bar[]; // syntax error + ^ diff --git a/src/test/06-Errors/error-after-multiline-string-2.ck b/src/test/06-Errors/error-after-multiline-string-2.ck new file mode 100644 index 000000000..bfcb8e066 --- /dev/null +++ b/src/test/06-Errors/error-after-multiline-string-2.ck @@ -0,0 +1,10 @@ +// test error reporting after a multi-line string literal +// (without trailing one-line comment) +" +multi +line +chuck +string +" => string foo; + +[1,2,3] => int bar[]; diff --git a/src/test/06-Errors/error-after-multiline-string-2.txt b/src/test/06-Errors/error-after-multiline-string-2.txt new file mode 100644 index 000000000..19e066bb9 --- /dev/null +++ b/src/test/06-Errors/error-after-multiline-string-2.txt @@ -0,0 +1,6 @@ +error-after-multiline-string-2.ck:10:9: error: cannot resolve operator '=>' on types 'int[]' and 'int[]'... +[10] [1,2,3] => int bar[]; + ^ +error-after-multiline-string-2.ck:10:9: error: ...(note: use '@=>' for object reference assignment) +[10] [1,2,3] => int bar[]; + ^