[geany/geany] 5a1a22: javascript: Properly handle nested unknown blocks
Colomban Wendling
git-noreply at xxxxx
Mon Nov 24 01:41:57 UTC 2014
Branch: refs/heads/master
Author: Colomban Wendling <ban at herbesfolles.org>
Committer: Colomban Wendling <ban at herbesfolles.org>
Date: Mon, 24 Nov 2014 01:41:57 UTC
Commit: 5a1a22d9306fdf0e4352127b12cafd8555ea55b8
https://github.com/geany/geany/commit/5a1a22d9306fdf0e4352127b12cafd8555ea55b8
Log Message:
-----------
javascript: Properly handle nested unknown blocks
Properly match open curly braces when parsing a statement not to
possibly get fooled by unexpected nested blocks, e.g. after a
`switch`'s `case` or a label.
This mostly reverts c54c3ad5e815d16e3b48f3c477465627808aadee and
replaces it with a more correct and complete solution.
Modified Paths:
--------------
tagmanager/ctags/js.c
tests/ctags/Makefile.am
tests/ctags/js-unknown-construct-nesting.js
tests/ctags/js-unknown-construct-nesting.js.tags
Modified: tagmanager/ctags/js.c
40 lines changed, 11 insertions(+), 29 deletions(-)
===================================================================
@@ -169,7 +169,7 @@ static const keywordDesc JsKeywordTable [] = {
/* Recursive functions */
static void parseFunction (tokenInfo *const token);
-static boolean parseBlock (tokenInfo *const token, tokenInfo *const parent);
+static boolean parseBlock (tokenInfo *const token, tokenInfo *const orig_parent);
static boolean parseLine (tokenInfo *const token, boolean is_inside_class);
static void parseUI5 (tokenInfo *const token);
@@ -674,31 +674,6 @@ static void findCmdTerm (tokenInfo *const token)
}
}
-static void findMatchingToken (tokenInfo *const token, tokenType begin_token, tokenType end_token)
-{
- int nest_level = 0;
-
- if ( ! isType (token, end_token))
- {
- nest_level++;
- while (! (isType (token, end_token) && (nest_level == 0)))
- {
- readToken (token);
- if (isType (token, begin_token))
- {
- nest_level++;
- }
- if (isType (token, end_token))
- {
- if (nest_level > 0)
- {
- nest_level--;
- }
- }
- }
- }
-}
-
static void parseSwitch (tokenInfo *const token)
{
/*
@@ -726,9 +701,8 @@ static void parseSwitch (tokenInfo *const token)
if (isType (token, TOKEN_OPEN_CURLY))
{
- findMatchingToken (token, TOKEN_OPEN_CURLY, TOKEN_CLOSE_CURLY);
+ parseBlock (token, token);
}
-
}
static boolean parseLoop (tokenInfo *const token)
@@ -951,11 +925,15 @@ static void parseFunction (tokenInfo *const token)
deleteToken (name);
}
-static boolean parseBlock (tokenInfo *const token, tokenInfo *const parent)
+static boolean parseBlock (tokenInfo *const token, tokenInfo *const orig_parent)
{
boolean is_class = FALSE;
boolean read_next_token = TRUE;
vString * saveScope = vStringNew ();
+ tokenInfo *const parent = newToken ();
+
+ /* backup the parent token to allow calls like parseBlock(token, token) */
+ copyToken (parent, orig_parent);
token->nestLevel++;
/*
@@ -1041,6 +1019,7 @@ static boolean parseBlock (tokenInfo *const token, tokenInfo *const parent)
} while (! isType (token, TOKEN_CLOSE_CURLY) && read_next_token );
}
+ deleteToken (parent);
vStringDelete(saveScope);
token->nestLevel--;
@@ -1228,6 +1207,9 @@ static boolean parseStatement (tokenInfo *const token, boolean is_inside_class)
! isType (token, TOKEN_SEMICOLON) &&
! isType (token, TOKEN_EQUAL_SIGN) )
{
+ if (isType (token, TOKEN_OPEN_CURLY))
+ parseBlock (token, token);
+
/* Potentially the name of the function */
readToken (token);
if (isType (token, TOKEN_PERIOD))
Modified: tests/ctags/Makefile.am
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -160,6 +160,7 @@ test_sources = \
invalid_name.f90 \
java_enum.java \
js-scope.js \
+ js-unknown-construct-nesting.js \
jsFunc_tutorial.js \
keyword_abstract.cs \
keyword_catch_try.cs \
Modified: tests/ctags/js-unknown-construct-nesting.js
23 lines changed, 23 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,23 @@
+
+var o = {
+ aa: function () {
+ foo: {
+ return ;
+ }
+ },
+
+ bb: function (a) {
+ switch (a) {
+ case 1:
+ if (1) {
+ return 32
+ }
+ break;
+ case 2:
+ return 31;
+ }
+ return 1;
+ },
+
+ cc: function() {}
+};
Modified: tests/ctags/js-unknown-construct-nesting.js.tags
5 lines changed, 5 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,5 @@
+# format=tagmanager
+aa�128�o�0
+bb�128�o�0
+cc�128�o�0
+o�1�0
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Commits
mailing list