mirror of
https://github.com/github/codeql.git
synced 2025-12-18 01:33:15 +01:00
53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
|
|
import os.path
|
|
import csv
|
|
import re
|
|
import semmle.util
|
|
|
|
IGNORE = re.compile("namespace|fieldreq")
|
|
|
|
class Emitter(object):
|
|
|
|
def __init__(self, trap_folder):
|
|
self.trap_folder = trap_folder
|
|
self.lengths = {}
|
|
self.next_id = 0
|
|
self.uuid = semmle.util.uuid('thrift')
|
|
|
|
def emit(self, file, tree):
|
|
trapwriter = semmle.util.TrapWriter()
|
|
vpath = self.trap_folder.get_virtual_path(file)
|
|
self.emit_recursive(trapwriter, vpath, tree, None, None)
|
|
trapwriter.write_file(vpath)
|
|
self.trap_folder.write_trap("thrift", file, trapwriter.get_compressed())
|
|
|
|
def emitrow(self, trapwriter, kind, *args):
|
|
if kind in self.lengths:
|
|
if len(args) != self.lengths[kind]:
|
|
raise Exception("Inconsistent row for '%s': %s, expecting %d" % (kind, args, self.lengths[kind]))
|
|
else:
|
|
self.lengths[kind] = len(args)
|
|
qpath = "thrift-"+kind
|
|
id = trapwriter.get_unique_id()
|
|
for index, value in enumerate(args):
|
|
trapwriter.write_tuple("externalData", "rsds", id, qpath, index, value)
|
|
|
|
def emit_recursive(self, trapwriter, file, node, index, parent):
|
|
self.next_id += 1
|
|
if hasattr(node, "type"):
|
|
tag = node.type
|
|
assert index >= 0
|
|
name = "%s-%s-%s" % (tag, self.next_id, self.uuid)
|
|
self.emitrow(trapwriter, tag, name, index, parent, node.value, file, node.line, node.column)
|
|
else:
|
|
tag = node.data
|
|
if IGNORE.match(tag):
|
|
return
|
|
name = "%s-%s-%s" % (node.data, self.next_id, self.uuid)
|
|
for cindex, child in enumerate(node.children):
|
|
self.emit_recursive(trapwriter, file, child, cindex, name)
|
|
if index is None:
|
|
self.emitrow(trapwriter, tag, name)
|
|
else:
|
|
self.emitrow(trapwriter, tag, name, index, parent)
|