Skip to content

Commit 3c3984c

Browse files
authored
Merge pull request EvilBeaver#1686 from Mr-Rm/v2/fix-1675
fix EvilBeaver#1675: возвращаемый тип ЗагрузитьСценарий()
2 parents 17dae14 + 9d10d7d commit 3c3984c

2 files changed

Lines changed: 66 additions & 66 deletions

File tree

src/OneScript.StandardLibrary/DynamicLoadingFunctions.cs

Lines changed: 58 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ This Source Code Form is subject to the terms of the
1111
using OneScript.Exceptions;
1212
using OneScript.Execution;
1313
using OneScript.Language;
14+
using OneScript.Localization;
1415
using OneScript.StandardLibrary.Collections;
1516
using OneScript.StandardLibrary.NativeApi;
1617
using ScriptEngine;
1718
using ScriptEngine.Machine;
1819
using ScriptEngine.Machine.Contexts;
20+
using System;
1921

2022
namespace OneScript.StandardLibrary
2123
{
@@ -34,7 +36,7 @@ public DynamicLoadingFunctions(ScriptingEngine engine)
3436

3537
/// <summary>
3638
/// Подключает сторонний файл сценария к текущей системе типов.
37-
/// Подключенный сценарий выступает, как самостоятельный класс, создаваемый оператором Новый
39+
/// Подключенный сценарий выступает как самостоятельный класс, создаваемый оператором Новый
3840
/// </summary>
3941
/// <param name="path">Путь к подключаемому сценарию</param>
4042
/// <param name="typeName">Имя типа, которое будет иметь новый класс. Экземпляры класса создаются оператором Новый. </param>
@@ -48,25 +50,15 @@ public void AttachScript(IBslProcess process, string path, string typeName)
4850
{
4951
_engine.AttachedScriptsFactory.AttachByPath(compiler, path, typeName, process);
5052
}
51-
catch (SyntaxErrorException e)
52-
{
53-
// обернем в RuntimeException
54-
throw new RuntimeException(
55-
Locale.NStr("ru = 'Ошибка компиляции подключаемого скрипта';en = 'Error compiling attached script'"),
56-
e);
57-
}
58-
catch (Compilation.CompilerException e)
59-
{
60-
// обернем в RuntimeException
61-
throw new RuntimeException(
62-
Locale.NStr("ru = 'Ошибка компиляции подключаемого скрипта';en = 'Error compiling attached script'"),
63-
e);
53+
catch (Exception e) when (e is SyntaxErrorException || e is CompilerException)
54+
{
55+
throw ScriptCompilingException(e);
6456
}
6557
}
6658

6759
/// <summary>
6860
/// Создает экземпляр объекта на основании стороннего файла сценария.
69-
/// Загруженный сценарий возвращается, как самостоятельный объект.
61+
/// Загруженный сценарий возвращается как самостоятельный объект.
7062
/// Экспортные свойства и методы скрипта доступны для вызова.
7163
/// </summary>
7264
/// <param name="process"></param>
@@ -80,44 +72,24 @@ public UserScriptContextInstance LoadScriptFromString(IBslProcess process,
8072
string code,
8173
StructureImpl externalContext = null)
8274
{
83-
var compiler = _engine.GetCompilerService();
84-
if (externalContext == null)
85-
{
86-
return _engine.AttachedScriptsFactory.LoadFromString(compiler, code, process);
87-
}
88-
else
89-
{
90-
var extData = new ExternalContextData();
75+
var compiler = _engine.GetCompilerService();
76+
try
77+
{
78+
if (externalContext == null)
79+
return _engine.AttachedScriptsFactory.LoadFromString(compiler, code, process);
9180

92-
foreach (var item in externalContext)
93-
{
94-
extData.Add(item.Key.ToString()!, item.Value);
95-
}
96-
97-
try
98-
{
99-
return _engine.AttachedScriptsFactory.LoadFromString(compiler, code, process, extData);
100-
}
101-
catch (SyntaxErrorException e)
102-
{
103-
// обернем в RuntimeException
104-
throw new RuntimeException(
105-
Locale.NStr("ru = 'Ошибка компиляции подключаемого скрипта';en = 'Error compiling attached script'"),
106-
e);
107-
}
108-
catch (CompilerException e)
109-
{
110-
// обернем в RuntimeException
111-
throw new RuntimeException(
112-
Locale.NStr("ru = 'Ошибка компиляции подключаемого скрипта';en = 'Error compiling attached script'"),
113-
e);
114-
}
115-
}
81+
var extData = CreateContextData(externalContext);
82+
return _engine.AttachedScriptsFactory.LoadFromString(compiler, code, process, extData);
83+
}
84+
catch (Exception e) when (e is SyntaxErrorException || e is CompilerException)
85+
{
86+
throw ScriptCompilingException(e);
87+
}
11688
}
11789

11890
/// <summary>
11991
/// Создает экземпляр объекта на основании стороннего файла сценария.
120-
/// Загруженный сценарий возвращается, как самостоятельный объект.
92+
/// Загруженный сценарий возвращается как самостоятельный объект.
12193
/// Экспортные свойства и методы скрипта доступны для вызова.
12294
/// </summary>
12395
/// <param name="path">Путь к подключаемому сценарию</param>
@@ -128,31 +100,44 @@ public UserScriptContextInstance LoadScriptFromString(IBslProcess process,
128100
/// // В коде скрипта somescript.os будет доступна глобальная переменная "ЧислоПи"
129101
/// Объект = ЗагрузитьСценарий("somescript.os", Контекст);</example>
130102
[ContextMethod("ЗагрузитьСценарий", "LoadScript")]
131-
public IRuntimeContextInstance LoadScript(IBslProcess process, string path, StructureImpl externalContext = null)
132-
{
103+
public UserScriptContextInstance LoadScript(IBslProcess process, string path, StructureImpl externalContext = null)
104+
{
133105
var compiler = _engine.GetCompilerService();
134-
if(externalContext == null)
135-
return _engine.AttachedScriptsFactory.LoadFromPath(compiler, path, process);
136-
else
137-
{
138-
ExternalContextData extData = new ExternalContextData();
139-
140-
foreach (var item in externalContext)
141-
{
142-
extData.Add(item.Key.ToString()!, item.Value);
143-
}
106+
try
107+
{
108+
if(externalContext == null)
109+
return _engine.AttachedScriptsFactory.LoadFromPath(compiler, path, process);
144110

111+
var extData = CreateContextData(externalContext);
145112
return _engine.AttachedScriptsFactory.LoadFromPath(compiler, path, extData, process);
146-
113+
}
114+
catch (Exception e) when (e is SyntaxErrorException || e is CompilerException)
115+
{
116+
throw ScriptCompilingException(e);
147117
}
148-
}
149-
118+
}
119+
120+
private static ExternalContextData CreateContextData(StructureImpl externalContext)
121+
{
122+
if (externalContext == null)
123+
return null;
124+
125+
ExternalContextData extData = new ExternalContextData();
126+
127+
foreach (var item in externalContext)
128+
{
129+
extData.Add(item.Key.ToString()!, item.Value);
130+
}
131+
132+
return extData;
133+
}
134+
150135
/// <summary>
151136
/// Подключает внешнюю сборку среды .NET (*.dll) и регистрирует классы 1Script, объявленные в этой сборке.
152137
/// Публичные классы, отмеченные в dll атрибутом ContextClass, будут импортированы аналогично встроенным классам 1Script.
153138
/// Загружаемая сборка должна ссылаться на сборку ScriptEngine.dll
154139
///
155-
/// Также подключает вншение компонеты, разработанные по технологии Native API,
140+
/// Также подключает внешние компоненты, разработанные по технологии Native API,
156141
/// поставляемые в виде отдельных DLL или упакованные в ZIP-архив.
157142
///
158143
/// </summary>
@@ -181,13 +166,21 @@ public bool AttachAddIn(string dllPath, string name = "", NativeApiEnums type =
181166
_engine.AttachExternalAssembly(assembly);
182167
return true;
183168
}
184-
else {
169+
else
170+
{
185171
if (!Utils.IsValidIdentifier(name))
186172
{
187173
throw RuntimeException.InvalidArgumentValue(name);
188174
}
189175
return NativeApiFactory.Register(dllPath, name, _engine.TypeManager);
190176
}
191177
}
178+
179+
private static RuntimeException ScriptCompilingException(Exception e)
180+
{
181+
return new RuntimeException(BilingualString.Localize(
182+
"Ошибка компиляции подключаемого сценария:\n",
183+
"Error compiling attached script:\n") + e.Message, e);
184+
}
192185
}
193186
}

tests/native-lib/test-native-use.os

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСОшибочноПропущеннымиПараметрами");
1616
Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСЛишнимиПараметрами");
1717
Тесты.Добавить("ТестДолжен_ПроверитьВызовКонструктораСПараметрамиПоУмолчанию");
18-
18+
Тесты.Добавить("ТестДолжен_ПроверитьПодключениеСценарияСОбъявленнойПеременной");
1919
Возврат Тесты;
2020

2121
КонецФункции
@@ -92,3 +92,10 @@
9292
Процедура ТестДолжен_ПроверитьВызовКонструктораСПараметрамиПоУмолчанию() Экспорт
9393
Сценарий = Новый ПараметрыКонструктораПоУмолчанию("Парам1");
9494
КонецПроцедуры
95+
96+
Процедура ТестДолжен_ПроверитьПодключениеСценарияСОбъявленнойПеременной() Экспорт
97+
Перем Сценарий;
98+
Сценарий = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "Классы", "ТестовыйСценарий.os"));
99+
юТест.ПроверитьРавенство(Сценарий.Поле1, 1);
100+
КонецПроцедуры
101+

0 commit comments

Comments
 (0)