Skip to content

Commit cc9c16b

Browse files
author
Сосна Евгений
committed
Добавил парсинг вызова процедур в модуле объекта.
1 parent b69df2a commit cc9c16b

File tree

3 files changed

+33
-23
lines changed

3 files changed

+33
-23
lines changed

lib/parser.js

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,18 @@ SyntaxAnalysis.prototype.AnalyseModule = function (sourceCode, initValueTable, t
218218
state = stInVarsDef;
219219
}
220220
break;
221+
} else {
222+
while( (Matches = this.RE_CALL.exec(str)) != null )
223+
{
224+
if (Matches[1].charAt(0) == "."){
225+
continue;
226+
}
227+
moduleContext.CallsPosition.push({"call": Matches[1], "line": i, "character": Lines[i].indexOf(Matches[1])});
228+
if(moduleContext._CallsUpper.indexOf(Matches[1].toUpperCase()) >= 0) {continue};
229+
moduleContext.Calls.push(Matches[1]);
230+
moduleContext._CallsUpper.push(Matches[1].toUpperCase());
231+
232+
}
221233
}
222234
break;
223235
case stInProc:
@@ -340,8 +352,8 @@ _1CModule.prototype.getMethodByLineNumber = function (lineNo) {
340352
(строка, в которой находится курсор). */
341353
_1CModule.prototype.getActiveLineMethod = function () {
342354
throw("Not implement");
343-
var pos = this.textWindow.GetCaretPos();
344-
return this.getMethodByLineNumber(pos.beginRow);
355+
/*let pos = this.textWindow.GetCaretPos();
356+
return this.getMethodByLineNumber(pos.beginRow);*/
345357
}
346358

347359
////} _1CModule
@@ -362,6 +374,10 @@ function _1CModuleContextDescription(initValueTable) {
362374

363375
// Ассоциативный массив Имя переменной -> Тип переменной (пока тип всегда null).
364376
this._moduleVarsTypes = {};
377+
this.Calls = new Array();
378+
this._CallsUpper = new Array();
379+
this.CallsPosition = new Array();
380+
365381
this.db = new Loki('loki.json');
366382

367383

@@ -370,32 +386,18 @@ function _1CModuleContextDescription(initValueTable) {
370386
{
371387
this._vtAllMethods = this.db.addCollection("ValueTable");
372388

373-
// var v8Type_String = v8New('TypeDescription', 'Строка', undefined, v8New('StringQualifiers', 255));
374-
// var v8Type_Number = v8New('TypeDescription', 'Число', v8New('NumberQualifiers', 10, 0));
375-
// var v8Type_Boolean = v8New('TypeDescription', 'Булево');
376-
377-
// this._vtAllMethods = v8New('ValueTable');
378-
// var cols = this._vtAllMethods.Columns;
379-
// // Добавляем колонки.
380-
// cols.Add('Name', v8Type_String, 'Имя процедуры/функции');
381-
// cols.Add('IsProc', v8Type_Boolean, 'Процедура');
382-
// cols.Add('StartLine', v8Type_Number, 'N первой строки');
383-
// cols.Add('EndLine', v8Type_Number, 'N последней строки');
384-
// cols.Add('Context', v8Type_String, 'Контекст компиляции модуля');
385-
//
386-
// cols.Add('_method'); // _1CMethodDescription
387389
}
388390
}
389391

390392
_1CModuleContextDescription.prototype.NewString = function () {
391393

392394
return {
393395
name:"", //'Имя процедуры/функции'
394-
isproc:false, //'Процедура = false, Функция = true
396+
isproc:false, //'Процедура = true, Функция = false
395397
line:0, //начало
396398
endline:0, //конец процедуры
397399
context:"", //'Контекст компиляции модуля'
398-
_method:"",
400+
_method:"", // object
399401
isexport: false,
400402
description: ""
401403

test/fixtures/module.os

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
Перем ТестПеременная;
2+
Перем ТестПеременнаяЭкспорт Экспорт;
3+
14
//Стандартный простой комментарий.
25
//
36
Процедура ТестЭкспортФункция(Знач Параметры) Экспорт
@@ -42,4 +45,6 @@
4245

4346
// Часть 0
4447

45-
КонецФункции
48+
КонецФункции
49+
50+
СложнаяФункцияСКучейПараметров();

test/parser_spec.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,14 @@ describe("Parser", function () {
6262
expect(method._method.Calls.length).to.equal(3);
6363
})
6464

65-
it("Функция ТестЭкспортФункция1 должна быть иметь 2 вызова и иметь позицию строки в 22 и линии 3 с учетом tab", function () {
65+
it("Функция ТестЭкспортФункция1 должна быть иметь 2 вызова и иметь позицию строки в 25 и линии 3 с учетом tab", function () {
6666
let name = "ТестЭкспортФункция1";
6767
expect(method._method.Calls).to.contain(name)
6868
for (var key in method._method.CallsPosition) {
6969
if (method._method.CallsPosition.hasOwnProperty(key)) {
7070
var element = method._method.CallsPosition[key];
7171
if (element.call.toUpperCase() === name.toUpperCase() ){
72-
expect(element.line).to.equal(22);
72+
expect(element.line).to.equal(25);
7373
expect(element.character).to.equal(10);
7474
break;
7575
}
@@ -113,6 +113,9 @@ describe("Parser", function () {
113113
expect(method.description).to.equal("// ТестСКомментарием\n//");
114114
})
115115
})
116-
}
117-
)
116+
it("Должны найти вызов функции в модуле 'СложнаяФункцияСКучейПараметров'", function () {
117+
expect(modulecontext.context.Calls.length).to.equal(1);
118+
})
119+
120+
})
118121

0 commit comments

Comments
 (0)