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 +