Skip to content

Commit

Permalink
Обход для изменений в рефлекторе. Разрешены аннотации с пустыми скобк…
Browse files Browse the repository at this point in the history
…ами параметров
  • Loading branch information
EvilBeaver committed Jan 19, 2023
1 parent c6ac510 commit 7917edd
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 30 deletions.
60 changes: 34 additions & 26 deletions src/ScriptEngine/Compiler/Compiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,40 +121,48 @@ private AnnotationParameter BuildAnnotationParameter()
{
result.Name = _lastExtractedLexem.Content;
NextToken();
if (_lastExtractedLexem.Token != Token.Equal)
if (_lastExtractedLexem.Token == Token.Equal)
{
result.ValueIndex = BuildDefaultParameterValue();
}
else
{
result.ValueIndex = AnnotationParameter.UNDEFINED_VALUE_INDEX;
NextToken();
return result;
}
NextToken();
}

var cDef = CreateConstDefinition(ref _lastExtractedLexem);
result.ValueIndex = GetConstNumber(ref cDef);

NextToken();

else
{
result.ValueIndex = BuildLiteralConstant();
}

return result;
}

private IList<AnnotationParameter> BuildAnnotationParameters()
{
var parameters = new List<AnnotationParameter>();
while (_lastExtractedLexem.Token != Token.EndOfText)
if (_lastExtractedLexem.Token == Token.OpenPar)
{
parameters.Add(BuildAnnotationParameter());
if (_lastExtractedLexem.Token == Token.Comma)
{
NextToken();
continue;
}
if (_lastExtractedLexem.Token == Token.ClosePar)
NextToken();

while (_lastExtractedLexem.Token != Token.EndOfText)
{
NextToken();
break;
if (_lastExtractedLexem.Token == Token.ClosePar)
{
NextToken();
break;
}

parameters.Add(BuildAnnotationParameter());
if (_lastExtractedLexem.Token == Token.Comma)
{
NextToken();
}
}
throw CompilerException.UnexpectedOperation();
}

return parameters;
}

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

NextToken();
if (_lastExtractedLexem.Token == Token.OpenPar)
{
NextToken();
annotation.Parameters = BuildAnnotationParameters().ToArray();
}

annotation.Parameters = BuildAnnotationParameters().ToArray();
_annotations.Add(annotation);
}
}
Expand Down Expand Up @@ -638,6 +641,11 @@ private int BuildDefaultParameterValue()
{
NextToken();

return BuildLiteralConstant();
}

private int BuildLiteralConstant()
{
bool hasSign = false;
bool signIsMinus = _lastExtractedLexem.Token == Token.Minus;
if (signIsMinus || _lastExtractedLexem.Token == Token.Plus)
Expand All @@ -656,7 +664,7 @@ private int BuildDefaultParameterValue()
cd.Presentation = '-' + cd.Presentation;
}
else if (_lastExtractedLexem.Type == LexemType.StringLiteral
|| _lastExtractedLexem.Type == LexemType.DateLiteral)
|| _lastExtractedLexem.Type == LexemType.DateLiteral)
{
throw CompilerException.NumberExpected();
}
Expand Down
10 changes: 6 additions & 4 deletions tests/annotations.os
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@
&АннотацияДляПараметра
Знач Парам1,

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

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

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

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

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

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

Expand Down

0 comments on commit 7917edd

Please sign in to comment.