def __link__(self, file, link_element): path = os.path.abspath(link_element.code_range.dir + file) if path in self.linked: return self.linked.append(path) try: html = open(path).read() except FileNotFoundError: self.diagnostics.append( Diagnostic(Severity.WARNING, link_element.code_range, f"'{file}' not included, file was not found")) return except PermissionError: self.diagnostics.append( Diagnostic(Severity.WARNING, link_element.code_range, f"Cannot open '{file}', permission denied")) return lexer = Lexer(utils.file_dir(path), utils.filename(path)) self.html_parser.feed(lexer, html=html) link_element.children = lexer.elements self.diagnostics.extend(lexer.diagnostics)
def compile(self, filepath, mapped_c): filename = utils.filename(filepath) self.dir = utils.file_dir(filepath) name = filename[:-2] # remove '.c' proc = subprocess.run([ "avr-gcc", "-mmcu=" + self.mcu, filename, "-o", name + ".o", "-O3" ], cwd=self.dir, stderr=subprocess.PIPE) if proc.returncode: mapped_c.print_gcc_errors(proc.stderr, filename) return self.hexfile = name + ".hex" proc = subprocess.run([ "avr-objcopy", "-j", ".text", "-j", ".data", "-O", "ihex", name + ".o", self.hexfile ], cwd=self.dir) self.compiled = not proc.returncode
def save_htmlc_files(self, out_dir): out_dir += "htmlc/" for hi in self.htmlc_includes: hi_file = out_dir + hi hi_dir = file_dir(hi_file) if not os.path.exists(hi_dir): os.makedirs(hi_dir) with open(hi_file, "w") as f: f.write( pkg_resources.resource_string( __name__, "data/c_code/" + hi).decode('utf-8').replace("\r", "")) f.close()
def text_document__did_change(self, request): params = request["params"] uri = params["textDocument"]["uri"] filepath = parse.urlparse(uri).path filepath = urlreq.url2pathname(filepath) if re.match("\\\\[a-zA-Z]:\\\\", filepath): # user is on windows, remove backslash before drive-letter filepath = filepath[1:] if filepath.endswith(".git"): filepath = filepath.split(".git")[0] lexer = Lexer(utils.file_dir(filepath), utils.filename(filepath)) parser = HTMLParser() if "contentChanges" in params and len(params["contentChanges"]): parser.feed(lexer, html=params["contentChanges"][0]["text"]) else: parser.feed(lexer, filepath=filepath) element_tree = lexer.elements linker = Linker(element_tree, parser) linker.link_external_files() for el in element_tree: el.init() el.init_children() diagnostics = diagnose(element_tree) diagnostics.extend(linker.diagnostics) diagnostics.extend(lexer.diagnostics) self.send({ "method": "textDocument/publishDiagnostics", "params": { "uri": uri, "diagnostics": [ d.to_json() for d in diagnostics if os.path.abspath(d.code_range.dir + d.code_range.filename) == filepath ] } })
def __init__(self, filepath): self.dir = utils.file_dir(filepath) self.filename = utils.filename(filepath) self.outdir = None self.outfile = None self.diagnostics = None self.mapped_c = None self.lexer = Lexer(self.dir, self.filename) parser = HTMLParser() parser.feed(self.lexer, filepath=filepath) self.element_tree = self.lexer.elements self.linker = Linker(self.element_tree, parser) self.linker.link_external_files() self.c_linker = CLinker(self.element_tree, self.lexer.doctype) self.__init_elements() self.__diagnose()