Changes On Branch intell Вы: nobody
Вход

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch intell Excluding Merge-Ins

This is equivalent to a diff from c99e49c574 to a082c3f073

2012-04-24
16:09
Добавлен скрипт показа функц/процедур с группировкой по контексту компиляции НаСервере, НаКлиенте, НаСервереБезКонтекста и т.д. check-in: 91f9bf4725 user: sosnae tags: trunk
04:39
Синхронизировал с основной веткой Leaf check-in: a082c3f073 user: kuntashov tags: intell
04:37
Синхронизировал с основной веткой. check-in: 45015b3ec4 user: kuntashov tags: refactoring-tool-script
2012-04-23
04:45
Исправлена ошибка http://snegopat.ru/forum/viewtopic.php?f=3&t=90&p=1992#p1992. check-in: c99e49c574 user: kuntashov tags: trunk
2012-04-22
13:36
Добавлена возможность группировки результатов поиска по методам. Добавлен вывод пиктограммы процедуры/функции. Для идентификации методов больше (пока?) не используем SyntaxAnalysis. check-in: 29f57a9af7 user: kuntashov tags: trunk
2011-11-17
10:34
Начат Inlellisense для Снегопата. Реализован класс IntsManager, управляющий подгрузкой информации о типах из внешних ints-файлов (Важно! Формат отличается от ints-файлов для ОпенКонфа!) check-in: 29cb1a309e user: kuntashov tags: intell

Added Intellisense.js.

            1  +$engine JScript
            2  +$uname Intellisence
            3  +$dname Умная подсказка после точки
            4  +$addin global
            5  +$addin stdlib
            6  +
            7  +var _DEBUG_MODE = true;
            8  +
            9  +function _debug(message)
           10  +{
           11  +    if (_DEBUG_MODE)
           12  +        Message(message);
           13  +}
           14  +
           15  +////////////////////////////////////////////////////////////////////////////////////////
           16  +//// IntsManager
           17  +////
           18  +
           19  +
           20  +/** Класс отвечающий за загрузку информации о типах методов из Ints-файлов и кэширование этих данных.
           21  + Параметр - каталог, в котором искать Ints-файлы. Подгрузка данных "ленивая", т.е. осуществляется по 
           22  +первому запросу информации о типе. О формате ints-файлов см. в описании метода loadTypeFromFile(). */
           23  +function IntsManager(intsFolder)
           24  +{
           25  +    this.allTypesInfo = {};
           26  +
           27  +    if (intsFolder) 
           28  +    {
           29  +        this._intsFolder = intsFolder;
           30  +    }    
           31  +    else
           32  +    {
           33  +        /* Если каталог не задан, используем каталог по умолчанию.
           34  +        Сознательно не помещаю его на один уровень со скриптами, чтобы ints-файлы 
           35  +        не попадали в репозиторий: файлов будет много, и это избыточная информация, 
           36  +        которую всегда при отсутствии можно восстановить по файлу 
           37  +        <MainFolder>\core\types\v8types.txt */
           38  +        var mainFolder = profileRoot.getValue("Snegopat/MainFolder");
           39  +        this._intsFolder = mainFolder + 'ints';        
           40  +    }
           41  +}
           42  +
           43  +/** Возвращает объект - информацию о методе. В качестве параметров передается 
           44  +имя типа и имя метода, информацию о котором надо получить. */
           45  +IntsManager.prototype.getMethodInfo = function (typeName, methodName)
           46  +{
           47  +    var typeInfo = this._getTypeInfo(typeName);               
           48  +    return typeInfo.m[methodName];
           49  +}
           50  +
           51  +/** Возвращает строку - имя типа возвращаемого методом methodName объекта типа typeName значения.*/
           52  +IntsManager.prototype.getMethodReturnType = function (typeName, methodName)
           53  +{
           54  +    var methodInfo = this.getMethodInfo(typeName, methodName);
           55  +    
           56  +    if (!methodInfo)
           57  +    {
           58  +        _debug('У объекта типа"' + typeName + '" нет методов с именем "' + methodName + '"!');
           59  +        return null;
           60  +    }
           61  +    
           62  +    return methodInfo.r;
           63  +}
           64  +
           65  +/** Возвращает информацию о свойстве propName объекта с именем typeName. */
           66  +IntsManager.prototype.getPropertyInfo = function (typeName, propName)
           67  +{
           68  +    var typeInfo = this._getTypeInfo(typeName);           
           69  +    return typeInfo.p[propName];
           70  +}
           71  +
           72  +/** Возвращает информацию о типе с именем typeName. Если тип не найден в кеше, подгружает его из ints-файла. */
           73  +IntsManager.prototype._getTypeInfo = function(typeName)
           74  +{
           75  +    var typeInfo = this.getTypeInfo(typeName);
           76  +    
           77  +    if (!typeInfo)
           78  +        typeInfo = this.loadTypeInfoFromFile(typeName);
           79  +    
           80  +    if (!typeInfo)
           81  +    {
           82  +        _debug('Информация о типе "' + typeName + '" не найдена!');
           83  +        return null;
           84  +    }
           85  +    
           86  +    return typeInfo;
           87  +}
           88  +
           89  +IntsManager.prototype.getIntsFolder = function ()
           90  +{    
           91  +    return this._intsFolder; 
           92  +}
           93  +
           94  +IntsManager.prototype.getFullIntsFilePath = function (typeName)
           95  +{
           96  +    var intsFolder = this.getIntsFolder();
           97  +    return intsFolder + '\\' + typeName + '.ints';
           98  +}
           99  +
          100  +/** Загружает информацию о типе из ints-файла. 
          101  +Формат ints-файла.
          102  +Имя файла: <ИмяТипа>.ints
          103  +Содержимое файла:
          104  +meth(<ИмяТипа>, <ИмяМетода>, <ИмяТипаВозвращаемогоЗначения>,<РежимДоступности>);
          105  +prop(<ИмяТипа>, <ИмяСвойства>, <ИмяТипаСвойства>,<РежимДоступности>);
          106  +*/
          107  +IntsManager.prototype.loadTypeInfoFromFile = function(typeName)
          108  +{
          109  +    var file = v8New('File', this.getFullIntsFilePath(typeName));
          110  +    
          111  +    if (!file.Exist())
          112  +    {
          113  +        _debug('Ints-файл ' + file.FullName + ' не существует!');
          114  +        return null;
          115  +    }
          116  +    
          117  +    var textDoc = v8New('TextDocument');
          118  +    textDoc.Read(file.FullName);
          119  +    
          120  +    try
          121  +    {
          122  +        this.addTypeInfoFromString(textDoc.GetText());    
          123  +    }
          124  +    catch (e)
          125  +    {
          126  +        Message('При чтении ints-файла ' + file.FullName + " произошла ошибка.");
          127  +        _debug(e.message);
          128  +        
          129  +        /* TODO: в не-дебаг режиме запоминать неудачные чтения, чтобы не 
          130  +        производить во время обычной работы повторные попытки чтения. */
          131  +    }
          132  +}
          133  +
          134  +IntsManager.prototype.addTypeInfoFromString = function(codeText)
          135  +{
          136  +    var _intsManager = this;
          137  +    
          138  +    var meth = function (typeName, methodName, returnType, accessability)
          139  +    {
          140  +        var typeInfo = _intsManager.getTypeInfo(typeName, true);
          141  +        
          142  +        typeInfo.m[methodName.toLowerCase()] = {
          143  +            n: methodName,
          144  +            r: returnType,
          145  +            a: accessability
          146  +        };
          147  +    };
          148  +
          149  +    var prop = function(typeName, propName, propTypeName, accessability)
          150  +    {
          151  +        var typeInfo = _intsManager.getTypeInfo(typeName, true);
          152  +        
          153  +        typeInfo.p[propName.toLowerCase()] = {
          154  +            n: propName,
          155  +            t: propTypeName,
          156  +            a: accessability
          157  +        };
          158  +    };
          159  +    
          160  +    eval(codeText);
          161  +}
          162  +
          163  +IntsManager.prototype.getTypeInfo = function(typeName, createIfNotFound)
          164  +{
          165  +    var typeInfo = this.allTypesInfo[typeName.toLowerCase()];
          166  +    
          167  +    if (!typeInfo && createIfNotFound)
          168  +    {
          169  +        typeInfo = { n: typeName, m:{}, p:{}};
          170  +        this.allTypesInfo[typeName.toLowerCase()] = typeInfo;
          171  +    }
          172  +    
          173  +    return typeInfo;
          174  +}

Added Tests/Automated/Intellisense/ints_testing/ТаблицаЗначений.ints.

            1  +meth('ТаблицаЗначений', 'ВыбратьСтроку', 'СтрокаТаблицыЗначений', 'c');
            2  +prop('ТаблицаЗначений', 'Колонки', 'КоллекцияКолонокТаблицыЗначений', 'sce');

Added Tests/Automated/Intellisense/testIntsManager.js.

            1  +$engine JScript
            2  +$uname testIntsManager
            3  +$dname Тесты для класса Intellisense.js::IntsManager
            4  +$addin global
            5  +$addin stdcommands
            6  +$addin stdlib
            7  +
            8  +stdlib.require('jsUnitCore.js', SelfScript);
            9  +
           10  +var mainFolder = profileRoot.getValue("Snegopat/MainFolder");
           11  +var testDir = mainFolder + 'scripts\\Tests\\Automated\\Intellisense\\ints_testing';
           12  +var Ints = stdlib.require(mainFolder + 'scripts\\Intellisense.js');
           13  +
           14  +function setUp()
           15  +{
           16  +}
           17  +
           18  +function tearDown()
           19  +{
           20  +}
           21  +
           22  +function macrosTest_addTypeInfoFromString()
           23  +{
           24  +    var etalonTypeInfo = {
           25  +        n : 'ТаблицаЗначений',
           26  +        m : { 'выбратьстроку': { n: 'ВыбратьСтроку', r: 'СтрокаТаблицыЗначений', a: 'c'} },
           27  +        p : { 'колонки' :  { n: 'Колонки', t: 'КоллекцияКолонокТаблицыЗначений', a: 'sce'}}
           28  +    };
           29  +
           30  +    var intsCode = "meth('ТаблицаЗначений', 'ВыбратьСтроку', 'СтрокаТаблицыЗначений', 'c');\n"
           31  +    + "prop('ТаблицаЗначений', 'Колонки', 'КоллекцияКолонокТаблицыЗначений', 'sce');"
           32  +    
           33  +    var im = new Ints.IntsManager();
           34  +    im.addTypeInfoFromString(intsCode);
           35  +
           36  +    var ti = im.getTypeInfo('ТаблицаЗначений');
           37  +    assertObjectEquals(etalonTypeInfo, ti);    
           38  +}
           39  +
           40  +function macrosTest_loadTypeInfoFromFile()
           41  +{
           42  +   var etalonTypeInfo = {
           43  +        n : 'ТаблицаЗначений',
           44  +        m : { 'выбратьстроку': { n: 'ВыбратьСтроку', r: 'СтрокаТаблицыЗначений', a: 'c'} },
           45  +        p : { 'колонки' :  { n: 'Колонки', t: 'КоллекцияКолонокТаблицыЗначений', a: 'sce'}}
           46  +    };
           47  +
           48  +    var im = new Ints.IntsManager(testDir);
           49  +    im.loadTypeInfoFromFile('ТаблицаЗначений');
           50  +
           51  +    var ti = im.getTypeInfo('ТаблицаЗначений');
           52  +    assertObjectEquals(etalonTypeInfo, ti);    
           53  +}
           54  +