SF.net SVN: geany:[3804] trunk
eht16 at users.sourceforge.net
eht16 at xxxxx
Tue May 19 20:17:22 UTC 2009
Revision: 3804
http://geany.svn.sourceforge.net/geany/?rev=3804&view=rev
Author: eht16
Date: 2009-05-19 20:17:21 +0000 (Tue, 19 May 2009)
Log Message:
-----------
Parse Python import statements to get symbol completion for the imported module names.
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/symbols.c
trunk/tagmanager/python.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2009-05-19 11:21:18 UTC (rev 3803)
+++ trunk/ChangeLog 2009-05-19 20:17:21 UTC (rev 3804)
@@ -1,3 +1,10 @@
+2009-05-19 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+
+ * src/symbols.c, tagmanager/python.c:
+ Parse Python import statements to get symbol completion for the
+ imported module names.
+
+
2009-05-19 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/editor.c:
Modified: trunk/src/symbols.c
===================================================================
--- trunk/src/symbols.c 2009-05-19 11:21:18 UTC (rev 3803)
+++ trunk/src/symbols.c 2009-05-19 20:17:21 UTC (rev 3804)
@@ -731,6 +731,7 @@
&(tv_iters.tag_member), _("Methods"), "classviewer-macro",
&(tv_iters.tag_function), _("Functions"), "classviewer-method",
&(tv_iters.tag_variable), _("Variables"), "classviewer-var",
+ &(tv_iters.tag_namespace), _("Imports"), "classviewer-namespace",
NULL);
/*&(tv_iters.tag_macro), _("Mixin"),*/
/*&(tv_iters.tag_variable), _("Variables"),*/
Modified: trunk/tagmanager/python.c
===================================================================
--- trunk/tagmanager/python.c 2009-05-19 11:21:18 UTC (rev 3803)
+++ trunk/tagmanager/python.c 2009-05-19 20:17:21 UTC (rev 3804)
@@ -27,14 +27,15 @@
* DATA DEFINITIONS
*/
typedef enum {
- K_CLASS, K_FUNCTION, K_MEMBER, K_VARIABLE
+ K_CLASS, K_FUNCTION, K_MEMBER, K_VARIABLE, K_IMPORT
} pythonKind;
static kindOption PythonKinds[] = {
{TRUE, 'c', "class", "classes"},
{TRUE, 'f', "function", "functions"},
{TRUE, 'm', "member", "class members"},
- {TRUE, 'v', "variable", "variables"}
+ {TRUE, 'v', "variable", "variables"},
+ {TRUE, 'i', "namespace", "imports"}
};
static char const * const singletriple = "'''";
@@ -247,6 +248,49 @@
vStringDelete (inheritance);
}
+static void parseImports (const char *cp)
+{
+ const char *pos;
+ vString *name, *name_next;
+
+ cp = skipEverything (cp);
+
+ if ((pos = strstr (cp, "import")) == NULL)
+ return;
+
+ cp = pos + 6;
+
+ /* continue only if there is some space between the keyword and the identifier */
+ if (! isspace (*cp))
+ return;
+
+ cp++;
+ cp = skipSpace (cp);
+
+ name = vStringNew ();
+ name_next = vStringNew ();
+
+ cp = skipEverything (cp);
+ while (*cp)
+ {
+ cp = parseIdentifier (cp, name);
+
+ cp = skipEverything (cp);
+ /* we parse the next possible import statement as well to be able to ignore 'foo' in
+ * 'import foo as bar' */
+ parseIdentifier (cp, name_next);
+
+ /* take the current tag only if the next one is not "as" */
+ if (strcmp (vStringValue (name_next), "as") != 0 &&
+ strcmp (vStringValue (name), "as") != 0)
+ {
+ makeSimpleTag (name, PythonKinds, K_IMPORT);
+ }
+ }
+ vStringDelete (name);
+ vStringDelete (name_next);
+}
+
static void parseFunction (const char *cp, vString *const def,
vString *const parent, int is_class_parent)
{
@@ -428,18 +472,18 @@
}
/* Skip type declaration that optionally follows a cdef/cpdef */
-static const char *skipTypeDecl (const char *cp, boolean *is_class)
-{
+static const char *skipTypeDecl (const char *cp, boolean *is_class)
+{
const char *lastStart = cp, *ptr = cp;
int loopCount = 0;
ptr = skipSpace(cp);
- if (!strncmp("extern", ptr, 6)) {
- ptr += 6;
- ptr = skipSpace(ptr);
+ if (!strncmp("extern", ptr, 6)) {
+ ptr += 6;
+ ptr = skipSpace(ptr);
if (!strncmp("from", ptr, 4)) { return NULL; }
}
if (!strncmp("class", ptr, 5)) {
- ptr += 5 ;
+ ptr += 5 ;
*is_class = TRUE;
ptr = skipSpace(ptr);
return ptr;
@@ -450,7 +494,7 @@
if (!*ptr || *ptr == '=') return NULL;
if (*ptr == '(') {
return lastStart; /* if we stopped on a '(' we are done */
- }
+ }
ptr = skipSpace(ptr);
lastStart = ptr;
while (*lastStart == '*') lastStart++; /* cdef int *identifier */
@@ -539,7 +583,7 @@
is_class = TRUE;
}
else if (!strncmp (keyword, "cdef ", 5))
- {
+ {
cp = skipSpace(keyword + 4);
candidate = skipTypeDecl (cp, &is_class);
if (candidate)
@@ -550,7 +594,7 @@
}
else if (!strncmp (keyword, "cpdef ", 6))
- {
+ {
cp = skipSpace(keyword + 5);
candidate = skipTypeDecl (cp, &is_class);
if (candidate)
@@ -597,6 +641,8 @@
makeVariableTag (name, parent);
}
+ /* Find and parse imports */
+ parseImports(line);
}
/* Clean up all memory we allocated. */
vStringDelete (parent);
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