Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

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

Anna | 16.06.2014 | нет комментариев
Существует такая 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 создает огроменный кеш в райоИсточник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB