diff --git a/src/ScriptEngine/Compiler/Compiler.cs b/src/ScriptEngine/Compiler/Compiler.cs index 69adf0b22..a8df0371f 100644 --- a/src/ScriptEngine/Compiler/Compiler.cs +++ b/src/ScriptEngine/Compiler/Compiler.cs @@ -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 BuildAnnotationParameters() { var parameters = new List(); - 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; } @@ -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); } } @@ -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) @@ -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(); } diff --git a/tests/annotations.os b/tests/annotations.os index 030e00993..7fef57889 100644 --- a/tests/annotations.os +++ b/tests/annotations.os @@ -23,9 +23,9 @@ &АннотацияДляПараметра Знач Парам1, - &АннотацияДляПараметра + &АннотацияДляПараметра() &АннотацияДляПараметра1 - &АннотацияДляПараметра2(СПараметрами = 3, 4, 5) + &АннотацияДляПараметра2(СПараметрами = 3, 4, -5) Знач Парам2, Парам3, @@ -38,6 +38,7 @@ &НаКлиентеНаСервереБезКонтекста &НаЧемУгодно(ДажеСПараметром = "Да", СПараметромБезЗначения, "Значение без параметра") &НаЧемУгодно(ДажеДважды = Истина) +&НаЧемУгодно() Процедура ТестДолжен_ПроверитьПолучениеАннотацийМетода() Экспорт Рефлектор = Новый Рефлектор; @@ -49,12 +50,13 @@ юТест.ПроверитьНеРавенство(СтрокаМетода, Неопределено, "Метод с аннотациями есть в таблице рефлектора"); юТест.ПроверитьНеРавенство(СтрокаМетода.Аннотации, Неопределено, "Рефлектор знает про аннотации метода"); - юТест.ПроверитьРавенство(СтрокаМетода.Аннотации.Количество(), 4, "Рефлектор вернул верное количество аннотаций"); + юТест.ПроверитьРавенство(СтрокаМетода.Аннотации.Количество(), 5, "Рефлектор вернул верное количество аннотаций"); юТест.ПроверитьРавенство(СтрокаМетода.Аннотации[0].Имя, "НаСервере", "Рефлектор сохранил порядок указания аннотаций"); юТест.ПроверитьРавенство(СтрокаМетода.Аннотации[1].Имя, "НаКлиентеНаСервереБезКонтекста", "Рефлектор сохранил порядок указания аннотаций"); юТест.ПроверитьРавенство(СтрокаМетода.Аннотации[2].Имя, "НаЧемУгодно", "Рефлектор сохранил порядок указания аннотаций"); юТест.ПроверитьРавенство(СтрокаМетода.Аннотации[3].Имя, "НаЧемУгодно", "Рефлектор сохранил порядок указания аннотаций"); + юТест.ПроверитьРавенство(СтрокаМетода.Аннотации[4].Имя, "НаЧемУгодно", "Рефлектор сохранил порядок указания аннотаций"); Аннотация2 = СтрокаМетода.Аннотации[2]; юТест.ПроверитьНеРавенство(Аннотация2.Параметры, Неопределено, "Есть таблица параметров аннотации"); @@ -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);