diff options
Diffstat (limited to 'dev-util/gnome-builder/files/3.24.2-jedi-fixes-3.patch')
-rw-r--r-- | dev-util/gnome-builder/files/3.24.2-jedi-fixes-3.patch | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/dev-util/gnome-builder/files/3.24.2-jedi-fixes-3.patch b/dev-util/gnome-builder/files/3.24.2-jedi-fixes-3.patch new file mode 100644 index 000000000000..484341ad1155 --- /dev/null +++ b/dev-util/gnome-builder/files/3.24.2-jedi-fixes-3.patch @@ -0,0 +1,197 @@ +From 8bf74c787af082102958de7498a9b4f4248788cc Mon Sep 17 00:00:00 2001 +From: Elad Alfassa <elad@fedoraproject.org> +Date: Wed, 9 Aug 2017 17:39:07 +0300 +Subject: [PATCH] jedi: adapt to jedi 0.10.0 + +https://bugzilla.gnome.org/show_bug.cgi?id=778708 +--- + +diff --git a/plugins/jedi/jedi_plugin.py b/plugins/jedi/jedi_plugin.py +index 25ade14..8898b69 100644 +--- a/plugins/jedi/jedi_plugin.py ++++ b/plugins/jedi/jedi_plugin.py +@@ -55,7 +55,6 @@ from gi.repository import GtkSource + from gi.repository import Ide + from gi.types import GObjectMeta + from gi.types import StructMeta +- + _ = Ide.gettext + + gi_importer = DynamicImporter('gi.repository') +@@ -91,22 +90,31 @@ _ICONS = { + try: + import jedi + from jedi.evaluate.compiled import CompiledObject ++ from jedi.evaluate.compiled import get_special_object + from jedi.evaluate.compiled import _create_from_name +- from jedi.evaluate.compiled import builtin ++ from jedi.evaluate.context import Context + from jedi.evaluate.docstrings import _evaluate_for_statement_string + from jedi.evaluate.imports import Importer + + class PatchedJediCompiledObject(CompiledObject): + "A modified version of Jedi CompiledObject to work with GObject Introspection modules" ++ ++ def __init__(self, evaluator, obj, parent_context=None, faked_class=None): ++ # we have to override __init__ to change super(CompiledObject, self) ++ # to Context, in order to prevent an infinite recursion ++ Context.__init__(self, evaluator, parent_context) ++ self.obj = obj ++ self.tree_node = faked_class ++ + def _cls(self): + if self.obj.__class__ == IntrospectionModule: + return self + else: +- return super()._cls() ++ return super()._cls(self) + + @property + def py__call__(self): +- def actual(evaluator, params): ++ def actual(params): + # Parse the docstring to find the return type: + ret_type = '' + if '->' in self.obj.__doc__: +@@ -115,18 +123,21 @@ try: + if ret_type.startswith('iter:'): + ret_type = ret_type[len('iter:'):] # we don't care if it's an iterator + +- if ret_type in __builtins__: ++ if hasattr(__builtins__, ret_type): + # The function we're inspecting returns a builtin python type, that's easy +- obj = _create_from_name(builtin, builtin, ret_type) +- return evaluator.execute(obj, params) ++ # (see test/test_evaluate/test_compiled.py in the jedi source code for usage) ++ builtins = get_special_object(self.evaluator, 'BUILTINS') ++ builtin_obj = builtins.py__getattribute__(ret_type) ++ obj = _create_from_name(self.evaluator, builtins, builtin_obj, "") ++ return self.evaluator.execute(obj, params) + else: + # The function we're inspecting returns a GObject type +- parent = self.parent.obj.__name__ ++ parent = self.parent_context.obj.__name__ + if parent.startswith('gi.repository'): + parent = parent[len('gi.repository.'):] + else: + # a module with overrides, such as Gtk, behaves differently +- parent_module = self.parent.obj.__module__ ++ parent_module = self.parent_context.obj.__module__ + if parent_module.startswith('gi.overrides'): + parent_module = parent_module[len('gi.overrides.'):] + parent = '%s.%s' % (parent_module, parent) +@@ -138,22 +149,28 @@ try: + # A pygobject type in a different module + return_type_parent = ret_type.split('.', 1)[0] + ret_type = 'from gi.repository import %s\n%s' % (return_type_parent, ret_type) +- result = _evaluate_for_statement_string(evaluator, ret_type, self.parent) +- return result ++ result = _evaluate_for_statement_string(self.parent_context, ret_type) ++ return set(result) + if type(self.obj) == FunctionInfo: + return actual + return super().py__call__ + ++ # we need to override CompiledBoundMethod without changing it much, ++ # just so it'll not get confused due to our overriden CompiledObject ++ class PatchedCompiledBoundMethod(PatchedJediCompiledObject): ++ def __init__(self, func): ++ super().__init__(func.evaluator, func.obj, func.parent_context, func.tree_node) ++ + class PatchedJediImporter(Importer): + "A modified version of Jedi Importer to work with GObject Introspection modules" + def follow(self): + module_list = super().follow() +- if module_list == []: ++ if not module_list: + import_path = '.'.join([str(i) for i in self.import_path]) + if import_path.startswith('gi.repository'): + try: + module = gi_importer.load_module(import_path) +- module_list = [PatchedJediCompiledObject(module)] ++ module_list = [PatchedJediCompiledObject(self._evaluator, module)] + except ImportError: + pass + return module_list +@@ -169,9 +186,9 @@ try: + return original_jedi_get_module('gi._gobject') + + jedi.evaluate.compiled.fake.get_module = patched_jedi_get_module +- +- jedi.evaluate.imports.Importer = PatchedJediImporter + jedi.evaluate.compiled.CompiledObject = PatchedJediCompiledObject ++ jedi.evaluate.instance.CompiledBoundMethod = PatchedCompiledBoundMethod ++ jedi.evaluate.imports.Importer = PatchedJediImporter + HAS_JEDI = True + except ImportError: + print("jedi not found, python auto-completion not possible.") +@@ -331,7 +348,6 @@ def update_doc_db_on_startup(): + + update_doc_db_on_startup() + +- + class JediCompletionProvider(Ide.Object, GtkSource.CompletionProvider, Ide.CompletionProvider): + context = None + current_word = None +@@ -600,6 +616,15 @@ class JediCompletionRequest: + script = jedi.Script(self.content, self.line + 1, self.column, self.filename) + + db = DocumentationDB() ++ ++ def get_gi_obj(info): ++ """ Get a GObject Introspection object from a jedi Completion, or None if the completion is not GObject Introspection related """ ++ if (type(info._module) == PatchedJediCompiledObject and ++ info._module.obj.__class__ == IntrospectionModule): ++ return next(info._name.infer()).obj ++ else: ++ return None ++ + for info in script.completions(): + if self.cancelled: + return +@@ -608,10 +633,9 @@ class JediCompletionRequest: + + # we have to use custom names here because .type and .params can't + # be overridden (they are properties) +- if type(info._definition) == PatchedJediCompiledObject and \ +- type(info._definition.obj) == FunctionInfo: ++ obj = get_gi_obj(info) ++ if type(obj) == FunctionInfo: + info.real_type = 'function' +- obj = info._definition.obj + params = [arg_info.get_name() for arg_info in obj.get_arguments()] + else: + info.real_type = info.type +@@ -626,8 +650,8 @@ class JediCompletionRequest: + params.append(param.name) + + doc = info.docstring() +- if hasattr(info._definition, 'obj'): +- obj = info._definition.obj ++ if obj is not None: ++ # get documentation for this GObject Introspection object + symbol = None + namespace = None + +@@ -640,17 +664,7 @@ class JediCompletionRequest: + namespace = obj.get_namespace() + + if symbol is not None: +- # we need to walk down the path to find the module so we can get the version +- parent = info._definition.parent +- found = False +- while not found: +- new_parent = parent.parent +- if new_parent is None: +- found = True +- else: +- parent = new_parent +- version = parent.obj._version +- result = db.query(symbol, version) ++ result = db.query(symbol, info._module.obj._version) + if result is not None: + doc = result + +-- +libgit2 0.26.0 + |