Библиотека Code Intelligence

в 16:18, , рубрики: python

Существует такая Python-библиотека, как Code Intelligence (питоновое имя «codeintel2»). Существует давно, она разработана ActiveState (авторы ActivePython) и уже включена в состав их текст-редактора Komodo Edit и среды Komodo IDE.

Она позволяет парсить исходный код на языках Python, Perl, Ruby, PHP, JavaScript, Tcl, LESS, SCSS, и некоторых других, и делать следующее:

  • находить список auto-completions к нужным именами,
  • находить строки объявления функций (с их параметрами),
  • находить позицию объявления имен переменных/функций в коде.

Библиотеку можно скачать со страницы проекта SublimeCodeIntel (части находятся в папках libs и arch), а «нормальной» страницы библиотеки на сайте ActiveState я не нашел — не афишируют ее они. От SublimeCodeIntel вы возьмете версию для Python 2.6, именно 2.6, а не 2.7, т.к. там есть бинарники, которые собраны под 2.6 (так было когда я ее брал).

API не очень уклюжее у CodeIntel. Официального туториала по CodeIntel я не нашел. Рассмотрим простой пример, как, скажем, найти список completions к некоторому имени класса.

Пусть у нас есть файл на Питоне «test.py»:

# test class
class CName:
    prop1 = 0
    prop2 = 1
    def __init__(self, val1, val2):
        pass
    def func1(self, par1, par2 = 10, par3 = None):
        return par1 + par2 * par3;
    def func2(self, l = [], count = 0):
        return l[:count]

c = CName()
c.

Задача: получить список completions к имени объекта «c» с точкой. По коду видно, что должно получиться — это 2 свойства prop1, prop2 и 3 метода __init__, func1, func2. Пишем наш скрипт «run.py»:

import sys
import os

class Info(object): # our demo data
    pass
info = Info()
info.timeout = 15 # max timeout for id searching, sec
info.filename = sys.argv[1] # source file name (py, php, pl, etc)

_codeintel = r'g:_CodeIntel' # path to libs/arch folders
sys.path.insert(0, os.path.join(_codeintel, 'arch'))
sys.path.insert(0, os.path.join(_codeintel, 'libs'))

from codeintel2.manager import Manager
from codeintel2.common import EvalController

# need to reset Codeintel cache?
if info.filename == '_reset_':
    mgr = Manager()
    mgr.db.reset(False)
    exit(0)

sys.path.append(os.path.basename(info.filename))
info.filepos = os.path.getsize(info.filename) # get end-of-file pos

def _do(buf, trg, timeout):
    ctlr = EvalController()
    buf.async_eval_at_trg(trg, ctlr)
    ctlr.wait(timeout)
    if not ctlr.is_done():
        ctlr.done("timed out")
        ctlr.abort()
        raise EvalTimeout("eval for %s timed-out" % trg)
    return (ctlr.cplns, ctlr.calltips)

mgr = Manager()
mgr.upgrade()
mgr.initialize()

# read file
buf = mgr.buf_from_path(info.filename)
buf.scan()

# get trigger
trg = buf.trg_from_pos(info.filepos)
result1, result2 = _do(buf, trg, info.timeout)

print 'auto-complete result:'
for s1, s2 in result1:
    print s1, s2

mgr.finalize()

По комментариям примерно видно, как использовать codeintel. Пускаем «python pathrun.py path2test.py», получаем ответ:

auto-complete result:
function func1
function func2
variable prop1
variable prop2
variable __class__
variable __doc__
function __init__

Прим.: скрипт run.py ищет результат для позиции «конец файла», если позиция «каретки» нужна другая, то скрипт надо поправить.

Так же можно получить и function call-tip для, например, функции c.func1: для этого в скрипте надо вывести не result1, а result2. Только файл test.py надо будет поправить — окончить его на такую строку: c.func1(.

Ну и наконец. Codeintel создает огроменный кеш в районе "%userprofile%.codeintel". В run.py показано, как этот кеш очистить.

Автор: Alex222

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js