From 35e8fbbe2886b2c5c82686f7e0435e5aa6aad32f Mon Sep 17 00:00:00 2001 From: Colomban Wendling Date: Sun, 3 Aug 2014 23:24:33 +0200 Subject: [PATCH] JavaScript: fix handling of various missing semicolons in loops --- tagmanager/ctags/js.c | 16 +++++++++----- tests/ctags/1880687.js | 53 ++++++++++++++++++++++++++++++++++++++++++++- tests/ctags/1880687.js.tags | 12 ++++++++++ 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/tagmanager/ctags/js.c b/tagmanager/ctags/js.c index 1024b6ced..65ab61af9 100644 --- a/tagmanager/ctags/js.c +++ b/tagmanager/ctags/js.c @@ -709,7 +709,7 @@ static void parseSwitch (tokenInfo *const token) } -static void parseLoop (tokenInfo *const token) +static boolean parseLoop (tokenInfo *const token) { /* * Handles these statements @@ -732,6 +732,7 @@ static void parseLoop (tokenInfo *const token) * } * while (number<5); */ + boolean is_terminated = TRUE; if (isKeyword (token, KEYWORD_for) || isKeyword (token, KEYWORD_while)) { @@ -758,7 +759,7 @@ static void parseLoop (tokenInfo *const token) } else { - parseLine(token, FALSE); + is_terminated = parseLine(token, FALSE); } } else if (isKeyword (token, KEYWORD_do)) @@ -777,10 +778,11 @@ static void parseLoop (tokenInfo *const token) } else { - parseLine(token, FALSE); + is_terminated = parseLine(token, FALSE); } - readToken(token); + if (is_terminated) + readToken(token); if (isKeyword (token, KEYWORD_while)) { @@ -794,8 +796,12 @@ static void parseLoop (tokenInfo *const token) */ skipArgumentList(token); } + if (! isType (token, TOKEN_SEMICOLON)) + is_terminated = FALSE; } } + + return is_terminated; } static boolean parseIf (tokenInfo *const token) @@ -1654,7 +1660,7 @@ static boolean parseLine (tokenInfo *const token, boolean is_inside_class) case KEYWORD_for: case KEYWORD_while: case KEYWORD_do: - parseLoop (token); + is_terminated = parseLoop (token); break; case KEYWORD_if: case KEYWORD_else: diff --git a/tests/ctags/1880687.js b/tests/ctags/1880687.js index 2bd5e4116..fbf390ec1 100644 --- a/tests/ctags/1880687.js +++ b/tests/ctags/1880687.js @@ -1,5 +1,5 @@ -// All these examples contain various forms of IF statements +// All these examples contain various forms of statements // with missing semicolons. Each of these are valid and must // be accommodated. // @@ -7,6 +7,9 @@ // The following tags should be generated: // functions // a +// aa +// aa_sub1 [aa] +// aa_sub2 [aa] // b // baz [f] // c @@ -32,6 +35,15 @@ // w // w_sub1 [w] // w_sub2 [w] +// x +// x_sub1 [x] +// x_sub2 [x] +// y +// y_sub1 [y] +// y_sub2 [y] +// z +// z_sub1 [z] +// z_sub2 [z] // classes // MyClass // methods @@ -189,3 +201,42 @@ MyClass = { var dummy5 = 42; } }; + +function x(){ + function x_sub1(){ + while (1) + x_sub2() + } + function x_sub2(){ + } +} + +function y(){ + function y_sub1(){ + while (1) { + y_sub2() + } + } + function y_sub2(){ + } +} + +function z(){ + function z_sub1(){ + do { + z_sub2() + } while (0) + } + function z_sub2(){ + } +} + +function aa(){ + function aa_sub1(){ + do + aa_sub2() + while (0) + } + function aa_sub2(){ + } +} diff --git a/tests/ctags/1880687.js.tags b/tests/ctags/1880687.js.tags index 6e1c57b5b..645ca843e 100644 --- a/tests/ctags/1880687.js.tags +++ b/tests/ctags/1880687.js.tags @@ -3,6 +3,9 @@ MyClass MyClass_sub1Ì128ÎMyClassÖ0 MyClass_sub2Ì128ÎMyClassÖ0 aÌ16Ö0 +aaÌ16Ö0 +aa_sub1Ì16ÎaaÖ0 +aa_sub2Ì16ÎaaÖ0 bÌ16Ö0 bazÌ16ÎfÖ0 cÌ16Ö0 @@ -28,3 +31,12 @@ v wÌ16Ö0 w_sub1Ì16ÎwÖ0 w_sub2Ì16ÎwÖ0 +xÌ16Ö0 +x_sub1Ì16ÎxÖ0 +x_sub2Ì16ÎxÖ0 +yÌ16Ö0 +y_sub1Ì16ÎyÖ0 +y_sub2Ì16ÎyÖ0 +zÌ16Ö0 +z_sub1Ì16ÎzÖ0 +z_sub2Ì16ÎzÖ0 -- 2.11.4.GIT