From 753af832c279d8c6b986caefdde90012e746674a Mon Sep 17 00:00:00 2001 From: Vissarion Date: Mon, 2 Jan 2023 17:09:13 +0600 Subject: [PATCH 1/6] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=BB=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B0=D1=82=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B8=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Library/Reflector.cs | 5 ++- .../Machine/Contexts/ScriptDrivenObject.cs | 6 ++-- src/ScriptEngine/Machine/Core.cs | 1 + .../Machine/IRuntimeContextInstance.cs | 15 +++++++- src/ScriptEngine/Machine/LoadedModule.cs | 24 +++++++++++++ tests/reflector.os | 35 +++++++++++++++++-- 6 files changed, 79 insertions(+), 7 deletions(-) diff --git a/src/ScriptEngine.HostedScript/Library/Reflector.cs b/src/ScriptEngine.HostedScript/Library/Reflector.cs index ef00e1d06..ba1b4d87a 100644 --- a/src/ScriptEngine.HostedScript/Library/Reflector.cs +++ b/src/ScriptEngine.HostedScript/Library/Reflector.cs @@ -299,7 +299,7 @@ private static void FillPropertiesTableForType(TypeTypeValue type, ValueTable.Va if (clrType.BaseType == typeof(ScriptDrivenObject)) { - var nativeFields = clrType.GetFields(); + var nativeFields = clrType.GetFields(BindingFlags.NonPublic | BindingFlags.Public); foreach(var field in nativeFields) { var info = new VariableInfo(); @@ -307,6 +307,7 @@ private static void FillPropertiesTableForType(TypeTypeValue type, ValueTable.Va info.Index = indices++; info.Identifier = field.Name; info.Annotations = GetAnnotations(field.GetCustomAttributes()); + info.IsExport = field.IsPublic; infos.Add(info); } } @@ -422,6 +423,7 @@ private static void FillPropertiesTable(ValueTable.ValueTable result, IEnumerabl { var nameColumn = result.Columns.Add("Имя", TypeDescription.StringType(), "Имя"); var annotationsColumn = result.Columns.Add("Аннотации", new TypeDescription(), "Аннотации"); + var exportColumn = result.Columns.Add("Экспорт", TypeDescription.BooleanType(), "Экспорт"); var systemVarNames = new string[] { "этотобъект", "thisobject" }; foreach (var propInfo in properties) @@ -432,6 +434,7 @@ private static void FillPropertiesTable(ValueTable.ValueTable result, IEnumerabl new_row.Set(nameColumn, ValueFactory.Create(propInfo.Identifier)); new_row.Set(annotationsColumn, propInfo.AnnotationsCount != 0 ? CreateAnnotationTable(propInfo.Annotations) : EmptyAnnotationsTable()); + new_row.Set(exportColumn, ValueFactory.Create(propInfo.IsExport)); } } diff --git a/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs b/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs index e3008f85d..82fbc1ad1 100644 --- a/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs +++ b/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs @@ -367,19 +367,19 @@ public override void CallAsFunction(int methodNumber, IValue[] arguments, out IV public override int GetPropCount() { - return VARIABLE_COUNT + _module.ExportedProperies.Length; + return VARIABLE_COUNT + _module.Variables.Count; } public override int GetMethodsCount() { - return METHOD_COUNT + _module.ExportedMethods.Length; + return METHOD_COUNT + _module.Methods.Length; } public override string GetPropName(int propNum) { if(PropDefinedInScript(propNum)) { - return _module.ExportedProperies[propNum - VARIABLE_COUNT].SymbolicName; + return _module.Variables[propNum - VARIABLE_COUNT].Identifier; } else { diff --git a/src/ScriptEngine/Machine/Core.cs b/src/ScriptEngine/Machine/Core.cs index 321e65215..b3ee5edef 100644 --- a/src/ScriptEngine/Machine/Core.cs +++ b/src/ScriptEngine/Machine/Core.cs @@ -311,6 +311,7 @@ public struct VariableInfo public string Identifier; public string Alias; public SymbolType Type; + public bool IsExport; public bool CanGet; public bool CanSet; diff --git a/src/ScriptEngine/Machine/IRuntimeContextInstance.cs b/src/ScriptEngine/Machine/IRuntimeContextInstance.cs index a14ac769c..794313647 100644 --- a/src/ScriptEngine/Machine/IRuntimeContextInstance.cs +++ b/src/ScriptEngine/Machine/IRuntimeContextInstance.cs @@ -60,13 +60,26 @@ public static IEnumerable GetProperties(this IRuntimeContextInstan Identifier = context.GetPropName(i), Type = SymbolType.ContextProperty, Index = i, - Annotations = HackGetAnnotations(context, i) + Annotations = HackGetAnnotations(context, i), + IsExport = HackGetExport(context, i) }; } return infos; } + private static bool HackGetExport(IRuntimeContextInstance context, int i) + { + if (!(context is UserScriptContextInstance userScript)) + return false; + + if (i == 0) + return false; + + var variable = userScript.Module.Variables[i - 1]; + return variable.IsExport; + } + private static AnnotationDefinition[] HackGetAnnotations(IRuntimeContextInstance context, int i) { if (!(context is UserScriptContextInstance userScript)) diff --git a/src/ScriptEngine/Machine/LoadedModule.cs b/src/ScriptEngine/Machine/LoadedModule.cs index 726f92561..f1f6be568 100644 --- a/src/ScriptEngine/Machine/LoadedModule.cs +++ b/src/ScriptEngine/Machine/LoadedModule.cs @@ -33,6 +33,30 @@ public LoadedModule(ModuleImage image) ResolveAnnotationConstants(); ResolveDefaultParametersValues(); + ResolveExportFieldOnParameters(); + } + + private void ResolveExportFieldOnParameters() + { + foreach(var expVariables in ExportedProperies) + { + for (int i = 0; i < Variables.Count; i++) + { + if (Variables[i].Index == expVariables.Index) + { + var variable = Variables[i]; + Variables[i] = new VariableInfo() + { + Identifier = variable.Identifier, + Annotations = variable.Annotations, + CanGet = variable.CanGet, + CanSet = variable.CanSet, + Index = variable.Index, + IsExport = true + }; + } + } + } } private void ResolveDefaultParametersValues() diff --git a/tests/reflector.os b/tests/reflector.os index d5a876886..6f47982cc 100644 --- a/tests/reflector.os +++ b/tests/reflector.os @@ -37,6 +37,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьМетод_ПолучитьТаблицуМетодов_ПроверитьЗначенияПоУмолчанию"); ВсеТесты.Добавить("ТестДолжен_ПроверитьМетод_ПолучитьТаблицуМетодов_ПроверитьЗначенияПоУмолчанию_ИзТипаОбъекта"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПустыеАннотации"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПриватныеПоля"); Возврат ВсеТесты; КонецФункции @@ -296,9 +297,9 @@ Рефлектор = Новый Рефлектор; ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(Пример); - юТест.ПроверитьРавенство(5, ТаблицаСвойств.Количество()); + юТест.ПроверитьРавенство(7, ТаблицаСвойств.Количество()); - юТест.ПроверитьРавенство("ЭкспортнаяПеременная", ТаблицаСвойств[3].Имя); + юТест.ПроверитьРавенство("ЭкспортнаяПеременная", ТаблицаСвойств[4].Имя); ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(Рефлектор); юТест.ПроверитьРавенство(0, ТаблицаСвойств.Количество()); @@ -553,4 +554,34 @@ юТест.ПроверитьРавенство(Яшма2.Аннотации[0].Параметры[0].Значение, 1); юТест.ПроверитьРавенство(ПеременнаяСАннотациейИПараметром.Аннотации[0].Параметры[0].Значение, 1); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПриватныеПоля() Экспорт + Пример = ПолучитьОбъектДляПроверки("test_reflector"); + + Рефлектор = Новый Рефлектор; + ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(Пример); + юТест.ПроверитьРавенство(ТаблицаСвойств[2].Имя, "юТест"); + юТест.ПроверитьРавенство(ТаблицаСвойств[2].Экспорт, Ложь); + юТест.ПроверитьРавенство(ТаблицаСвойств[4].Имя, "ЭкспортнаяПеременная"); + юТест.ПроверитьРавенство(ТаблицаСвойств[4].Экспорт, Истина); + + ТаблицаМетодов = Рефлектор.ПолучитьТаблицуМетодов(Пример); + юТест.ПроверитьРавенство(ТаблицаМетодов[4].Имя, "ПриватнаяПроцедура"); + юТест.ПроверитьРавенство(ТаблицаМетодов[4].Экспорт, Ложь); + юТест.ПроверитьРавенство(ТаблицаМетодов[6].Имя, "Яшма2"); + юТест.ПроверитьРавенство(ТаблицаМетодов[6].Экспорт, Истина); + + ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(ТипЗнч(Пример)); + юТест.ПроверитьРавенство(ТаблицаСвойств[2].Имя, "юТест"); + юТест.ПроверитьРавенство(ТаблицаСвойств[2].Экспорт, Ложь); + юТест.ПроверитьРавенство(ТаблицаСвойств[4].Имя, "ЭкспортнаяПеременная"); + юТест.ПроверитьРавенство(ТаблицаСвойств[4].Экспорт, Истина); + + ТаблицаМетодов = Рефлектор.ПолучитьТаблицуМетодов(ТипЗнч(Пример)); + юТест.ПроверитьРавенство(ТаблицаМетодов[3].Имя, "ПриватнаяПроцедура"); + юТест.ПроверитьРавенство(ТаблицаМетодов[3].Экспорт, Ложь); + юТест.ПроверитьРавенство(ТаблицаМетодов[5].Имя, "Яшма2"); + юТест.ПроверитьРавенство(ТаблицаМетодов[5].Экспорт, Истина); + КонецПроцедуры \ No newline at end of file From cdececac1a6d67767086d1842492cb91b33f0e81 Mon Sep 17 00:00:00 2001 From: Vissarion Date: Tue, 3 Jan 2023 17:23:25 +0600 Subject: [PATCH 2/6] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=BB=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B0=D1=82=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B8=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Library/Reflector.cs | 13 +++--- src/ScriptEngine/Compiler/Compiler.cs | 28 +++++++++---- .../Machine/IRuntimeContextInstance.cs | 41 ++++++++++++------- src/ScriptEngine/Machine/LoadedModule.cs | 24 ----------- tests/reflector.os | 4 +- 5 files changed, 57 insertions(+), 53 deletions(-) diff --git a/src/ScriptEngine.HostedScript/Library/Reflector.cs b/src/ScriptEngine.HostedScript/Library/Reflector.cs index ba1b4d87a..84e6e967c 100644 --- a/src/ScriptEngine.HostedScript/Library/Reflector.cs +++ b/src/ScriptEngine.HostedScript/Library/Reflector.cs @@ -274,7 +274,7 @@ private static AnnotationDefinition[] GetAnnotations(IEnumerable x.Annotation).ToArray(); } - private static void FillPropertiesTableForType(TypeTypeValue type, ValueTable.ValueTable result) + private static void FillPropertiesTableForType(TypeTypeValue type, ValueTable.ValueTable result, bool withPrivate = false) { var clrType = GetReflectableClrType(type); var nativeProps = clrType.GetProperties() @@ -299,8 +299,8 @@ private static void FillPropertiesTableForType(TypeTypeValue type, ValueTable.Va if (clrType.BaseType == typeof(ScriptDrivenObject)) { - var nativeFields = clrType.GetFields(BindingFlags.NonPublic | BindingFlags.Public); - foreach(var field in nativeFields) + var nativeFields = withPrivate ? clrType.GetFields(BindingFlags.NonPublic | BindingFlags.Public) : clrType.GetFields(); + foreach (var field in nativeFields) { var info = new VariableInfo(); info.Type = SymbolType.ContextProperty; @@ -366,18 +366,19 @@ private static void FillMethodsTable(ValueTable.ValueTable result, IEnumerable /// Объект, из которого получаем таблицу свойств. + /// Включая приватные /// Таблица значений с колонками - Имя, Аннотации [ContextMethod("ПолучитьТаблицуСвойств", "GetPropertiesTable")] - public ValueTable.ValueTable GetPropertiesTable(IValue target) + public ValueTable.ValueTable GetPropertiesTable(IValue target, bool withPrivate = false) { ValueTable.ValueTable result = new ValueTable.ValueTable(); if(target.DataType == DataType.Object) - FillPropertiesTable(result, target.AsObject().GetProperties()); + FillPropertiesTable(result, target.AsObject().GetProperties(withPrivate)); else if (target.DataType == DataType.Type) { var type = target.GetRawValue() as TypeTypeValue; - FillPropertiesTableForType(type, result); + FillPropertiesTableForType(type, result, withPrivate); } else throw RuntimeException.InvalidArgumentType(); diff --git a/src/ScriptEngine/Compiler/Compiler.cs b/src/ScriptEngine/Compiler/Compiler.cs index 9008cc0d6..3a32d7eb8 100644 --- a/src/ScriptEngine/Compiler/Compiler.cs +++ b/src/ScriptEngine/Compiler/Compiler.cs @@ -340,24 +340,38 @@ private void BuildVariableDefinitions() } _module.VariableRefs.Add(definition); + } + NextToken(); + if (_lastExtractedLexem.Token == Token.Export) + { + _module.ExportedProperties.Add(new ExportedSymbol() + { + SymbolicName = symbolicName, + Index = definition.CodeIndex + }); _module.Variables.Add(new VariableInfo() { Identifier = symbolicName, Annotations = annotations, CanGet = true, CanSet = true, - Index = definition.CodeIndex + Index = definition.CodeIndex, + IsExport = true }); + + NextToken(); } - NextToken(); - if (_lastExtractedLexem.Token == Token.Export) + else { - _module.ExportedProperties.Add(new ExportedSymbol() + _module.Variables.Add(new VariableInfo() { - SymbolicName = symbolicName, - Index = definition.CodeIndex + Identifier = symbolicName, + Annotations = annotations, + CanGet = true, + CanSet = true, + Index = definition.CodeIndex, + IsExport = false }); - NextToken(); } if (_lastExtractedLexem.Token == Token.Comma) { diff --git a/src/ScriptEngine/Machine/IRuntimeContextInstance.cs b/src/ScriptEngine/Machine/IRuntimeContextInstance.cs index 794313647..c9e7f9ab3 100644 --- a/src/ScriptEngine/Machine/IRuntimeContextInstance.cs +++ b/src/ScriptEngine/Machine/IRuntimeContextInstance.cs @@ -50,7 +50,32 @@ public static IEnumerable GetMethods(this IRuntimeContextInstance co return methods; } - public static IEnumerable GetProperties(this IRuntimeContextInstance context) + public static IEnumerable GetProperties(this IRuntimeContextInstance context, bool withPrivate = false) + { + return withPrivate ? GetPropertiesWithPrivate(context) : GetPropertiesWithoutPrivate(context); + } + + private static IEnumerable GetPropertiesWithPrivate(IRuntimeContextInstance context) + { + if (!(context is UserScriptContextInstance userScript)) + return Array.Empty(); + + List infos = new List(); + foreach (var variable in userScript.Module.Variables) + { + infos.Add(new VariableInfo() { + Identifier = variable.Identifier, + Type = variable.Type, + Index = variable.Index, + Annotations = HackGetAnnotations(context, variable.Index), + IsExport = variable.IsExport + }); + } + + return infos; + } + + private static IEnumerable GetPropertiesWithoutPrivate(IRuntimeContextInstance context) { VariableInfo[] infos = new VariableInfo[context.GetPropCount()]; for (int i = 0; i < infos.Length; i++) @@ -61,25 +86,13 @@ public static IEnumerable GetProperties(this IRuntimeContextInstan Type = SymbolType.ContextProperty, Index = i, Annotations = HackGetAnnotations(context, i), - IsExport = HackGetExport(context, i) + IsExport = true }; } return infos; } - private static bool HackGetExport(IRuntimeContextInstance context, int i) - { - if (!(context is UserScriptContextInstance userScript)) - return false; - - if (i == 0) - return false; - - var variable = userScript.Module.Variables[i - 1]; - return variable.IsExport; - } - private static AnnotationDefinition[] HackGetAnnotations(IRuntimeContextInstance context, int i) { if (!(context is UserScriptContextInstance userScript)) diff --git a/src/ScriptEngine/Machine/LoadedModule.cs b/src/ScriptEngine/Machine/LoadedModule.cs index f1f6be568..726f92561 100644 --- a/src/ScriptEngine/Machine/LoadedModule.cs +++ b/src/ScriptEngine/Machine/LoadedModule.cs @@ -33,30 +33,6 @@ public LoadedModule(ModuleImage image) ResolveAnnotationConstants(); ResolveDefaultParametersValues(); - ResolveExportFieldOnParameters(); - } - - private void ResolveExportFieldOnParameters() - { - foreach(var expVariables in ExportedProperies) - { - for (int i = 0; i < Variables.Count; i++) - { - if (Variables[i].Index == expVariables.Index) - { - var variable = Variables[i]; - Variables[i] = new VariableInfo() - { - Identifier = variable.Identifier, - Annotations = variable.Annotations, - CanGet = variable.CanGet, - CanSet = variable.CanSet, - Index = variable.Index, - IsExport = true - }; - } - } - } } private void ResolveDefaultParametersValues() diff --git a/tests/reflector.os b/tests/reflector.os index 6f47982cc..98f3e579f 100644 --- a/tests/reflector.os +++ b/tests/reflector.os @@ -560,7 +560,7 @@ Пример = ПолучитьОбъектДляПроверки("test_reflector"); Рефлектор = Новый Рефлектор; - ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(Пример); + ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(Пример, Истина); юТест.ПроверитьРавенство(ТаблицаСвойств[2].Имя, "юТест"); юТест.ПроверитьРавенство(ТаблицаСвойств[2].Экспорт, Ложь); юТест.ПроверитьРавенство(ТаблицаСвойств[4].Имя, "ЭкспортнаяПеременная"); @@ -572,7 +572,7 @@ юТест.ПроверитьРавенство(ТаблицаМетодов[6].Имя, "Яшма2"); юТест.ПроверитьРавенство(ТаблицаМетодов[6].Экспорт, Истина); - ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(ТипЗнч(Пример)); + ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(ТипЗнч(Пример), Истина); юТест.ПроверитьРавенство(ТаблицаСвойств[2].Имя, "юТест"); юТест.ПроверитьРавенство(ТаблицаСвойств[2].Экспорт, Ложь); юТест.ПроверитьРавенство(ТаблицаСвойств[4].Имя, "ЭкспортнаяПеременная"); From dc691e22f3534ba2d5e360f8d9190c868d831437 Mon Sep 17 00:00:00 2001 From: Vissarion Date: Tue, 3 Jan 2023 17:25:58 +0600 Subject: [PATCH 3/6] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=BB=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B0=D1=82=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B8=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs b/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs index 82fbc1ad1..e3008f85d 100644 --- a/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs +++ b/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs @@ -367,19 +367,19 @@ public override void CallAsFunction(int methodNumber, IValue[] arguments, out IV public override int GetPropCount() { - return VARIABLE_COUNT + _module.Variables.Count; + return VARIABLE_COUNT + _module.ExportedProperies.Length; } public override int GetMethodsCount() { - return METHOD_COUNT + _module.Methods.Length; + return METHOD_COUNT + _module.ExportedMethods.Length; } public override string GetPropName(int propNum) { if(PropDefinedInScript(propNum)) { - return _module.Variables[propNum - VARIABLE_COUNT].Identifier; + return _module.ExportedProperies[propNum - VARIABLE_COUNT].SymbolicName; } else { From f4d3422a08f88a7397de1e3ef2ec33325867e3ad Mon Sep 17 00:00:00 2001 From: Vissarion Date: Sat, 7 Jan 2023 17:35:40 +0600 Subject: [PATCH 4/6] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=BB=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B0=D1=82=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B8=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Library/Reflector.cs | 6 +- src/ScriptEngine/Compiler/Compiler.cs | 35 ++++------ tests/reflector.os | 65 ++++++++++++++----- 3 files changed, 68 insertions(+), 38 deletions(-) diff --git a/src/ScriptEngine.HostedScript/Library/Reflector.cs b/src/ScriptEngine.HostedScript/Library/Reflector.cs index 84e6e967c..c3cc70776 100644 --- a/src/ScriptEngine.HostedScript/Library/Reflector.cs +++ b/src/ScriptEngine.HostedScript/Library/Reflector.cs @@ -299,7 +299,11 @@ private static void FillPropertiesTableForType(TypeTypeValue type, ValueTable.Va if (clrType.BaseType == typeof(ScriptDrivenObject)) { - var nativeFields = withPrivate ? clrType.GetFields(BindingFlags.NonPublic | BindingFlags.Public) : clrType.GetFields(); + var flags = BindingFlags.Public; + if (withPrivate) + flags |= BindingFlags.NonPublic; + + var nativeFields = clrType.GetFields(flags); foreach (var field in nativeFields) { var info = new VariableInfo(); diff --git a/src/ScriptEngine/Compiler/Compiler.cs b/src/ScriptEngine/Compiler/Compiler.cs index 3a32d7eb8..1a82c555a 100644 --- a/src/ScriptEngine/Compiler/Compiler.cs +++ b/src/ScriptEngine/Compiler/Compiler.cs @@ -325,6 +325,7 @@ private void BuildVariableDefinitions() var symbolicName = _lastExtractedLexem.Content; var annotations = ExtractAnnotations(); var definition = _ctx.DefineVariable(symbolicName); + var variableInfo = new VariableInfo(); if (_inMethodScope) { if (_isStatementsDefined) @@ -340,39 +341,29 @@ private void BuildVariableDefinitions() } _module.VariableRefs.Add(definition); - } - NextToken(); - if (_lastExtractedLexem.Token == Token.Export) - { - _module.ExportedProperties.Add(new ExportedSymbol() - { - SymbolicName = symbolicName, - Index = definition.CodeIndex - }); - _module.Variables.Add(new VariableInfo() + variableInfo = new VariableInfo() { Identifier = symbolicName, Annotations = annotations, CanGet = true, CanSet = true, Index = definition.CodeIndex, - IsExport = true - }); - - NextToken(); + IsExport = false + }; } - else + NextToken(); + if (_lastExtractedLexem.Token == Token.Export) { - _module.Variables.Add(new VariableInfo() + _module.ExportedProperties.Add(new ExportedSymbol() { - Identifier = symbolicName, - Annotations = annotations, - CanGet = true, - CanSet = true, - Index = definition.CodeIndex, - IsExport = false + SymbolicName = symbolicName, + Index = definition.CodeIndex }); + variableInfo.IsExport = true; + NextToken(); } + if(variableInfo.Identifier != null) + _module.Variables.Add(variableInfo); if (_lastExtractedLexem.Token == Token.Comma) { NextToken(); diff --git a/tests/reflector.os b/tests/reflector.os index 98f3e579f..9f69f5986 100644 --- a/tests/reflector.os +++ b/tests/reflector.os @@ -297,9 +297,9 @@ Рефлектор = Новый Рефлектор; ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(Пример); - юТест.ПроверитьРавенство(7, ТаблицаСвойств.Количество()); + юТест.ПроверитьРавенство(5, ТаблицаСвойств.Количество()); - юТест.ПроверитьРавенство("ЭкспортнаяПеременная", ТаблицаСвойств[4].Имя); + юТест.ПроверитьРавенство("ЭкспортнаяПеременная", ТаблицаСвойств[3].Имя); ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(Рефлектор); юТест.ПроверитьРавенство(0, ТаблицаСвойств.Количество()); @@ -561,27 +561,62 @@ Рефлектор = Новый Рефлектор; ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(Пример, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств.Количество(), 7); + юТест.ПроверитьРавенство(ТаблицаСвойств[0].Имя, "ПеременнаяСАннотацией"); + юТест.ПроверитьРавенство(ТаблицаСвойств[0].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[1].Имя, "ПеременнаяСАннотациейИПараметром"); + юТест.ПроверитьРавенство(ТаблицаСвойств[1].Экспорт, Истина); юТест.ПроверитьРавенство(ТаблицаСвойств[2].Имя, "юТест"); юТест.ПроверитьРавенство(ТаблицаСвойств[2].Экспорт, Ложь); + юТест.ПроверитьРавенство(ТаблицаСвойств[3].Имя, "ЭтотОбъек"); + юТест.ПроверитьРавенство(ТаблицаСвойств[3].Экспорт, Истина); юТест.ПроверитьРавенство(ТаблицаСвойств[4].Имя, "ЭкспортнаяПеременная"); юТест.ПроверитьРавенство(ТаблицаСвойств[4].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[5].Имя, "Яшма1"); + юТест.ПроверитьРавенство(ТаблицаСвойств[5].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[6].Имя, "Яшма2"); + юТест.ПроверитьРавенство(ТаблицаСвойств[6].Экспорт, Ложь); + + ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(Пример); + юТест.ПроверитьРавенство(ТаблицаСвойств.Количество(), 5); + юТест.ПроверитьРавенство(ТаблицаСвойств[0].Имя, "ПеременнаяСАннотацией"); + юТест.ПроверитьРавенство(ТаблицаСвойств[0].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[1].Имя, "ПеременнаяСАннотациейИПараметром"); + юТест.ПроверитьРавенство(ТаблицаСвойств[1].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[2].Имя, "ЭтотОбъек"); + юТест.ПроверитьРавенство(ТаблицаСвойств[2].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[3].Имя, "ЭкспортнаяПеременная"); + юТест.ПроверитьРавенство(ТаблицаСвойств[3].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[4].Имя, "Яшма1"); + юТест.ПроверитьРавенство(ТаблицаСвойств[4].Экспорт, Истина); - ТаблицаМетодов = Рефлектор.ПолучитьТаблицуМетодов(Пример); - юТест.ПроверитьРавенство(ТаблицаМетодов[4].Имя, "ПриватнаяПроцедура"); - юТест.ПроверитьРавенство(ТаблицаМетодов[4].Экспорт, Ложь); - юТест.ПроверитьРавенство(ТаблицаМетодов[6].Имя, "Яшма2"); - юТест.ПроверитьРавенство(ТаблицаМетодов[6].Экспорт, Истина); - ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(ТипЗнч(Пример), Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств.Количество(), 7); + юТест.ПроверитьРавенство(ТаблицаСвойств[0].Имя, "ПеременнаяСАннотацией"); + юТест.ПроверитьРавенство(ТаблицаСвойств[0].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[1].Имя, "ПеременнаяСАннотациейИПараметром"); + юТест.ПроверитьРавенство(ТаблицаСвойств[1].Экспорт, Истина); юТест.ПроверитьРавенство(ТаблицаСвойств[2].Имя, "юТест"); юТест.ПроверитьРавенство(ТаблицаСвойств[2].Экспорт, Ложь); + юТест.ПроверитьРавенство(ТаблицаСвойств[3].Имя, "ЭтотОбъек"); + юТест.ПроверитьРавенство(ТаблицаСвойств[3].Экспорт, Истина); юТест.ПроверитьРавенство(ТаблицаСвойств[4].Имя, "ЭкспортнаяПеременная"); юТест.ПроверитьРавенство(ТаблицаСвойств[4].Экспорт, Истина); - - ТаблицаМетодов = Рефлектор.ПолучитьТаблицуМетодов(ТипЗнч(Пример)); - юТест.ПроверитьРавенство(ТаблицаМетодов[3].Имя, "ПриватнаяПроцедура"); - юТест.ПроверитьРавенство(ТаблицаМетодов[3].Экспорт, Ложь); - юТест.ПроверитьРавенство(ТаблицаМетодов[5].Имя, "Яшма2"); - юТест.ПроверитьРавенство(ТаблицаМетодов[5].Экспорт, Истина); - + юТест.ПроверитьРавенство(ТаблицаСвойств[5].Имя, "Яшма1"); + юТест.ПроверитьРавенство(ТаблицаСвойств[5].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[6].Имя, "Яшма2"); + юТест.ПроверитьРавенство(ТаблицаСвойств[6].Экспорт, Ложь); + + ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(ТипЗнч(Пример)); + юТест.ПроверитьРавенство(ТаблицаСвойств.Количество(), 5); + юТест.ПроверитьРавенство(ТаблицаСвойств[0].Имя, "ПеременнаяСАннотацией"); + юТест.ПроверитьРавенство(ТаблицаСвойств[0].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[1].Имя, "ПеременнаяСАннотациейИПараметром"); + юТест.ПроверитьРавенство(ТаблицаСвойств[1].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[2].Имя, "ЭтотОбъек"); + юТест.ПроверитьРавенство(ТаблицаСвойств[2].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[3].Имя, "ЭкспортнаяПеременная"); + юТест.ПроверитьРавенство(ТаблицаСвойств[3].Экспорт, Истина); + юТест.ПроверитьРавенство(ТаблицаСвойств[4].Имя, "Яшма1"); + юТест.ПроверитьРавенство(ТаблицаСвойств[4].Экспорт, Истина); КонецПроцедуры \ No newline at end of file From 4c1aab6cd5db7d367bab6443c56c670b77638335 Mon Sep 17 00:00:00 2001 From: Vissarion Date: Thu, 12 Jan 2023 00:47:39 +0600 Subject: [PATCH 5/6] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=BB=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B0=D1=82=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B8=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Так же исправил ошибку #1248 --- src/NUnitTests/CompilerTests.cs | 22 ++++++++++++++++++- src/ScriptEngine/Compiler/Compiler.cs | 17 +++++++------- .../Compiler/CompilerExceptions.cs | 6 +++++ 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/NUnitTests/CompilerTests.cs b/src/NUnitTests/CompilerTests.cs index 08b904ea9..5f3f5ceec 100644 --- a/src/NUnitTests/CompilerTests.cs +++ b/src/NUnitTests/CompilerTests.cs @@ -532,5 +532,25 @@ Если Ложь Тогда } Assert.IsTrue(exceptionThrown, "Отсутствует точка с запятой между операторами!"); } - } + + [Test] + public void TestLocalExportVar() + { + var moduleSource = host.Engine.Loader.FromString( + @"Процедура Проц1() + Перем Переменная Экспорт; + КонецПроцедуры"); + + bool exceptionThrown = false; + try + { + _ = host.Engine.GetCompilerService().Compile(moduleSource); + } + catch (CompilerException) + { + exceptionThrown = true; + } + Assert.IsTrue(exceptionThrown, "В теле процедуры или функции не может быть объявлена экспортная переменная!"); + } + } } \ No newline at end of file diff --git a/src/ScriptEngine/Compiler/Compiler.cs b/src/ScriptEngine/Compiler/Compiler.cs index abdc7974f..69adf0b22 100644 --- a/src/ScriptEngine/Compiler/Compiler.cs +++ b/src/ScriptEngine/Compiler/Compiler.cs @@ -325,13 +325,18 @@ private void BuildVariableDefinitions() var symbolicName = _lastExtractedLexem.Content; var annotations = ExtractAnnotations(); var definition = _ctx.DefineVariable(symbolicName); - var variableInfo = new VariableInfo(); + NextToken(); if (_inMethodScope) { if (_isStatementsDefined) { throw CompilerException.LateVarDefinition(); } + + if(_lastExtractedLexem.Token == Token.Export) + { + throw CompilerException.LocalExportVar(); + } } else { @@ -341,17 +346,16 @@ private void BuildVariableDefinitions() } _module.VariableRefs.Add(definition); - variableInfo = new VariableInfo() + _module.Variables.Add(new VariableInfo() { Identifier = symbolicName, Annotations = annotations, CanGet = true, CanSet = true, Index = definition.CodeIndex, - IsExport = false - }; + IsExport = _lastExtractedLexem.Token == Token.Export + }); } - NextToken(); if (_lastExtractedLexem.Token == Token.Export) { _module.ExportedProperties.Add(new ExportedSymbol() @@ -359,11 +363,8 @@ private void BuildVariableDefinitions() SymbolicName = symbolicName, Index = definition.CodeIndex }); - variableInfo.IsExport = true; NextToken(); } - if(variableInfo.Identifier != null) - _module.Variables.Add(variableInfo); if (_lastExtractedLexem.Token == Token.Comma) { NextToken(); diff --git a/src/ScriptEngine/Compiler/CompilerExceptions.cs b/src/ScriptEngine/Compiler/CompilerExceptions.cs index 0f38e1677..fa7d3977e 100644 --- a/src/ScriptEngine/Compiler/CompilerExceptions.cs +++ b/src/ScriptEngine/Compiler/CompilerExceptions.cs @@ -51,6 +51,12 @@ internal static CompilerException LateVarDefinition() + "en='Variable declarations must be placed at beginning of module, procedure, or function'")); } + internal static CompilerException LocalExportVar() + { + return new CompilerException(Locale.NStr("ru='В теле процедуры или функции не может быть объявлена экспортная переменная';" + + "en='An export variable cannot be declared in the body of a procedure or function'")); + } + internal static CompilerException TokenExpected(params Token[] expected) { var names = expected.Select(x => Enum.GetName(typeof(Token), x)); From 5b7166190223a8bd442472b3dd88cad896448bab Mon Sep 17 00:00:00 2001 From: Vissarion Date: Thu, 12 Jan 2023 18:48:36 +0600 Subject: [PATCH 6/6] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=BB=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B0=D1=82=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B8=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/NUnitTests/CompilerTests.cs | 64 ++++++++++++++++----------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/NUnitTests/CompilerTests.cs b/src/NUnitTests/CompilerTests.cs index 5f3f5ceec..4af1cdc21 100644 --- a/src/NUnitTests/CompilerTests.cs +++ b/src/NUnitTests/CompilerTests.cs @@ -35,7 +35,7 @@ public void TestNoSemicolonBeforeEndProcedure() Возврат КонецПроцедуры"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } [Test] @@ -46,7 +46,7 @@ public void TestNoSemicolonBeforeEndFunction() Возврат 4 КонецФункции"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } [Test] @@ -57,7 +57,7 @@ public void TestNoSemicolonBeforeEndDo() Прервать КонецЦикла"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } [Test] @@ -72,7 +72,7 @@ ИначеЕсли Истина Тогда Ф = 3 КонецЕсли"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } [Test] @@ -85,7 +85,7 @@ public void TestNoSemicolonBeforeExceptionOrEndTry() ВызватьИсключение КонецПопытки"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } @@ -98,7 +98,7 @@ public void TestNoSemicolonBeforeEndOfText() КонецПроцедуры Ф = 0"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } #endregion @@ -112,7 +112,7 @@ public void TestSemicolonBeforeEndProcedure() Возврат; КонецПроцедуры"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } [Test] @@ -123,7 +123,7 @@ public void TestSemicolonBeforeEndFunction() Возврат 4; КонецФункции"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } [Test] @@ -134,7 +134,7 @@ public void TestSemicolonBeforeEndDo() Прервать; КонецЦикла"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } [Test] @@ -149,7 +149,7 @@ ИначеЕсли Истина Тогда Ф = 3; КонецЕсли"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } [Test] @@ -162,7 +162,7 @@ public void TestSemicolonBeforeExceptionOrEndTry() ВызватьИсключение; КонецПопытки"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } @@ -175,7 +175,7 @@ public void TestSemicolonBeforeEndOfText() КонецПроцедуры Ф = 0;"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } #endregion @@ -192,7 +192,7 @@ public void TestEndFunctionDoesNotEndIf() bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -212,7 +212,7 @@ public void TestEndDoDoesNotEndIf() bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -232,7 +232,7 @@ public void TestEndIfDoesNotEndDo() bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -251,7 +251,7 @@ public void TestEndFunctionDoesNotEndProcedure() bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -271,7 +271,7 @@ Возврат 0 bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -291,7 +291,7 @@ public void TestElseifDoesNotEndProcedure() bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -311,7 +311,7 @@ public void TestEndTryDoesNotEndProcedure() bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -339,7 +339,7 @@ Функция Ф1(П1, П2 = Неопределено, П3 = Неопредел Р = Ф1(,,) + Ф1(,); "); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } [Test(Description = "Не компилируется вызов метода вообще без параметров")] @@ -355,7 +355,7 @@ public void TestCantCompileCallWithoutParams() bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -374,7 +374,7 @@ public void TestReturnBeforeException() Исключение КонецПопытки КонецПроцедуры"); - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } @@ -389,7 +389,7 @@ ДобавитьОбработчик ЭтотОбъект.Событие Ина bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -411,7 +411,7 @@ Процедура Проц1() bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -434,7 +434,7 @@ Если Истина Тогда bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -457,7 +457,7 @@ Процедура Проц2() bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -479,7 +479,7 @@ Если Ложь Тогда bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -501,7 +501,7 @@ Если Ложь Тогда bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -524,7 +524,7 @@ Если Ложь Тогда bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) { @@ -538,13 +538,13 @@ public void TestLocalExportVar() { var moduleSource = host.Engine.Loader.FromString( @"Процедура Проц1() - Перем Переменная Экспорт; - КонецПроцедуры"); + Перем Переменная Экспорт; + КонецПроцедуры"); bool exceptionThrown = false; try { - _ = host.Engine.GetCompilerService().Compile(moduleSource); + host.Engine.GetCompilerService().Compile(moduleSource); } catch (CompilerException) {