| @@ -32,7 +32,7 @@ class Database(object): | |||||
| def _migrate(self, cursor, current): | def _migrate(self, cursor, current): | ||||
| """Migrate the database to the latest schema version.""" | """Migrate the database to the latest schema version.""" | ||||
| for version in xrange(current, VERSION): | for version in xrange(current, VERSION): | ||||
| print "Migrating to %d..." % version + 1 | |||||
| print "Migrating to %d..." % (version + 1) | |||||
| for query in MIGRATIONS[version - 1]: | for query in MIGRATIONS[version - 1]: | ||||
| cursor.execute(query) | cursor.execute(query) | ||||
| cursor.execute("UPDATE version SET version = ?", (version + 1,)) | cursor.execute("UPDATE version SET version = ?", (version + 1,)) | ||||
| @@ -97,7 +97,7 @@ class Database(object): | |||||
| for type_, name, loc_type, row, col, erow, ecol in cursor.fetchall(): | for type_, name, loc_type, row, col, erow, ecol in cursor.fetchall(): | ||||
| sdict = symbols[Symbol.TYPES_INV[type_]] | sdict = symbols[Symbol.TYPES_INV[type_]] | ||||
| if name not in sdict: | if name not in sdict: | ||||
| sdict[name] = ((), ()) | |||||
| sdict[name] = ([], []) | |||||
| sdict[name][loc_type].append((row, col, erow, ecol)) | sdict[name][loc_type].append((row, col, erow, ecol)) | ||||
| for type_, sdict in symbols.items(): | for type_, sdict in symbols.items(): | ||||
| symbols[type_] = [(n, d, u) for n, (d, u) in sdict.iteritems()] | symbols[type_] = [(n, d, u) for n, (d, u) in sdict.iteritems()] | ||||
| @@ -147,7 +147,7 @@ class Database(object): | |||||
| (DEFAULT, ?, ?, ?, ?, ?, ?)""" | (DEFAULT, ?, ?, ?, ?, ?, ?)""" | ||||
| for (name, decls, uses) in symbols: | for (name, decls, uses) in symbols: | ||||
| cursor.execute(query1, (code_id, Symbol.TYPES_INV[sym_type], name)) | |||||
| cursor.execute(query1, (code_id, Symbol.TYPES_INV.index(sym_type), name)) | |||||
| sym_id = cursor.lastrowid | sym_id = cursor.lastrowid | ||||
| params = ([tuple([sym_id, 0] + list(loc)) for loc in decls] + | params = ([tuple([sym_id, 0] + list(loc)) for loc in decls] + | ||||
| [tuple([sym_id, 1] + list(loc)) for loc in uses]) | [tuple([sym_id, 1] + list(loc)) for loc in uses]) | ||||
| @@ -106,13 +106,7 @@ def parse_via_server(codelet): | |||||
| server_socket.send("%d\n%s" % (len(codelet.code), codelet.code)) | server_socket.send("%d\n%s" % (len(codelet.code), codelet.code)) | ||||
| symbols = json.loads(_recv_data(server_socket)) | symbols = json.loads(_recv_data(server_socket)) | ||||
| symbols = {key: [(name, [tuple(loc) | |||||
| for loc in syms[name]['assignments']], | |||||
| [tuple(loc) for loc in syms[name]['uses']]) | |||||
| for name in syms.keys()] | |||||
| for key, syms in symbols.iteritems()} | |||||
| codelet.symbols = symbols | |||||
| return symbols | |||||
| PARSERS = { | PARSERS = { | ||||
| "Python": parse_py, | "Python": parse_py, | ||||
| @@ -135,4 +129,13 @@ def parse(codelet): | |||||
| lang_string = LANGS[lang] | lang_string = LANGS[lang] | ||||
| codelet.language = lang | codelet.language = lang | ||||
| if lang_string in PARSERS: | if lang_string in PARSERS: | ||||
| PARSERS[lang_string](codelet) | |||||
| symbols = PARSERS[lang_string](codelet) | |||||
| symbols = {key: [(name, [tuple(loc) | |||||
| for loc in syms[name]['assignments']], | |||||
| [tuple(loc) for loc in syms[name]['uses']]) | |||||
| for name in syms.keys()] | |||||
| for key, syms in symbols.iteritems()} | |||||
| codelet.symbols = symbols | |||||
| codelet.symbols = symbols | |||||
| @@ -58,7 +58,7 @@ class _CachedWalker(ast.NodeVisitor): | |||||
| """ | """ | ||||
| line, col = node.lineno, node.col_offset | line, col = node.lineno, node.col_offset | ||||
| pos = (line, col, -1, -1) | |||||
| pos = (line, col, line, col) | |||||
| self.cache.append({'nodes': []}) | self.cache.append({'nodes': []}) | ||||
| self.generic_visit(node) | self.generic_visit(node) | ||||
| @@ -107,7 +107,7 @@ class _CachedWalker(ast.NodeVisitor): | |||||
| """ | """ | ||||
| line, col = node.lineno, node.col_offset | line, col = node.lineno, node.col_offset | ||||
| pos = (line, col, -1, -1) | |||||
| pos = (line, col, line, col) | |||||
| if isinstance(node.func, ast.Name): | if isinstance(node.func, ast.Name): | ||||
| name = node.func.id | name = node.func.id | ||||
| @@ -154,7 +154,7 @@ def parse_py(codelet): | |||||
| :param codelet: The codelet object to parsed. | :param codelet: The codelet object to parsed. | ||||
| :type code: Codelet | |||||
| :type code: list | |||||
| """ | """ | ||||
| def strip_encoding(lines): | def strip_encoding(lines): | ||||
| @@ -179,4 +179,4 @@ def parse_py(codelet): | |||||
| return | return | ||||
| cutter = _CachedWalker() | cutter = _CachedWalker() | ||||
| cutter.visit(tree) | cutter.visit(tree) | ||||
| codelet.symbols = cutter.accum | |||||
| return cutter.accum | |||||
| @@ -194,8 +194,11 @@ class Symbol(_Node): | |||||
| FUNCTION = 0 | FUNCTION = 0 | ||||
| CLASS = 1 | CLASS = 1 | ||||
| VARIABLE = 2 | VARIABLE = 2 | ||||
| TYPES = {FUNCTION: "FUNCTION", CLASS: "CLASS", VARIABLE: "VARIABLE"} | |||||
| TYPES_INV = ["functions", "classes", "vars"] | |||||
| MODULE = 3 | |||||
| INTERFACE = 4 | |||||
| TYPES = {FUNCTION: "FUNCTION", CLASS: "CLASS", VARIABLE: "VARIABLE", | |||||
| MODULE: "MODULE", INTERFACE: "INTERFACE"} | |||||
| TYPES_INV = ["functions", "classes", "vars", "modules", "interfaces"] | |||||
| def __init__(self, type_, name): | def __init__(self, type_, name): | ||||
| """ | """ | ||||