예제 #1
0
    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)
예제 #2
0
    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()