Exemplo n.º 1
0
def parse_package_db(pkgdb, defval=None):
    if isinstance(pkgdb, dict):
        pdb = get_value(pkgdb, 'package-db')
        return symbols.PackageDb(package_db=pdb) if pdb else defval
    if pkgdb == 'global-db':
        return symbols.PackageDb(global_db=True)
    if pkgdb == 'user-db':
        return symbols.PackageDb(user_db=True)
    return defval
Exemplo n.º 2
0
    def module(self,
               project_name,
               lookup='',
               search_type='prefix',
               project=None,
               file=None,
               module=None,
               deps=None,
               sandbox=None,
               cabal=False,
               symdb=None,
               package=None,
               source=False,
               standalone=False,
               **backend_args):
        modsyms = None
        if search_type == 'exact' and re.match(r'\w+(\.\w+)+', lookup):
            backend = self.project_backends.get(project_name)
            modinfo, err = backend.command_backend(
                'browse -d -o ' + lookup) if backend is not None else []
            if Settings.COMPONENT_DEBUG.recv_messages or Settings.COMPONENT_DEBUG.all_messages:
                print('ghc-mod modules: resp =\n{0}'.format(
                    pprint.pformat(modinfo)))

            if not err or 'EXCEPTION' not in ' '.join(err):
                moddecls = {}
                for mdecl in modinfo:
                    decl = None
                    name, declinfo = self.get_name_decl(mdecl)
                    if declinfo.startswith('class '):
                        ctx, args = self.split_context_args(name, declinfo[5:])
                        decl = symbols.Class(name, ctx, args)
                    elif declinfo.startswith('data '):
                        ctx, args = self.split_context_args(name, declinfo[5:])
                        decl = symbols.Data(name, ctx, args)
                    elif declinfo.startswith('newtype '):
                        ctx, args = self.split_context_args(name, declinfo[8:])
                        decl = symbols.Newtype(name, ctx, args)
                    elif declinfo.startswith('type '):
                        ctx, args = self.split_context_args(name, declinfo[5:])
                        decl = symbols.Type(name, ctx, args)
                    else:
                        # Default to function
                        decl = symbols.Function(name, declinfo)

                    if decl is not None:
                        moddecls[name] = decl

                if Settings.COMPONENT_DEBUG.recv_messages or Settings.COMPONENT_DEBUG.all_messages:
                    print('ghc-mod modules: moddecls =\n{0}'.format(
                        pprint.pformat(moddecls)))

                modsyms = symbols.Module(lookup, [], [], moddecls,
                                         symbols.PackageDb(global_db=True))

        return self.dispatch_callbacks([modsyms] if modsyms else [],
                                       **backend_args)
Exemplo n.º 3
0
    def module(self, project_name, lookup='', search_type='prefix', project=None, file=None, module=None, deps=None,
               sandbox=None, cabal=False, symdb=None, package=None, source=False, standalone=False, **backend_args):
        modsyms = None

        if search_type == 'exact' and re.match(r'\w+(\.\w+)+', lookup):
            backend = self.project_backends.get(project_name)
            modinfo = backend.command_backend('browse -d -o ' + lookup) if backend is not None else []
            if Settings.COMPONENT_DEBUG.recv_messages or Settings.COMPONENT_DEBUG.all_messages:
                print('ghc-mod modules: resp =\n{0}'.format(pprint.pformat(modinfo)))

            impinfo = [symbols.Module(lookup)]
            moddecls = dict([(decl.name, decl) for decl in [self.parse_syminfo(mdecl, impinfo) for mdecl in modinfo]])
            if Settings.COMPONENT_DEBUG.recv_messages or Settings.COMPONENT_DEBUG.all_messages:
                print('ghc-mod modules: moddecls =\n{0}'.format(pprint.pformat(moddecls)))

                modsyms = symbols.Module(lookup, [], [], moddecls, symbols.PackageDb(global_db=True))

        return self.dispatch_callbacks([modsyms] if modsyms else [], None, **backend_args)
Exemplo n.º 4
0
    def scope_modules(self,
                      project_name,
                      _filename,
                      lookup='',
                      search_type='prefix',
                      **backend_args):
        def make_pkg(pkg):
            pkg_info = pkg.split('-', 2)
            pkg_name = pkg_info[0]
            if pkg_info:
                pkg_ver = pkg_info[1]
            else:
                pkg_ver = '<no version>'

            return symbols.Package(pkg_name, pkg_ver)

        backend = self.project_backends.get(project_name)
        modules, err = backend.command_backend(
            'list -d') if backend is not None else ([], [])
        if Settings.COMPONENT_DEBUG.recv_messages or Settings.COMPONENT_DEBUG.all_messages:
            print('ghc-mod scope_modules: resp =\n{0}'.format(modules))

        if not err:
            filtered_mods = [
                symbols.Module(
                    mod[1], [], [], {},
                    symbols.InstalledLocation(
                        make_pkg(mod[0]), symbols.PackageDb(global_db=True)))
                for mod in (m.split() for m in modules
                            if self.lookup_match(m[1], lookup, search_type))
            ]

        if Settings.COMPONENT_DEBUG.recv_messages or Settings.COMPONENT_DEBUG.all_messages:
            print('ghc-mod scope_modules: filtered_mods\n{0}'.format(
                pprint.pformat(filtered_mods)))

        return self.dispatch_callbacks(filtered_mods, err, **backend_args)