Skip to content

Commit

Permalink
gnome-extra/gnome-builder: fix jedi-0.10.x compat for Python autocomp…
Browse files Browse the repository at this point in the history
…letion

gnome-builder-3.24 was compatible with jedi 0.9 or older. Add patches to make
it compatible with 0.10.x instead, which is still available in main tree at least.
It is still incompatible with 0.11+

Package-Manager: Portage-2.3.28, Repoman-2.3.9
  • Loading branch information
leio committed Apr 5, 2018
1 parent 89e8fc2 commit 6b4c897
Show file tree
Hide file tree
Showing 4 changed files with 383 additions and 0 deletions.
28 changes: 28 additions & 0 deletions gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-1.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
From 294920f6b932992e9da8864ca96ae35fe2402406 Mon Sep 17 00:00:00 2001
From: Christian Hergert <[email protected]>
Date: Fri, 30 Jun 2017 21:19:41 -0700
Subject: [PATCH] jedi: silence xml parser warning

https://bugzilla.gnome.org/show_bug.cgi?id=784327
---

diff --git a/plugins/jedi/jedi_plugin.py b/plugins/jedi/jedi_plugin.py
index 7be46f2..d257680 100644
--- a/plugins/jedi/jedi_plugin.py
+++ b/plugins/jedi/jedi_plugin.py
@@ -298,7 +298,11 @@ class DocumentationDB(object):
cursor.execute('UPDATE girfiles SET last_modified=? WHERE file=?', (mtime, filename))
parser = lxml.etree.XMLParser(recover=True)
tree = lxml.etree.parse(filename, parser=parser)
- namespace = tree.find('core:namespace', namespaces=ns)
+ try:
+ namespace = tree.find('core:namespace', namespaces=ns)
+ except:
+ print("Failed to parse", filename)
+ continue
library_version = namespace.attrib['version']
for node in namespace.findall('core:class', namespaces=ns):
doc = node.find('core:doc', namespaces=ns)
--
libgit2 0.26.0

25 changes: 25 additions & 0 deletions gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-2.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
From 1d7c6fa60faf9e81f2fa0f93898f8e1cc68da6d4 Mon Sep 17 00:00:00 2001
From: Christian Hergert <[email protected]>
Date: Thu, 6 Jul 2017 14:32:52 -0700
Subject: [PATCH] jedi: ignore non-gir files

The rnc file is now shipped here, so ignore that when going
through the directory contents.
---

diff --git a/plugins/jedi/jedi_plugin.py b/plugins/jedi/jedi_plugin.py
index d257680..25ade14 100644
--- a/plugins/jedi/jedi_plugin.py
+++ b/plugins/jedi/jedi_plugin.py
@@ -280,6 +280,8 @@ class DocumentationDB(object):
# I would use scandir for better performance, but it requires newer Python
for gir_path in GIR_PATH_LIST:
for gir_file in os.listdir(gir_path):
+ if not gir_file.endswith('.gir'):
+ continue
if gir_file in processed_gir_files:
continue
processed_gir_files[gir_file] = None
--
libgit2 0.26.0

197 changes: 197 additions & 0 deletions gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-3.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
From 8bf74c787af082102958de7498a9b4f4248788cc Mon Sep 17 00:00:00 2001
From: Elad Alfassa <[email protected]>
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

133 changes: 133 additions & 0 deletions gnome-extra/gnome-builder/gnome-builder-3.24.2-r1.ebuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
# Copyright 1999-2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

EAPI=6
PYTHON_COMPAT=( python3_{4,5,6} )
VALA_MIN_API_VERSION="0.30"
VALA_USE_DEPEND="vapigen"
DISABLE_AUTOFORMATTING=1
FORCE_PRINT_ELOG=1

inherit gnome2 python-single-r1 vala virtualx readme.gentoo-r1

DESCRIPTION="Builder attempts to be an IDE for writing software for GNOME"
HOMEPAGE="https://wiki.gnome.org/Apps/Builder"

# FIXME: Review licenses at some point
LICENSE="GPL-3+ GPL-2+ LGPL-3+ LGPL-2+ MIT CC-BY-SA-3.0 CC0-1.0"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE="clang +git sysprof vala webkit"
REQUIRED_USE="${PYTHON_REQUIRED_USE}"

# When bumping, pay attention to all the included plugins/*/configure.ac files and the requirements within.
# Most have no extra requirements and default to enabled; we need to handle the ones with extra requirements, which tend to default to auto(magic).
# Look at the last (fourth) argument given to AC_ARG_ENABLE to decide. We don't support any disabling of those that are default-enabled and have no extra deps beyond C/python/introspection.
# FIXME: >=dev-util/devhelp-3.20.0 dependency is automagic for devhelp integration plugin
# FIXME: vte could be optional via $(use_enable vte terminal-plugin) - but most/all people want this and have vte?
# FIXME: flatpak-plugin needs flatpak.pc >=0.6.9, libgit2[threads] >=libgit2-glib-0.24.0[ssh] libsoup-2.4.pc
# FIXME: --with-sanitizer configure option
# FIXME: Enable rdtscp based high performance counter usage on suitable architectures for EGG_COUNTER?
# Editorconfig needs pcre.h, with vte migrating away, might want it optional?
# Python is always enabled - the core python plugin support checks are automagic and not worth crippling it by not supporting python plugins
# Relatedly introspection is always required to not have broken python using plugins or have to enable/disable them based on it. This is a full IDE, not a place to be really minimal.
# An introspection USE flag of a dep is required if any introspection based language plugin wants to use it. Last full check at 3.22.4
RDEPEND="
>=x11-libs/gtk+-3.22.1:3[introspection]
>=dev-libs/glib-2.50.0:2[dbus]
>=x11-libs/gtksourceview-3.22.0:3.0[introspection]
>=dev-libs/gobject-introspection-1.48.0:=
>=dev-python/pygobject-3.22.0:3
>=dev-libs/libxml2-2.9.0
>=x11-libs/pango-1.38.0
>=dev-libs/libpeas-1.18.0[python,${PYTHON_USEDEP}]
>=dev-libs/json-glib-1.2.0
>=app-text/gspell-1.2.0
>=app-text/enchant-1.6.0
webkit? ( >=net-libs/webkit-gtk-2.12.0:4=[introspection] )
clang? ( sys-devel/clang:= )
git? (
dev-libs/libgit2[ssh,threads]
>=dev-libs/libgit2-glib-0.25.0[ssh] )
>=x11-libs/vte-0.46:2.91
sysprof? ( >=dev-util/sysprof-3.23.91[gtk] )
dev-libs/libpcre:3
${PYTHON_DEPS}
vala? ( $(vala_depend) )
"
# desktop-file-utils for desktop-file-validate check in configure for 3.22.4
DEPEND="${RDEPEND}
dev-libs/appstream-glib
dev-util/desktop-file-utils
>=sys-devel/gettext-0.19.8
virtual/pkgconfig
!<sys-apps/sandbox-2.10-r3
"

# Tests fail if all plugins aren't enabled (webkit, clang, devhelp, perhaps more)
RESTRICT="test"

DOC_CONTENTS='gnome-builder can use various other dependencies on runtime to provide
extra capabilities beyond these expressed via USE flags. Some of these
that are currently available with packages include:
* dev-util/ctags with exuberant-ctags selected via "eselect ctags" for
C, C++, Python, JavaScript, CSS, HTML and Ruby autocompletion, semantic
highlighting and symbol resolving support.
* dev-python/jedi-0.10.x and dev-python/lxml for more accurate Python
autocompletion support.
* dev-util/valgrind for integration with valgrind.
* dev-util/meson for integration with the Meson build system.
* dev-util/cargo for integration with the Rust Cargo build system.
'
# FIXME: Package gnome-code-assistance and mention here, or maybe USE flag and default enable because it's rather important
# eslint for additional diagnostics in JavaScript files
# jhbuild support
# rust language server via rls
# autotools stuff for autotools plugin; gtkmm/autoconf-archive for C++ template
# mono/PHPize stuff

PATCHES=( "${FILESDIR}"/${PV}-jedi-fixes-{1,2,3}.patch ) # jedi-0.10+ compatibility from 3.25.9x; remove 0.10 specific mention from DOC_CONTENTS once compat with 0.11+

pkg_setup() {
python-single-r1_pkg_setup
}

src_prepare() {
use vala && vala_src_prepare
gnome2_src_prepare
}

src_configure() {
gnome2_src_configure \
--with-channel=distro \
--enable-editorconfig \
--enable-introspection \
$(use_enable vala vala-pack-plugin) \
$(use_enable webkit) \
$(use_enable webkit html-preview-plugin) \
$(use_enable clang clang-plugin) \
$(use_enable git git-plugin) \
$(use_enable sysprof sysprof-plugin) \
--disable-flatpak-plugin \
--enable-terminal-plugin \
--enable-gettext-plugin \
--disable-static
}

src_install() {
gnome2_src_install
readme.gentoo_create_doc
}

pkg_postinst() {
gnome2_pkg_postinst
readme.gentoo_print_elog
}

src_test() {
# FIXME: this should be handled at eclass level
"${EROOT}${GLIB_COMPILE_SCHEMAS}" --allow-any-name "${S}/data/gsettings" || die

GSETTINGS_SCHEMA_DIR="${S}/data/gsettings" virtx emake check
}

0 comments on commit 6b4c897

Please sign in to comment.