Branch: refs/heads/master Author: Colomban Wendling ban@herbesfolles.org Committer: Colomban Wendling ban@herbesfolles.org Date: Sun, 14 Jun 2015 22:10:09 UTC Commit: 733b10efc4f3d757726376e453e880d6409db62d https://github.com/geany/geany/commit/733b10efc4f3d757726376e453e880d6409db6...
Log Message: ----------- Merge branch 'universal-ctags-fixes'
Import some various parser fixes from Universal CTags.
Modified Paths: -------------- tagmanager/ctags/get.c tagmanager/ctags/json.c tagmanager/ctags/python.c tagmanager/ctags/read.c tagmanager/ctags/read.h tagmanager/ctags/vstring.c tagmanager/ctags/vstring.h tests/ctags/Makefile.am tests/ctags/c-digraphs.c tests/ctags/c-digraphs.c.tags tests/ctags/c-trigraphs.c tests/ctags/c-trigraphs.c.tags tests/ctags/dotted-names.json tests/ctags/dotted-names.json.tags tests/ctags/python-anonymous-nestlevel_ctags-bug-356.py tests/ctags/python-anonymous-nestlevel_ctags-bug-356.py.tags
Modified: tagmanager/ctags/get.c 43 lines changed, 40 insertions(+), 3 deletions(-) =================================================================== @@ -648,8 +648,6 @@ extern int cppGetc (void)
if (next == NEWLINE) continue; - else if (next == '?') - cppUngetc (next); else fileUngetc (next); break; @@ -675,13 +673,49 @@ extern int cppGetc (void) case '-': c = '~'; break; case '=': c = '#'; goto process; default: + fileUngetc ('?'); fileUngetc (next); - cppUngetc ('?'); break; } } } break;
+ /* digraphs: + * input: <: :> <% %> %: %:%: + * output: [ ] { } # ## + */ + case '<': + { + int next = fileGetc (); + switch (next) + { + case ':': c = '['; break; + case '%': c = '{'; break; + default: fileUngetc (next); + } + goto enter; + } + case ':': + { + int next = fileGetc (); + if (next == '>') + c = ']'; + else + fileUngetc (next); + goto enter; + } + case '%': + { + int next = fileGetc (); + switch (next) + { + case '>': c = '}'; break; + case ':': c = '#'; goto process; + default: fileUngetc (next); + } + goto enter; + } + default: if (c == '@' && Cpp.hasAtLiteralStrings) { @@ -692,7 +726,10 @@ extern int cppGetc (void) c = skipToEndOfString (TRUE); break; } + else + fileUngetc (next); } + enter: Cpp.directive.accept = FALSE; if (directive) ignore = handleDirective (c);
Modified: tagmanager/ctags/json.c 10 lines changed, 1 insertions(+), 9 deletions(-) =================================================================== @@ -227,15 +227,7 @@ static void pushScope (tokenInfo *const token, static void popScope (tokenInfo *const token, const tokenInfo *const parent) { - char *dot = strrchr (token->scope->buffer, '.'); - - if (! dot) - vStringClear (token->scope); - else - { - *dot = 0; - token->scope->length = dot - token->scope->buffer; - } + vStringTruncate (token->scope, vStringLength (parent->scope)); token->scopeKind = parent->scopeKind; }
Modified: tagmanager/ctags/python.c 18 lines changed, 6 insertions(+), 12 deletions(-) =================================================================== @@ -463,10 +463,8 @@ static boolean constructParentString(NestingLevels *nls, int indent, return is_class; }
-/* Check whether parent's indentation level is higher than the current level and - * if so, remove it. - */ -static void checkParent(NestingLevels *nls, int indent, vString *parent) +/* Check indentation level and truncate nesting levels accordingly */ +static void checkIndent(NestingLevels *nls, int indent) { int i; NestingLevel *n; @@ -474,14 +472,10 @@ static void checkParent(NestingLevels *nls, int indent, vString *parent) for (i = 0; i < nls->n; i++) { n = nls->levels + i; - /* is there a better way to compare two vStrings? */ - if (n && strcmp(vStringValue(parent), vStringValue(n->name)) == 0) + if (n && indent <= n->indentation) { - if (indent <= n->indentation) - { - /* remove this level by clearing its name */ - vStringClear(n->name); - } + /* truncate levels */ + nls->n = i; break; } } @@ -749,7 +743,7 @@ static void findPythonTags (void) continue; } - checkParent(nesting_levels, indent, parent); + checkIndent(nesting_levels, indent);
/* Find global and class variables */ variable = findVariable(line);
Modified: tagmanager/ctags/read.c 12 lines changed, 8 insertions(+), 4 deletions(-) =================================================================== @@ -428,7 +428,12 @@ static int iFileGetc (void)
extern void fileUngetc (int c) { - File.ungetch = c; + const size_t len = sizeof File.ungetchBuf / sizeof File.ungetchBuf[0]; + + Assert (File.ungetchIdx < len); + /* we cannot rely on the assertion that might be disabled in non-debug mode */ + if (File.ungetchIdx < len) + File.ungetchBuf[File.ungetchIdx++] = c; }
static vString *iFileGetLine (void) @@ -468,10 +473,9 @@ extern int fileGetc (void) * other processing on it, though, because we already did that the * first time it was read through fileGetc (). */ - if (File.ungetch != '\0') + if (File.ungetchIdx > 0) { - c = File.ungetch; - File.ungetch = '\0'; + c = File.ungetchBuf[--File.ungetchIdx]; return c; /* return here to avoid re-calling debugPutc () */ } do
Modified: tagmanager/ctags/read.h 3 lines changed, 2 insertions(+), 1 deletions(-) =================================================================== @@ -70,7 +70,8 @@ typedef struct sInputFile { MIO *mio; /* stream used for reading the file */ unsigned long lineNumber; /* line number in the input file */ MIOPos filePosition; /* file position of current line */ - int ungetch; /* a single character that was ungotten */ + unsigned int ungetchIdx; + int ungetchBuf[3]; /* characters that were ungotten */ boolean eof; /* have we reached the end of file? */ boolean newLine; /* will the next character begin a new line? */
Modified: tagmanager/ctags/vstring.c 13 lines changed, 10 insertions(+), 3 deletions(-) =================================================================== @@ -54,11 +54,18 @@ extern boolean vStringAutoResize (vString *const string) return ok; }
+extern void vStringTruncate (vString *const string, const size_t length) +{ + Assert (length <= string->length); + string->length = length; + vStringTerminate (string); + DebugStatement ( memset (string->buffer + string->length, 0, + string->size - string->length); ) +} + extern void vStringClear (vString *const string) { - string->length = 0; - string->buffer [0] = '\0'; - DebugStatement ( memset (string->buffer, 0, string->size); ) + vStringTruncate (string, 0); }
extern void vStringDelete (vString *const string)
Modified: tagmanager/ctags/vstring.h 1 lines changed, 1 insertions(+), 0 deletions(-) =================================================================== @@ -77,6 +77,7 @@ extern void vStringCopyS (vString *const string, const char *const s); extern void vStringNCopyS (vString *const string, const char *const s, const size_t length); extern void vStringCopyToLower (vString *const dest, const vString *const src); extern void vStringSetLength (vString *const string); +extern void vStringTruncate (vString *const string, const size_t length);
#endif /* _VSTRING_H */
Modified: tests/ctags/Makefile.am 4 lines changed, 4 insertions(+), 0 deletions(-) =================================================================== @@ -108,6 +108,8 @@ test_sources = \ bug960316.v \ bug961001.v \ byte.f \ + c-digraphs.c \ + c-trigraphs.c \ case_sensitivity.php \ char-selector.f90 \ classes.php \ @@ -134,6 +136,7 @@ test_sources = \ debian_432872.f90 \ directives.c \ dopbl2.f \ + dotted-names.json \ enum.c \ enum.f90 \ enum.java \ @@ -235,6 +238,7 @@ test_sources = \ pure_elem.f95 \ py_constructor_arglist.py \ py-skipped-string.py \ + python-anonymous-nestlevel_ctags-bug-356.py \ qualified_types.f90 \ random.sql \ readlob.sql \
Modified: tests/ctags/c-digraphs.c 35 lines changed, 35 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,35 @@ + +/* simple trigraphs */ +%:define A 1 +%:define B 2 +%:define STRINGIFY_INTERN(x) %:x +%:define STRINGIFY(x) STRINGIFY_INTERN(x) + +%:define M3_INIT(a, b, c) <% a, b, c %> +typedef int matrix3<:3:>; + +struct str <% + char *buf; + unsigned int len, size; +%>; + +int main(void) +<% + const char *hello = STRINGIFY(hello); + matrix3 m = M3_INIT(1, 2, 3); + + return m<:2:>; +%> + +%:if 0 +#define bug4 +%:endif + + +/* test the same with untaken preprocessor paths (as they are then not read by + * the C parser but get.c) */ +#if 0 +%:define if0d_A 1 +%:define if0d_B 2 +#endif +
Modified: tests/ctags/c-digraphs.c.tags 12 lines changed, 12 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,12 @@ +# format=tagmanager +A�65536�0 +B�65536�0 +M3_INIT�131072�(a, b, c)�0 +STRINGIFY�131072�(x)�0 +STRINGIFY_INTERN�131072�(x)�0 +buf�64�str�0�char +len�64�str�0�int +main�16�(void)�0�int +matrix3�4096�0�int +size�64�str�0�int +str�2048�0
Modified: tests/ctags/c-trigraphs.c 56 lines changed, 56 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,56 @@ + +/* simple trigraphs */ +??=define A 1 +??=define B 2 +??=define STRINGIFY_INTERN(x) ??=x +??=define STRINGIFY(x) STRINGIFY_INTERN(x) + +/* doesn't expand to anything that makes sense, but as "???" is not a valid + * trigraph it should not prevent "??/" to match */ +??=define D 4 ???/ +#define bug1 +??=define E ?????/ +#define bug2 + +/* \ isn't interpreted for trigraphs */ +??=define F ?????/ +extern int bug3 = ??-0; + +??=define M3_INIT(a, b, c) ??< a, b, c ??> +typedef int matrix3??(3??); + +struct str ??< + char *buf; + unsigned int len, size; +??>; + +int main(void) +??< + const char *hello = STRINGIFY(hello); + matrix3 m = M3_INIT(1, 2, 3); + + return m??(2??); +??> + +/* FIXME: how to test "??'" ("^"), "??!" ("|") and "??-" ("~")? + * I can't think of a construct CTags cares about using those */ + +??=if 0 +#define bug4 +??=endif + + +/* test the same with untaken preprocessor paths (as they are then not read by + * the C parser but get.c) */ +#if 0 + +??=define if0d_A 1 +??=define if0d_B 2 +??=define if0d_C 4 ???/ +#define bug5 +??=define I ?????/ +#define bug6 +??=define I ??????????/ +#define bug7 + +#endif
Modified: tests/ctags/c-trigraphs.c.tags 15 lines changed, 15 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,15 @@ +# format=tagmanager +A�65536�0 +B�65536�0 +D�65536�0 +E�65536�0 +F�65536�0 +M3_INIT�131072�(a, b, c)�0 +STRINGIFY�131072�(x)�0 +STRINGIFY_INTERN�131072�(x)�0 +buf�64�str�0�char +len�64�str�0�int +main�16�(void)�0�int +matrix3�4096�0�int +size�64�str�0�int +str�2048�0
Modified: tests/ctags/dotted-names.json 25 lines changed, 25 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,25 @@ +{ + "first.name": "John", + "last.name": "Smith", + "is.alive": true, + "age": 25, + "height_cm": 167.6, + "address": { + "street.address": "21 2nd Street", + "city": "New York", + "state": "NY", + "postal.code": "10021-3100" + }, + "phone.numbers": [ + { + "type": "home", + "number": "212 555-1234" + }, + { + "type": "office", + "number": "646 555-4567" + } + ], + "children": [], + "spouse": null +}
Modified: tests/ctags/dotted-names.json.tags 20 lines changed, 20 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,20 @@ +# format=tagmanager +0�64�phone.numbers�0 +1�64�phone.numbers�0 +address�64�0 +age�64�0 +children�64�0 +city�64�address�0 +first.name�64�0 +height_cm�64�0 +is.alive�64�0 +last.name�64�0 +number�64�phone.numbers.0�0 +number�64�phone.numbers.1�0 +phone.numbers�64�0 +postal.code�64�address�0 +spouse�64�0 +state�64�address�0 +street.address�64�address�0 +type�64�phone.numbers.0�0 +type�64�phone.numbers.1�0
Modified: tests/ctags/python-anonymous-nestlevel_ctags-bug-356.py 6 lines changed, 6 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,6 @@ +class Testclass(): + def main(self): + variable = True + +if __name__ == "__main__": + module_level_attribute = True
Modified: tests/ctags/python-anonymous-nestlevel_ctags-bug-356.py.tags 4 lines changed, 4 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,4 @@ +# format=tagmanager +Testclass�1�0 +main�128�(self)�Testclass�0 +module_level_attribute�16384�0
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).