Skip to content

Commit 166b580

Browse files
committed
fixed EvilBeaver#158 Не компилируется конструкция вызова процедуры через точку от глобальной функции
1 parent 4d451a0 commit 166b580

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

src/ScriptEngine/Compiler/Compiler.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -922,7 +922,7 @@ private void BuildSimpleStatement()
922922
BuildLoadVariable(identifier);
923923
break;
924924
case Token.OpenPar:
925-
BuildProcedureCall(identifier);
925+
ProcessCallOnLeftHand(identifier);
926926
break;
927927
case Token.Dot:
928928
case Token.OpenBracket:
@@ -935,6 +935,21 @@ private void BuildSimpleStatement()
935935
}
936936
}
937937

938+
private void ProcessCallOnLeftHand(string identifier)
939+
{
940+
var args = PushMethodArgumentsBeforeCall();
941+
if(IsContinuationToken(ref _lastExtractedLexem))
942+
{
943+
BuildMethodCall(identifier, args, true);
944+
BuildAccessChainLeftHand();
945+
}
946+
else
947+
{
948+
BuildMethodCall(identifier, args, false);
949+
}
950+
951+
}
952+
938953
private void BuildAccessChainLeftHand()
939954
{
940955
string ident;
@@ -960,8 +975,8 @@ private void BuildAccessChainLeftHand()
960975
cDef.Type = DataType.String;
961976
cDef.Presentation = ident;
962977
int lastIdentifierConst = GetConstNumber(ref cDef);
963-
964-
if (_lastExtractedLexem.Token == Token.Dot || _lastExtractedLexem.Token == Token.OpenBracket)
978+
979+
if (IsContinuationToken(ref _lastExtractedLexem))
965980
{
966981
AddCommand(OperationCode.ResolveMethodFunc, lastIdentifierConst);
967982
BuildAccessChainLeftHand();
@@ -974,6 +989,11 @@ private void BuildAccessChainLeftHand()
974989
}
975990
}
976991

992+
private bool IsContinuationToken(ref Lexem lex)
993+
{
994+
return lex.Token == Token.Dot || lex.Token == Token.OpenBracket;
995+
}
996+
977997
private void BuildExpression(Token stopToken)
978998
{
979999
BuildPrimaryNode();
@@ -1154,7 +1174,7 @@ private void ProcessPrimaryIdentifier()
11541174
{
11551175
var identifier = _lastExtractedLexem.Content;
11561176
NextToken();
1157-
if (_lastExtractedLexem.Token == Token.Dot || _lastExtractedLexem.Token == Token.OpenBracket)
1177+
if (IsContinuationToken(ref _lastExtractedLexem))
11581178
{
11591179
BuildPushVariable(identifier);
11601180
BuildContinuationRightHand();

tests/engine-behaviors.os

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
ВсеТесты.Добавить("ТестДолжен_ПроверитьОператорВопросаПоЛожь");
3030
ВсеТесты.Добавить("ТестДолжен_ПроверитьМаршаллингУникальныхИдентификаторовИПеречислений");
3131
ВсеТесты.Добавить("ТестДолжен_ПроверитьВложенностьПробрасываемыхИсключений");
32+
ВсеТесты.Добавить("ТестДолжен_ПроверитьКомпиляциюОбращенияКВозвращаемомуОбъектуЧерезТочку");
3233

3334
Возврат ВсеТесты;
3435

@@ -103,6 +104,10 @@
103104

104105
КонецПроцедуры
105106

107+
Функция ФункцияВозвращаетОбъект()
108+
Возврат Новый Структура;
109+
КонецФункции
110+
106111
Процедура ТестДолжен_ПроверитьРазыменованияВПравойЧастиВыражения() Экспорт
107112

108113
Объект = Новый Структура("Свойство1",
@@ -226,3 +231,12 @@
226231
КонецПопытки;
227232

228233
КонецПроцедуры
234+
235+
Процедура ТестДолжен_ПроверитьКомпиляциюОбращенияКВозвращаемомуОбъектуЧерезТочку() Экспорт
236+
ФункцияВозвращаетОбъект().Вставить("Свойство");
237+
Попытка
238+
ФункцияВозвращаетОбъект().Свойство = "Привет";
239+
Исключение // здесь проверяется возможность компиляции, если скрипт запустился, значит тест прошел.
240+
// поэтому исключение проглатывается
241+
КонецПопытки;
242+
КонецПроцедуры

0 commit comments

Comments
 (0)