Пример #1
0
  def _ParseFileAndImports(self, rel_filename, import_directories,
      imported_filename_stack):
    # Ignore already-parsed files.
    if rel_filename.path in self._parsed_files:
      return

    if rel_filename.path in imported_filename_stack:
      print "%s: Error: Circular dependency" % rel_filename.path + \
          MakeImportStackMessage(imported_filename_stack + [rel_filename.path])
      sys.exit(1)

    try:
      with open(rel_filename.path) as f:
        source = f.read()
    except IOError as e:
      print "%s: Error: %s" % (e.rel_filename.path, e.strerror) + \
          MakeImportStackMessage(imported_filename_stack + [rel_filename.path])
      sys.exit(1)

    try:
      tree = Parse(source, rel_filename.path)
    except Error as e:
      full_stack = imported_filename_stack + [rel_filename.path]
      print str(e) + MakeImportStackMessage(full_stack)
      sys.exit(1)

    dirname = os.path.split(rel_filename.path)[0]
    for imp_entry in tree.import_list:
      import_file_entry = FindImportFile(
          RelativePath(dirname, rel_filename.source_root),
          imp_entry.import_filename, import_directories)
      self._ParseFileAndImports(import_file_entry, import_directories,
          imported_filename_stack + [rel_filename.path])

    self._parsed_files[rel_filename.path] = tree
Пример #2
0
    def _ParseFileAndImports(self, filename, import_directories,
                             imported_filename_stack):
        # Ignore already-parsed files.
        if filename in self._parsed_files:
            return

        if filename in imported_filename_stack:
            print "%s: Error: Circular dependency" % filename + \
                MakeImportStackMessage(imported_filename_stack + [filename])
            sys.exit(1)

        try:
            with open(filename) as f:
                source = f.read()
        except IOError as e:
            print "%s: Error: %s" % (e.filename, e.strerror) + \
                MakeImportStackMessage(imported_filename_stack + [filename])
            sys.exit(1)

        try:
            tree = Parse(source, filename)
        except Error as e:
            full_stack = imported_filename_stack + [filename]
            print str(e) + MakeImportStackMessage(full_stack)
            sys.exit(1)

        dirname = os.path.split(filename)[0]
        for imp_entry in tree.import_list:
            import_filename = FindImportFile(dirname,
                                             imp_entry.import_filename,
                                             import_directories)
            self._ParseFileAndImports(import_filename, import_directories,
                                      imported_filename_stack + [filename])

        self._parsed_files[filename] = tree
Пример #3
0
    def _maybe_download_dep(self, dep):
        if not dep.maybe_is_a_url():
            return False

        for candidate in dep.generate_candidate_urls():
            url = self._url_rewriter.rewrite(candidate)
            response = self._requests_get("https://" + url)
            if not response.ok:
                # If we get an error, it just mean that this candidate URL is not
                # correct. We must try the other ones before giving up.
                logging.debug("Error while downloading %s (%s)", candidate,
                              url)
                continue
            # This is an external dependency
            directory = os.path.dirname(candidate)
            full_directory = os.path.join(
                self._repository.get_external_directory(), directory)
            try:
                self._os_makedirs(full_directory)
            except OSError as e:
                # The directory may already exist, we don't care.
                if e.errno != errno.EEXIST:
                    raise
            with self._open(
                    os.path.join(self._repository.get_external_directory(),
                                 candidate), "w") as f:
                data = response.content
                try:
                    Parse(data, candidate)
                except ParseError:
                    logging.warn("File at %s is not a mojom", url)
                    break
                f.write(data)
            return True
        return False
Пример #4
0
def mojom_path(filename):
    with open(filename) as f:
        source = f.read()
    tree = Parse(source, filename)
    _, name = os.path.split(filename)
    mojom = Translate(tree, name)
    elements = mojom['namespace'].split('.')
    elements.append("%s" % mojom['name'])
    return os.path.join(*elements)
Пример #5
0
    def AddPath(mojom):
        path = os.path.join(GetChromiumRoot(), mojom)
        if path in mojom_paths:
            return
        mojom_paths.add(path)

        with open(path) as f:
            code = f.read()
            ast = Parse(code, path)
            for imp in ast.import_list:
                AddPath(imp.import_filename)
Пример #6
0
def _load_mojom(path_to_mojom):
    filename = os.path.abspath(path_to_mojom)
    name = os.path.basename(filename)

    # Read in mojom file.
    with open(filename) as f:
        source = f.read()
    # Parse
    tree = Parse(source, name)
    mojom = Translate(tree, name)
    return mojom
Пример #7
0
def main(argv):
    if len(argv) < 2:
        print "usage: %s filename" % sys.argv[0]
        return 1

    for filename in argv[1:]:
        with open(filename) as f:
            print "%s:" % filename
            print Translate(Parse(f.read(), filename),
                            os.path.splitext(os.path.basename(filename))[0])

    return 0
Пример #8
0
def main(argv):
    if len(argv) < 2:
        print "usage: %s filename" % argv[0]
        return 0

    for filename in argv[1:]:
        with open(filename) as f:
            print "%s:" % filename
            try:
                print Parse(f.read(), filename)
            except ParseError, e:
                print e
                return 1
Пример #9
0
def _ParseFile(args, rel_filename):
    try:
        with open(rel_filename.path) as f:
            source = f.read()
    except IOError as e:
        print("%s: Error: %s" % (rel_filename.path, e.strerror))
        sys.exit(1)

    try:
        tree = Parse(source, rel_filename.path)
        RemoveDisabledDefinitions(tree, args.enabled_features)
    except Error as e:
        print("%s: Error: %s" % (rel_filename.path, str(e)))
        sys.exit(1)
    _PickleAST(tree, _GetPicklePath(rel_filename, args.output_dir))
Пример #10
0
 def get_all_external_mojom_directories(self):
     """Get all external directories populated with their mojom files."""
     mojoms = self._get_all_mojom_in_directory(
         self.get_external_directory())
     directories = {}
     for mojom_path in mojoms:
         directory_path = os.path.dirname(mojom_path)
         directory = directories.setdefault(directory_path,
                                            MojomDirectory(directory_path))
         with self._open(mojom_path) as f:
             source = f.read()
             tree = Parse(source, mojom_path)
             mojom = MojomFile(self, mojom_path)
             directory.add_mojom(mojom)
             for dep in tree.import_list:
                 mojom.add_dependency(dep.import_filename)
     return directories.values()
Пример #11
0
    def get_missing_dependencies(self):
        """get_missing_dependencies returns a set of dependencies that are required
    by mojoms in this repository but not available.
    """
        # Update the list of available mojoms in this repository.
        mojoms = set(self._get_all_mojom_in_directory(self._root_dir))

        # Find all declared dependencies
        needed_deps = set([])
        for mojom in mojoms:
            with self._open(mojom) as f:
                source = f.read()
                tree = Parse(source, mojom)
                for dep in tree.import_list:
                    needed_deps.add(
                        Dependency(self, dep.filename, dep.import_filename))

        missing_deps = self._resolve_dependencies(needed_deps, mojoms)

        return missing_deps
Пример #12
0
def process_mojom(path_to_mojom):
    filename = os.path.abspath(path_to_mojom)
    name = os.path.basename(filename)

    # Read in mojom file.
    try:
        with open(filename) as f:
            source = f.read()
    except IOError:
        print("Error reading %s" % filename)
        sys.exit(2)

    # Parse
    try:
        tree = Parse(source, name)
    except Error:
        print("Error parsing %s" % filename)
        sys.exit(2)

    mojom = Translate(tree, name)
    # Output path
    attributes = mojom.get('attributes')
    print(mojom_path(mojom['name'], mojom['namespace'], attributes))
def ProcessFile(args,
                generator_modules,
                filename,
                _processed_files={},
                _imported_filename_stack=[]):
    # Memoized results.
    if filename in _processed_files:
        return _processed_files[filename]

    # Ensure we only visit each file once.
    if filename in _imported_filename_stack:
        print "%s: Error: Circular dependency" % filename + \
            MakeImportStackMessage(_imported_filename_stack + [filename])
        sys.exit(1)

    try:
        with open(filename) as f:
            source = f.read()
    except IOError as e:
        print "%s: Error: %s" % (e.filename, e.strerror) + \
            MakeImportStackMessage(_imported_filename_stack + [filename])
        sys.exit(1)

    try:
        tree = Parse(source, filename)
    except Error as e:
        print str(e) + MakeImportStackMessage(_imported_filename_stack +
                                              [filename])
        sys.exit(1)

    dirname, name = os.path.split(filename)
    mojom = Translate(tree, name)
    if args.debug_print_intermediate:
        pprint.PrettyPrinter().pprint(mojom)

    # Process all our imports first and collect the module object for each.
    # We use these to generate proper type info.
    for import_data in mojom['imports']:
        import_filename = os.path.join(dirname, import_data['filename'])
        import_data['module'] = ProcessFile(
            args,
            generator_modules,
            import_filename,
            _processed_files=_processed_files,
            _imported_filename_stack=_imported_filename_stack + [filename])

    module = OrderedModuleFromData(mojom)

    # Set the path as relative to the source root.
    module.path = os.path.relpath(os.path.abspath(filename),
                                  os.path.abspath(args.depth))

    # Normalize to unix-style path here to keep the generators simpler.
    module.path = module.path.replace('\\', '/')

    for generator_module in generator_modules:
        generator = generator_module.Generator(module, args.output_dir)
        generator.GenerateFiles()

    # Save result.
    _processed_files[filename] = module
    return module
Пример #14
0
from mojom.parse.parser import Parse
from mojom.generator.definitions_generator import GenerateDefinitions
from mojom.generator.servers_generator import GenerateServers
from mojom.generator.runtime_generator import GenerateRuntime
from mojom.generator.clients_generator import GenerateClients
import shutil
import glob

filenames = glob.glob("mojom/*.mojom")
trees = []
dst = 'mojom/generator/gene'
for filename in filenames:
    f = open(filename)
    tree = Parse(f.read(), filename)
    trees.append(tree)
    GenerateDefinitions(tree, filename)
    GenerateClients(tree, filename)
    GenerateServers(tree, filename)
    shutil.copy(filename + '.h', dst)
    shutil.copy(filename + '.client.h', dst)
    shutil.copy(filename + '.server.h', dst)

GenerateRuntime(trees, filenames)
shutil.copy('gene_runtime.h', dst)


Пример #15
0
    def ProcessFile(self,
                    args,
                    remaining_args,
                    generator_modules,
                    filename,
                    _imported_filename_stack=None):
        # Memoized results.
        if filename in self._processed_files:
            return self._processed_files[filename]

        if _imported_filename_stack is None:
            _imported_filename_stack = []

        # Ensure we only visit each file once.
        if filename in _imported_filename_stack:
            print "%s: Error: Circular dependency" % filename + \
                MakeImportStackMessage(_imported_filename_stack + [filename])
            sys.exit(1)

        try:
            with open(filename) as f:
                source = f.read()
        except IOError as e:
            print "%s: Error: %s" % (e.filename, e.strerror) + \
                MakeImportStackMessage(_imported_filename_stack + [filename])
            sys.exit(1)

        try:
            tree = Parse(source, filename)
        except Error as e:
            full_stack = _imported_filename_stack + [filename]
            print str(e) + MakeImportStackMessage(full_stack)
            sys.exit(1)

        dirname, name = os.path.split(filename)
        mojom = Translate(tree, name)
        if args.debug_print_intermediate:
            pprint.PrettyPrinter().pprint(mojom)

        # Process all our imports first and collect the module object for each.
        # We use these to generate proper type info.
        for import_data in mojom['imports']:
            import_filename = FindImportFile(dirname, import_data['filename'],
                                             args.import_directories)
            import_data['module'] = self.ProcessFile(
                args,
                remaining_args,
                generator_modules,
                import_filename,
                _imported_filename_stack=_imported_filename_stack + [filename])

        module = OrderedModuleFromData(mojom)

        # Set the path as relative to the source root.
        module.path = os.path.relpath(os.path.abspath(filename),
                                      os.path.abspath(args.depth))

        # Normalize to unix-style path here to keep the generators simpler.
        module.path = module.path.replace('\\', '/')

        if self._should_generate(filename):
            for generator_module in generator_modules:
                generator = generator_module.Generator(module, args.output_dir)
                filtered_args = []
                if hasattr(generator_module, 'GENERATOR_PREFIX'):
                    prefix = '--' + generator_module.GENERATOR_PREFIX + '_'
                    filtered_args = [
                        arg for arg in remaining_args if arg.startswith(prefix)
                    ]
                generator.GenerateFiles(filtered_args)

        # Save result.
        self._processed_files[filename] = module
        return module