Skip to content

Commit d201fde

Browse files
authored
Merge pull request #1048 from Mr-Rm/fix-1044
fix #1044: имена библиотек и комментарии в директиве Использовать
2 parents 6f7c7ac + 62255c9 commit d201fde

File tree

4 files changed

+90
-22
lines changed

4 files changed

+90
-22
lines changed

src/ScriptEngine.HostedScript/LibraryResolver.cs

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -148,17 +148,15 @@ private bool DirectiveSupported(string directive)
148148

149149
private void LoadLibrary(string value)
150150
{
151-
if (String.IsNullOrWhiteSpace(value))
152-
throw new ArgumentException("Ошибка в имени библиотеки", "value");
153-
151+
bool quoted = PrepareQuoted(ref value);
154152
bool loaded;
155-
if (IsQuoted(value))
156-
loaded = LoadByRelativePath(value.Substring(1, value.Length - 2));
153+
if (quoted)
154+
loaded = LoadByRelativePath(value);
157155
else
158156
loaded = LoadByName(value);
159157

160158
if(!loaded)
161-
throw new CompilerException(String.Format("Библиотека не найдена {0}", value));
159+
throw new CompilerException(String.Format("Библиотека не найдена: '{0}'", value));
162160

163161
}
164162

@@ -192,16 +190,44 @@ private static bool PathHasInvalidChars(string path)
192190
return (!string.IsNullOrEmpty(path) && path.IndexOfAny(System.IO.Path.GetInvalidPathChars()) >= 0);
193191
}
194192

195-
private bool IsQuoted(string value)
193+
private bool PrepareQuoted(ref string value)
196194
{
195+
const string COMMENT = "//";
197196
const char QUOTE = '"';
198-
if(value[0] == QUOTE && value.Length > 1)
197+
198+
bool quoted = false;
199+
if (value.IndexOf(QUOTE)==0)
199200
{
200-
return value[0] == QUOTE && value[value.Length - 1] == QUOTE;
201+
var secondQuote = value.Substring(1).IndexOf(QUOTE);
202+
if (secondQuote > 0)
203+
{
204+
if (secondQuote+2 < value.Length)
205+
{
206+
var tail = value.Substring(secondQuote+2, value.Length-secondQuote-2).TrimStart();
207+
if (!String.IsNullOrWhiteSpace(tail) && tail.IndexOf(COMMENT) != 0)
208+
throw new CompilerException($"Недопустимые символы после имени библиотеки: '{tail}'");
209+
}
210+
value = value.Substring(1, secondQuote);
211+
quoted = true;
212+
}
213+
else
214+
{
215+
throw new CompilerException($"Ошибка в имени библиотеки: '{value}'");
216+
}
201217
}
202218
else
203-
return false;
204-
219+
{
220+
var comment = value.IndexOf(COMMENT);
221+
if( comment>=0 )
222+
{
223+
value = value.Substring(0,comment).TrimEnd();
224+
}
225+
}
226+
227+
if (String.IsNullOrWhiteSpace(value))
228+
throw new CompilerException("Отсутствует имя библиотеки");
229+
230+
return quoted;
205231
}
206232

207233
private bool LoadByPath(string libraryPath)

src/ScriptEngine/Compiler/Compiler.cs

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ private void AppendCodeInfo(CompilerException exc, int line, int column)
263263

264264
private void DispatchModuleBuild()
265265
{
266+
HandleImportDirectives();
266267
while (_lastExtractedLexem.Type != LexemType.EndOfText)
267268
{
268269
if (_lastExtractedLexem.Type == LexemType.Identifier)
@@ -293,6 +294,10 @@ private void DispatchModuleBuild()
293294
{
294295
BuildAnnotations();
295296
}
297+
else if (_lastExtractedLexem.Type == LexemType.PreprocessorDirective)
298+
{
299+
throw CompilerException.IllegalDirective(_lastExtractedLexem.Content);
300+
}
296301
else
297302
{
298303
throw CompilerException.UnexpectedOperation();
@@ -425,14 +430,24 @@ private static void FillVariablesFrame(ref MethodDescriptor descriptor, SymbolSc
425430
}
426431
}
427432

428-
private void HandleDirective(bool codeEntered)
433+
private void HandleDirective()
429434
{
430435
var directive = _lastExtractedLexem.Content;
431-
432436
var value = _lexer.Iterator.ReadToLineEnd();
433437

434-
if (DirectiveHandler == null || !DirectiveHandler(directive, value, codeEntered))
435-
throw new CompilerException(String.Format("Неизвестная директива: {0}({1})", directive, value));
438+
if (DirectiveHandler == null || !DirectiveHandler(directive, value, _isCodeEntered))
439+
throw CompilerException.UnknownDirective(directive, value);
440+
}
441+
442+
private void HandleImportDirectives()
443+
{
444+
while (_lastExtractedLexem.Type == LexemType.PreprocessorDirective)
445+
{
446+
HandleDirective();
447+
UpdateCompositeContext(); // костыль для #330
448+
449+
_lastExtractedLexem = _lexer.NextLexem();
450+
}
436451
}
437452

438453
private void BuildSingleMethod()
@@ -713,6 +728,11 @@ private void BuildCodeBatch(params Token[] endTokens)
713728
continue;
714729
}
715730

731+
if (_lastExtractedLexem.Type == LexemType.PreprocessorDirective)
732+
{
733+
throw CompilerException.IllegalDirective(_lastExtractedLexem.Content);
734+
}
735+
716736
if (_lastExtractedLexem.Type != LexemType.Identifier && _lastExtractedLexem.Token != Token.EndOfText)
717737
{
718738
throw CompilerException.UnexpectedOperation();
@@ -1973,13 +1993,6 @@ private void NextToken()
19731993
if (_lastExtractedLexem.Token != Token.EndOfText)
19741994
{
19751995
_lastExtractedLexem = _lexer.NextLexem();
1976-
while (_lastExtractedLexem.Type == LexemType.PreprocessorDirective)
1977-
{
1978-
HandleDirective(_isCodeEntered);
1979-
UpdateCompositeContext(); // костыль для #330
1980-
1981-
_lastExtractedLexem = _lexer.NextLexem();
1982-
}
19831996
}
19841997
else
19851998
{

src/ScriptEngine/Compiler/CompilerExceptions.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,16 @@ public static CompilerException NumberExpected()
137137
return new CompilerException(Locale.NStr("ru='Ожидается числовая константа';en='Numeric constant expected'"));
138138
}
139139

140+
public static CompilerException IllegalDirective(string name)
141+
{
142+
return new CompilerException(Locale.NStr("ru='Недопустимая директива:';en='Illegal directive'")+name);
143+
}
144+
145+
public static CompilerException UnknownDirective(string name, string arg)
146+
{
147+
return new CompilerException(Locale.NStr("ru='Неизвестная директива:';en='Unknown directive'") + $"{name} ({arg})");
148+
}
149+
140150
}
141151

142152
public class ExtraClosedParenthesis : CompilerException

tests/global-funcs.os

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
ВсеТесты.Добавить("Тест_ДолженПроверитьЧтоФункцияМаксНеСравниваетРазнотипныеЗначения");
5656

5757
ВсеТесты.Добавить("Тест_ДолженПроверитьЧтоКопированиеФайлаРаботаетПоHTTP");
58+
ВсеТесты.Добавить("Тест_ДолженПроверитьЧтоКопированиеФайлаРаботаетПоHTTPS");
5859
ВсеТесты.Добавить("Тест_ДолженПроверитьЧтоПеремещениеФайлаРаботаетПоHTTP");
5960
ВсеТесты.Добавить("Тест_ДолженПроверитьЧтоКопированиеФайлаПоОтносительномуПутиРаботаетКорректно");
6061
ВсеТесты.Добавить("Тест_ДолженПроверитьЧтоПеремещениеФайлаПоОтносительномуПутиРаботаетКорректно");
@@ -503,6 +504,24 @@
503504

504505
КонецПроцедуры
505506

507+
Процедура Тест_ДолженПроверитьЧтоКопированиеФайлаРаботаетПоHTTPS() Экспорт
508+
509+
Приемник = ПолучитьИмяВременногоФайла();
510+
511+
КопироватьФайл("https://httpbin.org/image", Приемник);
512+
513+
Попытка
514+
ДД = Новый ДвоичныеДанные(Приемник);
515+
юТест.Проверить(ДД.Размер() > 0, "Файл должен быть скопирован");
516+
Исключение
517+
УдалитьФайлы(Приемник);
518+
ВызватьИсключение;
519+
КонецПопытки;
520+
521+
УдалитьФайлы(Приемник);
522+
523+
КонецПроцедуры
524+
506525
Процедура Тест_ДолженПроверитьЧтоПеремещениеФайлаРаботаетПоHTTP() Экспорт
507526

508527
Приемник = ПолучитьИмяВременногоФайла();

0 commit comments

Comments
 (0)