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

от автора

Существует такая 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 path\run.py path2\test.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 показано, как этот кеш очистить.

ссылка на оригинал статьи http://habrahabr.ru/post/194140/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *