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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
$engine JScript
$uname Intellisence
$dname Умная подсказка после точки
$addin global
$addin stdlib

var _DEBUG_MODE = true;

function _debug(message)
{
    if (_DEBUG_MODE)
        Message(message);
}

////////////////////////////////////////////////////////////////////////////////////////
//// IntsManager
////


/** Класс отвечающий за загрузку информации о типах методов из Ints-файлов и кэширование этих данных.
 Параметр - каталог, в котором искать Ints-файлы. Подгрузка данных "ленивая", т.е. осуществляется по 
первому запросу информации о типе. О формате ints-файлов см. в описании метода loadTypeFromFile(). */
function IntsManager(intsFolder)
{
    this.allTypesInfo = {};

    if (intsFolder) 
    {
        this._intsFolder = intsFolder;
    }    
    else
    {
        /* Если каталог не задан, используем каталог по умолчанию.
        Сознательно не помещаю его на один уровень со скриптами, чтобы ints-файлы 
        не попадали в репозиторий: файлов будет много, и это избыточная информация, 
        которую всегда при отсутствии можно восстановить по файлу 
        <MainFolder>\core\types\v8types.txt */
        var mainFolder = profileRoot.getValue("Snegopat/MainFolder");
        this._intsFolder = mainFolder + 'ints';        
    }
}

/** Возвращает объект - информацию о методе. В качестве параметров передается 
имя типа и имя метода, информацию о котором надо получить. */
IntsManager.prototype.getMethodInfo = function (typeName, methodName)
{
    var typeInfo = this._getTypeInfo(typeName);               
    return typeInfo.m[methodName];
}

/** Возвращает строку - имя типа возвращаемого методом methodName объекта типа typeName значения.*/
IntsManager.prototype.getMethodReturnType = function (typeName, methodName)
{
    var methodInfo = this.getMethodInfo(typeName, methodName);
    
    if (!methodInfo)
    {
        _debug('У объекта типа"' + typeName + '" нет методов с именем "' + methodName + '"!');
        return null;
    }
    
    return methodInfo.r;
}

/** Возвращает информацию о свойстве propName объекта с именем typeName. */
IntsManager.prototype.getPropertyInfo = function (typeName, propName)
{
    var typeInfo = this._getTypeInfo(typeName);           
    return typeInfo.p[propName];
}

/** Возвращает информацию о типе с именем typeName. Если тип не найден в кеше, подгружает его из ints-файла. */
IntsManager.prototype._getTypeInfo = function(typeName)
{
    var typeInfo = this.getTypeInfo(typeName);
    
    if (!typeInfo)
        typeInfo = this.loadTypeInfoFromFile(typeName);
    
    if (!typeInfo)
    {
        _debug('Информация о типе "' + typeName + '" не найдена!');
        return null;
    }
    
    return typeInfo;
}

IntsManager.prototype.getIntsFolder = function ()
{    
    return this._intsFolder; 
}

IntsManager.prototype.getFullIntsFilePath = function (typeName)
{
    var intsFolder = this.getIntsFolder();
    return intsFolder + '\\' + typeName + '.ints';
}

/** Загружает информацию о типе из ints-файла. 
Формат ints-файла.
Имя файла: <ИмяТипа>.ints
Содержимое файла:
meth(<ИмяТипа>, <ИмяМетода>, <ИмяТипаВозвращаемогоЗначения>,<РежимДоступности>);
prop(<ИмяТипа>, <ИмяСвойства>, <ИмяТипаСвойства>,<РежимДоступности>);
*/
IntsManager.prototype.loadTypeInfoFromFile = function(typeName)
{
    var file = v8New('File', this.getFullIntsFilePath(typeName));
    
    if (!file.Exist())
    {
        _debug('Ints-файл ' + file.FullName + ' не существует!');
        return null;
    }
    
    var textDoc = v8New('TextDocument');
    textDoc.Read(file.FullName);
    
    try
    {
        this.addTypeInfoFromString(textDoc.GetText());    
    }
    catch (e)
    {
        Message('При чтении ints-файла ' + file.FullName + " произошла ошибка.");
        _debug(e.message);
        
        /* TODO: в не-дебаг режиме запоминать неудачные чтения, чтобы не 
        производить во время обычной работы повторные попытки чтения. */
    }
}

IntsManager.prototype.addTypeInfoFromString = function(codeText)
{
    var _intsManager = this;
    
    var meth = function (typeName, methodName, returnType, accessability)
    {
        var typeInfo = _intsManager.getTypeInfo(typeName, true);
        
        typeInfo.m[methodName.toLowerCase()] = {
            n: methodName,
            r: returnType,
            a: accessability
        };
    };

    var prop = function(typeName, propName, propTypeName, accessability)
    {
        var typeInfo = _intsManager.getTypeInfo(typeName, true);
        
        typeInfo.p[propName.toLowerCase()] = {
            n: propName,
            t: propTypeName,
            a: accessability
        };
    };
    
    eval(codeText);
}

IntsManager.prototype.getTypeInfo = function(typeName, createIfNotFound)
{
    var typeInfo = this.allTypesInfo[typeName.toLowerCase()];
    
    if (!typeInfo && createIfNotFound)
    {
        typeInfo = { n: typeName, m:{}, p:{}};
        this.allTypesInfo[typeName.toLowerCase()] = typeInfo;
    }
    
    return typeInfo;
}

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




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

Added Tests/Automated/Intellisense/testIntsManager.js.












































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
$engine JScript
$uname testIntsManager
$dname Тесты для класса Intellisense.js::IntsManager
$addin global
$addin stdcommands
$addin stdlib

stdlib.require('jsUnitCore.js', SelfScript);

var mainFolder = profileRoot.getValue("Snegopat/MainFolder");
var testDir = mainFolder + 'scripts\\Tests\\Automated\\Intellisense\\ints_testing';
var Ints = stdlib.require(mainFolder + 'scripts\\Intellisense.js');

function setUp()
{
}

function tearDown()
{
}

function macrosTest_addTypeInfoFromString()
{
    var etalonTypeInfo = {
        n : 'ТаблицаЗначений',
        m : { 'выбратьстроку': { n: 'ВыбратьСтроку', r: 'СтрокаТаблицыЗначений', a: 'c'} },
        p : { 'колонки' :  { n: 'Колонки', t: 'КоллекцияКолонокТаблицыЗначений', a: 'sce'}}
    };

    var intsCode = "meth('ТаблицаЗначений', 'ВыбратьСтроку', 'СтрокаТаблицыЗначений', 'c');\n"
    + "prop('ТаблицаЗначений', 'Колонки', 'КоллекцияКолонокТаблицыЗначений', 'sce');"
    
    var im = new Ints.IntsManager();
    im.addTypeInfoFromString(intsCode);

    var ti = im.getTypeInfo('ТаблицаЗначений');
    assertObjectEquals(etalonTypeInfo, ti);    
}

function macrosTest_loadTypeInfoFromFile()
{
   var etalonTypeInfo = {
        n : 'ТаблицаЗначений',
        m : { 'выбратьстроку': { n: 'ВыбратьСтроку', r: 'СтрокаТаблицыЗначений', a: 'c'} },
        p : { 'колонки' :  { n: 'Колонки', t: 'КоллекцияКолонокТаблицыЗначений', a: 'sce'}}
    };

    var im = new Ints.IntsManager(testDir);
    im.loadTypeInfoFromFile('ТаблицаЗначений');

    var ti = im.getTypeInfo('ТаблицаЗначений');
    assertObjectEquals(etalonTypeInfo, ti);    
}