SF.net SVN: geany:[5995] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Tue Oct 4 12:22:36 UTC 2011
Revision: 5995
http://geany.svn.sourceforge.net/geany/?rev=5995&view=rev
Author: ntrel
Date: 2011-10-04 12:22:36 +0000 (Tue, 04 Oct 2011)
Log Message:
-----------
Update from CTags SVN jscript.c.
Modified Paths:
--------------
trunk/ChangeLog
trunk/tagmanager/js.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2011-10-03 17:06:12 UTC (rev 5994)
+++ trunk/ChangeLog 2011-10-04 12:22:36 UTC (rev 5995)
@@ -1,3 +1,9 @@
+2011-10-04 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * tagmanager/js.c:
+ Update from CTags SVN jscript.c.
+
+
2011-10-03 Colomban Wendling <colomban(at)geany(dot)org>
* TODO, configure.ac, doc/geany.txt, geany.nsi, geany_private.rc,
Modified: trunk/tagmanager/js.c
===================================================================
--- trunk/tagmanager/js.c 2011-10-03 17:06:12 UTC (rev 5994)
+++ trunk/tagmanager/js.c 2011-10-04 12:22:36 UTC (rev 5995)
@@ -256,26 +256,56 @@
}
static void makeClassTag (tokenInfo *const token)
-{
+{
+ vString * fulltag;
+
if ( ! token->ignoreTag )
{
- if ( ! stringListHas(ClassNames, vStringValue (token->string)) )
+ fulltag = vStringNew ();
+ if (vStringLength (token->scope) > 0)
{
- stringListAdd (ClassNames, vStringNewCopy (token->string));
+ vStringCopy(fulltag, token->scope);
+ vStringCatS (fulltag, ".");
+ vStringCatS (fulltag, vStringValue(token->string));
+ }
+ else
+ {
+ vStringCopy(fulltag, token->string);
+ }
+ vStringTerminate(fulltag);
+ if ( ! stringListHas(ClassNames, vStringValue (fulltag)) )
+ {
+ stringListAdd (ClassNames, vStringNewCopy (fulltag));
makeJsTag (token, JSTAG_CLASS);
}
+ vStringDelete (fulltag);
}
}
static void makeFunctionTag (tokenInfo *const token)
-{
+{
+ vString * fulltag;
+
if ( ! token->ignoreTag )
{
- if ( ! stringListHas(FunctionNames, vStringValue (token->string)) )
+ fulltag = vStringNew ();
+ if (vStringLength (token->scope) > 0)
{
- stringListAdd (FunctionNames, vStringNewCopy (token->string));
+ vStringCopy(fulltag, token->scope);
+ vStringCatS (fulltag, ".");
+ vStringCatS (fulltag, vStringValue(token->string));
+ }
+ else
+ {
+ vStringCopy(fulltag, token->string);
+ }
+ vStringTerminate(fulltag);
+ if ( ! stringListHas(FunctionNames, vStringValue (fulltag)) )
+ {
+ stringListAdd (FunctionNames, vStringNewCopy (fulltag));
makeJsTag (token, JSTAG_FUNCTION);
}
+ vStringDelete (fulltag);
}
}
@@ -742,6 +772,14 @@
readToken (token);
+ if (isKeyword (token, KEYWORD_if))
+ {
+ /*
+ * Check for an "else if" and consume the "if"
+ */
+ readToken (token);
+ }
+
if (isType (token, TOKEN_OPEN_PAREN))
{
/*
@@ -940,20 +978,32 @@
return is_class;
}
-static void parseMethods (tokenInfo *const token, tokenInfo *const class)
+static boolean parseMethods (tokenInfo *const token, tokenInfo *const class)
{
tokenInfo *const name = newToken ();
+ boolean has_methods = FALSE;
/*
* This deals with these formats
* validProperty : 2,
* validMethod : function(a,b) {}
* 'validMethod2' : function(a,b) {}
+ * container.dirtyTab = {'url': false, 'title':false, 'snapshot':false, '*': false}
*/
do
{
readToken (token);
+ if (isType (token, TOKEN_CLOSE_CURLY))
+ {
+ /*
+ * This was most likely a variable declaration of a hash table.
+ * indicate there were no methods and return.
+ */
+ has_methods = FALSE;
+ goto cleanUp;
+ }
+
if (isType (token, TOKEN_STRING) || isKeyword(token, KEYWORD_NONE))
{
copyToken(name, token);
@@ -972,6 +1022,7 @@
if (isType (token, TOKEN_OPEN_CURLY))
{
+ has_methods = TRUE;
addToScope (name, class->string);
makeJsTag (name, JSTAG_METHOD);
parseBlock (token, name);
@@ -985,6 +1036,7 @@
}
else
{
+ has_methods = TRUE;
addToScope (name, class->string);
makeJsTag (name, JSTAG_PROPERTY);
@@ -1000,7 +1052,10 @@
findCmdTerm (token);
+cleanUp:
deleteToken (name);
+
+ return has_methods;
}
static boolean parseStatement (tokenInfo *const token, boolean is_inside_class)
@@ -1012,6 +1067,8 @@
boolean is_terminated = TRUE;
boolean is_global = FALSE;
boolean is_prototype = FALSE;
+ boolean has_methods = FALSE;
+ vString * fulltag;
vStringClear(saveScope);
/*
@@ -1324,8 +1381,62 @@
* 'validMethodOne' : function(a,b) {},
* 'validMethodTwo' : function(a,b) {}
* }
+ * Or checks if this is a hash variable.
+ * var z = {};
*/
- parseMethods(token, name);
+ has_methods = parseMethods(token, name);
+ if ( ! has_methods )
+ {
+ /*
+ * Only create variables for global scope
+ */
+ if ( token->nestLevel == 0 && is_global )
+ {
+ /*
+ * A pointer can be created to the function.
+ * If we recognize the function/class name ignore the variable.
+ * This format looks identical to a variable definition.
+ * A variable defined outside of a block is considered
+ * a global variable:
+ * var g_var1 = 1;
+ * var g_var2;
+ * This is not a global variable:
+ * var g_var = function;
+ * This is a global variable:
+ * var g_var = different_var_name;
+ */
+ fulltag = vStringNew ();
+ if (vStringLength (token->scope) > 0)
+ {
+ vStringCopy(fulltag, token->scope);
+ vStringCatS (fulltag, ".");
+ vStringCatS (fulltag, vStringValue(token->string));
+ }
+ else
+ {
+ vStringCopy(fulltag, token->string);
+ }
+ vStringTerminate(fulltag);
+ if ( ! stringListHas(FunctionNames, vStringValue (fulltag)) &&
+ ! stringListHas(ClassNames, vStringValue (fulltag)) )
+ {
+ readToken (token);
+ if ( ! isType (token, TOKEN_SEMICOLON))
+ findCmdTerm (token);
+ if (isType (token, TOKEN_SEMICOLON))
+ makeJsTag (name, JSTAG_VARIABLE);
+ }
+ vStringDelete (fulltag);
+ }
+ }
+ if (isType (token, TOKEN_CLOSE_CURLY))
+ {
+ /*
+ * Assume the closing parantheses terminates
+ * this statements.
+ */
+ is_terminated = TRUE;
+ }
}
else if (isKeyword (token, KEYWORD_new))
{
@@ -1345,11 +1456,14 @@
if (isType (token, TOKEN_SEMICOLON))
{
- if ( is_class )
+ if ( token->nestLevel == 0 )
{
- makeClassTag (name);
- } else {
- makeFunctionTag (name);
+ if ( is_class )
+ {
+ makeClassTag (name);
+ } else {
+ makeFunctionTag (name);
+ }
}
}
}
@@ -1374,13 +1488,26 @@
* This is a global variable:
* var g_var = different_var_name;
*/
- if ( ! stringListHas(FunctionNames, vStringValue (token->string)) &&
- ! stringListHas(ClassNames, vStringValue (token->string)) )
+ fulltag = vStringNew ();
+ if (vStringLength (token->scope) > 0)
{
+ vStringCopy(fulltag, token->scope);
+ vStringCatS (fulltag, ".");
+ vStringCatS (fulltag, vStringValue(token->string));
+ }
+ else
+ {
+ vStringCopy(fulltag, token->string);
+ }
+ vStringTerminate(fulltag);
+ if ( ! stringListHas(FunctionNames, vStringValue (fulltag)) &&
+ ! stringListHas(ClassNames, vStringValue (fulltag)) )
+ {
findCmdTerm (token);
if (isType (token, TOKEN_SEMICOLON))
makeJsTag (name, JSTAG_VARIABLE);
}
+ vStringDelete (fulltag);
}
}
}
@@ -1398,7 +1525,7 @@
* return 1;
* }
*/
- if (isType (token, TOKEN_CLOSE_CURLY))
+ if ( ! is_terminated && isType (token, TOKEN_CLOSE_CURLY))
is_terminated = FALSE;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list