@@ -11,11 +11,13 @@ This Source Code Form is subject to the terms of the
1111using OneScript . Exceptions ;
1212using OneScript . Execution ;
1313using OneScript . Language ;
14+ using OneScript . Localization ;
1415using OneScript . StandardLibrary . Collections ;
1516using OneScript . StandardLibrary . NativeApi ;
1617using ScriptEngine ;
1718using ScriptEngine . Machine ;
1819using ScriptEngine . Machine . Contexts ;
20+ using System ;
1921
2022namespace 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}
0 commit comments