Skip to content

Commit 234190f

Browse files
committed
исправлена ошибка вложенных условий, добавлены тесты
1 parent cbe07e9 commit 234190f

File tree

5 files changed

+78
-7
lines changed

5 files changed

+78
-7
lines changed

src/OneScript.Language.Tests/PreprocessorTests.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,43 @@ public void PreprocessingLexer_DirectiveNotOnNewLine()
559559
Assert.Throws<SyntaxErrorException>(() => { while (pp.NextLexem().Token != Token.EndOfText) ; });
560560
}
561561

562+
[Fact]
563+
public void PreprocessingLexer_DirectiveNotOnSingleLine()
564+
{
565+
var pp = new PreprocessingLexer();
566+
567+
var code = @"
568+
#Если Нет
569+
Тогда
570+
F;
571+
#КонецОбласти
572+
";
573+
574+
pp.Code = code;
575+
Assert.Throws<SyntaxErrorException>(() => { while (pp.NextLexem().Token != Token.EndOfText) ; });
576+
}
577+
578+
[Fact]
579+
public void PreprocessingLexer_ExcludedLines()
580+
{
581+
var pp = new PreprocessingLexer();
582+
pp.Define("Да");
583+
584+
var code = @"
585+
#Если Да Тогда
586+
F;
587+
#Иначе
588+
!!
589+
#КонецЕсли
590+
";
591+
592+
pp.Code = code;
593+
594+
Lexem lex;
595+
do { lex = pp.NextLexem(); } while (pp.NextLexem().Token != Token.EndOfText);
596+
Assert.Equal(Token.EndOfText, lex.Token);
597+
}
598+
562599
private string GetPreprocessedContent(PreprocessingLexer pp, string code)
563600
{
564601
pp.Code = code;

src/OneScript.Language/LexicalAnalysis/PreprocessingLexer.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -371,13 +371,13 @@ private void SkipTillNextDirective()
371371

372372
if (_lastExtractedLexem.Token == Token.If)
373373
PushBlock();
374-
else if (_lastExtractedLexem.Token == Token.EndIf)
375-
{
376-
if (BlockLevel() > currentLevel)
377-
PopBlock();
378-
else if (BlockLevel() == currentLevel)
379-
break;
380-
}
374+
else if (_lastExtractedLexem.Token == Token.EndIf && BlockLevel() > currentLevel)
375+
PopBlock();
376+
else if (BlockLevel() == currentLevel &&
377+
(_lastExtractedLexem.Token == Token.EndIf ||
378+
_lastExtractedLexem.Token == Token.ElseIf ||
379+
_lastExtractedLexem.Token == Token.Else) )
380+
break;
381381
}
382382

383383
_lexer.UnexpectedCharacterFound -= SkipErrors;

tests/directives.os

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоОбластиКомпилируются");
99
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоИспользоватьНеКомпилируетсяЕслиНачалсяКод");
10+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМногострочныеДирективыНеКомпилируются");
11+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоИсключенныеСтрокиПропускаются");
1012

1113
Возврат ВсеТесты;
1214

@@ -43,3 +45,19 @@
4345

4446
КонецФункции
4547

48+
Функция ТестДолжен_ПроверитьЧтоМногострочныеДирективыНеКомпилируются() Экспорт
49+
50+
юТест.ПроверитьРавенство(ФайлКомпилируется("preprocessor/multiline-fail.os"), Ложь,
51+
"Файл multiline-fail.os компилируется, хотя не должен!"
52+
);
53+
54+
КонецФункции
55+
56+
Функция ТестДолжен_ПроверитьЧтоИсключенныеСтрокиПропускаются() Экспорт
57+
58+
юТест.ПроверитьРавенство(ФайлКомпилируется("preprocessor/excluded.os"), Истина,
59+
"Файл excluded.os не компилируется, хотя должен!"
60+
);
61+
62+
КонецФункции
63+

tests/preprocessor/excluded.os

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#Если Windows И Linux Тогда
2+
!!
3+
#КонецЕсли
4+
5+
#Если Windows ИЛИ Linux Тогда //!! ok
6+
7+
#ИначеЕсли НЕ MacOS Тогда //??
8+
!!
9+
#Иначе //!!
10+
!!??
11+
#КонецЕсли
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#Если Windows
2+
или Linux
3+
Тогда
4+
//!!
5+
#КонецЕсли

0 commit comments

Comments
 (0)