Skip to content

Commit 7917edd

Browse files
committed
Обход для изменений в рефлекторе. Разрешены аннотации с пустыми скобками параметров
1 parent c6ac510 commit 7917edd

File tree

2 files changed

+40
-30
lines changed

2 files changed

+40
-30
lines changed

src/ScriptEngine/Compiler/Compiler.cs

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -121,40 +121,48 @@ private AnnotationParameter BuildAnnotationParameter()
121121
{
122122
result.Name = _lastExtractedLexem.Content;
123123
NextToken();
124-
if (_lastExtractedLexem.Token != Token.Equal)
124+
if (_lastExtractedLexem.Token == Token.Equal)
125+
{
126+
result.ValueIndex = BuildDefaultParameterValue();
127+
}
128+
else
125129
{
126130
result.ValueIndex = AnnotationParameter.UNDEFINED_VALUE_INDEX;
131+
NextToken();
127132
return result;
128133
}
129-
NextToken();
130134
}
131-
132-
var cDef = CreateConstDefinition(ref _lastExtractedLexem);
133-
result.ValueIndex = GetConstNumber(ref cDef);
134-
135-
NextToken();
136-
135+
else
136+
{
137+
result.ValueIndex = BuildLiteralConstant();
138+
}
139+
137140
return result;
138141
}
139142

140143
private IList<AnnotationParameter> BuildAnnotationParameters()
141144
{
142145
var parameters = new List<AnnotationParameter>();
143-
while (_lastExtractedLexem.Token != Token.EndOfText)
146+
if (_lastExtractedLexem.Token == Token.OpenPar)
144147
{
145-
parameters.Add(BuildAnnotationParameter());
146-
if (_lastExtractedLexem.Token == Token.Comma)
147-
{
148-
NextToken();
149-
continue;
150-
}
151-
if (_lastExtractedLexem.Token == Token.ClosePar)
148+
NextToken();
149+
150+
while (_lastExtractedLexem.Token != Token.EndOfText)
152151
{
153-
NextToken();
154-
break;
152+
if (_lastExtractedLexem.Token == Token.ClosePar)
153+
{
154+
NextToken();
155+
break;
156+
}
157+
158+
parameters.Add(BuildAnnotationParameter());
159+
if (_lastExtractedLexem.Token == Token.Comma)
160+
{
161+
NextToken();
162+
}
155163
}
156-
throw CompilerException.UnexpectedOperation();
157164
}
165+
158166
return parameters;
159167
}
160168

@@ -165,12 +173,7 @@ private void BuildAnnotations()
165173
var annotation = new AnnotationDefinition() {Name = _lastExtractedLexem.Content};
166174

167175
NextToken();
168-
if (_lastExtractedLexem.Token == Token.OpenPar)
169-
{
170-
NextToken();
171-
annotation.Parameters = BuildAnnotationParameters().ToArray();
172-
}
173-
176+
annotation.Parameters = BuildAnnotationParameters().ToArray();
174177
_annotations.Add(annotation);
175178
}
176179
}
@@ -638,6 +641,11 @@ private int BuildDefaultParameterValue()
638641
{
639642
NextToken();
640643

644+
return BuildLiteralConstant();
645+
}
646+
647+
private int BuildLiteralConstant()
648+
{
641649
bool hasSign = false;
642650
bool signIsMinus = _lastExtractedLexem.Token == Token.Minus;
643651
if (signIsMinus || _lastExtractedLexem.Token == Token.Plus)
@@ -656,7 +664,7 @@ private int BuildDefaultParameterValue()
656664
cd.Presentation = '-' + cd.Presentation;
657665
}
658666
else if (_lastExtractedLexem.Type == LexemType.StringLiteral
659-
|| _lastExtractedLexem.Type == LexemType.DateLiteral)
667+
|| _lastExtractedLexem.Type == LexemType.DateLiteral)
660668
{
661669
throw CompilerException.NumberExpected();
662670
}

tests/annotations.os

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
&АннотацияДляПараметра
2424
Знач Парам1,
2525

26-
&АннотацияДляПараметра
26+
&АннотацияДляПараметра()
2727
&АннотацияДляПараметра1
28-
&АннотацияДляПараметра2(СПараметрами = 3, 4, 5)
28+
&АннотацияДляПараметра2(СПараметрами = 3, 4, -5)
2929
Знач Парам2,
3030

3131
Парам3,
@@ -38,6 +38,7 @@
3838
&НаКлиентеНаСервереБезКонтекста
3939
&НаЧемУгодно(ДажеСПараметром = "Да", СПараметромБезЗначения, "Значение без параметра")
4040
&НаЧемУгодно(ДажеДважды = Истина)
41+
&НаЧемУгодно()
4142
Процедура ТестДолжен_ПроверитьПолучениеАннотацийМетода() Экспорт
4243

4344
Рефлектор = Новый Рефлектор;
@@ -49,12 +50,13 @@
4950
юТест.ПроверитьНеРавенство(СтрокаМетода, Неопределено, "Метод с аннотациями есть в таблице рефлектора");
5051

5152
юТест.ПроверитьНеРавенство(СтрокаМетода.Аннотации, Неопределено, "Рефлектор знает про аннотации метода");
52-
юТест.ПроверитьРавенство(СтрокаМетода.Аннотации.Количество(), 4, "Рефлектор вернул верное количество аннотаций");
53+
юТест.ПроверитьРавенство(СтрокаМетода.Аннотации.Количество(), 5, "Рефлектор вернул верное количество аннотаций");
5354

5455
юТест.ПроверитьРавенство(СтрокаМетода.Аннотации[0].Имя, "НаСервере", "Рефлектор сохранил порядок указания аннотаций");
5556
юТест.ПроверитьРавенство(СтрокаМетода.Аннотации[1].Имя, "НаКлиентеНаСервереБезКонтекста", "Рефлектор сохранил порядок указания аннотаций");
5657
юТест.ПроверитьРавенство(СтрокаМетода.Аннотации[2].Имя, "НаЧемУгодно", "Рефлектор сохранил порядок указания аннотаций");
5758
юТест.ПроверитьРавенство(СтрокаМетода.Аннотации[3].Имя, "НаЧемУгодно", "Рефлектор сохранил порядок указания аннотаций");
59+
юТест.ПроверитьРавенство(СтрокаМетода.Аннотации[4].Имя, "НаЧемУгодно", "Рефлектор сохранил порядок указания аннотаций");
5860

5961
Аннотация2 = СтрокаМетода.Аннотации[2];
6062
юТест.ПроверитьНеРавенство(Аннотация2.Параметры, Неопределено, "Есть таблица параметров аннотации");
@@ -89,7 +91,7 @@
8991
юТест.ПроверитьРавенство(Парам2.Аннотации.Получить(2).Параметры.Количество(), 3, "Параметры аннотации параметров");
9092
юТест.ПроверитьРавенство(Парам2.Аннотации.Получить(2).Параметры[0].Значение, 3, "Значения параметров аннотации параметров");
9193
юТест.ПроверитьРавенство(Парам2.Аннотации.Получить(2).Параметры[1].Значение, 4, "Значения параметров аннотации параметров");
92-
юТест.ПроверитьРавенство(Парам2.Аннотации.Получить(2).Параметры[2].Значение, 5, "Значения параметров аннотации параметров");
94+
юТест.ПроверитьРавенство(Парам2.Аннотации.Получить(2).Параметры[2].Значение, -5, "Значения параметров аннотации параметров");
9395
юТест.ПроверитьРавенство(Парам3.Аннотации.Количество(), 0);
9496
юТест.ПроверитьРавенство(Парам4.Аннотации.Количество(), 0);
9597

0 commit comments

Comments
 (0)