From a6e406d2aacfbd15d1773f71ad876975648b62ea Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Sat, 18 Mar 2023 15:42:38 +0300 Subject: [PATCH 001/126] =?UTF-8?q?=D0=91=D0=B0=D0=BC=D0=BF=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 176d7c1bc..d1e62f341 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,7 +5,7 @@ pipeline { environment { VersionPrefix = '2.0.0' - VersionSuffix = 'rc2'+"-${(long)(currentBuild.startTimeInMillis/60000)}" + VersionSuffix = 'rc3'+"-${(long)(currentBuild.startTimeInMillis/60000)}" outputEnc = '65001' } From 9b41fce1b245dc1cfc8e274a6e0e503773651108 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sat, 18 Mar 2023 19:15:27 +0300 Subject: [PATCH 002/126] Exe-less opm.bat --- install/opm.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/opm.bat b/install/opm.bat index 3fd12a362..1105eba2c 100644 --- a/install/opm.bat +++ b/install/opm.bat @@ -5,4 +5,4 @@ setlocal set lib="%~dp0..\lib" set opm=%lib%\opm\src\cmd\opm.os -oscript.exe %opm% %* +oscript %opm% %* From b4e2e2f1c3480dc315a09368fad53be0465dd9ef Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 19 Mar 2023 16:31:01 +0300 Subject: [PATCH 003/126] Update oscript-opm --- install/builders/deb/oscript-opm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/builders/deb/oscript-opm b/install/builders/deb/oscript-opm index f847629a6..1c357d9c4 100755 --- a/install/builders/deb/oscript-opm +++ b/install/builders/deb/oscript-opm @@ -1,4 +1,4 @@ #!/bin/sh OSPATH=/usr/share/oscript -mono $OSPATH/bin/oscript.exe $OSPATH/lib/opm/src/cmd/opm.os "$@" +oscript $OSPATH/lib/opm/src/cmd/opm.os "$@" From be0a38e5609eb8980e00ce069689f92c651425d4 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 19 Mar 2023 16:31:22 +0300 Subject: [PATCH 004/126] Update oscript-cgi --- install/builders/deb/oscript-cgi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/builders/deb/oscript-cgi b/install/builders/deb/oscript-cgi index f62a3fe07..caca00423 100755 --- a/install/builders/deb/oscript-cgi +++ b/install/builders/deb/oscript-cgi @@ -4,5 +4,5 @@ if [ -z "$SCRIPT_FILENAME" ]; then export SCRIPT_FILENAME=$1 fi -mono /usr/share/oscript/bin/oscript.exe -cgi "$@" +oscript -cgi "$@" From 5b35b84ba8b0b7d80f60f76fe0ab490d746dffc8 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 19 Mar 2023 16:32:18 +0300 Subject: [PATCH 005/126] Update oscript --- install/builders/deb/oscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/builders/deb/oscript b/install/builders/deb/oscript index 65af38659..3644f82d4 100755 --- a/install/builders/deb/oscript +++ b/install/builders/deb/oscript @@ -1,3 +1,3 @@ #!/bin/sh -mono /usr/share/oscript/bin/oscript.exe "$@" +dotnet /usr/share/oscript/bin/oscript.dll "$@" From 58e0f8ca4a1406b741a38f4667a72222dafae857 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 19 Mar 2023 16:32:49 +0300 Subject: [PATCH 006/126] Delete README.md --- install/builders/msi/README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 install/builders/msi/README.md diff --git a/install/builders/msi/README.md b/install/builders/msi/README.md deleted file mode 100644 index 394545228..000000000 --- a/install/builders/msi/README.md +++ /dev/null @@ -1 +0,0 @@ -# WiX wili be here \ No newline at end of file From 13bec83d14e9c49eca2e48bca1366cb5059fc7b4 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 19 Mar 2023 16:33:21 +0300 Subject: [PATCH 007/126] Update oscript --- install/builders/rpm/oscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/builders/rpm/oscript b/install/builders/rpm/oscript index 65af38659..3644f82d4 100644 --- a/install/builders/rpm/oscript +++ b/install/builders/rpm/oscript @@ -1,3 +1,3 @@ #!/bin/sh -mono /usr/share/oscript/bin/oscript.exe "$@" +dotnet /usr/share/oscript/bin/oscript.dll "$@" From 0fc0a09f301688e68d5a951d7c1c66dca399187c Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 19 Mar 2023 16:33:41 +0300 Subject: [PATCH 008/126] Update oscript-opm --- install/builders/rpm/oscript-opm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/builders/rpm/oscript-opm b/install/builders/rpm/oscript-opm index f847629a6..1c357d9c4 100644 --- a/install/builders/rpm/oscript-opm +++ b/install/builders/rpm/oscript-opm @@ -1,4 +1,4 @@ #!/bin/sh OSPATH=/usr/share/oscript -mono $OSPATH/bin/oscript.exe $OSPATH/lib/opm/src/cmd/opm.os "$@" +oscript $OSPATH/lib/opm/src/cmd/opm.os "$@" From 742e3b207e24761794f3bcca22967b98e86ec4f5 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 19 Mar 2023 17:22:44 +0300 Subject: [PATCH 009/126] Create oscript.bat --- install/oscript.bat | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 install/oscript.bat diff --git a/install/oscript.bat b/install/oscript.bat new file mode 100644 index 000000000..6e5dafd26 --- /dev/null +++ b/install/oscript.bat @@ -0,0 +1,8 @@ +@echo off + + + + + + +dotnet %~dp0oscript.dll %* From e90a12aa412b7d3576d6d6149a5d269c5aeac46c Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Mon, 3 Apr 2023 14:22:49 +0400 Subject: [PATCH 010/126] =?UTF-8?q?=D0=94=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=8B=20=D0=B4=D0=B2=D1=83=D1=8F=D0=B7=D1=8B=D1=87?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D1=81=D0=B2=D0=BE=D0=B9=D1=81=D1=82=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Binding/AliasedVariableSymbol.cs | 34 +++++++++++++++++++ src/ScriptEngine/Machine/MachineInstance.cs | 11 ++++-- 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 src/OneScript.Core/Compilation/Binding/AliasedVariableSymbol.cs diff --git a/src/OneScript.Core/Compilation/Binding/AliasedVariableSymbol.cs b/src/OneScript.Core/Compilation/Binding/AliasedVariableSymbol.cs new file mode 100644 index 000000000..bca92f5e2 --- /dev/null +++ b/src/OneScript.Core/Compilation/Binding/AliasedVariableSymbol.cs @@ -0,0 +1,34 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ +using System; +using OneScript.Values; + +namespace OneScript.Compilation.Binding +{ + public class AliasedVariableSymbol : IVariableSymbol + { + public AliasedVariableSymbol(string name, string alias, Type type) + { + Name = name; + Alias = alias; + Type = type; + } + + public AliasedVariableSymbol(string name, string alias) + { + Name = name; + Alias = alias; + Type = typeof(BslValue); + } + + public string Name { get; } + + public string Alias { get; } + + public Type Type { get; } + } +} diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index fbc1d395f..f1359ee8e 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -2543,9 +2543,14 @@ private SymbolTable ExtractCompilerContext() } foreach (var variable in scope.Variables) { - // TODO тут возможна двуязычность у свойств (приаттаченых, как IVariable) - // пока костыль в виде одного имени - symbolScope.DefineVariable(new LocalVariableSymbol(variable.Name)); + if (variable.SystemType.Alias != null) + { + symbolScope.DefineVariable(new AliasedVariableSymbol(variable.Name, variable.SystemType.Alias)); + } + else + { + symbolScope.DefineVariable(new LocalVariableSymbol(variable.Name)); + } } ctx.PushScope(symbolScope, scope.Instance); From 5a53fc82b105f24140468ba00ce8158bfae7f7e9 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Wed, 22 Mar 2023 14:59:01 +0400 Subject: [PATCH 011/126] =?UTF-8?q?=D0=92=D1=8B=D1=87=D0=B8=D1=81=D0=BB?= =?UTF-8?q?=D0=B8=D1=82=D1=8C()=20=D0=B2=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4?= =?UTF-8?q?=D1=87=D0=B8=D0=BA=D0=B5,=20=D0=BA=D0=B0=D0=B4=D1=80=20=D1=81?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D0=B0,=20=D1=80=D0=B0=D1=81=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20(#1266)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DefaultDebugService.cs | 18 +-- src/ScriptEngine/Machine/MachineInstance.cs | 119 +++++++++++------- .../OscriptDebugSession.cs | 2 +- 3 files changed, 87 insertions(+), 52 deletions(-) diff --git a/src/OneScript.DebugServices/DefaultDebugService.cs b/src/OneScript.DebugServices/DefaultDebugService.cs index 51e727f46..e9478c14f 100644 --- a/src/OneScript.DebugServices/DefaultDebugService.cs +++ b/src/OneScript.DebugServices/DefaultDebugService.cs @@ -72,7 +72,6 @@ public virtual Breakpoint[] SetMachineBreakpoints(Breakpoint[] breaksToSet) Source = item.Key }); } - } // Уведомить все потоки о новых точках остановки @@ -92,13 +91,14 @@ public virtual StackFrame[] GetStackFrames(int threadId) int index = 0; foreach (var frameInfo in frames) { - var frame = new StackFrame(); - frame.LineNumber = frameInfo.LineNumber; - frame.Index = index++; - frame.MethodName = frameInfo.MethodName; - frame.Source = frameInfo.Source; + var frame = new StackFrame + { + LineNumber = frameInfo.LineNumber, + Index = index++, + MethodName = frameInfo.MethodName, + Source = frameInfo.Source + }; result[frame.Index] = frame; - } return result; } @@ -134,7 +134,7 @@ public virtual Variable[] GetEvaluatedVariables(string expression, int threadId, try { - value = GetMachine(threadId).Evaluate(expression, true); + value = GetMachine(threadId).EvaluateInFrame(expression, frameIndex); } catch (Exception e) { @@ -157,7 +157,7 @@ public virtual Variable Evaluate(int threadId, int contextFrame, string expressi try { var value = GetMachine(threadId) - .Evaluate(expression, true) + .EvaluateInFrame(expression, contextFrame) .GetRawValue(); var variable = _visualizer.GetVariable(MachineVariable.Create(value, "$evalResult")); diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index f1359ee8e..a17066584 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -42,6 +42,7 @@ public class MachineInstance // для отладчика. // актуален в момент останова машины private IList _fullCallstackCache; + private ScriptInformationContext _debugInfo; private MachineInstance() { @@ -311,52 +312,88 @@ public void PrepareDebugContinuation() _stopManager.Continue(); } - public IValue Evaluate(string expression, bool separate = false) + public IValue Evaluate(string expression) { var code = CompileCached(expression, CompileExpressionModule); - MachineInstance runner; - MachineInstance currentMachine; - if (separate) + var localScope = new Scope { - runner = new MachineInstance(); - runner._mem = _mem; - runner._scopes = new List(_scopes); - currentMachine = Current; - SetCurrentMachineInstance(runner); + Instance = new UserScriptContextInstance(code), + Methods = TopScope.Methods, + Variables = _currentFrame.Locals + }; + _scopes.Add(localScope); + + var frame = new ExecutionFrame + { + MethodName = code.Source.Name, + Module = code, + ModuleScope = localScope, + ModuleLoadIndex = _scopes.Count - 1, + Locals = new IVariable[0], + InstructionPointer = 0, + }; + + try + { + PushFrame(frame); + MainCommandLoop(); } - else + finally { - currentMachine = null; - runner = this; + PopFrame(); + _scopes.RemoveAt(_scopes.Count - 1); } - ExecutionFrame frame; + return _operationStack.Pop(); + } + + public IValue EvaluateInFrame(string expression, int frameId) + { + System.Diagnostics.Debug.Assert(_fullCallstackCache != null); + if (frameId < 0 || frameId >= _fullCallstackCache.Count) + throw new ScriptException("Wrong stackframe"); + + ExecutionFrame selectedFrame = _fullCallstackCache[frameId].FrameObject; + + MachineInstance currentMachine; + MachineInstance runner = new MachineInstance + { + _mem = this._mem, + _scopes = new List(this._scopes.GetRange(0, selectedFrame.ModuleLoadIndex + 1)), + _debugInfo = CurrentScript + }; + currentMachine = Current; + SetCurrentMachineInstance(runner); + runner.SetFrame(selectedFrame); + + ExecutionFrame frame; try { - var mlocals = new Scope(); - mlocals.Instance = new UserScriptContextInstance(code); - mlocals.Methods = TopScope.Methods; - mlocals.Variables = _currentFrame.Locals; - runner._scopes.Add(mlocals); + var code = runner.CompileExpressionModule(expression); + + var localScope = new Scope + { + Instance = new UserScriptContextInstance(code), + Methods = new BslMethodInfo[0], + Variables = selectedFrame.Locals + }; + runner._scopes.Add(localScope); frame = new ExecutionFrame { MethodName = code.Source.Name, + Module = code, + ModuleScope = localScope, + ModuleLoadIndex = runner._scopes.Count - 1, Locals = new IVariable[0], InstructionPointer = 0, - Module = code, - ModuleScope = mlocals, - ModuleLoadIndex = runner._scopes.Count - 1 }; } catch { - if (separate) - { - SetCurrentMachineInstance(currentMachine); - } + SetCurrentMachineInstance(currentMachine); throw; } @@ -367,18 +404,10 @@ public IValue Evaluate(string expression, bool separate = false) } finally { - if (!separate) - { - PopFrame(); - _scopes.RemoveAt(_scopes.Count - 1); - } - else - { - SetCurrentMachineInstance(currentMachine); - } + SetCurrentMachineInstance(currentMachine); } - return runner._operationStack.Pop(); + return runner._operationStack.Pop().GetRawValue(); } private StackRuntimeModule CompileCached(string code, Func compile) @@ -2447,14 +2476,21 @@ private void ExceptionDescr(int arg) private void ModuleInfo(int arg) { - var currentScript = this.CurrentScript; - if (currentScript != null) + if (_debugInfo != null) { - _operationStack.Push(currentScript); + _operationStack.Push(_debugInfo); } else { - _operationStack.Push(ValueFactory.Create()); + var currentScript = this.CurrentScript; + if (currentScript != null) + { + _operationStack.Push(currentScript); + } + else + { + _operationStack.Push(ValueFactory.Create()); + } } NextInstruction(); } @@ -2504,13 +2540,12 @@ private StackRuntimeModule CompileExpressionModule(string expression) var stringSource = SourceCodeBuilder.Create() .FromString(expression) - .WithName("") + .WithName($"{entryId}:") .Build(); - + var compiler = _mem.Services.Resolve(); compiler.SharedSymbols = ctx; var module = (StackRuntimeModule)compiler.CompileExpression(stringSource); - return module; } diff --git a/src/VSCode.DebugAdapter/OscriptDebugSession.cs b/src/VSCode.DebugAdapter/OscriptDebugSession.cs index 3ab3db32e..a7ac7019e 100644 --- a/src/VSCode.DebugAdapter/OscriptDebugSession.cs +++ b/src/VSCode.DebugAdapter/OscriptDebugSession.cs @@ -388,7 +388,7 @@ public override void Evaluate(Response response, dynamic arguments) if (evalResult.IsStructured) { - var loc = new EvaluatedVariableLocator(expression, frame.ThreadId, frameId); + var loc = new EvaluatedVariableLocator(expression, frame.ThreadId, frame.Index); id = _variableHandles.Create(loc); } } From ff348ba4f16ce94109930a64311051f7e1b0c9b0 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Fri, 24 Mar 2023 16:31:57 +0400 Subject: [PATCH 012/126] =?UTF-8?q?=D0=B2=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8?= =?UTF-8?q?=D1=82=D1=8C()/=D0=92=D1=8B=D1=87=D0=B8=D1=81=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C(),=20=D0=9F=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B0=20=D0=B2?= =?UTF-8?q?=20=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D1=8C=20(#1?= =?UTF-8?q?275=20=D0=B8=20=D0=B4=D1=80.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ScriptEngine/Machine/MachineInstance.cs | 29 +++++++++++++-------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index a17066584..fc29b947d 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -319,7 +319,7 @@ public IValue Evaluate(string expression) var localScope = new Scope { Instance = new UserScriptContextInstance(code), - Methods = TopScope.Methods, + Methods = new BslMethodInfo[0], Variables = _currentFrame.Locals }; _scopes.Add(localScope); @@ -1481,13 +1481,19 @@ private void Execute(int arg) { var code = _operationStack.Pop().AsString(); var module = CompileCached(code, CompileExecutionBatchModule); - PrepareCodeStatisticsData(module); + if (module.Methods.Count() == 0) + { + NextInstruction(); + return; + } - var mlocals = new Scope(); - mlocals.Instance = new UserScriptContextInstance(module); - mlocals.Methods = TopScope.Methods; - mlocals.Variables = _currentFrame.Locals; - _scopes.Add(mlocals); + var localScope = new Scope + { + Instance = new UserScriptContextInstance(module), + Methods = new BslMethodInfo[0], + Variables = _currentFrame.Locals + }; + _scopes.Add(localScope); var mi = (MachineMethodInfo)module.Methods[0]; var method = mi.GetRuntimeMethod(); @@ -1495,7 +1501,7 @@ private void Execute(int arg) { Module = module, MethodName = mi.Name, - ModuleScope = mlocals, + ModuleScope = localScope, ModuleLoadIndex = _scopes.Count - 1, Locals = new IVariable[method.LocalVariables.Length], InstructionPointer = 0 @@ -1506,14 +1512,14 @@ private void Execute(int arg) locals[i] = Variable.Create(ValueFactory.Create(), method.LocalVariables[i]); } + PushFrame(frame); try { - PushFrame(frame); - MainCommandLoop(); + ExecuteCode(); + PopFrame(); } finally { - PopFrame(); _scopes.RemoveAt(_scopes.Count - 1); } @@ -2537,6 +2543,7 @@ private void NewFunc(int argCount) private StackRuntimeModule CompileExpressionModule(string expression) { var ctx = ExtractCompilerContext(); + var entryId = CurrentCodeEntry().ToString(); var stringSource = SourceCodeBuilder.Create() .FromString(expression) From 888923208a02656b9fa65121e442d090ecd477ad Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Mon, 3 Apr 2023 15:57:32 +0400 Subject: [PATCH 013/126] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82?= =?UTF-8?q?=D1=8C()/=D0=92=D1=8B=D1=87=D0=B8=D1=81=D0=BB=D0=B8=D1=82=D1=8C?= =?UTF-8?q?()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/eval.os | 155 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 154 insertions(+), 1 deletion(-) diff --git a/tests/eval.os b/tests/eval.os index d6f31fba6..3344fe294 100644 --- a/tests/eval.os +++ b/tests/eval.os @@ -1,4 +1,5 @@ Перем юТест; +Перем Глобал; Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт @@ -15,7 +16,15 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВОператореВыполнитьЗапрещенВозврат"); ВсеТесты.Добавить("ТестДолжен_ПроверитьСвойствоЭтотОбъект_issue712"); ВсеТесты.Добавить("ТестДолжен_ПроверитьКешКомпиляцииВРазныхФреймах"); - + ВсеТесты.Добавить("ТестДолжен_ПроверитьРекурсивныйВызовВычислить"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьСложныеВложенныеВызовыВычислить"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьВычислитьВнутриВыполнить"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьАлиасыФункцийИПеременныхВВычислить"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьОбработкуИсключенияВВыполнить"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьРекурсивныйВызовВыполнить"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьВложенныеВызовыВыполнить"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовыВыполнитьСПопытками"); + Возврат ВсеТесты; КонецФункции @@ -168,3 +177,147 @@ юТест.ПроверитьРавенство(3, Рез4); КонецПроцедуры + +Процедура ТестДолжен_ПроверитьРекурсивныйВызовВычислить() Экспорт + Рез = "Вычислить(1)"; + Для й=1 По 100 Цикл + Рез = "Вычислить("+Рез+")+1"; + КонецЦикла; + + Рез = Вычислить(Рез); + юТест.ПроверитьРавенство(101, Рез); +КонецПроцедуры + + +Функция Один() + Возврат Вычислить("1"); +КонецФункции + +Функция Два() + Один = Вычислить("Один()"); + Возврат Вычислить("Один+Один()"); +КонецФункции + +Функция Шесть() + Три = 3; + Возврат Вычислить("Два()") * Три; +КонецФункции + +Функция СорокДва(Семь) + Возврат Вычислить("Семь * Шесть()"); +КонецФункции + +Функция Ответ() + Возврат Вычислить("Глобал + СорокДва(7)"); +КонецФункции + +Процедура ТестДолжен_ПроверитьСложныеВложенныеВызовыВычислить() Экспорт + Глобал = 0; + Рез = Вычислить("Ответ()"); + юТест.ПроверитьРавенство(42, Рез); + + Глобал = 66; + Рез = Вычислить("Ответ()"); + юТест.ПроверитьРавенство(108, Рез); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьВычислитьВнутриВыполнить() Экспорт + Рез = -1; + Выполнить("Для й=1 По 9 Цикл ц = -й; КонецЦикла; Рез = Вычислить(""ц + й"")"); + юТест.ПроверитьРавенство(1, Рез); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьАлиасыФункцийИПеременныхвВычислить() Экспорт + Рез = Вычислить("Лев(""фыв""+Символы.ПС,1)+Left(""fgh""+Chars.LF,1)"); + юТест.ПроверитьРавенство("фf", Рез); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьОбработкуИсключенияВВыполнить() Экспорт + + Рез = 1; + Выполнить " + |Попытка + | Рез = 1/0; + |Исключение + | Рез = -1; + |КонецПопытки;"; + юТест.ПроверитьРавенство(-1, Рез); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьРекурсивныйВызовВыполнить() Экспорт + + Рез = 1; + Код = "Рез=Рез+1;"; + Для й = 1 По 10 Цикл + Код = СтрЗаменить(Код, """", """"""); + Код = "Выполнить""" + Код + """;"; + КонецЦикла; + Выполнить(Код); + + юТест.ПроверитьРавенство(2, Рез); + +КонецПроцедуры + +Процедура Третья(Пар) + Выполнить "Рез = Рез + Пар;"; +КонецПроцедуры + +Процедура Вторая(Пар) + Выполнить "Лок = Пар + 1; Третья(Лок);"; +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьВложенныеВызовыВыполнить() Экспорт + + Рез = 1; + Выполнить "Вторая(2);"; + + юТест.ПроверитьРавенство(4, Рез); + +КонецПроцедуры + +Процедура СИсключением() + Выполнить " + |Попытка + | Рез = Рез + 8; + | ВызватьИсключение 0; + |Исключение + | Рез = Рез + 9; + |КонецПопытки; + |Выполнить(""Рез = Рез + (-10)"");"; +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьВызовыВыполнитьСПопытками() Экспорт + + Рез = "0"; + попытка + Выполнить(" + |Лок=""1""; + |Попытка + | Рез = 1/0; + |Исключение + | Рез = Рез + Лок; + |КонецПопытки;"); + Выполнить(" + |Попытка + | Рез = Рез + 2/0; + |Исключение + | Выполнить(""Рез = Рез + 3""); + |КонецПопытки; + |Рез = Рез + 4;"); + Выполнить(" + |Попытка + | Рез = Рез + 5; + | СИсключением(); + |Исключение + | Рез = Рез + 6; + |КонецПопытки; + |Рез = Рез + 7;"); + исключение + Рез = Рез+ "!" ; + конецпопытки; + Рез = Рез + "+"; + + юТест.ПроверитьРавенство("0134589-107+", Рез); + +КонецПроцедуры From ba2b189e7fa12f80d8040feb44cbb6e7eeba7df9 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 10 Apr 2023 22:17:05 +0300 Subject: [PATCH 014/126] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=B0=20=D0=BA=20=D0=B3?= =?UTF-8?q?=D0=BB=D0=BE=D0=B1=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=BC=D1=83=20?= =?UTF-8?q?=D1=81=D0=B2=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D1=83=20+=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=87=D0=B0=D1=82=D1=8C=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB?= =?UTF-8?q?=D1=8C=D1=82=D0=B0=D1=82=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8?= =?UTF-8?q?=D0=BB=D1=8F=D1=86=D0=B8=D0=B8=20=D0=B2=20TestApp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Compiler/ExpressionHelpers.cs | 4 +- src/ScriptEngine/Compiler/ModuleDumpWriter.cs | 76 ++++++++++++++++++- src/TestApp/MainWindow.xaml.cs | 1 + 3 files changed, 77 insertions(+), 4 deletions(-) diff --git a/src/OneScript.Native/Compiler/ExpressionHelpers.cs b/src/OneScript.Native/Compiler/ExpressionHelpers.cs index 0c69b630c..e7938ed7d 100644 --- a/src/OneScript.Native/Compiler/ExpressionHelpers.cs +++ b/src/OneScript.Native/Compiler/ExpressionHelpers.cs @@ -566,11 +566,11 @@ public static Expression GetContextPropertyValue(IRuntimeContextInstance target, nameof(IRuntimeContextInstance.GetPropValue), BindingFlags.Instance | BindingFlags.Public); - return Expression.Call( + return Expression.Convert(Expression.Call( Expression.Constant(target), getter, Expression.Constant(propertyNumber) - ); + ), typeof(BslValue)); } public static Expression GetContextPropertyValue(Expression target, string propertyName) diff --git a/src/ScriptEngine/Compiler/ModuleDumpWriter.cs b/src/ScriptEngine/Compiler/ModuleDumpWriter.cs index 5418e8a7d..bfc981242 100644 --- a/src/ScriptEngine/Compiler/ModuleDumpWriter.cs +++ b/src/ScriptEngine/Compiler/ModuleDumpWriter.cs @@ -8,10 +8,14 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.IO; using System.Linq; +using System.Linq.Expressions; +using System.Reflection; using OneScript.Commons; using OneScript.Compilation; using OneScript.Compilation.Binding; using OneScript.Contexts; +using OneScript.Native.Compiler; +using OneScript.Native.Runtime; using OneScript.Sources; using ScriptEngine.Machine; @@ -28,10 +32,78 @@ public ModuleDumpWriter(ICompilerFrontend compilerService) public void Write(TextWriter output, SourceCode source) { - var module = (StackRuntimeModule)_compiler.Compile(source); + var compilerResult = _compiler.Compile(source); + if (compilerResult is StackRuntimeModule stackModule) + { + var module = stackModule; + WriteImage(output, module); + } + else + { + WriteNativeModule(output, (DynamicModule)compilerResult); + } - WriteImage(output, module); + } + private void WriteNativeModule(TextWriter output, DynamicModule compilerResult) + { + foreach (var attribute in compilerResult.ModuleAttributes) + { + output.WriteLine($"[{attribute.Name}]"); + } + output.WriteLine("class DynamicModule"); + output.WriteLine("{"); + output.WriteLine(".fields"); + foreach (var field in compilerResult.Fields) + { + PrintField(output, field); + } + + output.WriteLine(".properties"); + foreach (var prop in compilerResult.Properties) + { + PrintProperty(output, prop); + } + + output.WriteLine(".methods"); + foreach (var method in compilerResult.Methods) + { + PrintMethod(output, (BslNativeMethodInfo)method); + } + + output.WriteLine("}"); + } + + private void PrintProperty(TextWriter output, BslPropertyInfo prop) + { + output.WriteLine(); + foreach (var attribute in prop.GetAnnotations()) + { + output.WriteLine($"[{attribute.Name}]"); + } + output.WriteLine($"{prop.PropertyType} {prop.Name}"); + } + + private void PrintMethod(TextWriter output, BslNativeMethodInfo method) + { + output.WriteLine(); + foreach (var attribute in method.GetAnnotations()) + { + output.WriteLine($"[{attribute.Name}]"); + } + + var propertyInfo = typeof(Expression).GetProperty("DebugView", BindingFlags.Instance | BindingFlags.NonPublic); + output.WriteLine(propertyInfo.GetValue(method.Implementation) as string); + } + + private void PrintField(TextWriter output, BslFieldInfo field) + { + output.WriteLine(); + foreach (var attribute in field.GetAnnotations()) + { + output.WriteLine($"[{attribute.Name}]"); + } + output.WriteLine($"{field.FieldType} {field.Name}"); } public void Write(TextWriter output, StackRuntimeModule module) diff --git a/src/TestApp/MainWindow.xaml.cs b/src/TestApp/MainWindow.xaml.cs index 6926006ec..ab3e80b53 100644 --- a/src/TestApp/MainWindow.xaml.cs +++ b/src/TestApp/MainWindow.xaml.cs @@ -136,6 +136,7 @@ private HostedScriptEngine CreateEngine() var builder = DefaultEngineBuilder .Create() .SetDefaultOptions() + .UseNativeRuntime() .SetupEnvironment(e => e.AddStandardLibrary()) .SetupConfiguration(x => { From 4517f6385855cf3e6bc4efed27b043aa35539244 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 10 Apr 2023 22:28:47 +0300 Subject: [PATCH 015/126] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D0=B0=20=D0=B2=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=A2=D0=B8=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Native/Compiler/ExpressionHelpers.cs | 2 +- src/OneScript.Native/Compiler/MethodCompiler.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OneScript.Native/Compiler/ExpressionHelpers.cs b/src/OneScript.Native/Compiler/ExpressionHelpers.cs index e7938ed7d..726c7b3e2 100644 --- a/src/OneScript.Native/Compiler/ExpressionHelpers.cs +++ b/src/OneScript.Native/Compiler/ExpressionHelpers.cs @@ -526,7 +526,7 @@ public static Expression ConstructorCall(ITypeManager typeManager, Expression se public static Expression TypeByNameCall(ITypeManager manager, Expression argument) { var method = OperationsCache.GetOrAdd(typeof(DynamicOperations), nameof(DynamicOperations.GetTypeByName), - BindingFlags.Instance | BindingFlags.Public); + BindingFlags.Static | BindingFlags.Public); Debug.Assert(method != null); diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index c5b83f2db..79258e6c9 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -1264,7 +1264,7 @@ private Expression CreateBuiltInFunctionCall(CallNode node) case Token.Type: CheckArgumentsCount(node.ArgumentList, 1); result = ExpressionHelpers.TypeByNameCall(CurrentTypeManager, - ConvertToExpressionTree(node.ArgumentList.Children[0])); + ConvertToExpressionTree(node.ArgumentList.Children[0].Children[0])); break; case Token.ExceptionInfo: CheckArgumentsCount(node.ArgumentList, 0); From 53153a1f2bc5d859c3ec081e8ca7421d6a4c44b0 Mon Sep 17 00:00:00 2001 From: Dmitriy Korolev Date: Wed, 19 Apr 2023 09:42:19 +0700 Subject: [PATCH 016/126] =?UTF-8?q?fix:=20=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B6=D0=BA=D0=B0=20=D0=B2=D0=BE=D0=B7=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=B0=20=D0=B8=D0=B7=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4?= =?UTF-8?q?=D1=83=D1=80=D1=8B,=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83=D1=80=D1=8B=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BA=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SyntaxAnalysis/LocalizedErrors.cs | 3 ++ .../Compiler/MethodCompiler.cs | 31 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/OneScript.Language/SyntaxAnalysis/LocalizedErrors.cs b/src/OneScript.Language/SyntaxAnalysis/LocalizedErrors.cs index 7bd4d26f3..b2f8b73fe 100644 --- a/src/OneScript.Language/SyntaxAnalysis/LocalizedErrors.cs +++ b/src/OneScript.Language/SyntaxAnalysis/LocalizedErrors.cs @@ -123,6 +123,9 @@ public static CodeError PreprocessorDefinitionExpected() => public static CodeError UseBuiltInFunctionAsProcedure() => Create("Использование встроенной функции, как процедуры", "Using build-in function as procedure"); + public static CodeError UseProcAsFunction() => + Create("Использование процедуры, как функции", "Procedure called as function"); + public static CodeError DuplicateVarDefinition(string varName) => Create($"Переменная {varName} уже определена", $"Variable {varName} already defined"); diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index 79258e6c9..b1877602a 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -660,13 +660,25 @@ private Expression CompileBinaryOp(Expression left, Expression right, BinaryOper protected override void VisitReturnNode(BslSyntaxNode node) { - Debug.Assert(node.Children.Count > 0); + if (_method.IsFunction() && node.Children.Count == 0) + { + AddError(LocalizedErrors.FuncEmptyReturnValue(), node.Location); + return; + } + var label = _blocks.GetCurrentBlock().MethodReturn; + + if (!_method.IsFunction() && node.Children.Count == 0) + { + var undefinedExpr = Expression.Constant(BslUndefinedValue.Instance); + _blocks.Add(Expression.Return(label, undefinedExpr)); + return; + } + VisitExpression(node.Children[0]); var resultExpr = _statementBuildParts.Pop(); - - var label = _blocks.GetCurrentBlock().MethodReturn; + if (!resultExpr.Type.IsValue()) resultExpr = ExpressionHelpers.ConvertToType(resultExpr, typeof(BslValue)); @@ -1055,11 +1067,18 @@ protected override void VisitGlobalProcedureCall(CallNode node) protected override void VisitGlobalFunctionCall(CallNode node) { + if (!_method.IsFunction()) + { + AddError(LocalizedErrors.UseProcAsFunction(), node.Location); + return; + } + if (LanguageDef.IsBuiltInFunction(node.Identifier.Lexem.Token)) { _statementBuildParts.Push(CreateBuiltInFunctionCall(node)); return; } + var expression = CreateMethodCall(node); _statementBuildParts.Push(expression); } @@ -1114,6 +1133,12 @@ private IEnumerable PrepareDynamicCallArguments(BslSyntaxNode argLis protected override void VisitObjectFunctionCall(BslSyntaxNode node) { + if (!_method.IsFunction()) + { + AddError(LocalizedErrors.UseProcAsFunction(), node.Location); + return; + } + var target = _statementBuildParts.Pop(); var call = (CallNode) node; From 839182cde57abd6178437c8a5e70b37cec42afae Mon Sep 17 00:00:00 2001 From: Dmitriy Korolev Date: Wed, 19 Apr 2023 09:45:45 +0700 Subject: [PATCH 017/126] =?UTF-8?q?fix:=20=D0=98=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20ShellExecute=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B5?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.StandardLibrary/Processes/ProcessContext.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/OneScript.StandardLibrary/Processes/ProcessContext.cs b/src/OneScript.StandardLibrary/Processes/ProcessContext.cs index c2ae44819..2d3a0b364 100644 --- a/src/OneScript.StandardLibrary/Processes/ProcessContext.cs +++ b/src/OneScript.StandardLibrary/Processes/ProcessContext.cs @@ -270,6 +270,7 @@ public static ProcessStartInfo PrepareProcessStartupInfo(string cmdLine, string var sInfo = new ProcessStartInfo(); int argsPosition; + sInfo.UseShellExecute = true; sInfo.FileName = ExtractExecutableName(cmdLine, out argsPosition); sInfo.Arguments = argsPosition >= cmdLine.Length ? "" : cmdLine.Substring(argsPosition); if (currentDir != null) From 4bc40f2634ec502a49a21e0fae83471a761299dd Mon Sep 17 00:00:00 2001 From: Dmitriy Korolev Date: Thu, 20 Apr 2023 12:04:35 +0700 Subject: [PATCH 018/126] =?UTF-8?q?fix:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=B8=20=D1=81=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8?= =?UTF-8?q?=D0=BB=D1=8F=D1=82=D0=BE=D1=80=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Compiler/MethodCompiler.cs | 13 ++++---- .../Compiler_Api_Tests.cs | 31 +++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index b1877602a..9a5d6dc95 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -1067,18 +1067,17 @@ protected override void VisitGlobalProcedureCall(CallNode node) protected override void VisitGlobalFunctionCall(CallNode node) { - if (!_method.IsFunction()) - { - AddError(LocalizedErrors.UseProcAsFunction(), node.Location); - return; - } - if (LanguageDef.IsBuiltInFunction(node.Identifier.Lexem.Token)) { _statementBuildParts.Push(CreateBuiltInFunctionCall(node)); return; } - + + if (!_method.IsFunction()) + { + AddError(LocalizedErrors.UseProcAsFunction(), node.Location); + } + var expression = CreateMethodCall(node); _statementBuildParts.Push(expression); } diff --git a/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs b/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs index 72e4df766..e657ef4e5 100644 --- a/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs +++ b/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs @@ -136,6 +136,37 @@ public void Test_Min_Max_Functions() errors.Should().BeEmpty(); } + [Fact] + public void CanCompile_Proc_With_Return() + { + var code = @" + Процедура Тест() + Возврат; + КонецПроцедуры"; + + var errors = new List(); + CreateModule(code, errors); + + errors.Should().BeEmpty(); + } + + [Fact] + public void Detects_Proc_As_Func_Invoke() + { + var code = @" + Процедура Тест() + + КонецПроцедуры + + a = Тест();"; + + var errors = new List(); + CreateModule(code, errors); + + errors.Should().HaveCount(1); + errors[0].ErrorId.Should().Be(nameof(LocalizedErrors.UseProcAsFunction)); + } + private DynamicModule CreateModule(string code) { var helper = new CompileHelper(); From e3caeccbd80044935b9fe5128793b200f2a6e4ca Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Sun, 23 Apr 2023 21:25:28 +0300 Subject: [PATCH 019/126] =?UTF-8?q?=D0=9F=D0=BE=D1=82=D0=BE=D0=BA=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BB=D0=B0=D0=B4=D1=87=D0=B8=D0=BA=D0=B0=20=D1=81=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B0=D0=BD=20=D1=84=D0=BE=D0=BD=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs b/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs index 5d97d916c..022d44625 100644 --- a/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs +++ b/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs @@ -84,6 +84,7 @@ private void RunCommandsLoop() } }); + _messageThread.IsBackground = true; _messageThread.Start(); } From 719bdeb0edb3c8b4cf27297dcda69cc2922c2d37 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Sun, 23 Apr 2023 21:37:19 +0300 Subject: [PATCH 020/126] =?UTF-8?q?=D0=91=D0=BE=D0=BB=D0=B5=D0=B5=20=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE=D0=B5=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D1=86=D0=B8=D0=BA=D0=BB?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85=20=D0=B7=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B5=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FileSystemDependencyResolver.cs | 13 ++++++------- .../Compiler/StackMachineCodeGenerator.cs | 6 ++---- .../DependencyResolveException.cs | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 src/ScriptEngine/DependencyResolveException.cs diff --git a/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs b/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs index aa71ab66e..c729dc740 100644 --- a/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs +++ b/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs @@ -10,8 +10,8 @@ This Source Code Form is subject to the terms of the using System.IO; using System.Linq; using System.Text; -using OneScript.Commons; using OneScript.Compilation; +using OneScript.Localization; using OneScript.Sources; namespace ScriptEngine.HostedScript @@ -181,8 +181,10 @@ private bool LoadLibraryInternal(string libraryPath) if (existedLib.state == ProcessingState.Discovered) { string libStack = ListToStringStack(_libs, id); - throw new RuntimeException($"Ошибка загрузки библиотеки {id}. Обнаружены циклические зависимости.\n" + - $"{libStack}"); + throw new DependencyResolveException( + new BilingualString( + $"Ошибка загрузки библиотеки {id}. Обнаружены циклические зависимости.\n", + $"Error loading library {id}. Circular dependencies found.\n") + libStack); } return true; @@ -232,10 +234,7 @@ private static string ListToStringStack(IEnumerable libs, string stopTo builder.Append("-> "); builder.AppendLine(library.id); offset += " "; - if (library.id == stopToken) - { - break; - } + offset += " "; } return builder.ToString(); diff --git a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs index 6c73404d0..5e2c2afa5 100644 --- a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs +++ b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs @@ -99,14 +99,12 @@ private void HandleImportClause(AnnotationNode node) // if(_ctx is ModuleCompilerContext moduleContext) // moduleContext.Update(); } - catch (CompilerException e) + catch (DependencyResolveException e) { var error = new CodeError { Description = e.Message, - Position = e.GetPosition()?.LineNumber == default - ? MakeCodePosition(node.Location) - : e.GetPosition(), + Position = MakeCodePosition(node.Location), ErrorId = nameof(CompilerException) }; AddError(error); diff --git a/src/ScriptEngine/DependencyResolveException.cs b/src/ScriptEngine/DependencyResolveException.cs new file mode 100644 index 000000000..d7ece9990 --- /dev/null +++ b/src/ScriptEngine/DependencyResolveException.cs @@ -0,0 +1,19 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using OneScript.Commons; +using OneScript.Localization; + +namespace ScriptEngine +{ + public class DependencyResolveException : RuntimeException + { + public DependencyResolveException(BilingualString message) : base(message) + { + } + } +} \ No newline at end of file From 77486e43c5e7c70b5e3d1853381e0541cb75bdd5 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Thu, 4 May 2023 11:16:30 +0300 Subject: [PATCH 021/126] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20opm=20=D1=81=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Build_Core.csproj | 1 - install/opm.ospx | Bin 425631 -> 426914 bytes 2 files changed, 1 deletion(-) diff --git a/Build_Core.csproj b/Build_Core.csproj index 104c1f0ce..7af74eeba 100644 --- a/Build_Core.csproj +++ b/Build_Core.csproj @@ -8,7 +8,6 @@ $(BUILD_NUMBER) 0 - $(MSBuildProjectDirectory)/built $(MSBuildProjectDirectory)/built $(ArtifactsRoot)/lib $(ArtifactsRoot)\vscode\ diff --git a/install/opm.ospx b/install/opm.ospx index 36365671f7e8b7118468f4b7bee91cdfe7fa4f14..661b6ff2b17e8459ec8e7febf5c8dcdcd4f3df3e 100644 GIT binary patch delta 411221 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

mY^(i*- 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 z

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

hN@pjV4n)9Ef51=7k3W_GH- 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ℑ~ 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 Date: Fri, 5 May 2023 00:47:38 +0500 Subject: [PATCH 022/126] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83=D1=80=D1=8B=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BA=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Compilation/Binding/SymbolTable.cs | 14 ++++++++++++- .../Compiler/MethodCompiler.cs | 7 +++++-- .../Compiler/ModuleCompiler.cs | 2 +- .../Compiler/StackMachineCodeGenerator.cs | 6 +++--- .../Compiler_Api_Tests.cs | 20 ++++++++++++++++++- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/OneScript.Core/Compilation/Binding/SymbolTable.cs b/src/OneScript.Core/Compilation/Binding/SymbolTable.cs index 10e1ac2ad..4c6c8aac1 100644 --- a/src/OneScript.Core/Compilation/Binding/SymbolTable.cs +++ b/src/OneScript.Core/Compilation/Binding/SymbolTable.cs @@ -65,7 +65,7 @@ public bool FindVariable(string name, out SymbolBinding binding) return false; } - public bool FindMethod(string name, out SymbolBinding binding) + public bool TryFindMethodBinding(string name, out SymbolBinding binding) { for (int i = _bindings.Count - 1; i >= 0; i--) { @@ -86,6 +86,18 @@ public bool FindMethod(string name, out SymbolBinding binding) return false; } + public bool TryFindMethod(string name, out IMethodSymbol method) + { + if (TryFindMethodBinding(name, out var binding)) + { + method = GetMethod(binding); + return true; + } + + method = default; + return false; + } + public SymbolBinding DefineMethod(IMethodSymbol symbol) { var index = _bindings[ScopeCount - 1].scope.DefineMethod(symbol); diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index 9a5d6dc95..931458ee4 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -1073,7 +1073,10 @@ protected override void VisitGlobalFunctionCall(CallNode node) return; } - if (!_method.IsFunction()) + var methodExists = Symbols.TryFindMethod( + node.Identifier.GetIdentifier(), out var methodSymbol); + + if (methodExists && !methodSymbol.Method.IsFunction()) { AddError(LocalizedErrors.UseProcAsFunction(), node.Location); } @@ -1233,7 +1236,7 @@ private PropertyInfo FindPropertyOfType(BslSyntaxNode node, Type targetType, str private Expression CreateMethodCall(CallNode node) { - if (!Symbols.FindMethod(node.Identifier.GetIdentifier(), out var binding)) + if (!Symbols.TryFindMethodBinding(node.Identifier.GetIdentifier(), out var binding)) { AddError($"Unknown method {node.Identifier.GetIdentifier()}", node.Location); return null; diff --git a/src/OneScript.Native/Compiler/ModuleCompiler.cs b/src/OneScript.Native/Compiler/ModuleCompiler.cs index 7ea4733fc..088f3d2d1 100644 --- a/src/OneScript.Native/Compiler/ModuleCompiler.cs +++ b/src/OneScript.Native/Compiler/ModuleCompiler.cs @@ -73,7 +73,7 @@ private void RegisterLocalMethods(BslSyntaxNode module) foreach (var methodNode in methodsSection.Children.Cast()) { var signature = methodNode.Signature; - if (Symbols.FindMethod(signature.MethodName, out _)) + if (Symbols.TryFindMethodBinding(signature.MethodName, out _)) { AddError(LocalizedErrors.DuplicateMethodDefinition(signature.MethodName), signature.Location); continue; diff --git a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs index 5e2c2afa5..c21c25f5f 100644 --- a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs +++ b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs @@ -117,7 +117,7 @@ private void CheckForwardedDeclarations() { foreach (var item in _forwardedMethods) { - if (!_ctx.FindMethod(item.identifier, out var methN)) + if (!_ctx.TryFindMethodBinding(item.identifier, out var methN)) { AddError(LocalizedErrors.SymbolNotFound(item.identifier), item.location); continue; @@ -720,7 +720,7 @@ private void GlobalCall(CallNode call, bool asFunction) var identifier = identifierNode.Lexem.Content; - var hasMethod = _ctx.FindMethod(identifier, out var methBinding); + var hasMethod = _ctx.TryFindMethodBinding(identifier, out var methBinding); if (hasMethod) { var scope = _ctx.GetScope(methBinding.ScopeNumber); @@ -873,7 +873,7 @@ protected override void VisitHandlerOperation(BslSyntaxNode node) { var terminal = handlerNode.AsTerminal(); var identifier = terminal.GetIdentifier(); - if (_ctx.FindMethod(identifier, out _)) + if (_ctx.TryFindMethodBinding(identifier, out _)) { var lex = terminal.Lexem; lex.Type = LexemType.StringLiteral; diff --git a/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs b/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs index e657ef4e5..67e536df7 100644 --- a/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs +++ b/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs @@ -135,6 +135,22 @@ public void Test_Min_Max_Functions() errors.Should().BeEmpty(); } + + [Fact] + public void CanCompile_Func() + { + var code = @" + Функция Тест() + Возврат 123; + КонецФункции + + а = Тест();"; + + var errors = new List(); + CreateModule(code, errors); + + errors.Should().BeEmpty(); + } [Fact] public void CanCompile_Proc_With_Return() @@ -142,7 +158,9 @@ public void CanCompile_Proc_With_Return() var code = @" Процедура Тест() Возврат; - КонецПроцедуры"; + КонецПроцедуры + + Тест();"; var errors = new List(); CreateModule(code, errors); From e00ba7835289a32231f51e01f868536a05cafe6f Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 5 May 2023 15:59:56 +0300 Subject: [PATCH 023/126] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=B2=20native?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/{native-compiler.os => eratosthenes.os} | 0 tests/native-lib/test-native-use.os | 3 +++ ...320\275\320\260\321\200\320\270\320\271.os" | 18 ++++++++++++++++++ 3 files changed, 21 insertions(+) rename tests/{native-compiler.os => eratosthenes.os} (100%) create mode 100644 tests/native-lib/test-native-use.os create mode 100644 "tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271.os" diff --git a/tests/native-compiler.os b/tests/eratosthenes.os similarity index 100% rename from tests/native-compiler.os rename to tests/eratosthenes.os diff --git a/tests/native-lib/test-native-use.os b/tests/native-lib/test-native-use.os new file mode 100644 index 000000000..bc18cbbcf --- /dev/null +++ b/tests/native-lib/test-native-use.os @@ -0,0 +1,3 @@ +#native +#Использовать "." +ТестовыйСценарий = Новый ТестовыйСценарий; \ No newline at end of file diff --git "a/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271.os" "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271.os" new file mode 100644 index 000000000..a9f126b28 --- /dev/null +++ "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271.os" @@ -0,0 +1,18 @@ +#native + +Перем Поле1 Экспорт; + +Перем Поле2; + +Процедура ПриСозданииОбъекта() + Поле1 = 1; +КонецПроцедуры + + +Процедура Метод1() + +КонецПроцедуры + +Процедура Метод2() Экспорт + +КонецПроцедуры \ No newline at end of file From 5536a84de448ac96b9514f987b0f22b2854baf5c Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 15 May 2023 19:54:00 +0300 Subject: [PATCH 024/126] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82?= =?UTF-8?q?=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D0=B2=20=D0=B2=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=BC=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B6=D0=B8=D0=BC=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commons}/DependencyResolveException.cs | 3 +- .../ICompileTimeDependencyResolver.cs | 16 ++++++ .../Contexts/BslMethodBuilder.cs | 2 +- .../Compiler/CompilerHelpers.cs | 38 +++++++++---- .../Compiler/ExpressionHelpers.cs | 21 +++++-- .../Compiler/ModuleCompiler.cs | 55 ++++++++++++++++++- .../NativeRuntimeAnnotationHandler.cs | 4 +- .../FileSystemDependencyResolver.cs | 5 +- .../Compiler/NativeCompilerBackend.cs | 2 +- .../Compiler/StackMachineCodeGenerator.cs | 5 +- src/ScriptEngine/IDependencyResolver.cs | 6 +- src/ScriptEngine/NullDependencyResolver.cs | 3 +- .../OneScript.Dynamic.Tests/CompileHelper.cs | 10 +++- 13 files changed, 132 insertions(+), 38 deletions(-) rename src/{ScriptEngine => OneScript.Core/Commons}/DependencyResolveException.cs (91%) create mode 100644 src/OneScript.Core/Compilation/ICompileTimeDependencyResolver.cs diff --git a/src/ScriptEngine/DependencyResolveException.cs b/src/OneScript.Core/Commons/DependencyResolveException.cs similarity index 91% rename from src/ScriptEngine/DependencyResolveException.cs rename to src/OneScript.Core/Commons/DependencyResolveException.cs index d7ece9990..31454a1f1 100644 --- a/src/ScriptEngine/DependencyResolveException.cs +++ b/src/OneScript.Core/Commons/DependencyResolveException.cs @@ -5,10 +5,9 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using OneScript.Commons; using OneScript.Localization; -namespace ScriptEngine +namespace OneScript.Commons { public class DependencyResolveException : RuntimeException { diff --git a/src/OneScript.Core/Compilation/ICompileTimeDependencyResolver.cs b/src/OneScript.Core/Compilation/ICompileTimeDependencyResolver.cs new file mode 100644 index 000000000..0fc5b30e3 --- /dev/null +++ b/src/OneScript.Core/Compilation/ICompileTimeDependencyResolver.cs @@ -0,0 +1,16 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using OneScript.Sources; + +namespace OneScript.Compilation +{ + public interface ICompileTimeDependencyResolver + { + void Resolve(SourceCode module, string libraryName); + } +} \ No newline at end of file diff --git a/src/OneScript.Core/Contexts/BslMethodBuilder.cs b/src/OneScript.Core/Contexts/BslMethodBuilder.cs index 018c35f9e..818be5b59 100644 --- a/src/OneScript.Core/Contexts/BslMethodBuilder.cs +++ b/src/OneScript.Core/Contexts/BslMethodBuilder.cs @@ -76,7 +76,7 @@ public BslMethodBuilder IsExported(bool exportFlag) return this; } - public BslMethodBuilder SetAnnotations(IEnumerable annotations) + public BslMethodBuilder SetAnnotations(IEnumerable annotations) { _member.SetAnnotations(annotations); return this; diff --git a/src/OneScript.Native/Compiler/CompilerHelpers.cs b/src/OneScript.Native/Compiler/CompilerHelpers.cs index 3501e5509..0e32c85c1 100644 --- a/src/OneScript.Native/Compiler/CompilerHelpers.cs +++ b/src/OneScript.Native/Compiler/CompilerHelpers.cs @@ -45,20 +45,18 @@ public static object ClrValueFromLiteral(in Lexem lex) }; } - public static IEnumerable GetAnnotations(IEnumerable annotations) + public static IEnumerable GetAnnotations(IEnumerable annotations) { // Возможно будут какие-то маппинги на системные атрибуты, не только на BslAnnotation - // поэтому возвращаем object[] а не BslAnnotation[] + // поэтому возвращаем Attribute[] а не BslAnnotation[] - var mappedAnnotations = new List(); - foreach (var node in annotations) - { - var anno = new BslAnnotationAttribute(node.Name); - anno.SetParameters(GetAnnotationParameters(node)); - mappedAnnotations.Add(anno); - } - - return mappedAnnotations; + return annotations.Select(GetBslAnnotation).ToList(); + } + + public static BslAnnotationAttribute GetBslAnnotation(AnnotationNode node) + { + var parameters = GetAnnotationParameters(node); + return new BslAnnotationAttribute(node.Name, parameters); } public static Type GetClrType(TypeDescriptor type) @@ -83,10 +81,26 @@ public static Type GetClrType(TypeDescriptor type) private static IEnumerable GetAnnotationParameters(AnnotationNode node) { return node.Children.Cast() - .Select(param => new BslAnnotationParameter(param.Name, ValueFromLiteral(param.Value))) + .Select(MakeAnnotationParameter) .ToList(); } + private static BslAnnotationParameter MakeAnnotationParameter(AnnotationParameterNode param) + { + BslAnnotationParameter result; + if (param.Value.Type != LexemType.NotALexem) + { + var runtimeValue = ValueFromLiteral(param.Value); + result = new BslAnnotationParameter(param.Name, runtimeValue); + } + else + { + result = new BslAnnotationParameter(param.Name, null); + } + + return result; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string GetIdentifier(this BslSyntaxNode node) { diff --git a/src/OneScript.Native/Compiler/ExpressionHelpers.cs b/src/OneScript.Native/Compiler/ExpressionHelpers.cs index 726c7b3e2..d8f0d6b25 100644 --- a/src/OneScript.Native/Compiler/ExpressionHelpers.cs +++ b/src/OneScript.Native/Compiler/ExpressionHelpers.cs @@ -508,12 +508,23 @@ public static Expression ConstructorCall(ITypeManager typeManager, Expression se public static Expression ConstructorCall(ITypeManager typeManager, Expression services, TypeDescriptor knownType, Expression[] argsArray) { - var genericMethod = OperationsCache.GetOrAdd( - typeof(DynamicOperations), - nameof(DynamicOperations.StrictConstructorCall)); + MethodInfo method; + + if (knownType.ImplementingClass.IsValue()) + { + var genericMethod = OperationsCache.GetOrAdd( + typeof(DynamicOperations), + nameof(DynamicOperations.StrictConstructorCall)); + + method = genericMethod.MakeGenericMethod(knownType.ImplementingClass); + } + else // подключенный сценарий + { + method = OperationsCache.GetOrAdd( + typeof(DynamicOperations), + nameof(DynamicOperations.ConstructorCall)); + } - var method = genericMethod.MakeGenericMethod(knownType.ImplementingClass); - var arrayOfArgs = Expression.NewArrayInit(typeof(BslValue), argsArray.Select(ConvertToBslValue)); return Expression.Call(method, diff --git a/src/OneScript.Native/Compiler/ModuleCompiler.cs b/src/OneScript.Native/Compiler/ModuleCompiler.cs index 088f3d2d1..bfe09047e 100644 --- a/src/OneScript.Native/Compiler/ModuleCompiler.cs +++ b/src/OneScript.Native/Compiler/ModuleCompiler.cs @@ -6,11 +6,13 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Linq; +using OneScript.Commons; using OneScript.Compilation; using OneScript.Compilation.Binding; using OneScript.Contexts; using OneScript.DependencyInjection; using OneScript.Language; +using OneScript.Language.LexicalAnalysis; using OneScript.Language.SyntaxAnalysis; using OneScript.Language.SyntaxAnalysis.AstNodes; using OneScript.Native.Runtime; @@ -22,13 +24,16 @@ namespace OneScript.Native.Compiler public class ModuleCompiler : ExpressionTreeGeneratorBase { private readonly IServiceContainer _runtimeServices; + private readonly ICompileTimeDependencyResolver _dependencyResolver; private DynamicModule _module; private readonly BslMethodInfoFactory _methodsFactory; - public ModuleCompiler(IErrorSink errors, IServiceContainer runtimeServices) : base(errors) + public ModuleCompiler(IErrorSink errors, IServiceContainer runtimeServices, ICompileTimeDependencyResolver dependencyResolver) : base(errors) { _runtimeServices = runtimeServices; + _dependencyResolver = dependencyResolver; _methodsFactory = new BslMethodInfoFactory(() => new BslNativeMethodInfo()); + } public DynamicModule Compile( @@ -80,7 +85,7 @@ private void RegisterLocalMethods(BslSyntaxNode module) } var builder = _methodsFactory.NewMethod(); - builder.SetAnnotations(methodNode.Annotations); + builder.SetAnnotations(CompilerHelpers.GetAnnotations(methodNode.Annotations)); builder.SetDispatchingIndex(ownMethodsCount++); VisitMethodSignature(builder, methodNode.Signature); @@ -186,5 +191,51 @@ protected override void VisitModuleBody(BslSyntaxNode moduleBody) var methCompiler = new MethodCompiler(context, method); methCompiler.CompileModuleBody(moduleBody); } + + protected override void VisitModuleAnnotation(AnnotationNode node) + { + if (node.Kind == NodeKind.Import) + { + HandleImportClause(node); + } + + var annotation = CompilerHelpers.GetBslAnnotation(node); + _module.ModuleAttributes.Add(annotation); + } + + private void HandleImportClause(AnnotationNode node) + { + var libName = node.Children + .Cast() + .First() + .Value + .Content; + + try + { + _dependencyResolver.Resolve(_module.Source, libName); + } + catch (DependencyResolveException e) + { + var error = new CodeError + { + Description = e.Message, + Position = MakeCodePosition(node.Location), + ErrorId = nameof(CompilerException) + }; + AddError(error); + } + } + + private ErrorPositionInfo MakeCodePosition(CodeRange range) + { + return new ErrorPositionInfo + { + Code = _module.Source.GetCodeLine(range.LineNumber), + LineNumber = range.LineNumber, + ColumnNumber = range.ColumnNumber, + ModuleName = _module.Source.Name + }; + } } } \ No newline at end of file diff --git a/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs b/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs index 25936a87e..f8a654e4a 100644 --- a/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs +++ b/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs @@ -37,9 +37,7 @@ protected override void ParseAnnotationInternal(ref Lexem lastExtractedLexem, IL { var node = new AnnotationNode(NodeKind.Annotation, lastExtractedLexem); _allLineContentLexer.Iterator = lexer.Iterator; - - var child = new TerminalNode(NodeKind.Unknown, lastExtractedLexem); - node.AddChild(child); + parserContext.AddChild(node); // после ничего не должно находиться diff --git a/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs b/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs index c729dc740..f53a3013b 100644 --- a/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs +++ b/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using System.IO; using System.Linq; using System.Text; +using OneScript.Commons; using OneScript.Compilation; using OneScript.Localization; using OneScript.Sources; @@ -56,7 +57,7 @@ public void Initialize(ScriptingEngine engine) Engine = engine; } - public ExternalLibraryDef Resolve(SourceCode module, string libraryName) + public void Resolve(SourceCode module, string libraryName) { bool quoted = PrepareQuoted(ref libraryName); bool loaded; @@ -67,8 +68,6 @@ public ExternalLibraryDef Resolve(SourceCode module, string libraryName) if(!loaded) throw new CompilerException(String.Format("Библиотека не найдена: '{0}'", libraryName)); - - return default; } private bool LoadByName(string libraryName) diff --git a/src/ScriptEngine/Compiler/NativeCompilerBackend.cs b/src/ScriptEngine/Compiler/NativeCompilerBackend.cs index 57fc098a9..6c6bb9344 100644 --- a/src/ScriptEngine/Compiler/NativeCompilerBackend.cs +++ b/src/ScriptEngine/Compiler/NativeCompilerBackend.cs @@ -21,7 +21,7 @@ public class NativeCompilerBackend : ICompilerBackend public NativeCompilerBackend(IErrorSink errorSink, IServiceContainer services) { - _codeGen = new ModuleCompiler(errorSink, services); + _codeGen = new ModuleCompiler(errorSink, services, services.Resolve()); } public bool GenerateDebugCode { get; set; } diff --git a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs index c21c25f5f..240285322 100644 --- a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs +++ b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs @@ -11,6 +11,7 @@ This Source Code Form is subject to the terms of the using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; +using OneScript.Commons; using OneScript.Compilation; using OneScript.Compilation.Binding; using OneScript.Contexts; @@ -1060,9 +1061,9 @@ private void VisitConstant(in Lexem constant) AddCommand(OperationCode.PushConst, num); } - private IEnumerable GetAnnotationAttributes(AnnotatableNode node) + private IEnumerable GetAnnotationAttributes(AnnotatableNode node) { - var mappedAnnotations = new List(); + var mappedAnnotations = new List(); foreach (var annotation in node.Annotations) { var anno = new BslAnnotationAttribute(annotation.Name); diff --git a/src/ScriptEngine/IDependencyResolver.cs b/src/ScriptEngine/IDependencyResolver.cs index c72719ee4..291e36ad0 100644 --- a/src/ScriptEngine/IDependencyResolver.cs +++ b/src/ScriptEngine/IDependencyResolver.cs @@ -5,14 +5,12 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using OneScript.Sources; +using OneScript.Compilation; namespace ScriptEngine { - public interface IDependencyResolver + public interface IDependencyResolver : ICompileTimeDependencyResolver { - ExternalLibraryDef Resolve(SourceCode module, string libraryName); - void Initialize(ScriptingEngine engine); } } \ No newline at end of file diff --git a/src/ScriptEngine/NullDependencyResolver.cs b/src/ScriptEngine/NullDependencyResolver.cs index b83c94ef5..5f2b205d1 100644 --- a/src/ScriptEngine/NullDependencyResolver.cs +++ b/src/ScriptEngine/NullDependencyResolver.cs @@ -12,9 +12,8 @@ namespace ScriptEngine // ReSharper disable once ClassNeverInstantiated.Global internal class NullDependencyResolver : IDependencyResolver { - public ExternalLibraryDef Resolve(SourceCode module, string libraryName) + public void Resolve(SourceCode module, string libraryName) { - return new ExternalLibraryDef(libraryName); } public void Initialize(ScriptingEngine engine) diff --git a/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs b/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs index 585851b69..147c19293 100644 --- a/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs +++ b/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs @@ -8,6 +8,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Linq; using OneScript.Commons; +using OneScript.Compilation; using OneScript.Compilation.Binding; using OneScript.DependencyInjection; using OneScript.Language; @@ -87,8 +88,15 @@ public DynamicModule Compile(SymbolTable scopes) { if (scopes.ScopeCount == 0) scopes.PushScope(new SymbolScope(), null); - var compiler = new ModuleCompiler(_errors, _services); + var compiler = new ModuleCompiler(_errors, _services, new DependencyResolverMock()); return compiler.Compile(_codeIndexer, _module, scopes); } + + private class DependencyResolverMock : ICompileTimeDependencyResolver + { + public void Resolve(SourceCode module, string libraryName) + { + } + } } } From ea7880d4302ea94522f224a4b6edc332293d4bc2 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 15 May 2023 20:34:16 +0300 Subject: [PATCH 025/126] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=20=D0=BD=D0=B0=D1=82=D0=B8=D0=B2=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D1=81=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D0=BE=D0=B1=D1=8B=D1=87=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F.=20see=20#1278?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SyntaxAnalysis/PreprocessorHandlers.cs | 2 +- .../Runtime/DynamicOperations.cs | 1 + .../OneScript.Dynamic.Tests/CompileHelper.cs | 3 +- .../OneScript.Dynamic.Tests/NativeSdoTests.cs | 59 ++++++++++++++++++- .../test-import-native-from-stack.os | 36 +++++++++++ tests/native-lib/test-native-use.os | 18 +++++- ...21\217\321\200\320\272\320\276\320\271.os" | 15 +++++ 7 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 tests/native-lib/test-import-native-from-stack.os create mode 100644 "tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\265\321\200\321\202\320\272\320\260\320\235\320\260\320\264\320\240\320\265\320\263\321\203\320\273\321\217\321\200\320\272\320\276\320\271.os" diff --git a/src/OneScript.Language/SyntaxAnalysis/PreprocessorHandlers.cs b/src/OneScript.Language/SyntaxAnalysis/PreprocessorHandlers.cs index 53b5c3ded..0649be80a 100644 --- a/src/OneScript.Language/SyntaxAnalysis/PreprocessorHandlers.cs +++ b/src/OneScript.Language/SyntaxAnalysis/PreprocessorHandlers.cs @@ -51,7 +51,7 @@ public PreprocessorHandlers Slice(Func predicate) { var slice = _handlers.Where(predicate).ToArray(); if (slice.Length == 0) - return default; + return new PreprocessorHandlers(); return new PreprocessorHandlers(slice); } diff --git a/src/OneScript.Native/Runtime/DynamicOperations.cs b/src/OneScript.Native/Runtime/DynamicOperations.cs index 1ce717098..fcb25c511 100644 --- a/src/OneScript.Native/Runtime/DynamicOperations.cs +++ b/src/OneScript.Native/Runtime/DynamicOperations.cs @@ -100,6 +100,7 @@ public static BslValue WrapClrObjectToValue(object value) double dbl => BslNumericValue.Create((decimal) dbl), bool boolean => BslBooleanValue.Create(boolean), DateTime date => BslDateValue.Create(date), + BslValue bslValue => bslValue, _ => throw new TypeConversionException(new BilingualString( $"Невозможно преобразовать {value.GetType()} в тип {nameof(BslValue)}", $"Can't Convert {value.GetType()} to {nameof(BslValue)}")) diff --git a/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs b/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs index 147c19293..938119075 100644 --- a/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs +++ b/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs @@ -80,7 +80,8 @@ private DefaultBslParser GetBslParser(string code) .CreateIterator(); _codeIndexer = lexer.Iterator.Source; - var parser = new DefaultBslParser(lexer, _errors, new PreprocessorHandlers()); + var providers = _services.ResolveEnumerable(); + var parser = new DefaultBslParser(lexer, _errors, new PreprocessorHandlers(providers)); return parser; } diff --git a/src/Tests/OneScript.Dynamic.Tests/NativeSdoTests.cs b/src/Tests/OneScript.Dynamic.Tests/NativeSdoTests.cs index 3351057f0..91e859cf3 100644 --- a/src/Tests/OneScript.Dynamic.Tests/NativeSdoTests.cs +++ b/src/Tests/OneScript.Dynamic.Tests/NativeSdoTests.cs @@ -11,6 +11,8 @@ This Source Code Form is subject to the terms of the using OneScript.DependencyInjection; using OneScript.Execution; using OneScript.Language; +using OneScript.Language.LexicalAnalysis; +using OneScript.Language.SyntaxAnalysis; using OneScript.Native.Compiler; using OneScript.Native.Extensions; using OneScript.Native.Runtime; @@ -18,6 +20,7 @@ This Source Code Form is subject to the terms of the using OneScript.StandardLibrary; using OneScript.StandardLibrary.Collections; using OneScript.StandardLibrary.Collections.ValueTable; +using OneScript.StandardLibrary.Regex; using OneScript.StandardLibrary.TypeDescriptions; using OneScript.Types; using ScriptEngine; @@ -49,9 +52,28 @@ public NativeSdoTests() testServices.RegisterSingleton(); testServices.RegisterSingleton(); testServices.RegisterSingleton(); + testServices.RegisterEnumerable(); + testServices.Register(); testServices.UseImports(); } - + + // ReSharper disable once ClassNeverInstantiated.Local + private class EmptyDirectiveHandler : IDirectiveHandler + { + public void OnModuleEnter() + { + } + + public void OnModuleLeave() + { + } + + public bool HandleDirective(ref Lexem lastExtractedLexem, ILexer lexer) + { + return false; + } + } + [Fact] public void Test_Can_Instantiate_Sdo_With_NativeModule() { @@ -162,7 +184,6 @@ Процедура А() Экспорт [Fact] public void CanSelectNativeCompiler() { - testServices.Register(); testServices.UseNativeRuntime(); var code = @@ -378,6 +399,40 @@ Функция Тест(Условие) val1.AsNumber().Should().Be(1); } + [Fact] + public void Can_Instantiate_Native_Class_With_Args() + { + var code = @"#native + + Перем РегулярноеВыражение; + + Процедура ПриСозданииОбъекта(ТекстРегулярки) + РегулярноеВыражение = Новый РегулярноеВыражение(ТекстРегулярки); + КонецПроцедуры + + Функция НайтиСовпадения(Текст) Экспорт + + КоллекцияСовпадений = РегулярноеВыражение.НайтиСовпадения(Текст); + + Возврат КоллекцияСовпадений; + + КонецФункции"; + + var symbols = new SymbolTable(); + + testServices.UseNativeRuntime(); + var serviceContainer = testServices.CreateContainer(); + var discoverer = serviceContainer.Resolve(); + discoverer.DiscoverClasses(typeof(RegExpImpl).Assembly); + var module = CreateModule(code, serviceContainer, symbols); + + var sdo = new UserScriptContextInstance(module, + new TypeDescriptor(new Guid(), "TestClass", default, typeof(UserScriptContextInstance)), + new IValue[] { new RegExpImpl(".") }); + sdo.InitOwnData(); + sdo.Initialize(); + } + private DynamicModule CreateModule(string code) => CreateModule(code, testServices.CreateContainer(), new SymbolTable()); private DynamicModule CreateModule(string code, IServiceContainer services, SymbolTable symbols) diff --git a/tests/native-lib/test-import-native-from-stack.os b/tests/native-lib/test-import-native-from-stack.os new file mode 100644 index 000000000..9722dba00 --- /dev/null +++ b/tests/native-lib/test-import-native-from-stack.os @@ -0,0 +1,36 @@ +#Использовать "." + +Перем юТест; + +Функция ПолучитьСписокТестов(Тестирование) Экспорт + + юТест = Тестирование; + + Тесты = Новый Массив; + Тесты.Добавить("ТестДолжен_ПроверитьОберткуНадРегуляркой"); + + Возврат Тесты; + +КонецФункции + +Процедура ТестДолжен_ПроверитьОберткуНадРегуляркой() Экспорт + ИсходнаяСтрока = "{20221110000049,N, + |{2444a6a24da10,3d},1,1,1,1803214,81,I,""Первое событие"",599, + |{""U""},""Представление данных"",1,1,9,3,0, + |{0} + |}, + |{20221110000049,U, + |{2444a6a24da10,3d},1,1,1,1803214,81,E,""Второе событие"",599, + |{""U""},""Представление данных2"",1,1,9,3,0, + |{2,1,31,2,31} + |}"; + Регулярка = "\,*\r*\n*\{(\d{14}),(\w),\r*\n\{([0-9a-f]+),([0-9a-f]+)\},(\d+),(\d+),(\d+),(\d+),(\d+),(\w),""([^ꡏ]*?)(?="",\d+,\r*\n)"",(\d+),\r*\n\{([^ꡏ]*?)(?=\},"")\},""([^ꡏ]*?)(?="",\d+)"",(\d+),(\d+),(\d+),(\d+),\d+[,\d+]*,\r*\n\{((\d+)|\d+,(\d+),(\d+),(\d+),(\d+))\}\r*\n\},*\r*\n*"; + + ОберткаНадРегуляркой = Новый ОберткаНадРегуляркой(Регулярка); + + Совпадения = ОберткаНадРегуляркой.НайтиСовпадения(ИсходнаяСтрока); + Совпадение = Совпадения[0]; + + юТест.ПроверитьРавенство(2, Совпадения.Количество()); +КонецПроцедуры + diff --git a/tests/native-lib/test-native-use.os b/tests/native-lib/test-native-use.os index bc18cbbcf..eadbe06cb 100644 --- a/tests/native-lib/test-native-use.os +++ b/tests/native-lib/test-native-use.os @@ -1,3 +1,19 @@ #native #Использовать "." -ТестовыйСценарий = Новый ТестовыйСценарий; \ No newline at end of file + +Перем юТест; + +Функция ПолучитьСписокТестов(Тестирование) Экспорт + + юТест = Тестирование; + + Тесты = Новый Массив; + Тесты.Добавить("ТестДолжен_ПроверитьСозданиеОбъекта_ИзНативногоКласса"); + + Возврат Тесты; + +КонецФункции + +Процедура ТестДолжен_ПроверитьСозданиеОбъекта_ИзНативногоКласса() Экспорт + ТестовыйСценарий = Новый ТестовыйСценарий; +КонецПроцедуры \ No newline at end of file diff --git "a/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\265\321\200\321\202\320\272\320\260\320\235\320\260\320\264\320\240\320\265\320\263\321\203\320\273\321\217\321\200\320\272\320\276\320\271.os" "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\265\321\200\321\202\320\272\320\260\320\235\320\260\320\264\320\240\320\265\320\263\321\203\320\273\321\217\321\200\320\272\320\276\320\271.os" new file mode 100644 index 000000000..fb82ecfa0 --- /dev/null +++ "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\265\321\200\321\202\320\272\320\260\320\235\320\260\320\264\320\240\320\265\320\263\321\203\320\273\321\217\321\200\320\272\320\276\320\271.os" @@ -0,0 +1,15 @@ +#native + +Перем РегулярноеВыражение; + +Процедура ПриСозданииОбъекта(ТекстРегулярки) + РегулярноеВыражение = Новый РегулярноеВыражение(ТекстРегулярки); +КонецПроцедуры + +Функция НайтиСовпадения(Текст) Экспорт + + КоллекцияСовпадений = РегулярноеВыражение.НайтиСовпадения(Текст); + + Возврат КоллекцияСовпадений; + +КонецФункции \ No newline at end of file From 4ead8a466d588adb4ba36690dd6259bb5af56d2d Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 15 May 2023 21:02:26 +0300 Subject: [PATCH 026/126] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1=D1=8A=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D0=B2,=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=20=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=D0=A1=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B9.?= =?UTF-8?q?=20see=20#1278?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Compiler/MethodCompiler.cs | 15 ++++++++++--- .../ServiceRegistrationExtensions.cs | 1 + .../Extensions/EngineBuilderExtensions.cs | 3 +++ .../Extensions/NativeScriptInfoFactory.cs | 22 +++++++++++++++++++ tests/native-lib/test-native-use.os | 7 ++++++ 5 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 src/ScriptEngine.HostedScript/Extensions/NativeScriptInfoFactory.cs diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index 931458ee4..a138335f3 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -1479,9 +1479,18 @@ protected override void VisitNewObjectCreation(NewObjectNode node) else { var typeNameString = node.TypeNameNode.GetIdentifier(); - var typeDef = CurrentTypeManager.GetTypeByName(typeNameString); - var call = ExpressionHelpers.ConstructorCall(CurrentTypeManager, services, typeDef, parameters); - _statementBuildParts.Push(call); + var isKnownType = CurrentTypeManager.TryGetType(typeNameString, out var typeDef); + if (isKnownType) + { + var call = ExpressionHelpers.ConstructorCall(CurrentTypeManager, services, typeDef, parameters); + _statementBuildParts.Push(call); + } + else // это может быть тип, подключенный через ПодключитьСценарий + { + var typeName = Expression.Constant(typeNameString); + var call = ExpressionHelpers.ConstructorCall(CurrentTypeManager, services, typeName, parameters); + _statementBuildParts.Push(call); + } } } diff --git a/src/OneScript.Native/Extensions/ServiceRegistrationExtensions.cs b/src/OneScript.Native/Extensions/ServiceRegistrationExtensions.cs index e74af7327..53aeb356b 100644 --- a/src/OneScript.Native/Extensions/ServiceRegistrationExtensions.cs +++ b/src/OneScript.Native/Extensions/ServiceRegistrationExtensions.cs @@ -5,6 +5,7 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +using OneScript.Contexts; using OneScript.DependencyInjection; using OneScript.Execution; using OneScript.Language.SyntaxAnalysis; diff --git a/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs b/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs index 5e01f4251..636d298ae 100644 --- a/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs +++ b/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs @@ -7,6 +7,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.IO; +using OneScript.Contexts; using OneScript.Native.Extensions; using ScriptEngine.Hosting; using ScriptEngine.Machine; @@ -119,7 +120,9 @@ public static ExecutionContext UseTemplateFactory(this ExecutionContext env, ITe public static IEngineBuilder UseNativeRuntime(this IEngineBuilder builder) { + builder.Services.Register(); builder.Services.UseNativeRuntime(); + return builder; } } diff --git a/src/ScriptEngine.HostedScript/Extensions/NativeScriptInfoFactory.cs b/src/ScriptEngine.HostedScript/Extensions/NativeScriptInfoFactory.cs new file mode 100644 index 000000000..f7a4075ca --- /dev/null +++ b/src/ScriptEngine.HostedScript/Extensions/NativeScriptInfoFactory.cs @@ -0,0 +1,22 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using OneScript.Contexts; +using OneScript.Sources; +using OneScript.Values; +using ScriptEngine.Machine.Contexts; + +namespace ScriptEngine.HostedScript.Extensions +{ + public class NativeScriptInfoFactory : IScriptInformationFactory + { + public BslObjectValue GetInfo(SourceCode source) + { + return new ScriptInformationContext(source); + } + } +} \ No newline at end of file diff --git a/tests/native-lib/test-native-use.os b/tests/native-lib/test-native-use.os index eadbe06cb..574c59541 100644 --- a/tests/native-lib/test-native-use.os +++ b/tests/native-lib/test-native-use.os @@ -9,6 +9,7 @@ Тесты = Новый Массив; Тесты.Добавить("ТестДолжен_ПроверитьСозданиеОбъекта_ИзНативногоКласса"); + Тесты.Добавить("ТестДолжен_ПроверитьПодключениеСценария"); Возврат Тесты; @@ -16,4 +17,10 @@ Процедура ТестДолжен_ПроверитьСозданиеОбъекта_ИзНативногоКласса() Экспорт ТестовыйСценарий = Новый ТестовыйСценарий; +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПодключениеСценария() Экспорт + ПодключитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "Классы", "ТестовыйСценарий.os"), "ПодключенныйСценарий"); + + ТестовыйСценарий = Новый ПодключенныйСценарий; КонецПроцедуры \ No newline at end of file From 9274d64c7ceae45ddc07a87a570ffd48ab6ea751 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 15 May 2023 21:07:29 +0300 Subject: [PATCH 027/126] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D0=B8=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs | 2 +- src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs index 26380b06c..ce6f77e47 100644 --- a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs +++ b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs @@ -699,7 +699,7 @@ Если Массив[индекс] Тогда tm.RegisterClass(typeof(ArrayImpl)); var blockCompiler = new CompiledBlock(default); - var N = 5000; + var N = 50000; var arr = new ArrayImpl(); for (int i = 0; i < N; i++) { diff --git a/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs b/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs index 938119075..e1e3ab13b 100644 --- a/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs +++ b/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs @@ -17,6 +17,7 @@ This Source Code Form is subject to the terms of the using OneScript.Language.SyntaxAnalysis.AstNodes; using OneScript.Native.Compiler; using OneScript.Sources; +using ScriptEngine.Hosting; namespace OneScript.Dynamic.Tests { @@ -34,7 +35,7 @@ public CompileHelper(IServiceContainer services) public CompileHelper() { - _services = default; + _services = new TinyIocImplementation(); } public IEnumerable Errors => _errors.Errors; From 18eaf41bf75f702199967bfffd765b2a07d05c7e Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Tue, 16 May 2023 10:14:14 +0300 Subject: [PATCH 028/126] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=B2=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20=D0=BE=D1=88=D0=B8=D0=B1?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20=D0=BD=D0=B0=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Native/Compiler/MethodCompiler.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index a138335f3..b7a9c764c 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -1135,12 +1135,6 @@ private IEnumerable PrepareDynamicCallArguments(BslSyntaxNode argLis protected override void VisitObjectFunctionCall(BslSyntaxNode node) { - if (!_method.IsFunction()) - { - AddError(LocalizedErrors.UseProcAsFunction(), node.Location); - return; - } - var target = _statementBuildParts.Pop(); var call = (CallNode) node; From cd30371e192ee3ff5c795f81a7679fe7ea0de86d Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Tue, 16 May 2023 11:16:08 +0300 Subject: [PATCH 029/126] opm bash launcher --- install/opm.sh | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100755 install/opm.sh diff --git a/install/opm.sh b/install/opm.sh new file mode 100755 index 000000000..c55be99ff --- /dev/null +++ b/install/opm.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +THISDIR=$(dirname -- "$0") + +LIB="$THISDIR/../lib" +OPM=$LIB/opm/src/cmd/opm.os + +oscript $OPM "$@" From 8a23df49bc4530a3bc0ad07b636a5384e6ee2afa Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Tue, 16 May 2023 11:25:28 +0300 Subject: [PATCH 030/126] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B8=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=B0?= =?UTF-8?q?=20opm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install/opm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/opm.sh b/install/opm.sh index c55be99ff..e6e62bc7b 100755 --- a/install/opm.sh +++ b/install/opm.sh @@ -1,6 +1,6 @@ #!/bin/bash -THISDIR=$(dirname -- "$0") +THISDIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) LIB="$THISDIR/../lib" OPM=$LIB/opm/src/cmd/opm.os From b2efe8909c24f99b50044e78b4e19241ec1f737d Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Fri, 19 May 2023 22:12:02 +0400 Subject: [PATCH 031/126] =?UTF-8?q?native:=20=D0=B4=D0=BE=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B8=D0=BF=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BA=20=D0=BF=D1=80=D0=B5=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC=20Bsl=20=D0=B2?= =?UTF-8?q?=20Clr.=20Fix=20#1294?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Native/Compiler/CompilerHelpers.cs | 2 ++ src/OneScript.Native/Compiler/ExpressionHelpers.cs | 12 +++--------- src/OneScript.Native/Runtime/DynamicOperations.cs | 8 ++++++++ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/OneScript.Native/Compiler/CompilerHelpers.cs b/src/OneScript.Native/Compiler/CompilerHelpers.cs index 0e32c85c1..2afe69439 100644 --- a/src/OneScript.Native/Compiler/CompilerHelpers.cs +++ b/src/OneScript.Native/Compiler/CompilerHelpers.cs @@ -28,6 +28,7 @@ public static BslPrimitiveValue ValueFromLiteral(in Lexem lex) LexemType.StringLiteral => BslStringValue.Create(lex.Content), LexemType.DateLiteral => BslDateValue.Parse(lex.Content), LexemType.UndefinedLiteral => BslUndefinedValue.Instance, + LexemType.NullLiteral => BslNullValue.Instance, _ => throw new NotImplementedException() }; } @@ -41,6 +42,7 @@ public static object ClrValueFromLiteral(in Lexem lex) LexemType.StringLiteral => (string)BslStringValue.Create(lex.Content), LexemType.DateLiteral => (DateTime)BslDateValue.Parse(lex.Content), LexemType.UndefinedLiteral => BslUndefinedValue.Instance, + LexemType.NullLiteral => BslNullValue.Instance, _ => throw new NotImplementedException() }; } diff --git a/src/OneScript.Native/Compiler/ExpressionHelpers.cs b/src/OneScript.Native/Compiler/ExpressionHelpers.cs index d8f0d6b25..88a76e239 100644 --- a/src/OneScript.Native/Compiler/ExpressionHelpers.cs +++ b/src/OneScript.Native/Compiler/ExpressionHelpers.cs @@ -382,7 +382,7 @@ public static Expression ConvertToBslValue(Expression value) var factoryClass = GetValueFactoryType(value.Type); if (factoryClass == null) { - if (value.Type == typeof(object)) + if (value.Type==typeof(IValue) || value.Type.IsSubclassOf(typeof(IValue))) { // это результат динамической операции // просто верим, что он BslValue @@ -432,15 +432,9 @@ private static Type GetValueFactoryType(Type clrType) { factoryClass = typeof(BslBooleanValue); } - else if (clrType == typeof(decimal)) + else if (clrType.IsNumeric()) { - factoryClass = typeof(BslNumericValue); - } - else if (clrType == typeof(int) || - clrType == typeof(long) || - clrType == typeof(double)) - { - factoryClass = typeof(BslNumericValue); + factoryClass = typeof(BslNumericValue); } else if (clrType == typeof(DateTime)) { diff --git a/src/OneScript.Native/Runtime/DynamicOperations.cs b/src/OneScript.Native/Runtime/DynamicOperations.cs index fcb25c511..f5241a971 100644 --- a/src/OneScript.Native/Runtime/DynamicOperations.cs +++ b/src/OneScript.Native/Runtime/DynamicOperations.cs @@ -95,8 +95,16 @@ public static BslValue WrapClrObjectToValue(object value) null => BslUndefinedValue.Instance, string s => BslStringValue.Create(s), decimal d => BslNumericValue.Create(d), + int n => BslNumericValue.Create(n), + uint n => BslNumericValue.Create(n), + short n => BslNumericValue.Create(n), + ushort n => BslNumericValue.Create(n), + byte n => BslNumericValue.Create(n), + sbyte n => BslNumericValue.Create(n), long l => BslNumericValue.Create(l), + ulong l => BslNumericValue.Create(l), + double dbl => BslNumericValue.Create((decimal) dbl), bool boolean => BslBooleanValue.Create(boolean), DateTime date => BslDateValue.Create(date), From e8851f204de8660ad99a09d0414e335d0c1e9001 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Mon, 22 May 2023 21:19:51 +0400 Subject: [PATCH 032/126] =?UTF-8?q?=D0=BA=20#1294:=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D1=83=D0=BB=20=D0=BE=D0=B1=D1=89=D0=B8=D0=B9=20=D1=81?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B0=D0=B9=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB?= =?UTF-8?q?=D1=8C=D1=82=D0=B0=D1=82=D0=B0=20=D0=B4=D0=B8=D0=BD=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B9=20=D0=BE=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Native/Compiler/ExpressionHelpers.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/OneScript.Native/Compiler/ExpressionHelpers.cs b/src/OneScript.Native/Compiler/ExpressionHelpers.cs index 88a76e239..34b210eb4 100644 --- a/src/OneScript.Native/Compiler/ExpressionHelpers.cs +++ b/src/OneScript.Native/Compiler/ExpressionHelpers.cs @@ -382,7 +382,8 @@ public static Expression ConvertToBslValue(Expression value) var factoryClass = GetValueFactoryType(value.Type); if (factoryClass == null) { - if (value.Type==typeof(IValue) || value.Type.IsSubclassOf(typeof(IValue))) + if (value.Type==typeof(IValue) || value.Type.IsSubclassOf(typeof(IValue)) + || value.Type == typeof(object)) { // это результат динамической операции // просто верим, что он BslValue @@ -404,6 +405,7 @@ public static Expression ConvertToBslValue(Expression value) var factory = OperationsCache.GetOrAdd(factoryClass, "Create"); return Expression.Call(factory, value); } + public static (Expression, Expression) ConvertToCompatibleBslValues(Expression value1, Expression value2) { value1 = ConvertToBslValue(value1); From 8d5576f8dc4ea21233d8aa1fdcc294792a44edc6 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Wed, 24 May 2023 12:36:13 +0400 Subject: [PATCH 033/126] =?UTF-8?q?fix=20#1289:=20=D0=BF=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D1=80=D1=8B=20=D0=BF=D0=BE=20=D1=83=D0=BC?= =?UTF-8?q?=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Compiler/MethodCompiler.cs | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index b7a9c764c..2ef34a58d 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -1397,8 +1397,22 @@ private List PrepareCallArguments(BslSyntaxNode argList, ParameterIn } else { - var convertedOrDirect = PassSingleParameter(passedArg, declaredParam.ParameterType, argList.Location); - factArguments.Add(convertedOrDirect); + if (passedArg != null) + { + var convertedOrDirect = PassSingleParameter(passedArg, declaredParam.ParameterType, argList.Location); + factArguments.Add(convertedOrDirect); + } + else if (declaredParam.HasDefaultValue) + { + factArguments.Add(Expression.Constant(declaredParam.DefaultValue, declaredParam.ParameterType)); + } + else + { + var errText = new BilingualString( + $"Пропущен обязательный параметр {declaredParam.Position+1} '{declaredParam.Name}'", + $"Missing mandatory parameter {declaredParam.Position+1} '{declaredParam.Name}'"); + AddError(errText, argList.Location); + } } --parametersToProcess; @@ -1436,7 +1450,8 @@ private Expression PassSingleParameter(Expression passedArg, Type targetType, Co { AddError( new BilingualString( - $"Не удается выполнить преобразование из типа {passedArg.Type} в тип {targetType}"), + $"Не удается выполнить преобразование параметра из типа {passedArg.Type} в тип {targetType}", + $"Cannot convert parameter from type {passedArg.Type} to type {targetType}"), location); } From 4668da52cdbaf3b5d20ed20ce85d9be5972bcc62 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Thu, 25 May 2023 11:08:37 +0300 Subject: [PATCH 034/126] =?UTF-8?q?=D0=9B=D0=B0=D1=83=D0=BD=D1=87=D0=B5?= =?UTF-8?q?=D1=80=20=D0=B4=D0=BB=D1=8F=20linux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install/oscript.bat | 5 ----- install/oscript.sh | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100755 install/oscript.sh diff --git a/install/oscript.bat b/install/oscript.bat index 6e5dafd26..abb4ca583 100644 --- a/install/oscript.bat +++ b/install/oscript.bat @@ -1,8 +1,3 @@ @echo off - - - - - dotnet %~dp0oscript.dll %* diff --git a/install/oscript.sh b/install/oscript.sh new file mode 100755 index 000000000..d2cbc30be --- /dev/null +++ b/install/oscript.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +THISDIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +dotnet "$THISDIR/oscript.dll" "$@" From 8f1f0f966ca00937483d582cabcd0b9a99524ab7 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 31 May 2023 09:32:32 +0300 Subject: [PATCH 035/126] =?UTF-8?q?fixed=20#1289=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=D1=87=D0=B0=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BF=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20=D0=B2=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=B5=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contexts/BslScriptMethodInfo.cs | 2 +- .../Compiler/ExpressionHelpers.cs | 18 ++++--- .../Runtime/BslNativeMethodInfo.cs | 25 +++++++--- .../Runtime/DynamicOperations.cs | 27 +++++++++++ .../DynamicOperationsTest.cs | 47 +++++++++++++++++++ tests/native-lib/test-native-use.os | 21 +++++++++ ...21\207\320\260\320\275\320\270\321\216.os" | 29 ++++++++++++ 7 files changed, 151 insertions(+), 18 deletions(-) create mode 100644 src/Tests/OneScript.Dynamic.Tests/DynamicOperationsTest.cs create mode 100644 "tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\320\276\320\243\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216.os" diff --git a/src/OneScript.Core/Contexts/BslScriptMethodInfo.cs b/src/OneScript.Core/Contexts/BslScriptMethodInfo.cs index 7dacf42d5..0dd00e1e4 100644 --- a/src/OneScript.Core/Contexts/BslScriptMethodInfo.cs +++ b/src/OneScript.Core/Contexts/BslScriptMethodInfo.cs @@ -23,7 +23,7 @@ public class BslScriptMethodInfo : BslMethodInfo, IBuildableMethod private Type _returnType = typeof(void); private string _name; private bool _isPrivate = true; - private BslParameterInfo[] _parameters = Array.Empty(); + protected BslParameterInfo[] _parameters = Array.Empty(); protected BslScriptMethodInfo() { diff --git a/src/OneScript.Native/Compiler/ExpressionHelpers.cs b/src/OneScript.Native/Compiler/ExpressionHelpers.cs index 34b210eb4..3083e0b0d 100644 --- a/src/OneScript.Native/Compiler/ExpressionHelpers.cs +++ b/src/OneScript.Native/Compiler/ExpressionHelpers.cs @@ -351,27 +351,25 @@ private static bool IsNullable(Type targetType) public static Expression CallCompareTo(Expression target, Expression argument) { var compareToMethod = OperationsCache.GetOrAdd( - typeof(IComparable), - nameof(IComparable.CompareTo), - BindingFlags.Instance | BindingFlags.Public + typeof(DynamicOperations), + nameof(DynamicOperations.Comparison) ); - var bslArgument = ConvertToBslValue(argument); + Debug.Assert(argument.Type.IsValue()); - return Expression.Call(target, compareToMethod, bslArgument); + return Expression.Call(compareToMethod, target, argument); } public static Expression CallEquals(Expression target, Expression argument) { var equalsMethod = OperationsCache.GetOrAdd( - typeof(IEquatable), - nameof(IEquatable.Equals), - BindingFlags.Instance | BindingFlags.Public + typeof(DynamicOperations), + nameof(DynamicOperations.Equality) ); - var bslArgument = ConvertToBslValue(argument); + Debug.Assert(argument.Type.IsValue()); - return Expression.Call(target, equalsMethod, bslArgument); + return Expression.Call(equalsMethod, target, argument); } public static Expression ConvertToBslValue(Expression value) diff --git a/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs b/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs index b3bf5f184..ac3fa9750 100644 --- a/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs +++ b/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs @@ -5,13 +5,10 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System; -using System.Collections.Generic; +using System.Diagnostics; using System.Globalization; -using System.Linq; using System.Linq.Expressions; using System.Reflection; -using System.Threading; using OneScript.Contexts; using OneScript.Values; @@ -45,10 +42,24 @@ private CallableMethod CreateCallable() public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) { - var bslArguments = new List(parameters.Length); - bslArguments.AddRange(parameters.Cast()); + // FIXME: Из стековой машины дефолтные значения могут прийти, как null или Skipped + // здесь мы принудительно проставляем пропущенные параметры + var bslArguments = new BslValue[parameters.Length]; + for (int i = 0; i < bslArguments.Length; i++) + { + var param = parameters[i]; + if (param == null || param == BslSkippedParameterValue.Instance) + { + Debug.Assert(_parameters[i].HasDefaultValue); + bslArguments[i] = (BslValue)_parameters[i].DefaultValue; + } + else + { + bslArguments[i] = (BslValue)param; + } + } - return _callable.Invoke(obj, bslArguments.ToArray()); + return _callable.Invoke(obj, bslArguments); } } diff --git a/src/OneScript.Native/Runtime/DynamicOperations.cs b/src/OneScript.Native/Runtime/DynamicOperations.cs index f5241a971..f4bbc1bd9 100644 --- a/src/OneScript.Native/Runtime/DynamicOperations.cs +++ b/src/OneScript.Native/Runtime/DynamicOperations.cs @@ -7,6 +7,7 @@ This Source Code Form is subject to the terms of the using System; using System.Linq; +using System.Runtime.CompilerServices; using OneScript.Commons; using OneScript.Contexts; using OneScript.DependencyInjection; @@ -16,6 +17,8 @@ This Source Code Form is subject to the terms of the using OneScript.Values; using ScriptEngine.Machine; +[assembly: InternalsVisibleTo("OneScript.Dynamic.Tests")] + namespace OneScript.Native.Runtime { internal static class DynamicOperations @@ -88,6 +91,30 @@ public static string ToString(BslValue value) return (string)value; } + // FIXME: тут не должно быть Null, но из-за несовершенства мира они тут бывают. Когда задолбает - надо починить и убрать отсюда проверки на null + public static bool Equality(BslValue left, BslValue right) + { + if (ReferenceEquals(left, right)) + return true; + + if (left == null || right == null) + return false; + + return left.Equals(right); + } + + // FIXME: тут не должно быть Null, но из-за несовершенства мира они тут бывают. Когда задолбает - надо починить и убрать отсюда проверки на null + public static int Comparison(BslValue left, BslValue right) + { + if (left == null && right == null) + return 0; + + if (left != null) + return left.CompareTo(right); + + return BslUndefinedValue.Instance.CompareTo(right); + } + public static BslValue WrapClrObjectToValue(object value) { return value switch diff --git a/src/Tests/OneScript.Dynamic.Tests/DynamicOperationsTest.cs b/src/Tests/OneScript.Dynamic.Tests/DynamicOperationsTest.cs new file mode 100644 index 000000000..c2be899a2 --- /dev/null +++ b/src/Tests/OneScript.Dynamic.Tests/DynamicOperationsTest.cs @@ -0,0 +1,47 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System.Collections.Generic; +using FluentAssertions; +using OneScript.Commons; +using OneScript.Native.Runtime; +using OneScript.Values; +using Xunit; + +namespace OneScript.Dynamic.Tests; + +public class DynamicOperationsTest +{ + [Theory] + [MemberData(nameof(ArgsForEqualityOperators))] + public void DynamicEquality(BslValue left, BslValue right, bool expected) + { + var result = DynamicOperations.Equality(left, right); + result.Should().Be(expected); + } + + [Fact] + public void DynamicAdditionForNulls() + { + Assert.Throws(() => DynamicOperations.Add(null, null)); + } + + [Fact] + public void DynamicSubtractionForNulls() + { + Assert.Throws(() => DynamicOperations.Subtract(null, null)); + } + + public static IEnumerable ArgsForEqualityOperators() + { + yield return new object[] { BslBooleanValue.True, BslBooleanValue.True, true }; + yield return new object[] { BslBooleanValue.True, null, false }; + yield return new object[] { null, BslBooleanValue.True, false }; + yield return new object[] { BslBooleanValue.True, BslUndefinedValue.Instance, false }; + // TODO: расширить по мере возможности + } +} \ No newline at end of file diff --git a/tests/native-lib/test-native-use.os b/tests/native-lib/test-native-use.os index 574c59541..2b25e2767 100644 --- a/tests/native-lib/test-native-use.os +++ b/tests/native-lib/test-native-use.os @@ -10,6 +10,7 @@ Тесты = Новый Массив; Тесты.Добавить("ТестДолжен_ПроверитьСозданиеОбъекта_ИзНативногоКласса"); Тесты.Добавить("ТестДолжен_ПроверитьПодключениеСценария"); + Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСПараметрамиПоУмолчанию"); Возврат Тесты; @@ -23,4 +24,24 @@ ПодключитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "Классы", "ТестовыйСценарий.os"), "ПодключенныйСценарий"); ТестовыйСценарий = Новый ПодключенныйСценарий; +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьВызовМетодовСПараметрамиПоУмолчанию() Экспорт + Сценарий = Новый ПараметрыПоУмолчанию; + + Результат1 = Сценарий.МетодБулево(); + Результат2 = Сценарий.МетодБулево(Истина); + Результат3 = Сценарий.МетодБулево(Ложь); + + Если НЕ Результат1 = 1 Тогда + ВызватьИсключение "Ошибка передачи параметра"; + КонецЕсли; + + Если НЕ Результат2 = 1 Тогда + ВызватьИсключение "Ошибка передачи параметра"; + КонецЕсли; + + Если НЕ Результат3 = 0 Тогда + ВызватьИсключение "Ошибка передачи параметра"; + КонецЕсли; КонецПроцедуры \ No newline at end of file diff --git "a/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\320\276\320\243\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216.os" "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\320\276\320\243\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216.os" new file mode 100644 index 000000000..9d5ad47a1 --- /dev/null +++ "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\320\276\320\243\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216.os" @@ -0,0 +1,29 @@ +#native + +Процедура ПриСозданииОбъекта() + +КонецПроцедуры + +Функция МетодСтроки(Текст1 = "Т1 ", Текст2 = "Т2 ") Экспорт + Возврат Текст1 + Текст2; +КонецФункции + +Функция МетодБулево(Булево = Истина) Экспорт + + Если Булево = Истина Или Булево Тогда + Возврат 1; + Иначе + Возврат 0; + КонецЕсли; + +КонецФункции + +Функция МетодНеопределено(Параметр = Неопределено) Экспорт + + Если Параметр = Неопределено Тогда + Возврат 1; + Иначе + Возврат 0; + КонецЕсли; + +КонецФункции \ No newline at end of file From b1d61647d6ebc6f25277d129942c563448b4d9ea Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Wed, 31 May 2023 17:49:16 +0400 Subject: [PATCH 036/126] =?UTF-8?q?=D0=BA=20#1289:=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BF=D0=B0=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=20null;=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE;=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Compiler/MethodCompiler.cs | 6 +-- .../Runtime/BslNativeMethodInfo.cs | 7 ++- tests/native-lib/test-native-use.os | 43 +++++++++++++++++++ ...21\207\320\260\320\275\320\270\321\216.os" | 10 +++++ 4 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index 2ef34a58d..9c7ab55ce 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -1130,7 +1130,7 @@ private IEnumerable PrepareDynamicCallArguments(BslSyntaxNode argLis return argList.Children.Select(passedArg => passedArg.Children.Count > 0 ? ConvertToExpressionTree(passedArg.Children[0]) - : null); + : Expression.Constant(BslSkippedParameterValue.Instance)); } protected override void VisitObjectFunctionCall(BslSyntaxNode node) @@ -1442,9 +1442,9 @@ private Expression PassSingleParameter(Expression passedArg, Type targetType, Co { if (passedArg == null) { - return Expression.Default(targetType); + return Expression.Constant(BslSkippedParameterValue.Instance); } - + var convertedOrDirect = ExpressionHelpers.TryConvertParameter(passedArg, targetType); if (convertedOrDirect == null) { diff --git a/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs b/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs index ac3fa9750..e6dc4b64a 100644 --- a/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs +++ b/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using System.Globalization; using System.Linq.Expressions; using System.Reflection; +using OneScript.Commons; using OneScript.Contexts; using OneScript.Values; @@ -50,8 +51,10 @@ public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder var param = parameters[i]; if (param == null || param == BslSkippedParameterValue.Instance) { - Debug.Assert(_parameters[i].HasDefaultValue); - bslArguments[i] = (BslValue)_parameters[i].DefaultValue; + if (_parameters[i].HasDefaultValue) + bslArguments[i] = (BslValue)_parameters[i].DefaultValue; + else + throw RuntimeException.MissedArgument(); } else { diff --git a/tests/native-lib/test-native-use.os b/tests/native-lib/test-native-use.os index 2b25e2767..1078d7719 100644 --- a/tests/native-lib/test-native-use.os +++ b/tests/native-lib/test-native-use.os @@ -11,6 +11,10 @@ Тесты.Добавить("ТестДолжен_ПроверитьСозданиеОбъекта_ИзНативногоКласса"); Тесты.Добавить("ТестДолжен_ПроверитьПодключениеСценария"); Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСПараметрамиПоУмолчанию"); + Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСПропущеннымиПараметрами"); + Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСОшибочноПропущеннымиПараметрами"); + // "красные" тесты + Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСЛишнимиПараметрами"); Возврат Тесты; @@ -44,4 +48,43 @@ Если НЕ Результат3 = 0 Тогда ВызватьИсключение "Ошибка передачи параметра"; КонецЕсли; +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьВызовМетодовСПропущеннымиПараметрами() Экспорт + Сценарий = Новый ПараметрыПоУмолчанию; + + Результат = Сценарий.МетодЧисло(,2); + + юТест.ПроверитьРавенство(Результат, 1, "Ошибка передачи пропущенного параметра"); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьВызовМетодовСОшибочноПропущеннымиПараметрами() Экспорт + Сценарий = Новый ПараметрыПоУмолчанию; + + ОК = Ложь; + Ошибка = ""; + Попытка + Результат = Сценарий.МетодЧисло(1,); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + ОК = СтрНайти(Ошибка,"Пропущен") > 0; + КонецПопытки; + + юТест.ПроверитьИстину(ОК, "Не было исключения о пропущенном параметре."+Ошибка); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьВызовМетодовСЛишнимиПараметрами() // Экспорт // красный + Сценарий = Новый ПараметрыПоУмолчанию; + + ОК = Ложь; + Ошибка = ""; + Попытка + Результат = Сценарий.МетодЧисло(1,2,3); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + ОК = СтрНайти(Ошибка,"Слишком много") > 0; + КонецПопытки; + + юТест.ПроверитьИстину(ОК, "Не было исключения о лишнем параметре."+Ошибка); КонецПроцедуры \ No newline at end of file diff --git "a/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\320\276\320\243\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216.os" "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\320\276\320\243\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216.os" index 9d5ad47a1..b943f980f 100644 --- "a/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\320\276\320\243\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216.os" +++ "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\320\276\320\243\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216.os" @@ -26,4 +26,14 @@ Возврат 0; КонецЕсли; +КонецФункции + +Функция МетодЧисло(Параметр1 = -1, Параметр2 ) Экспорт + + Если Параметр1 = -1 Тогда + Возврат 1; + Иначе + Возврат 0 * Параметр2; + КонецЕсли; + КонецФункции \ No newline at end of file From 288411b55e55131db158ead5298d4ed30edd1135 Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Tue, 6 Jun 2023 17:16:41 +0300 Subject: [PATCH 037/126] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20native?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/native-lib/test-native-change-array.os | 30 ++++++ .../test-native-default-params-in-methods.os | 76 ++++++++++++++++ tests/native-lib/test-native-kolichestvo.os | 91 +++++++++++++++++++ .../native-lib/test-native-search-in-array.os | 40 ++++++++ .../test-native-use-default-params-bool.os | 31 +++++++ .../test-native-use-default-params-string.os | 25 +++++ ...est-native-use-default-params-undefinde.os | 29 ++++++ .../test-native-use-params-in-constructor.os | 23 +++++ ...20\272\321\202\320\276\321\200\320\265.os" | 7 ++ 9 files changed, 352 insertions(+) create mode 100644 tests/native-lib/test-native-change-array.os create mode 100644 tests/native-lib/test-native-default-params-in-methods.os create mode 100644 tests/native-lib/test-native-kolichestvo.os create mode 100644 tests/native-lib/test-native-search-in-array.os create mode 100644 tests/native-lib/test-native-use-default-params-bool.os create mode 100644 tests/native-lib/test-native-use-default-params-string.os create mode 100644 tests/native-lib/test-native-use-default-params-undefinde.os create mode 100644 tests/native-lib/test-native-use-params-in-constructor.os create mode 100644 "tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\241\320\242\320\265\320\272\321\201\321\202\320\276\320\274\320\222\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\265.os" diff --git a/tests/native-lib/test-native-change-array.os b/tests/native-lib/test-native-change-array.os new file mode 100644 index 000000000..9c9845f58 --- /dev/null +++ b/tests/native-lib/test-native-change-array.os @@ -0,0 +1,30 @@ +#native + +Перем юТест; + +Функция ПолучитьСписокТестов(Тестирование) Экспорт + + юТест = Тестирование; + + Тесты = Новый Массив; + Тесты.Добавить("ТестДолжен_ИзменениеМассиваПоСсылке"); + + Возврат Тесты; + +КонецФункции + +Процедура ТестДолжен_ИзменениеМассиваПоСсылке() Экспорт + + МойМассив = Новый Массив; + + ДобавитьВМассив(МойМассив); + + Значение = МойМассив[0]; + + юТест.ПроверитьРавенство(Значение, 1, "Массив изменен корректно"); + +КонецПроцедуры + +Процедура ДобавитьВМассив(Массив) + Массив.Добавить(1); +КонецПроцедуры diff --git a/tests/native-lib/test-native-default-params-in-methods.os b/tests/native-lib/test-native-default-params-in-methods.os new file mode 100644 index 000000000..530296f65 --- /dev/null +++ b/tests/native-lib/test-native-default-params-in-methods.os @@ -0,0 +1,76 @@ +#native + +Перем юТест; + +Функция ПолучитьСписокТестов(Тестирование) Экспорт + + юТест = Тестирование; + + Тесты = Новый Массив; + Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюСтрока"); + Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюБулево"); + Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюНеопределено"); + + Возврат Тесты; + +КонецФункции + +Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюСтрока() Экспорт + + Результат = МетодСтроки(,"Текст"); + + юТест.ПроверитьРавенство(Результат, "Т1 Текст", "Текст сформирован корректно"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюБулево() Экспорт + + Результат1 = МетодБулево(); + Результат2 = МетодБулево(Истина); + Результат3 = МетодБулево(Ложь); + Результат4 = МетодБулево(Неопределено); + + юТест.ПроверитьРавенство(Результат1, 1, "параметр передан корректно"); + юТест.ПроверитьРавенство(Результат2, 1, "параметр передан корректно"); + юТест.ПроверитьРавенство(Результат3, 0, "параметр передан корректно"); + юТест.ПроверитьРавенство(Результат4, 1, "параметр передан корректно"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюНеопределено() Экспорт + + Результат1 = МетодНеопределено(); + Результат2 = МетодНеопределено(Неопределено); + Результат3 = МетодНеопределено(Ложь); + + юТест.ПроверитьРавенство(Результат1, 1, "параметр передан корректно"); + юТест.ПроверитьРавенство(Результат2, 1, "параметр передан корректно"); + юТест.ПроверитьРавенство(Результат3, 0, "параметр передан корректно"); + +КонецПроцедуры + +Функция МетодСтроки(Текст1 = "Т1 ", Текст2 = "Т2 ") + Сообщить(Текст1); + Сообщить(Текст2); + Возврат Текст1 + Текст2; +КонецФункции + +Функция МетодБулево(Булево = Истина) + + Если Булево = Истина Или Булево Тогда + Возврат 1; + Иначе + Возврат 0; + КонецЕсли; + +КонецФункции + +Функция МетодНеопределено(Параметр = Неопределено) + + Если Параметр = Неопределено Тогда + Возврат 1; + Иначе + Возврат 0; + КонецЕсли; + +КонецФункции \ No newline at end of file diff --git a/tests/native-lib/test-native-kolichestvo.os b/tests/native-lib/test-native-kolichestvo.os new file mode 100644 index 000000000..2fa09ba8a --- /dev/null +++ b/tests/native-lib/test-native-kolichestvo.os @@ -0,0 +1,91 @@ +#native +#Использовать "." + +Перем юТест; + +Функция ПолучитьСписокТестов(Тестирование) Экспорт + + юТест = Тестирование; + + Тесты = Новый Массив; + Тесты.Добавить("ТестДолжен_ПроверитьКоличество_Массив"); + Тесты.Добавить("ТестДолжен_ПроверитьКоличество_Структура"); + Тесты.Добавить("ТестДолжен_ПроверитьКоличество_СписокЗначений"); + Тесты.Добавить("ТестДолжен_ПроверитьКоличество_Соответствие"); + Тесты.Добавить("ТестДолжен_ПроверитьКоличество_ТаблицаЗначений"); + + Возврат Тесты; + +КонецФункции + +Процедура ТестДолжен_ПроверитьКоличество_Массив() Экспорт + + // Дано + Коллекция = Новый Массив(); + + // Когда + Количество = Коллекция.Количество(); + + // Тогда + + юТест.ПроверитьРавенство(Количество, 0, "Количество получено"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьКоличество_Структура() Экспорт + + // Дано + Коллекция = Новый Структура(); + + // Когда + Количество = Коллекция.Количество(); + + // Тогда + + юТест.ПроверитьРавенство(Количество, 0, "Количество получено"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьКоличество_СписокЗначений() Экспорт + + // Дано + Коллекция = Новый СписокЗначений(); + + // Когда + Количество = Коллекция.Количество(); + + // Тогда + + юТест.ПроверитьРавенство(Количество, 0, "Количество получено"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьКоличество_Соответствие() Экспорт + + // Дано + Коллекция = Новый Соответствие(); + + // Когда + Количество = Коллекция.Количество(); + + // Тогда + + юТест.ПроверитьРавенство(Количество, 0, "Количество получено"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьКоличество_ТаблицаЗначений() Экспорт + + // Дано + Коллекция = Новый ТаблицаЗначений(); + + // Когда + Количество = Коллекция.Количество(); + КоличествоКолонок = Коллекция.Колонки.Количество(); + + // Тогда + + юТест.ПроверитьРавенство(Количество, 0, "Количество получено"); + юТест.ПроверитьРавенство(КоличествоКолонок, 0, "Количество получено"); + +КонецПроцедуры diff --git a/tests/native-lib/test-native-search-in-array.os b/tests/native-lib/test-native-search-in-array.os new file mode 100644 index 000000000..d3a2e1f33 --- /dev/null +++ b/tests/native-lib/test-native-search-in-array.os @@ -0,0 +1,40 @@ +#native + +Перем юТест; + +Функция ПолучитьСписокТестов(Тестирование) Экспорт + + юТест = Тестирование; + + Тесты = Новый Массив; + Тесты.Добавить("ТестДолжен_ПроверитьПоискВМассиве"); + + Возврат Тесты; + +КонецФункции + +Процедура ТестДолжен_ПроверитьПоискВМассиве() Экспорт + + Массив = Новый Массив(); + Массив.Добавить("1"); + Массив.Добавить("2"); + Массив.Добавить("3"); + + Если Массив.Найти("1") <> Неопределено Тогда + НашлиЗначение1 = Истина; + Иначе + НашлиЗначение1 = Ложь; + КонецЕсли; + + Если Массив.Найти("9") <> Неопределено Тогда + НашлиЗначение9 = Истина; + Иначе + НашлиЗначение9 = Ложь; + КонецЕсли; + + юТест.ПроверитьРавенство(НашлиЗначение1, Истина, "Нашли 1"); + юТест.ПроверитьРавенство(НашлиЗначение9, Ложь, "Не нашли 9"); + юТест.ПроверитьРавенство(Массив.Найти("2"), 1, "Индекс элемента по значению"); + +КонецПроцедуры + diff --git a/tests/native-lib/test-native-use-default-params-bool.os b/tests/native-lib/test-native-use-default-params-bool.os new file mode 100644 index 000000000..9edb29461 --- /dev/null +++ b/tests/native-lib/test-native-use-default-params-bool.os @@ -0,0 +1,31 @@ +#native +#Использовать "." + +Перем юТест; + +Функция ПолучитьСписокТестов(Тестирование) Экспорт + + юТест = Тестирование; + + Тесты = Новый Массив; + Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьБулево"); + + Возврат Тесты; + +КонецФункции + +Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьБулево() Экспорт + + Сценарий = Новый ПараметрыПоУмолчанию; + + Результат1 = Сценарий.МетодБулево(); + Результат2 = Сценарий.МетодБулево(Истина); + Результат3 = Сценарий.МетодБулево(Ложь); + Результат4 = Сценарий.МетодБулево(Неопределено); + + юТест.ПроверитьРавенство(Результат1, 1, "параметр передан корректно"); + юТест.ПроверитьРавенство(Результат2, 1, "параметр передан корректно"); + юТест.ПроверитьРавенство(Результат3, 0, "параметр передан корректно"); + юТест.ПроверитьРавенство(Результат4, 1, "параметр передан корректно"); + +КонецПроцедуры diff --git a/tests/native-lib/test-native-use-default-params-string.os b/tests/native-lib/test-native-use-default-params-string.os new file mode 100644 index 000000000..ae5102c99 --- /dev/null +++ b/tests/native-lib/test-native-use-default-params-string.os @@ -0,0 +1,25 @@ +#native +#Использовать "." + +Перем юТест; + +Функция ПолучитьСписокТестов(Тестирование) Экспорт + + юТест = Тестирование; + + Тесты = Новый Массив; + Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьСтрока"); + + Возврат Тесты; + +КонецФункции + +Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьСтрока() Экспорт + + Сценарий = Новый ПараметрыПоУмолчанию; + + Результат = Сценарий.МетодСтроки(,"Текст"); + + юТест.ПроверитьРавенство(Результат, "Т1 Текст", "Текст сформирован корректно"); + +КонецПроцедуры diff --git a/tests/native-lib/test-native-use-default-params-undefinde.os b/tests/native-lib/test-native-use-default-params-undefinde.os new file mode 100644 index 000000000..d0ce0e2aa --- /dev/null +++ b/tests/native-lib/test-native-use-default-params-undefinde.os @@ -0,0 +1,29 @@ +#native +#Использовать "." + +Перем юТест; + +Функция ПолучитьСписокТестов(Тестирование) Экспорт + + юТест = Тестирование; + + Тесты = Новый Массив; + Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьНеопределено"); + + Возврат Тесты; + +КонецФункции + +Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьНеопределено() Экспорт + + Сценарий = Новый ПараметрыПоУмолчанию; + + Результат1 = Сценарий.МетодНеопределено(); + Результат2 = Сценарий.МетодНеопределено(Неопределено); + Результат3 = Сценарий.МетодНеопределено(Ложь); + + юТест.ПроверитьРавенство(Результат1, 1, "параметр передан корректно"); + юТест.ПроверитьРавенство(Результат2, 1, "параметр передан корректно"); + юТест.ПроверитьРавенство(Результат3, 0, "параметр передан корректно"); + +КонецПроцедуры diff --git a/tests/native-lib/test-native-use-params-in-constructor.os b/tests/native-lib/test-native-use-params-in-constructor.os new file mode 100644 index 000000000..dce112f4f --- /dev/null +++ b/tests/native-lib/test-native-use-params-in-constructor.os @@ -0,0 +1,23 @@ +#native +#Использовать "." + +Перем юТест; + +Функция ПолучитьСписокТестов(Тестирование) Экспорт + + юТест = Тестирование; + + Тесты = Новый Массив; + Тесты.Добавить("ТестДолжен_ПроверитьПередачуЗначенияВКонструктор"); + + Возврат Тесты; + +КонецФункции + +Процедура ТестДолжен_ПроверитьПередачуЗначенияВКонструктор() Экспорт + + НужныйОбъект = Новый СценарийСТекстомВКонструкторе("1"); + + юТест.ПроверитьРавенство(НужныйОбъект.Поле1, "1", "параметр передан корректно"); + +КонецПроцедуры diff --git "a/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\241\320\242\320\265\320\272\321\201\321\202\320\276\320\274\320\222\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\265.os" "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\241\320\242\320\265\320\272\321\201\321\202\320\276\320\274\320\222\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\265.os" new file mode 100644 index 000000000..3aaddf5de --- /dev/null +++ "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\241\320\242\320\265\320\272\321\201\321\202\320\276\320\274\320\222\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\265.os" @@ -0,0 +1,7 @@ +#native + +Перем Поле1 Экспорт; + +Процедура ПриСозданииОбъекта(Параметр1) + Поле1 = Параметр1; +КонецПроцедуры \ No newline at end of file From 58c4e82fdde61a6624f35655f74a014db661070b Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Wed, 7 Jun 2023 13:06:18 +0400 Subject: [PATCH 038/126] =?UTF-8?q?fix=20#1301:=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=20=D1=82=D0=B8=D0=BF=D0=B0=20=D0=A2=D0=B8=D0=BF=20?= =?UTF-8?q?=D0=B2=20native?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Core/Values/BslTypeValue.cs | 5 ++++- src/OneScript.Native/Compiler/ExpressionHelpers.cs | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/OneScript.Core/Values/BslTypeValue.cs b/src/OneScript.Core/Values/BslTypeValue.cs index 2a1977633..979323cc5 100644 --- a/src/OneScript.Core/Values/BslTypeValue.cs +++ b/src/OneScript.Core/Values/BslTypeValue.cs @@ -6,6 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using OneScript.Types; +using System; namespace OneScript.Values { @@ -17,7 +18,9 @@ public BslTypeValue(TypeDescriptor type) { _type = type; } - + + public static BslTypeValue Create(TypeDescriptor value) => new BslTypeValue(value); + public override TypeDescriptor SystemType => BasicTypes.Type; public override string ToString() diff --git a/src/OneScript.Native/Compiler/ExpressionHelpers.cs b/src/OneScript.Native/Compiler/ExpressionHelpers.cs index 3083e0b0d..eb58cfa08 100644 --- a/src/OneScript.Native/Compiler/ExpressionHelpers.cs +++ b/src/OneScript.Native/Compiler/ExpressionHelpers.cs @@ -440,6 +440,10 @@ private static Type GetValueFactoryType(Type clrType) { factoryClass = typeof(BslDateValue); } + else if (clrType == typeof(TypeDescriptor)) + { + factoryClass = typeof(BslTypeValue); + } return factoryClass; } From f0cdf9ca6a995c57945d293eba0a92c1689d928a Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Wed, 7 Jun 2023 15:07:54 +0400 Subject: [PATCH 039/126] =?UTF-8?q?fix=20#1302:=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D1=8C=20=D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D0=BF=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20=D0=B2=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B9=20(v2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ScriptEngine/Compiler/CompilerErrors.cs | 5 ++- .../Compiler/StackMachineCodeGenerator.cs | 31 +++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/ScriptEngine/Compiler/CompilerErrors.cs b/src/ScriptEngine/Compiler/CompilerErrors.cs index 6f411444a..1f6ea3e2d 100644 --- a/src/ScriptEngine/Compiler/CompilerErrors.cs +++ b/src/ScriptEngine/Compiler/CompilerErrors.cs @@ -21,7 +21,10 @@ public static CodeError TooFewArgumentsPassed() => public static CodeError TooManyArgumentsPassed() => Create("Слишком много фактических параметров", "Too many actual parameters"); - + + public static CodeError MissedArgument() => + Create("Пропущен обязательный параметр", "Missed mandatory parameter"); + private static CodeError Create(string ru, string en, [CallerMemberName] string errorId = default) { return new CodeError diff --git a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs index 240285322..abd2fdbad 100644 --- a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs +++ b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs @@ -604,7 +604,7 @@ private void BuiltInFunctionCall(CallNode node) else { var parameters = BuiltinFunctions.ParametersInfo(funcId); - CheckFactArguments(parameters, node.ArgumentList); + FullCheckFactArguments(parameters, node.ArgumentList); } AddCommand(funcId, argsPassed); @@ -629,7 +629,34 @@ private void CheckFactArguments(BslMethodInfo method, BslSyntaxNode argList) { CheckFactArguments(method.GetParameters(), argList); } - + + private void FullCheckFactArguments(ParameterInfo[] parameters, BslSyntaxNode argList) + { + var argsPassed = argList.Children.Count; + if (argsPassed > parameters.Length) + { + AddError(CompilerErrors.TooManyArgumentsPassed(), argList.Location); + return; + } + + int i = 0; + for (; i < argsPassed; i++) + { + if (!parameters[i].HasDefaultValue && argList.Children[i].Children.Count == 0) + { + AddError(CompilerErrors.MissedArgument(), argList.Location); + } + } + for (; i < parameters.Length; i++) + { + if (!parameters[i].HasDefaultValue) + { + AddError(CompilerErrors.TooFewArgumentsPassed(), argList.Location); + return; + } + } + } + protected override void VisitGlobalProcedureCall(CallNode node) { if (LanguageDef.IsBuiltInFunction(node.Identifier.Lexem.Token)) From 8eb18c014bb154f76966164c4af545429d7a44ef Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 14 Jun 2023 22:22:18 +0300 Subject: [PATCH 040/126] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20*.so=20=D0=B4=D0=BB=D1=8F=20NativeAp?= =?UTF-8?q?i=20=D0=B2=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 26 ++++++++++++++++++++++++++ install/builders/nativeapi/Dockerfile | 15 +++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index d1e62f341..bea00cbfb 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -23,6 +23,7 @@ pipeline { docker login -p $dockerpassword -u $dockeruser docker push oscript/onescript-builder:deb docker push oscript/onescript-builder:rpm + docker push oscript/onescript-builder:gcc """.stripIndent() } } @@ -64,6 +65,22 @@ pipeline { } } } + + stage('Linux Build') { + agent { + docker { + image 'oscript/onescript-builder:gcc' + label 'linux' + } + } + + steps { + sh 'mkdir output' + sh 'cp -Rv /built/* ./output/' + stash includes: 'output/bin/*.so', name: 'nativeApiSo' + stash includes: 'output/tests/*.so', name: 'nativeApiTestsSo' + } + } } } stage('VSCode debugger Build') { @@ -125,6 +142,11 @@ pipeline { } unstash 'buildResults' + unstash 'nativeApiSo' + unstash 'nativeApiTestsSo' + + sh 'cp output/bin/*.so ../built/linux-x64/bin/' + sh 'cp output/tests/*.so ../tests/native-api/build64/AddInNativeLin64.so' sh '''\ if [ ! -d lintests ]; then @@ -154,6 +176,10 @@ pipeline { } unstash 'buildResults' + unstash 'nativeApiSo' + + bat 'copy output/bin/*64.so built/linux-64/' + script { if (env.BRANCH_NAME == "preview") { diff --git a/install/builders/nativeapi/Dockerfile b/install/builders/nativeapi/Dockerfile index e65d29dde..03d130f1c 100644 --- a/install/builders/nativeapi/Dockerfile +++ b/install/builders/nativeapi/Dockerfile @@ -14,9 +14,12 @@ RUN chmod +x build.sh && ./build.sh RUN cd / \ && mkdir built \ - && mkdir built/tmp \ - && mkdir built/tmp/bin \ - && mkdir built/tmp/tests \ - && cp /src/proxy/*.so built/tmp/bin \ - && cp /src/tests/*.so built/tmp/tests \ - && chmod -x built/tmp/bin/*.so \ No newline at end of file + && mkdir built/bin \ + && mkdir built/tests \ + && cp /src/proxy/*.so built/bin \ + && cp /src/tests/*.so built/tests \ + && chmod -x built/bin/*.so \ + && chmod -x built/tests/*.so + +# /output should be mounted on build, then +# cp -Rv /built/* /output/ \ No newline at end of file From 3935087dc95473dbd72559a2dd5e6a701e8aea92 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 14 Jun 2023 22:36:02 +0300 Subject: [PATCH 041/126] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B0=D1=83=D0=BD=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=20=D0=B2=20=D0=B0=D1=80=D1=85=D0=B8=D0=B2?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=BE=20=D0=9E=D0=A1=D1=8F=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Build_Core.csproj | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Build_Core.csproj b/Build_Core.csproj index 7af74eeba..49e2e8a62 100644 --- a/Build_Core.csproj +++ b/Build_Core.csproj @@ -83,6 +83,16 @@ + + + + + + + + + + @@ -109,6 +119,17 @@ + + + + + + + + + + + @@ -166,7 +187,6 @@ - From 4f29490e5e4476108325b6e34998cc5835ae9d31 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 14 Jun 2023 22:45:54 +0300 Subject: [PATCH 042/126] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=8D=D1=82=D0=B0=D0=BF=D0=BE=D0=B2=20=D1=81=D0=B1=D0=BE=D1=80?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index bea00cbfb..d90a7c0bd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -65,7 +65,10 @@ pipeline { } } } - + } + } + stage('Additional files') { + parallel { stage('Linux Build') { agent { docker { @@ -81,28 +84,27 @@ pipeline { stash includes: 'output/tests/*.so', name: 'nativeApiTestsSo' } } - } - } - stage('VSCode debugger Build') { - agent { - docker { - image 'node' - label 'linux' - } - } - - steps { - unstash 'buildResults' - sh 'npm install vsce' - script { - def vsceBin = pwd() + "/node_modules/.bin/vsce" - sh "cd built/vscode && ${vsceBin} package" - archiveArtifacts artifacts: 'built/vscode/*.vsix', fingerprint: true - stash includes: 'built/vscode/*.vsix', name: 'vsix' - } - } - } + stage('VSCode debugger Build') { + agent { + docker { + image 'node' + label 'linux' + } + } + steps { + unstash 'buildResults' + sh 'npm install vsce' + script { + def vsceBin = pwd() + "/node_modules/.bin/vsce" + sh "cd built/vscode && ${vsceBin} package" + archiveArtifacts artifacts: 'built/vscode/*.vsix', fingerprint: true + stash includes: 'built/vscode/*.vsix', name: 'vsix' + } + } + } + } + } stage('Testing'){ parallel{ stage('Windows testing') { From f88773a44f090aacf610e5d6be5ca53747ea8ca8 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 14 Jun 2023 22:51:30 +0300 Subject: [PATCH 043/126] =?UTF-8?q?=D0=9F=D0=BE-=D0=B4=D1=80=D1=83=D0=B3?= =?UTF-8?q?=D0=BE=D0=BC=D1=83=20=D1=80=D0=B0=D1=81=D0=BF=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8=D0=BB=20=D1=8D=D1=82=D0=B0=D0=BF=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 79 ++++++++++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index d90a7c0bd..46fd7fe6d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -10,25 +10,24 @@ pipeline { } stages { + stage('Prepare Linux Environment') { + agent{ label 'master'} + steps{ + dir('install'){ + sh 'chmod +x make-dockers.sh && ./make-dockers.sh' + } + withCredentials([usernamePassword(credentialsId: 'docker-hub', passwordVariable: 'dockerpassword', usernameVariable: 'dockeruser')]) { + sh """ + docker login -p $dockerpassword -u $dockeruser + docker push oscript/onescript-builder:deb + docker push oscript/onescript-builder:rpm + docker push oscript/onescript-builder:gcc + """.stripIndent() + } + } + } stage('Build'){ parallel { - stage('Prepare Linux Environment') { - agent{ label 'master'} - steps{ - dir('install'){ - sh 'chmod +x make-dockers.sh && ./make-dockers.sh' - } - withCredentials([usernamePassword(credentialsId: 'docker-hub', passwordVariable: 'dockerpassword', usernameVariable: 'dockeruser')]) { - sh """ - docker login -p $dockerpassword -u $dockeruser - docker push oscript/onescript-builder:deb - docker push oscript/onescript-builder:rpm - docker push oscript/onescript-builder:gcc - """.stripIndent() - } - } - } - stage('Windows Build') { agent { label 'windows' } @@ -65,10 +64,7 @@ pipeline { } } } - } - } - stage('Additional files') { - parallel { + stage('Linux Build') { agent { docker { @@ -84,27 +80,28 @@ pipeline { stash includes: 'output/tests/*.so', name: 'nativeApiTestsSo' } } - stage('VSCode debugger Build') { - agent { - docker { - image 'node' - label 'linux' - } - } + } + } + stage('VSCode debugger Build') { + agent { + docker { + image 'node' + label 'linux' + } + } + + steps { + unstash 'buildResults' + sh 'npm install vsce' + script { + def vsceBin = pwd() + "/node_modules/.bin/vsce" + sh "cd built/vscode && ${vsceBin} package" + archiveArtifacts artifacts: 'built/vscode/*.vsix', fingerprint: true + stash includes: 'built/vscode/*.vsix', name: 'vsix' + } + } + } - steps { - unstash 'buildResults' - sh 'npm install vsce' - script { - def vsceBin = pwd() + "/node_modules/.bin/vsce" - sh "cd built/vscode && ${vsceBin} package" - archiveArtifacts artifacts: 'built/vscode/*.vsix', fingerprint: true - stash includes: 'built/vscode/*.vsix', name: 'vsix' - } - } - } - } - } stage('Testing'){ parallel{ stage('Windows testing') { From 90d91cb3feb707f02b797fe411606aacbf7bd94e Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 14 Jun 2023 22:54:21 +0300 Subject: [PATCH 044/126] =?UTF-8?q?=D0=9D=D0=B5=D0=B2=D0=B5=D1=80=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=BF=D1=83=D1=82=D0=B8=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BA=D0=B5=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20=D0=BD=D0=B0=20=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D1=83=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 46fd7fe6d..16d433d2b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -144,8 +144,8 @@ pipeline { unstash 'nativeApiSo' unstash 'nativeApiTestsSo' - sh 'cp output/bin/*.so ../built/linux-x64/bin/' - sh 'cp output/tests/*.so ../tests/native-api/build64/AddInNativeLin64.so' + sh 'cp output/bin/*.so ./built/linux-x64/bin/' + sh 'cp output/tests/*.so ./tests/native-api/build64/AddInNativeLin64.so' sh '''\ if [ ! -d lintests ]; then From f4db00a9383da0adde8005a54a01d568559ddfc0 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 14 Jun 2023 23:04:50 +0300 Subject: [PATCH 045/126] =?UTF-8?q?=D0=92=D1=8B=D0=B4=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B1=D0=B8=D0=BB=D0=B4-=D1=81=D0=BA=D1=80?= =?UTF-8?q?=D0=B8=D0=BF=D1=82=D1=8B=20native-api=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BB=D0=B8=D0=BD=D1=83=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ScriptEngine.NativeApi/build.sh | 0 tests/native-api/build.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 src/ScriptEngine.NativeApi/build.sh mode change 100644 => 100755 tests/native-api/build.sh diff --git a/src/ScriptEngine.NativeApi/build.sh b/src/ScriptEngine.NativeApi/build.sh old mode 100644 new mode 100755 diff --git a/tests/native-api/build.sh b/tests/native-api/build.sh old mode 100644 new mode 100755 From ee3347a09e3f121ad765a49fd5f700695797b890 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 14 Jun 2023 23:16:14 +0300 Subject: [PATCH 046/126] =?UTF-8?q?=D0=A1=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=20=D0=BB=D0=B8=D0=BD=D1=83=D0=BA=D1=81=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D0=B5=D1=80-=D0=B0=D0=B3?= =?UTF-8?q?=D0=B5=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 24 +++++++++++++++++------- install/builders/nativeapi/Dockerfile | 22 +--------------------- src/1Script.sln | 1 + src/ScriptEngine.NativeApi/build.sh | 1 + tests/native-api/build.sh | 1 + 5 files changed, 21 insertions(+), 28 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 16d433d2b..49d889e9f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -74,10 +74,20 @@ pipeline { } steps { - sh 'mkdir output' - sh 'cp -Rv /built/* ./output/' - stash includes: 'output/bin/*.so', name: 'nativeApiSo' - stash includes: 'output/tests/*.so', name: 'nativeApiTestsSo' + sh 'mkdir -p built/tmp/na-proxy && mkdir -p built/tmp/na-tests' + dir('src/ScriptEngine.NativeApi') { + sh './build.sh' + sh 'cp *.so ../../built/tmp/na-proxy' + } + dir('tests/native-api') { + sh './build.sh' + sh 'cp *.so ../../built/tmp/na-tests' + } + dir('output') { + sh 'cp -Rv /built/tmp/* ./output/' + } + stash includes: 'output/na-proxy/*.so', name: 'nativeApiSo' + stash includes: 'output/na-tests/*.so', name: 'nativeApiTestsSo' } } } @@ -144,8 +154,8 @@ pipeline { unstash 'nativeApiSo' unstash 'nativeApiTestsSo' - sh 'cp output/bin/*.so ./built/linux-x64/bin/' - sh 'cp output/tests/*.so ./tests/native-api/build64/AddInNativeLin64.so' + sh 'cp output/na-proxy/*.so ./built/linux-x64/bin/' + sh 'cp output/na-tests/*.so ./tests/native-api/build64/AddInNativeLin64.so' sh '''\ if [ ! -d lintests ]; then @@ -177,7 +187,7 @@ pipeline { unstash 'buildResults' unstash 'nativeApiSo' - bat 'copy output/bin/*64.so built/linux-64/' + bat 'copy output/na-proxy/*64.so built/linux-64/' script { diff --git a/install/builders/nativeapi/Dockerfile b/install/builders/nativeapi/Dockerfile index 03d130f1c..c3df70df9 100644 --- a/install/builders/nativeapi/Dockerfile +++ b/install/builders/nativeapi/Dockerfile @@ -2,24 +2,4 @@ FROM ubuntu:18.04 RUN apt-get update -qq \ && dpkg --add-architecture i386 \ - && apt-get install -y -qq build-essential cmake uuid-dev libc6-dev gcc-multilib g++-multilib - -WORKDIR /src/proxy -COPY /src/ScriptEngine.NativeApi /src/proxy -RUN chmod +x build.sh && ./build.sh - -WORKDIR /src/tests -COPY /tests/native-api /src/tests -RUN chmod +x build.sh && ./build.sh - -RUN cd / \ - && mkdir built \ - && mkdir built/bin \ - && mkdir built/tests \ - && cp /src/proxy/*.so built/bin \ - && cp /src/tests/*.so built/tests \ - && chmod -x built/bin/*.so \ - && chmod -x built/tests/*.so - -# /output should be mounted on build, then -# cp -Rv /built/* /output/ \ No newline at end of file + && apt-get install -y -qq build-essential cmake uuid-dev libc6-dev gcc-multilib g++-multilib \ No newline at end of file diff --git a/src/1Script.sln b/src/1Script.sln index fc18d92e7..9da3cfeaf 100644 --- a/src/1Script.sln +++ b/src/1Script.sln @@ -20,6 +20,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\Build.csproj = ..\Build.csproj oscommon.targets = oscommon.targets ..\Build_Core.csproj = ..\Build_Core.csproj + ..\Jenkinsfile = ..\Jenkinsfile EndProjectSection EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Installer", "Installer\Installer.wixproj", "{BBE794A6-B159-422F-B655-B7F03F25F223}" diff --git a/src/ScriptEngine.NativeApi/build.sh b/src/ScriptEngine.NativeApi/build.sh index 4a911d356..a2aaacc80 100755 --- a/src/ScriptEngine.NativeApi/build.sh +++ b/src/ScriptEngine.NativeApi/build.sh @@ -11,5 +11,6 @@ cmake -E make_directory build64 cd build64 cmake -D CMAKE_BUILD_TYPE:STRING=Release -D TARGET_PLATFORM_32:BOOL=OFF --build .. cmake --build . +chmod +x *.so cp *.so .. cd .. diff --git a/tests/native-api/build.sh b/tests/native-api/build.sh index 4a911d356..a2aaacc80 100755 --- a/tests/native-api/build.sh +++ b/tests/native-api/build.sh @@ -11,5 +11,6 @@ cmake -E make_directory build64 cd build64 cmake -D CMAKE_BUILD_TYPE:STRING=Release -D TARGET_PLATFORM_32:BOOL=OFF --build .. cmake --build . +chmod +x *.so cp *.so .. cd .. From 826de6a5629b0426c7ba2d0479256707705131b5 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 14 Jun 2023 23:33:02 +0300 Subject: [PATCH 047/126] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=B5=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 49d889e9f..c4b8dbea5 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -84,7 +84,7 @@ pipeline { sh 'cp *.so ../../built/tmp/na-tests' } dir('output') { - sh 'cp -Rv /built/tmp/* ./output/' + sh 'cp -Rv ../built/tmp/* .' } stash includes: 'output/na-proxy/*.so', name: 'nativeApiSo' stash includes: 'output/na-tests/*.so', name: 'nativeApiTestsSo' @@ -155,7 +155,7 @@ pipeline { unstash 'nativeApiTestsSo' sh 'cp output/na-proxy/*.so ./built/linux-x64/bin/' - sh 'cp output/na-tests/*.so ./tests/native-api/build64/AddInNativeLin64.so' + sh 'cp output/na-tests/*.so ./tests/native-api/build64/' sh '''\ if [ ! -d lintests ]; then From b1f927f649ca68fc171bedb069e81045753c81ff Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 14 Jun 2023 23:49:01 +0300 Subject: [PATCH 048/126] oops I did it again --- Jenkinsfile | 98 ++++++++++++++++++++++++++--------------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index c4b8dbea5..42b1f0a8b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -10,22 +10,22 @@ pipeline { } stages { - stage('Prepare Linux Environment') { - agent{ label 'master'} - steps{ - dir('install'){ - sh 'chmod +x make-dockers.sh && ./make-dockers.sh' - } - withCredentials([usernamePassword(credentialsId: 'docker-hub', passwordVariable: 'dockerpassword', usernameVariable: 'dockeruser')]) { - sh """ - docker login -p $dockerpassword -u $dockeruser - docker push oscript/onescript-builder:deb - docker push oscript/onescript-builder:rpm - docker push oscript/onescript-builder:gcc - """.stripIndent() - } - } - } + stage('Prepare Linux Environment') { + agent{ label 'master'} + steps{ + dir('install'){ + sh 'chmod +x make-dockers.sh && ./make-dockers.sh' + } + withCredentials([usernamePassword(credentialsId: 'docker-hub', passwordVariable: 'dockerpassword', usernameVariable: 'dockeruser')]) { + sh """ + docker login -p $dockerpassword -u $dockeruser + docker push oscript/onescript-builder:deb + docker push oscript/onescript-builder:rpm + docker push oscript/onescript-builder:gcc + """.stripIndent() + } + } + } stage('Build'){ parallel { stage('Windows Build') { @@ -64,32 +64,32 @@ pipeline { } } } - - stage('Linux Build') { - agent { - docker { - image 'oscript/onescript-builder:gcc' - label 'linux' - } - } - - steps { - sh 'mkdir -p built/tmp/na-proxy && mkdir -p built/tmp/na-tests' - dir('src/ScriptEngine.NativeApi') { - sh './build.sh' - sh 'cp *.so ../../built/tmp/na-proxy' - } - dir('tests/native-api') { + + stage('Linux Build') { + agent { + docker { + image 'oscript/onescript-builder:gcc' + label 'linux' + } + } + + steps { + sh 'mkdir -p built/tmp/na-proxy && mkdir -p built/tmp/na-tests' + dir('src/ScriptEngine.NativeApi') { + sh './build.sh' + sh 'cp *.so ../../built/tmp/na-proxy' + } + dir('tests/native-api') { sh './build.sh' sh 'cp *.so ../../built/tmp/na-tests' } - dir('output') { - sh 'cp -Rv ../built/tmp/* .' - } - stash includes: 'output/na-proxy/*.so', name: 'nativeApiSo' - stash includes: 'output/na-tests/*.so', name: 'nativeApiTestsSo' - } - } + dir('output') { + sh 'cp -Rv ../built/tmp/* .' + } + stash includes: 'output/na-proxy/*.so', name: 'nativeApiSo' + stash includes: 'output/na-tests/*.so', name: 'nativeApiTestsSo' + } + } } } stage('VSCode debugger Build') { @@ -151,11 +151,11 @@ pipeline { } unstash 'buildResults' - unstash 'nativeApiSo' - unstash 'nativeApiTestsSo' - - sh 'cp output/na-proxy/*.so ./built/linux-x64/bin/' - sh 'cp output/na-tests/*.so ./tests/native-api/build64/' + unstash 'nativeApiSo' + unstash 'nativeApiTestsSo' + + sh 'cp output/na-proxy/*.so ./built/linux-x64/bin/' + sh 'mkdir -p tests/native-api/build64 && cp output/na-tests/*.so ./tests/native-api/build64/' sh '''\ if [ ! -d lintests ]; then @@ -185,10 +185,10 @@ pipeline { } unstash 'buildResults' - unstash 'nativeApiSo' - - bat 'copy output/na-proxy/*64.so built/linux-64/' - + unstash 'nativeApiSo' + + bat 'copy output/na-proxy/*64.so built/linux-64/' + script { if (env.BRANCH_NAME == "preview") { @@ -232,7 +232,7 @@ pipeline { } } - stage ('Publishing preview') { + stage ('Publishing preview') { when { anyOf { branch 'release/preview'; } From 9fa250c458136d8554d11242fb7f28fde8d756b9 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Thu, 15 Jun 2023 13:46:16 +0400 Subject: [PATCH 049/126] =?UTF-8?q?fix=20#1308:=20=D1=81=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D1=87=D0=B8=D1=81=D0=BB=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D1=85=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Compiler/BinaryOperationCompiler.cs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs b/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs index 439ec500a..1c7f56f90 100644 --- a/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs +++ b/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs @@ -35,11 +35,6 @@ public Expression Compile(BinaryOperationNode node, Expression left, Expression private Expression CompileStaticOperation(Expression left, Expression right) { - if (IsEqualityOperation(_opCode)) - { - return MakeStaticEqualityOperation(left, right); - } - if (left.Type.IsNumeric()) { return MakeNumericOperation(left, right); @@ -71,11 +66,6 @@ private Expression CompileStaticOperation(Expression left, Expression right) throw NativeCompilerException.OperationNotDefined(_opCode, left.Type, right.Type); } - private Expression MakeStaticEqualityOperation(Expression left, Expression right) - { - return Expression.MakeBinary(_opCode, left, right); - } - private Expression MakeNumericOperation(Expression left, Expression right) { Debug.Assert(left.Type.IsNumeric()); From 2af53e11061c5a0d2264a46838fb6191f4fdaeef Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 16 Jun 2023 09:31:12 +0300 Subject: [PATCH 050/126] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20#1309?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OneScript.Core.Tests/NativeCompilerTest.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs index ce6f77e47..c133248a5 100644 --- a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs +++ b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs @@ -404,6 +404,23 @@ public void EqualityOperators_With_BslValue_On_Right(TypeDescriptor type) statements[0].NodeType.Should().Be(ExpressionType.Assign); statements[1].NodeType.Should().Be(ExpressionType.Assign); } + + [Fact] + public void ClrIntegers_Can_Be_Used_As_Bsl_Numbers() + { + var block = new CompiledBlock(default); + block.CodeBlock = + @"Равенство = (Найти(""123"",""2"") = 0); + Неравенство = (КодСимвола(""А"") <> 0)"; + + var statements = block.MakeExpression() + .Body + .As() + .Expressions; + + statements[0].NodeType.Should().Be(ExpressionType.Assign); + statements[1].NodeType.Should().Be(ExpressionType.Assign); + } public static IEnumerable TypesForTestEqualityOperators() { From d56358983bc77d17b1c2c2022ada5a41c8ce1847 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 16 Jun 2023 09:38:59 +0300 Subject: [PATCH 051/126] =?UTF-8?q?=D0=95=D1=89=D0=B5=20=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D1=81=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?#1309?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Native/Compiler/BinaryOperationCompiler.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs b/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs index 1c7f56f90..8aa5e71b2 100644 --- a/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs +++ b/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs @@ -56,6 +56,11 @@ private Expression CompileStaticOperation(Expression left, Expression right) // для простоты сделаем через BslValue.CompareTo return MakeDynamicComparison(left, right); } + else if (IsEqualityOperation(_opCode)) + { + // для простоты сделаем через BslValue.Equals + return MakeDynamicEquality(left, right); + } } if (left.Type == typeof(bool)) From 8b8fe66b4975f50646e0d93542f71f9158ebd1a0 Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Fri, 16 Jun 2023 12:41:47 +0300 Subject: [PATCH 052/126] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BE=D1=87=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=20=D0=BD=D0=B0=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=20=D0=B1=D1=83=D0=BB=D0=B5=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/native-lib/test-native-default-params-in-methods.os | 2 -- tests/native-lib/test-native-use-default-params-bool.os | 2 -- 2 files changed, 4 deletions(-) diff --git a/tests/native-lib/test-native-default-params-in-methods.os b/tests/native-lib/test-native-default-params-in-methods.os index 530296f65..aafbc6153 100644 --- a/tests/native-lib/test-native-default-params-in-methods.os +++ b/tests/native-lib/test-native-default-params-in-methods.os @@ -28,12 +28,10 @@ Результат1 = МетодБулево(); Результат2 = МетодБулево(Истина); Результат3 = МетодБулево(Ложь); - Результат4 = МетодБулево(Неопределено); юТест.ПроверитьРавенство(Результат1, 1, "параметр передан корректно"); юТест.ПроверитьРавенство(Результат2, 1, "параметр передан корректно"); юТест.ПроверитьРавенство(Результат3, 0, "параметр передан корректно"); - юТест.ПроверитьРавенство(Результат4, 1, "параметр передан корректно"); КонецПроцедуры diff --git a/tests/native-lib/test-native-use-default-params-bool.os b/tests/native-lib/test-native-use-default-params-bool.os index 9edb29461..526a080de 100644 --- a/tests/native-lib/test-native-use-default-params-bool.os +++ b/tests/native-lib/test-native-use-default-params-bool.os @@ -21,11 +21,9 @@ Результат1 = Сценарий.МетодБулево(); Результат2 = Сценарий.МетодБулево(Истина); Результат3 = Сценарий.МетодБулево(Ложь); - Результат4 = Сценарий.МетодБулево(Неопределено); юТест.ПроверитьРавенство(Результат1, 1, "параметр передан корректно"); юТест.ПроверитьРавенство(Результат2, 1, "параметр передан корректно"); юТест.ПроверитьРавенство(Результат3, 0, "параметр передан корректно"); - юТест.ПроверитьРавенство(Результат4, 1, "параметр передан корректно"); КонецПроцедуры From 9b003fe6a5f973b58865d133d683532dda26eb8a Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 16 Jun 2023 13:03:10 +0300 Subject: [PATCH 053/126] =?UTF-8?q?=D0=9D=D0=B0=D0=B4=D0=BE=20=D0=B1=D1=8B?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D1=82=D1=83=D1=82=20=D0=B2=D1=81=D1=91...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Compiler/BinaryOperationCompiler.cs | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs b/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs index 8aa5e71b2..ad0d9a566 100644 --- a/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs +++ b/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs @@ -47,20 +47,7 @@ private Expression CompileStaticOperation(Expression left, Expression right) if (left.Type == typeof(string)) { - if (_opCode == ExpressionType.Add) - return StringAddition(left, right); - - // Для строк допустимо сравнение со строками на < > - if (IsComparisonOperation(_opCode)) - { - // для простоты сделаем через BslValue.CompareTo - return MakeDynamicComparison(left, right); - } - else if (IsEqualityOperation(_opCode)) - { - // для простоты сделаем через BslValue.Equals - return MakeDynamicEquality(left, right); - } + return MakeStringOperation(left, right); } if (left.Type == typeof(bool)) @@ -71,6 +58,30 @@ private Expression CompileStaticOperation(Expression left, Expression right) throw NativeCompilerException.OperationNotDefined(_opCode, left.Type, right.Type); } + private Expression MakeStringOperation(Expression left, Expression right) + { + if (_opCode == ExpressionType.Add) + { + return StringAddition(left, right); + } + + // Для строк допустимо сравнение со строками на < > + if (IsComparisonOperation(_opCode)) + { + // для простоты сделаем через BslValue.CompareTo + return MakeDynamicComparison(left, right); + } + + if (IsEqualityOperation(_opCode)) + { + return right.Type == typeof(string) ? + Expression.MakeBinary(_opCode, left, right) + : MakeDynamicEquality(left, right); + } + + throw NativeCompilerException.OperationNotDefined(_opCode, left.Type, right.Type); + } + private Expression MakeNumericOperation(Expression left, Expression right) { Debug.Assert(left.Type.IsNumeric()); From bed8329b6628a455b5ff5fccee5b92419dc49ee9 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Thu, 22 Jun 2023 14:44:06 +0400 Subject: [PATCH 054/126] =?UTF-8?q?=D0=BA=20#1289:=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B8=D0=B7=D0=B1=D1=8B=D1=82=D0=BE=D1=87=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D1=87=D0=B8=D1=81=D0=BB=D0=B0=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs | 3 +++ tests/native-lib/test-native-use.os | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs b/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs index 622cec3fa..9993a0cba 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs @@ -281,6 +281,9 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o } var parameters = GetMethodInfo(methIdx).GetParameters(); + if (args.Length > parameters.Length) + throw RuntimeException.TooManyArgumentsPassed(); + var valueArgs = new IValue[parameters.Length]; var passedArgs = args.Select(x => ContextValuesMarshaller.ConvertDynamicValue(x)).ToArray(); diff --git a/tests/native-lib/test-native-use.os b/tests/native-lib/test-native-use.os index 1078d7719..26e561fe4 100644 --- a/tests/native-lib/test-native-use.os +++ b/tests/native-lib/test-native-use.os @@ -13,7 +13,6 @@ Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСПараметрамиПоУмолчанию"); Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСПропущеннымиПараметрами"); Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСОшибочноПропущеннымиПараметрами"); - // "красные" тесты Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСЛишнимиПараметрами"); Возврат Тесты; @@ -74,7 +73,7 @@ КонецПроцедуры -Процедура ТестДолжен_ПроверитьВызовМетодовСЛишнимиПараметрами() // Экспорт // красный +Процедура ТестДолжен_ПроверитьВызовМетодовСЛишнимиПараметрами() Экспорт Сценарий = Новый ПараметрыПоУмолчанию; ОК = Ложь; From 6b5777bffbd2019608dfa67b5dd4fe4540a76a0d Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Thu, 22 Jun 2023 17:39:15 +0400 Subject: [PATCH 055/126] copypaste? --- src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs b/src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs index 9a95af6fe..931e5ce21 100644 --- a/src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs +++ b/src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs @@ -75,7 +75,7 @@ public EnumerationValue GetValue(Encoding encoding) public static TextEncodingEnum CreateInstance(ITypeManager typeManager) { - var instance = EnumContextHelper.CreateClrEnumInstance( + var instance = EnumContextHelper.CreateClrEnumInstance( typeManager, (t, v) => new TextEncodingEnum(t, v)); From c741c95d030035c2052f007ed4424b728186e2a4 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Sun, 25 Jun 2023 13:07:13 +0300 Subject: [PATCH 056/126] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D1=87=D0=B8=D0=BD=D0=B8=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=201testrunner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Build_Core.csproj | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Build_Core.csproj b/Build_Core.csproj index 49e2e8a62..f889c371d 100644 --- a/Build_Core.csproj +++ b/Build_Core.csproj @@ -274,7 +274,13 @@ - + + + From fa98259b0c63070afeee42b6bde084e481287ee8 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Sun, 25 Jun 2023 13:41:31 +0300 Subject: [PATCH 057/126] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B5=20DOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 42b1f0a8b..79e124f9d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -187,7 +187,7 @@ pipeline { unstash 'buildResults' unstash 'nativeApiSo' - bat 'copy output/na-proxy/*64.so built/linux-64/' + bat 'copy output\\na-proxy\\*64.so built\\linux-64\\' script { From 5d4cc911f9f863608cab9688057be63ae99988f7 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Sun, 25 Jun 2023 13:57:41 +0300 Subject: [PATCH 058/126] =?UTF-8?q?=D0=95=D1=89=D0=B5=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B8=20=D0=B2=20=D0=BF=D1=83=D1=82=D1=8F=D1=85=20?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=D1=85=20DOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 79e124f9d..a87b8bcf3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -187,7 +187,7 @@ pipeline { unstash 'buildResults' unstash 'nativeApiSo' - bat 'copy output\\na-proxy\\*64.so built\\linux-64\\' + bat 'xcopy output\\na-proxy\\*64.so built\\linux-64\\bin\\' script { From fb0a373ba6dfa3330bf4de68136adafebabce19b Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Sun, 25 Jun 2023 20:30:24 +0300 Subject: [PATCH 059/126] =?UTF-8?q?=D0=9E=D1=82=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3-?= =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20native=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE=D0=BB=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8E.=20closes=20#1295?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NativeRuntimeAnnotationHandler.cs | 4 +++- .../Extensions/EngineBuilderExtensions.cs | 4 +--- .../HostedScriptEngine.cs | 21 ++++------------ .../Compiler/CompilerBackendSelector.cs | 15 ++++++++++++ src/ScriptEngine/Compiler/CompilerFrontend.cs | 2 +- src/ScriptEngine/OneScriptCoreOptions.cs | 24 +++++++++++++------ src/ScriptEngine/ScriptingEngine.cs | 11 ++------- 7 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs b/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs index f8a654e4a..6ff0b9183 100644 --- a/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs +++ b/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs @@ -27,10 +27,12 @@ public NativeRuntimeAnnotationHandler(IErrorSink errorSink) : base(errorSink) } public static string NativeDirectiveName => "native"; + public static string StackRuntimeDirectiveName => "stack"; protected override bool DirectiveSupported(string directive) { - return string.Equals(directive, NativeDirectiveName, StringComparison.CurrentCultureIgnoreCase); + return string.Equals(directive, NativeDirectiveName, StringComparison.CurrentCultureIgnoreCase) || + string.Equals(directive, StackRuntimeDirectiveName, StringComparison.CurrentCultureIgnoreCase); } protected override void ParseAnnotationInternal(ref Lexem lastExtractedLexem, ILexer lexer, ParserContext parserContext) diff --git a/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs b/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs index 636d298ae..05d2d1146 100644 --- a/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs +++ b/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs @@ -76,9 +76,7 @@ public static IEngineBuilder UseFileSystemLibraries(this IEngineBuilder b) { b.Services.RegisterSingleton(sp => { - var config = sp.Resolve(); - - var libOptions = new OneScriptLibraryOptions(config); + var libOptions = sp.Resolve(); var searchDirs = new List(); var sysDir = libOptions.SystemLibraryDir; diff --git a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs index 8e1422b22..23aaa81da 100644 --- a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs +++ b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs @@ -26,7 +26,7 @@ public class HostedScriptEngine : IDisposable private readonly RuntimeEnvironment _env; private bool _isInitialized; - private readonly Lazy _workingConfig; + private readonly OneScriptLibraryOptions _workingConfig; private CodeStatProcessor _codeStat; @@ -35,7 +35,7 @@ public HostedScriptEngine(ScriptingEngine engine) _engine = engine; _env = _engine.Environment; _engine.AttachAssembly(typeof(HostedScriptEngine).Assembly); - _workingConfig = new Lazy(InitWorkingConfig); + _workingConfig = _engine.Services.Resolve(); SetGlobalContexts(engine.GlobalsManager); } @@ -55,19 +55,6 @@ private void SetGlobalContexts(IGlobalsManager manager) _env.InjectGlobalProperty(bgTasksManager, "ФоновыеЗадания", "BackgroundJobs", true); } - private OneScriptLibraryOptions GetWorkingConfig() - { - return _workingConfig.Value; - } - - private OneScriptLibraryOptions InitWorkingConfig() - { - var cfgAccessor = _engine.GlobalsManager.GetInstance(); - cfgAccessor.Refresh(); - - return new OneScriptLibraryOptions(cfgAccessor.GetConfig()); - } - public void Initialize() { if (!_isInitialized) @@ -77,7 +64,7 @@ public void Initialize() } // System language - var systemLanguageCfg = GetWorkingConfig().SystemLanguage; + var systemLanguageCfg = _workingConfig.SystemLanguage; Locale.SystemLanguageISOName = systemLanguageCfg ?? System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName; } @@ -130,7 +117,7 @@ public Process CreateProcess(IHostApplication host, SourceCode src) private void DefineConstants(ICompilerFrontend compilerSvc) { - var definitions = GetWorkingConfig().PreprocessorDefinitions; + var definitions = _workingConfig.PreprocessorDefinitions; foreach (var val in definitions) { compilerSvc.PreprocessorDefinitions.Add(val); diff --git a/src/ScriptEngine/Compiler/CompilerBackendSelector.cs b/src/ScriptEngine/Compiler/CompilerBackendSelector.cs index 7ea0d6e5c..edaf320ff 100644 --- a/src/ScriptEngine/Compiler/CompilerBackendSelector.cs +++ b/src/ScriptEngine/Compiler/CompilerBackendSelector.cs @@ -17,6 +17,12 @@ namespace ScriptEngine.Compiler public class CompilerBackendSelector : BslSyntaxWalker { private bool _isNative; + private bool _isNativeDefault; + + public CompilerBackendSelector(OneScriptCoreOptions options) + { + _isNativeDefault = options.UseNativeAsDefaultRuntime; + } public Func StackBackendInitializer { get; set; } @@ -40,6 +46,15 @@ protected override void VisitModuleAnnotation(AnnotationNode node) { _isNative = true; } + else if (string.Equals(node.Name, NativeRuntimeAnnotationHandler.StackRuntimeDirectiveName, + StringComparison.CurrentCultureIgnoreCase)) + { + _isNative = false; + } + else + { + _isNative = _isNativeDefault; + } } protected override void VisitModule(ModuleNode node) diff --git a/src/ScriptEngine/Compiler/CompilerFrontend.cs b/src/ScriptEngine/Compiler/CompilerFrontend.cs index 95f70658e..1c6fe1db8 100644 --- a/src/ScriptEngine/Compiler/CompilerFrontend.cs +++ b/src/ScriptEngine/Compiler/CompilerFrontend.cs @@ -28,7 +28,7 @@ public CompilerFrontend( IDependencyResolver dependencyResolver) : base(handlers, errorSink, services) { _dependencyResolver = dependencyResolver; - _backendSelector = new CompilerBackendSelector(); + _backendSelector = services.Resolve(); _backendSelector.NativeBackendInitializer = NativeInitializer; _backendSelector.StackBackendInitializer = StackInitializer; diff --git a/src/ScriptEngine/OneScriptCoreOptions.cs b/src/ScriptEngine/OneScriptCoreOptions.cs index d615bfe8c..222ef74a2 100644 --- a/src/ScriptEngine/OneScriptCoreOptions.cs +++ b/src/ScriptEngine/OneScriptCoreOptions.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Text; using OneScript.Commons; +using OneScript.Native.Compiler; using ScriptEngine.Hosting; namespace ScriptEngine @@ -18,22 +19,30 @@ public class OneScriptCoreOptions private const string FILE_READER_ENCODING = "encoding.script"; private const string SYSTEM_LANGUAGE_KEY = "SystemLanguage"; private const string PREPROCESSOR_DEFINITIONS_KEY = "preprocessor.define"; + private const string DEFAULT_RUNTIME_KEY = "runtime.default"; public OneScriptCoreOptions(KeyValueConfig config) { SystemLanguage = config[SYSTEM_LANGUAGE_KEY]; FileReaderEncoding = SetupEncoding(config[FILE_READER_ENCODING]); PreprocessorDefinitions = SetupDefinitions(config[PREPROCESSOR_DEFINITIONS_KEY]); + UseNativeAsDefaultRuntime = SetupDefaultRuntime(config[DEFAULT_RUNTIME_KEY]); } + public string SystemLanguage { get; } + + public Encoding FileReaderEncoding { get; } + + public bool UseNativeAsDefaultRuntime { get; } + public IEnumerable PreprocessorDefinitions { get; set; } - private IEnumerable SetupDefinitions(string s) + private static IEnumerable SetupDefinitions(string s) { - return s?.Split(',') ?? new string[0]; + return s?.Split(',') ?? Array.Empty(); } - private Encoding SetupEncoding(string openerEncoding) + private static Encoding SetupEncoding(string openerEncoding) { if (string.IsNullOrWhiteSpace(openerEncoding)) return Encoding.UTF8; @@ -43,9 +52,10 @@ private Encoding SetupEncoding(string openerEncoding) else return Encoding.GetEncoding(openerEncoding); } - - public string SystemLanguage { get; set; } - - public Encoding FileReaderEncoding { get; set; } + + private static bool SetupDefaultRuntime(string runtimeId) + { + return runtimeId == NativeRuntimeAnnotationHandler.NativeDirectiveName; + } } } \ No newline at end of file diff --git a/src/ScriptEngine/ScriptingEngine.cs b/src/ScriptEngine/ScriptingEngine.cs index 6dddaf100..cfc95835f 100644 --- a/src/ScriptEngine/ScriptingEngine.cs +++ b/src/ScriptEngine/ScriptingEngine.cs @@ -27,7 +27,7 @@ public class ScriptingEngine : IDisposable public ScriptingEngine(ITypeManager types, IGlobalsManager globals, RuntimeEnvironment env, - ConfigurationProviders configurationProviders, + OneScriptCoreOptions options, IServiceContainer services) { TypeManager = types; @@ -40,18 +40,11 @@ public ScriptingEngine(ITypeManager types, Services = services; ContextDiscoverer = new ContextDiscoverer(types, globals, services); DebugController = services.TryResolve(); - ApplyConfiguration(configurationProviders.CreateConfig()); + Loader.ReaderEncoding = options.FileReaderEncoding; } public IServiceContainer Services { get; } - private void ApplyConfiguration(KeyValueConfig config) - { - var options = new OneScriptCoreOptions(config); - - Loader.ReaderEncoding = options.FileReaderEncoding; - } - private ContextDiscoverer ContextDiscoverer { get; } public RuntimeEnvironment Environment { get; set; } From 1f551b3499660cd7f7ff740b3769d4b548200b85 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Fri, 21 Jul 2023 14:17:39 +0400 Subject: [PATCH 060/126] =?UTF-8?q?fix=20#1313=20v2:=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=20=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BD=D0=B0=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=B5/=D0=BC=D0=B5=D0=BD=D1=8C=D1=88=D0=B5=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D1=87=D0=B8=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=B8=20=D0=B4=D1=80=D1=83=D0=B3=D0=B8?= =?UTF-8?q?=D1=85=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2=20+?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Machine/Contexts/ContextIValueImpl.cs | 16 +------- .../Machine/Contexts/EnumerationValue.cs | 18 +-------- tests/engine-behaviors.os | 38 +++++++++++++++++++ 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs b/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs index 9993a0cba..de506b794 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs @@ -81,21 +81,7 @@ private bool TryDetermineOwnType() public override int CompareTo(IValue other) { - if (other.SystemType.Equals(this.SystemType)) - { - if (this.Equals(other)) - { - return 0; - } - else - { - throw RuntimeException.ComparisonNotSupportedException(); - } - } - else - { - return this.SystemType.ToString().CompareTo(other.SystemType.ToString()); - } + throw RuntimeException.ComparisonNotSupportedException(); } #endregion diff --git a/src/ScriptEngine/Machine/Contexts/EnumerationValue.cs b/src/ScriptEngine/Machine/Contexts/EnumerationValue.cs index 855adf8db..c126e57a6 100644 --- a/src/ScriptEngine/Machine/Contexts/EnumerationValue.cs +++ b/src/ScriptEngine/Machine/Contexts/EnumerationValue.cs @@ -49,23 +49,7 @@ public override IValue GetRawValue() public override int CompareTo(BslValue other) { - if (other != null) - { - if (other is EnumerationValue) - { - int thisIdx = _owner.IndexOf(this); - int otherIdx = _owner.IndexOf((EnumerationValue)other); - return thisIdx - otherIdx; - } - else - { - throw RuntimeException.ComparisonNotSupportedException(); - } - } - else - { - return 1; - } + throw RuntimeException.ComparisonNotSupportedException(); } public override bool Equals(BslValue other) diff --git a/tests/engine-behaviors.os b/tests/engine-behaviors.os index e2a2b1f45..76be78e21 100644 --- a/tests/engine-behaviors.os +++ b/tests/engine-behaviors.os @@ -50,6 +50,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьПрерываниеВложенныхПопыток"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПродолжениеВложенныхПопыток"); ВсеТесты.Добавить("ТестДолжен_ПроверитьИнформацияОбОшибкеВнеИсключения"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьСравнениеНаБольшеМеньше"); Возврат ВсеТесты; @@ -627,4 +628,41 @@ юТест.ПроверитьРавенство("", ИнформацияОбОшибке.ПодробноеОписаниеОшибки()); юТест.ПроверитьРавенство(Неопределено, ИнформацияОбОшибке.Параметры); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьСравнениеНаБольшеМеньше() Экспорт + + Ошибка = "Сравнение на больше/меньше для данного типа не поддерживается"; + + юТест.ПроверитьКодСОшибкой( + "Рез = (СтатусСообщения.БезСтатуса <= СтатусСообщения.БезСтатуса);", + Ошибка, "Для одинаковых значений перечислений" ); + + юТест.ПроверитьКодСОшибкой( + "Рез = (ЦветКонсоли.Черный < СтатусСообщения.БезСтатуса);", + Ошибка, "Для значений перечислений разных типов" ); + + юТест.ПроверитьКодСОшибкой( + "Рез = (КодировкаТекста >= КодировкаТекста);", + Ошибка, "Для одинаковых перечислений" ); + юТест.ПроверитьКодСОшибкой( + "Рез = (ХешФункция > СтатусСообщения);", + Ошибка, "Для перечислений разных типов" ); + + юТест.ПроверитьКодСОшибкой( + "Рез = (ТипЗнч(истина) > ТипЗнч(0));", + Ошибка, "Для значений типа 'Тип'" ); + + юТест.ПроверитьКодСОшибкой( + "Массив = Новый Массив(1); + |Структура = Новый Структура; + |Рез = (Массив > Структура);", + Ошибка, "Для объектов разных типов" ); + + юТест.ПроверитьКодСОшибкой( + "Массив = Новый Массив(1); + |Массив2 = Новый Массив(1);; + |Рез = (Массив <= Массив2);", + Ошибка, "Для одинаковых объектов" ); + КонецПроцедуры \ No newline at end of file From bcf703eb43d7417c5c52d1ef4c8b9cd0d4540a59 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Fri, 21 Jul 2023 15:35:37 +0400 Subject: [PATCH 061/126] =?UTF-8?q?fix=20#1303=20v2=20VM:=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D0=B0=20=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BF=D0=BE=20=D1=81=D1=81=D1=8B?= =?UTF-8?q?=D0=BB=D0=BA=D0=B5=20+=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ScriptEngine/Machine/MachineInstance.cs | 4 ++- tests/engine-behaviors.os | 27 ++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index fc29b947d..dec64bd21 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -1192,7 +1192,9 @@ private void PrepareContextCallArguments(int arg, out IRuntimeContextInstance co if (!argValue.IsSkippedArgument()) { if (methodParams[i].IsByRef()) - argValues[i] = argValue; + { + argValues[i] = argValue is IVariable? argValue : Variable.Create(argValue, ""); + } else argValues[i] = argValue.GetRawValue(); } diff --git a/tests/engine-behaviors.os b/tests/engine-behaviors.os index e2a2b1f45..c7b8fcd6e 100644 --- a/tests/engine-behaviors.os +++ b/tests/engine-behaviors.os @@ -50,6 +50,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьПрерываниеВложенныхПопыток"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПродолжениеВложенныхПопыток"); ВсеТесты.Добавить("ТестДолжен_ПроверитьИнформацияОбОшибкеВнеИсключения"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПередачуПараметровПоСсылке"); Возврат ВсеТесты; @@ -627,4 +628,28 @@ юТест.ПроверитьРавенство("", ИнформацияОбОшибке.ПодробноеОписаниеОшибки()); юТест.ПроверитьРавенство(Неопределено, ИнформацияОбОшибке.Параметры); -КонецПроцедуры \ No newline at end of file +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПередачуПараметровПоСсылке() Экспорт + + Структура = Новый Структура("Поле", 1); + + Т = 0; + Рез = Структура.Свойство("Поле", Т); + юТест.ПроверитьРавенство(1, Т, "Для переменной"); + + Массив = Новый Массив(1); + Рез = Структура.Свойство("Поле", Массив[0]); + юТест.ПроверитьРавенство(1, Массив[0], "Для элемента массива"); + + Структура2 = Новый Структура("Поле", 2); + Рез = Структура.Свойство("Поле", Структура2.Поле); + юТест.ПроверитьРавенство(1, Структура2.Поле, "Для поля структуры"); + + Рез = Структура.Свойство("Поле", 3); // не должно упасть + юТест.ПроверитьРавенство(истина, Рез); + + Рез = Структура.Свойство("Поле", ТекущаяДата()); // не должно упасть + юТест.ПроверитьРавенство(истина, Рез); + +КонецПроцедуры From 17cb478f39e1789076ed12a607d4651e63a815e7 Mon Sep 17 00:00:00 2001 From: Dmitriy Korolev Date: Mon, 24 Jul 2023 17:52:03 +0700 Subject: [PATCH 062/126] =?UTF-8?q?#1318=20fix:=20=D0=98=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20UTF-8=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B5?= =?UTF-8?q?=20=D0=B4=D0=B5=D0=B1=D0=B0=D0=B3=D0=B3=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.DebugProtocol/DebuggerSettings.cs | 6 ++++++ src/VSCode.DebugAdapter/DebugeeProcess.cs | 3 +++ src/oscript/DebugBehavior.cs | 3 +++ 3 files changed, 12 insertions(+) diff --git a/src/OneScript.DebugProtocol/DebuggerSettings.cs b/src/OneScript.DebugProtocol/DebuggerSettings.cs index c89fe6025..fd3297aa5 100644 --- a/src/OneScript.DebugProtocol/DebuggerSettings.cs +++ b/src/OneScript.DebugProtocol/DebuggerSettings.cs @@ -4,11 +4,17 @@ This Source Code Form is subject to the terms of the was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ + +using System.Text; + namespace OneScript.DebugProtocol { public static class DebuggerSettings { public const int MAX_BUFFER_SIZE = 5000000; + public const int MAX_PRESENTATION_LENGTH = (int)(MAX_BUFFER_SIZE / 2.5); + + public static readonly Encoding DebugModeEncoding = Encoding.UTF8; } } \ No newline at end of file diff --git a/src/VSCode.DebugAdapter/DebugeeProcess.cs b/src/VSCode.DebugAdapter/DebugeeProcess.cs index 2a7e31bb6..19c8d16a0 100644 --- a/src/VSCode.DebugAdapter/DebugeeProcess.cs +++ b/src/VSCode.DebugAdapter/DebugeeProcess.cs @@ -46,6 +46,9 @@ public void Start() psi.RedirectStandardError = true; psi.RedirectStandardOutput = true; + psi.StandardErrorEncoding = DebuggerSettings.DebugModeEncoding; + psi.StandardOutputEncoding = DebuggerSettings.DebugModeEncoding; + _process.EnableRaisingEvents = true; _process.OutputDataReceived += Process_OutputDataReceived; _process.ErrorDataReceived += Process_ErrorDataReceived; diff --git a/src/oscript/DebugBehavior.cs b/src/oscript/DebugBehavior.cs index dfd84dbd9..b76664f0f 100644 --- a/src/oscript/DebugBehavior.cs +++ b/src/oscript/DebugBehavior.cs @@ -5,6 +5,7 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ using System; +using OneScript.DebugProtocol; using OneScript.DebugServices; namespace oscript @@ -20,6 +21,8 @@ public DebugBehavior(int port, string path, string[] args) : base(path, args) public override int Execute() { + Output.ConsoleOutputEncoding = DebuggerSettings.DebugModeEncoding; + var tcpDebugServer = new BinaryTcpDebugServer(_port); DebugController = tcpDebugServer.CreateDebugController(); From 238eef58c2b759ef11f92b4313c0f222f46d8023 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 24 Jul 2023 13:50:51 +0300 Subject: [PATCH 063/126] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=80=D1=8F=D0=B4=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BE=D0=BA=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=B2=20=D0=BD=D0=B0=D1=82=D0=B8=D0=B2?= =?UTF-8?q?=D0=BD=D0=BE=D0=BC=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Core/TypeUtils.cs | 3 + .../Compiler/ExpressionHelpers.cs | 27 +++++- .../Compiler/MethodCompiler.cs | 9 +- .../Compiler/NativeCompilerErrors.cs | 29 ++++++ .../Runtime/DynamicOperations.cs | 19 ++-- .../CompilerTestBase.cs | 34 +++++++ .../Compiler_Api_Tests.cs | 29 ++---- tests/engine-behaviors.os | 90 ++++++++++--------- 8 files changed, 166 insertions(+), 74 deletions(-) create mode 100644 src/OneScript.Native/Compiler/NativeCompilerErrors.cs create mode 100644 src/Tests/OneScript.Dynamic.Tests/CompilerTestBase.cs diff --git a/src/OneScript.Core/TypeUtils.cs b/src/OneScript.Core/TypeUtils.cs index bf3f2ef11..1cb9bda5f 100644 --- a/src/OneScript.Core/TypeUtils.cs +++ b/src/OneScript.Core/TypeUtils.cs @@ -6,6 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using OneScript.Contexts; using OneScript.Values; namespace OneScript @@ -35,6 +36,8 @@ public static bool IsNumeric(this Type type) public static bool IsValue(this Type type) => typeof(BslValue).IsAssignableFrom(type); + public static bool IsContext(this Type type) => typeof(IRuntimeContextInstance).IsAssignableFrom(type); + public static bool IsObjectValue(this Type type) => typeof(BslObjectValue).IsAssignableFrom(type); } } \ No newline at end of file diff --git a/src/OneScript.Native/Compiler/ExpressionHelpers.cs b/src/OneScript.Native/Compiler/ExpressionHelpers.cs index eb58cfa08..633e11144 100644 --- a/src/OneScript.Native/Compiler/ExpressionHelpers.cs +++ b/src/OneScript.Native/Compiler/ExpressionHelpers.cs @@ -33,6 +33,9 @@ public static Expression DowncastDecimal(Expression decimalValue, Type targetTyp public static Expression CastToDecimal(Expression value) { + if (value.Type == typeof(decimal)) + return value; + return Expression.Convert(value, typeof(decimal)); } @@ -105,6 +108,11 @@ public static Expression ToBoolean(Expression right) if (right.Type.IsValue()) return ConvertBslValueToPrimitiveType(right, typeof(bool)); + + if (right.Type.IsNumeric()) + { + return Expression.NotEqual(right, Expression.Default(right.Type)); + } return Expression.Convert(right, typeof(bool)); } @@ -631,7 +639,7 @@ public static Expression InvokeBslNativeMethod(BslNativeMethodInfo nativeMethod, PackArgsToArgsArray(args)); } - private static Expression PackArgsToArgsArray(List args) + private static Expression PackArgsToArgsArray(IEnumerable args) { return Expression.NewArrayInit(typeof(BslValue), args.Select(ConvertToBslValue)); } @@ -684,5 +692,22 @@ private static bool IsModuleVariable(Expression counterVar) return memberExpr.Expression.Type == typeof(IVariable) && memberExpr.Member.Name == nameof(IVariable.BslValue); } + + public static Expression CallContextMethod(Expression target, string name, IEnumerable arguments) + { + var methodInfo = OperationsCache.GetOrAdd( + typeof(DynamicOperations), + nameof(DynamicOperations.CallContextMethod) + ); + + var argExpressions = new List + { + target, + Expression.Constant(name), + PackArgsToArgsArray(arguments) + }; + + return Expression.Call(methodInfo, argExpressions); + } } } diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index 9c7ab55ce..5ff812802 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -196,6 +196,7 @@ protected override void VisitStatement(BslSyntaxNode statement) } catch (Exception e) { + RestoreNestingLevel(nestingLevel); if (e is NativeCompilerException ce) { @@ -1121,7 +1122,7 @@ protected override void VisitObjectProcedureCall(BslSyntaxNode node) } else { - AddError(new BilingualString($"Тип {targetType} не является объектным типом.",$"Type {targetType} is not an object type."), node.Location); + AddError(NativeCompilerErrors.TypeIsNotAnObjectType(targetType), node.Location); } } @@ -1153,6 +1154,10 @@ protected override void VisitObjectFunctionCall(BslSyntaxNode node) var args = PrepareCallArguments(call.ArgumentList, methodInfo.GetParameters()); _statementBuildParts.Push(Expression.Call(target, methodInfo, args)); } + else if (targetType.IsContext()) + { + _statementBuildParts.Push(ExpressionHelpers.CallContextMethod(target, name, PrepareDynamicCallArguments(call.ArgumentList))); + } else if (targetType.IsValue() || target is DynamicExpression) { var args = new List(); @@ -1175,7 +1180,7 @@ protected override void VisitObjectFunctionCall(BslSyntaxNode node) } else { - AddError(new BilingualString($"Тип {targetType} не является объектным типом.",$"Type {targetType} is not an object type."), node.Location); + AddError(NativeCompilerErrors.TypeIsNotAnObjectType(targetType), node.Location); } } diff --git a/src/OneScript.Native/Compiler/NativeCompilerErrors.cs b/src/OneScript.Native/Compiler/NativeCompilerErrors.cs new file mode 100644 index 000000000..5f484a2ca --- /dev/null +++ b/src/OneScript.Native/Compiler/NativeCompilerErrors.cs @@ -0,0 +1,29 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.Runtime.CompilerServices; +using OneScript.Language; +using OneScript.Localization; + +namespace OneScript.Native.Compiler +{ + public class NativeCompilerErrors + { + public static CodeError TypeIsNotAnObjectType(Type targetType) => + Create($"Тип {targetType} не является объектным типом.",$"Type {targetType} is not an object type."); + + private static CodeError Create(string ru, string en, [CallerMemberName] string errorId = default) + { + return new CodeError + { + ErrorId = errorId, + Description = BilingualString.Localize(ru, en) + }; + } + } +} \ No newline at end of file diff --git a/src/OneScript.Native/Runtime/DynamicOperations.cs b/src/OneScript.Native/Runtime/DynamicOperations.cs index f4bbc1bd9..09ee83c5f 100644 --- a/src/OneScript.Native/Runtime/DynamicOperations.cs +++ b/src/OneScript.Native/Runtime/DynamicOperations.cs @@ -173,17 +173,17 @@ public static ExceptionInfoClass GetExceptionInfo(Exception e) return new ExceptionInfoClass(wrapper); } - public static TypeDescriptor GetTypeByName(ITypeManager manager, string name) + public static BslTypeValue GetTypeByName(ITypeManager manager, string name) { - var firstTry = manager.GetTypeByName(name); + var foundType = manager.GetTypeByName(name); // костыль подмены типа для Тип("ИнформацияОбОшибке") - if (firstTry.Name == ExceptionInfoClass.LanguageType.Name) + if (foundType.Name == ExceptionInfoClass.LanguageType.Name) { - return ExceptionInfoClass.LanguageType; + foundType = ExceptionInfoClass.LanguageType; } - return firstTry; + return new BslTypeValue(foundType); } public static BslValue GetIndexedValue(object target, BslValue index) @@ -206,7 +206,7 @@ public static void SetIndexedValue(object target, BslValue index, BslValue value context.SetIndexedValue(index, value); } - public static BslValue GetPropertyValue(BslValue target, string propertyName) + public static BslValue GetPropertyValue(object target, string propertyName) { if (!(target is IRuntimeContextInstance context)) throw BslExceptions.ValueIsNotObjectException(); @@ -214,5 +214,12 @@ public static BslValue GetPropertyValue(BslValue target, string propertyName) var propIndex = context.GetPropertyNumber(propertyName); return (BslValue)context.GetPropValue(propIndex); } + + public static BslValue CallContextMethod(IRuntimeContextInstance instance, string methodName, BslValue[] arguments) + { + var idx = instance.GetMethodNumber(methodName); + instance.CallAsFunction(idx, arguments, out var result); + return (BslValue)result; + } } } \ No newline at end of file diff --git a/src/Tests/OneScript.Dynamic.Tests/CompilerTestBase.cs b/src/Tests/OneScript.Dynamic.Tests/CompilerTestBase.cs new file mode 100644 index 000000000..c7e1b6392 --- /dev/null +++ b/src/Tests/OneScript.Dynamic.Tests/CompilerTestBase.cs @@ -0,0 +1,34 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System.Collections.Generic; +using OneScript.Compilation.Binding; +using OneScript.Language; +using OneScript.Native.Compiler; + +namespace OneScript.Dynamic.Tests; + +public class CompilerTestBase +{ + protected DynamicModule CreateModule(string code) + { + var helper = new CompileHelper(); + helper.ParseModule(code); + var result = helper.Compile(new SymbolTable()); + helper.ThrowOnErrors(); + return result; + } + + protected DynamicModule CreateModule(string code, List errors) + { + var helper = new CompileHelper(); + helper.ParseModule(code); + var result = helper.Compile(new SymbolTable()); + errors.AddRange(helper.Errors); + return result; + } +} \ No newline at end of file diff --git a/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs b/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs index 67e536df7..35e85f0df 100644 --- a/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs +++ b/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs @@ -15,7 +15,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.Dynamic.Tests { - public class Compiler_Api_Tests + public class Compiler_Api_Tests : CompilerTestBase { [Fact] public void CanCompile_Empty_Module() @@ -184,28 +184,15 @@ Процедура Тест() errors.Should().HaveCount(1); errors[0].ErrorId.Should().Be(nameof(LocalizedErrors.UseProcAsFunction)); } - - private DynamicModule CreateModule(string code) - { - var helper = new CompileHelper(); - helper.ParseModule(code); - return helper.Compile(new SymbolTable()); - } - private DynamicModule CreateModule(string code, List errors) - { - var helper = new CompileHelper(); - helper.ParseModule(code); - var result = helper.Compile(new SymbolTable()); - errors.AddRange(helper.Errors); - return result; - } - - private DynamicModule CreateModule(string code, SymbolTable scopes) + [Fact] + public void Test_Conversion_To_Boolean_For_Decimals_In_BooleanExpressions() { - var helper = new CompileHelper(); - helper.ParseBatch(code); - return helper.Compile(scopes); + var code = @" + Номер = 0; + Операнд = 2=2 И Номер+1;"; + + CreateModule(code); } } } \ No newline at end of file diff --git a/tests/engine-behaviors.os b/tests/engine-behaviors.os index 06c1d00c5..6980bf1a1 100644 --- a/tests/engine-behaviors.os +++ b/tests/engine-behaviors.os @@ -462,50 +462,52 @@ КонецФункции -Процедура ТестДолжен_ПроверитьПропускПараметров() Экспорт - - П = ПропущенныеПараметры1(,); - юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); - - - П = ПропущенныеПараметры1(,,); - юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); - - - П = ПропущенныеПараметры1(, 2); - юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П2, 2, "Параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); - - - П = ПропущенныеПараметры1(3,); - юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); - - - П = ПропущенныеПараметры1(3,,); - юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); - - - П = ПропущенныеПараметры1(,,"4"); - юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П3, "4", "Параметр со значением по-умолчанию"); - - - П = ПропущенныеПараметры1(, 2, "6"); - юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П2, 2, "Параметр без значения по-умолчанию"); - юТест.ПроверитьРавенство(П.П3, "6", "Параметр со значением по-умолчанию"); - -КонецПроцедуры +// отключим пока, т.к. идет обсуждение этого поведения +// см https://github.com/EvilBeaver/OneScript/pull/1306 +//Процедура ТестДолжен_ПроверитьПропускПараметров() Экспорт +// +// П = ПропущенныеПараметры1(,);F +// юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); +// +// +// П = ПропущенныеПараметры1(,,); +// юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); +// +// +// П = ПропущенныеПараметры1(, 2); +// юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П2, 2, "Параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); +// +// +// П = ПропущенныеПараметры1(3,); +// юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); +// +// +// П = ПропущенныеПараметры1(3,,); +// юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); +// +// +// П = ПропущенныеПараметры1(,,"4"); +// юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П3, "4", "Параметр со значением по-умолчанию"); +// +// +// П = ПропущенныеПараметры1(, 2, "6"); +// юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П2, 2, "Параметр без значения по-умолчанию"); +// юТест.ПроверитьРавенство(П.П3, "6", "Параметр со значением по-умолчанию"); +// +//КонецПроцедуры Процедура ТестДолжен_ПроверитьФинальнуюЗапятуюВОбъявленииМетода() Экспорт From be418f9649f4719a59b9e71c190cf4a667004ebd Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 24 Jul 2023 14:23:08 +0300 Subject: [PATCH 064/126] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NativeCompilerTest.cs | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs index c133248a5..30cb1bb17 100644 --- a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs +++ b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs @@ -1055,7 +1055,7 @@ public void LazyBoolAnd() { var tm = new DefaultTypeManager(); var objectType = tm.RegisterClass(typeof(StructureImpl)); - var block = GetCompiler(new DefaultTypeManager()); + var block = GetCompiler(tm); block.Parameters.Insert("Ф", new BslTypeValue(objectType)); block.CodeBlock = "Возврат Ложь И Ф;"; // Ф не должен быть вычислен @@ -1066,5 +1066,37 @@ public void LazyBoolAnd() ((bool)(BslBooleanValue)func.DynamicInvoke(new object[] { testData })).Should().Be(false); } + + [Fact] + public void TypeFuncValue_Is_BslTypeValue() + { + var tm = new DefaultTypeManager(); + var objectType = tm.RegisterClass(typeof(StructureImpl)); + var block = GetCompiler(tm); + block.CodeBlock = "Возврат Тип(\"Структура\");"; + + var lambda = block.MakeExpression(); + var func = lambda.Compile(); + + var testType = new BslTypeValue(objectType); + var result = func.DynamicInvoke(); + + result.Should().BeOfType().And.Be(testType); + } + + [Fact] + public void TypeOfFuncValue_Is_BslTypeValue() + { + var block = GetCompiler(new DefaultTypeManager()); + block.CodeBlock = "Возврат ТипЗнч(42);"; + + var lambda = block.MakeExpression(); + var func = lambda.Compile(); + + var testType = new BslTypeValue(BasicTypes.Number); + var result = func.DynamicInvoke(); + + result.Should().BeOfType().And.Be(testType); + } } } \ No newline at end of file From e6b4b29420a2b858490bb57ee25cca25945ddf4f Mon Sep 17 00:00:00 2001 From: Dmitriy Korolev Date: Mon, 24 Jul 2023 21:18:38 +0700 Subject: [PATCH 065/126] =?UTF-8?q?#1235=20feat:=20=D0=9F=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D0=BD=D1=8B=D0=B5=20=D1=81=D0=B2=D0=BE=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B0=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9=20/=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contexts/UserScriptContextInstance.cs | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs b/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs index e61dd271b..aa970cede 100644 --- a/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs +++ b/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs @@ -302,17 +302,25 @@ protected override string ConvertToString() void IDebugPresentationAcceptor.Accept(IDebugValueVisitor visitor) { - var thisId = GetPropertyNumber(THISOBJ_RU); - var total = GetPropCount(); - var props = new List(total); - for (int i = 0; i < total; i++) - { - if (i != thisId) - { - props.Add(Variable.Create(GetPropValue(i), GetPropName(i))); - } - } - + var instanceProps = Module + .Properties + .OfType() + .OrderBy(x => x.DispatchId) + .ToDictionary(x => x.Name, x => x.DispatchId); + + var instanceFields = Module + .Fields + .OfType() + .OrderBy(x => x.DispatchId) + .Where(x => !instanceProps.ContainsKey(x.Name)) + .ToDictionary(x => $"${x.Name}", x => x.DispatchId); + + var props = instanceProps + .Concat(instanceFields) + .Select(x => + Variable.Create(GetPropValue(x.Value), x.Key)) + .ToList(); + visitor.ShowCustom(props); } } From c8a5486ad30a5a73b1253a9dc785af6a9074f09b Mon Sep 17 00:00:00 2001 From: Dmitriy Korolev Date: Mon, 24 Jul 2023 22:25:56 +0700 Subject: [PATCH 066/126] =?UTF-8?q?#1299=20feat:=20=D0=9F=D0=B0=D1=80?= =?UTF-8?q?=D1=81=D0=B5=D1=80=20=D0=B0=D1=80=D0=B3=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Processes/ArgumentsParser.cs | 92 +++++++++++++++++++ .../Processes/ProcessContext.cs | 13 ++- .../ArgumentParserTests.cs | 24 +++++ 3 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs create mode 100644 src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs diff --git a/src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs b/src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs new file mode 100644 index 000000000..effdca348 --- /dev/null +++ b/src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OneScript.StandardLibrary.Processes +{ + public class ArgumentsParser + { + private readonly string _input; + private readonly List _quotes; + private readonly List _arguments; + private readonly StringBuilder _currentArgument; + + private char _currentQuote; + private bool _isInQuotes; + + public ArgumentsParser(string input) + { + _input = input; + _currentArgument = new StringBuilder(); + _arguments = new List(); + _quotes = new List { '\'', '"' }; + } + + public string[] GetArguments() + { + if (string.IsNullOrWhiteSpace(_input)) + { + return Array.Empty(); + } + + if (_arguments.Count > 0) + { + return _arguments.ToArray(); + } + + _currentArgument.Clear(); + + foreach (var currentChar in _input) + { + if (char.IsWhiteSpace(currentChar) && !_isInQuotes) + { + PushArgument(); + } + else if (_quotes.Contains(currentChar)) + { + HandleQuotes(currentChar); + } + else + { + PushChar(currentChar); + } + } + + PushArgument(); + + return _arguments.ToArray(); + } + + private void HandleQuotes(char quoteChar) + { + if (!_isInQuotes) + { + _isInQuotes = true; + _currentQuote = quoteChar; + } + else if (quoteChar == _currentQuote) + { + _isInQuotes = false; + _currentQuote = default; + } + + PushChar(quoteChar); + } + + private void PushChar(char ch) + { + _currentArgument.Append(ch); + } + + private void PushArgument() + { + if (_currentArgument.Length == 0) + { + return; + } + + _arguments.Add(_currentArgument.ToString()); + _currentArgument.Clear(); + } + } +} \ No newline at end of file diff --git a/src/OneScript.StandardLibrary/Processes/ProcessContext.cs b/src/OneScript.StandardLibrary/Processes/ProcessContext.cs index 2d3a0b364..7961307e4 100644 --- a/src/OneScript.StandardLibrary/Processes/ProcessContext.cs +++ b/src/OneScript.StandardLibrary/Processes/ProcessContext.cs @@ -272,12 +272,21 @@ public static ProcessStartInfo PrepareProcessStartupInfo(string cmdLine, string int argsPosition; sInfo.UseShellExecute = true; sInfo.FileName = ExtractExecutableName(cmdLine, out argsPosition); - sInfo.Arguments = argsPosition >= cmdLine.Length ? "" : cmdLine.Substring(argsPosition); if (currentDir != null) sInfo.WorkingDirectory = currentDir; + + var arguments = argsPosition >= cmdLine.Length + ? Array.Empty() + : new ArgumentsParser(cmdLine[argsPosition..]).GetArguments(); + + foreach (var argument in arguments) + { + sInfo.ArgumentList.Add(argument); + } + return sInfo; } - + private static string ExtractExecutableName(string cmdLine, out int argsPosition) { bool inQuotes = false; diff --git a/src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs b/src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs new file mode 100644 index 000000000..1db6cc11d --- /dev/null +++ b/src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs @@ -0,0 +1,24 @@ +using FluentAssertions; +using OneScript.StandardLibrary.Processes; +using Xunit; + +namespace OneScript.Core.Tests; + +public class ArgumentParserTests +{ + [Theory] + [InlineData("-c 'oscript -version'", "-c", "'oscript -version'")] + [InlineData("-c oscript -version", "-c", "oscript", "-version")] + [InlineData("-c '\"oscript\" -version'", "-c", "'\"oscript\" -version'")] + [InlineData("-c \"'oscript' -version\"", "-c", "\"'oscript' -version\"")] + [InlineData(" ")] + [InlineData("'aaa\"", "'aaa\"")] + public void Should_Parse_Arguments(string input, params string[] expected) + { + var parser = new ArgumentsParser(input); + + var actual = parser.GetArguments(); + + actual.Should().Equal(expected); + } +} \ No newline at end of file From dbe167654c491e62aa1cafe1fed46d5282aaab49 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 24 Jul 2023 22:26:51 +0300 Subject: [PATCH 067/126] =?UTF-8?q?=D0=9D=D0=B5=D0=B2=D0=B5=D1=80=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B2=D0=BE=20=D0=B2=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=9D=D0=B0=D0=B9=D1=82=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Native/Runtime/BuiltInFunctions.cs | 2 +- tests/engine-behaviors.os | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OneScript.Native/Runtime/BuiltInFunctions.cs b/src/OneScript.Native/Runtime/BuiltInFunctions.cs index 3f5283b7b..62f9a0306 100644 --- a/src/OneScript.Native/Runtime/BuiltInFunctions.cs +++ b/src/OneScript.Native/Runtime/BuiltInFunctions.cs @@ -90,7 +90,7 @@ public static string Mid(string str, int start, int len = -1) } [ContextMethod("Найти", "Find")] - public static int StrPos(string needle, string haystack) + public static int StrPos(string haystack, string needle) { var result = haystack.IndexOf(needle, StringComparison.Ordinal) + 1; return result; diff --git a/tests/engine-behaviors.os b/tests/engine-behaviors.os index 6980bf1a1..f97183364 100644 --- a/tests/engine-behaviors.os +++ b/tests/engine-behaviors.os @@ -243,7 +243,7 @@ Попытка ПроброситьИсключение(); Исключение - юТест.ПроверитьИстину(ПустаяСтрока(ИнформацияОбОшибке().Описание), "Текст исключения должен быть пустым"); + юТест.ПроверитьРавенство("", ИнформацияОбОшибке().Описание, "Текст исключения должен быть пустым"); КонецПопытки; КонецПроцедуры From d1c2e94156cf6b3ef63e9d6f790832f97643510a Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 24 Jul 2023 22:46:31 +0300 Subject: [PATCH 068/126] =?UTF-8?q?=D0=92=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=B0=D0=BF=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=84=D1=80=D0=B0=D1=81=D1=82=D1=80=D1=83=D0=BA?= =?UTF-8?q?=D1=82=D1=83=D1=80=D1=8B=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Compilation/Binding/SymbolTable.cs | 1 - .../Compilation/ICompilerBackend.cs | 1 - .../BslCoreException.cs | 2 +- .../{Commons => Exceptions}/BslExceptions.cs | 2 +- .../DependencyResolveException.cs | 2 +- .../PropertyAccessException.cs | 2 +- .../RuntimeException.cs | 2 +- .../TypeConversionException.cs | 2 +- src/OneScript.Core/Values/BslBooleanValue.cs | 2 +- src/OneScript.Core/Values/BslDateValue.cs | 2 +- src/OneScript.Core/Values/BslNumericValue.cs | 2 +- src/OneScript.Core/Values/BslObjectValue.cs | 2 +- .../Values/BslPrimitiveValue.cs | 2 +- src/OneScript.Core/Values/BslTypeValue.cs | 1 - src/OneScript.Core/Values/BslValue.cs | 2 +- .../Values/PropertyValueReference.cs | 2 +- .../TcpServer/BinaryChannel.cs | 1 - .../Compiler/BinaryOperationCompiler.cs | 2 - .../Compiler/MethodCompiler.cs | 1 + .../Compiler/ModuleCompiler.cs | 2 +- .../Compiler/NativeCompilerException.cs | 2 +- .../ServiceRegistrationExtensions.cs | 1 - .../Runtime/BslNativeMethodInfo.cs | 3 +- .../Runtime/BuiltInFunctions.cs | 1 + .../Runtime/DynamicOperations.cs | 2 +- .../Binary/BinaryDataBuffer.cs | 1 + .../Binary/BinaryDataContext.cs | 2 +- .../Binary/DataReader.cs | 1 + .../Binary/DataWriter.cs | 1 + .../Binary/GenericStreamImpl.cs | 2 +- .../Binary/GlobalBinaryData.cs | 2 +- .../Collections/ArrayImpl.cs | 2 +- .../Collections/FixedArrayImpl.cs | 2 +- .../Collections/FixedMapImpl.cs | 2 +- .../Collections/FixedStructureImpl.cs | 2 +- .../Collections/MapImpl.cs | 2 +- .../Collections/StructureImpl.cs | 1 + .../Collections/ValueList/ValueListImpl.cs | 2 +- .../Collections/ValueTable/ValueTable.cs | 2 +- .../ValueTable/ValueTableColumn.cs | 2 +- .../ValueTable/ValueTableColumnCollection.cs | 1 + .../Collections/ValueTree/ValueTreeColumn.cs | 2 +- .../ValueTree/ValueTreeColumnCollection.cs | 2 +- .../Collections/ValueTree/ValueTreeRow.cs | 2 +- .../ValueTree/ValueTreeRowCollection.cs | 2 +- .../DynamicLoadingFunctions.cs | 1 + .../GlobalBitFunctions.cs | 2 +- src/OneScript.StandardLibrary/GuidWrapper.cs | 1 + .../Hash/HashImpl.cs | 2 +- .../Http/HttpConnectionContext.cs | 2 +- .../Http/HttpRequestContext.cs | 2 +- .../Http/InternetProxyContext.cs | 2 +- .../Json/GlobalJsonFunctions.cs | 1 + .../Json/JSONDataExtractor.cs | 1071 ++++++++--------- .../Json/JSONReader.cs | 1 + .../Json/JSONWriter.cs | 2 +- .../Native/CompiledBlock.cs | 1 + .../NativeApi/NativeApiComponent.cs | 2 +- .../NativeApi/NativeApiLibrary.cs | 2 +- .../NativeApi/NativeApiPackage.cs | 2 +- .../NativeApi/NativeApiValue.cs | 2 +- .../Processes/ProcessContext.cs | 2 +- .../RandomNumberGenerator.cs | 2 +- src/OneScript.StandardLibrary/Reflector.cs | 2 +- .../StandardGlobalContext.cs | 2 +- .../StringOperations.cs | 1 + .../SystemEnvironmentContext.cs | 1 + .../Tasks/BackgroundTask.cs | 1 + .../Tasks/BackgroundTasksManager.cs | 1 + .../Text/ConsoleContext.cs | 2 +- .../Text/TextDocumentContext.cs | 1 + .../Text/TextEncodingEnum.cs | 2 +- .../Text/TextReadImpl.cs | 1 + .../Text/TextWriteImpl.cs | 2 +- .../Timezones/GlobalTimezoneFunctions.cs | 2 +- .../TypeDescriptions/BooleanTypeAdjuster.cs | 2 +- .../TypeDescriptions/NumberQualifiers.cs | 1 + .../TypeDescriptions/TypeDescription.cs | 2 +- .../XDTO/XDTOSerializer.cs | 2 +- .../XMLSchema/Collections/XMLSchemaSet.cs | 2 +- .../XMLSchema/Collections/XSComponentList.cs | 2 +- .../Collections/XSNamedComponentMap.cs | 2 +- .../XMLSchema/Objects/XMLSchema.cs | 2 +- .../XMLSchema/Objects/XMLSchemaSerializer.cs | 2 +- .../XMLSchema/Objects/XSAnnotation.cs | 2 +- .../Objects/XSComplexTypeDefinition.cs | 2 +- .../XMLSchema/Objects/XSEnumerationFacet.cs | 2 +- .../Objects/XSFractionDigitsFacet.cs | 2 +- .../Objects/XSIdentityConstraintDefinition.cs | 2 +- .../XMLSchema/Objects/XSLengthFacet.cs | 2 +- .../XMLSchema/Objects/XSMaxExclusiveFacet.cs | 2 +- .../XMLSchema/Objects/XSMaxInclusiveFacet.cs | 2 +- .../XMLSchema/Objects/XSMaxLengthFacet.cs | 2 +- .../XMLSchema/Objects/XSMinExclusiveFacet.cs | 2 +- .../XMLSchema/Objects/XSMinInclusiveFacet.cs | 2 +- .../XMLSchema/Objects/XSMinLengthFacet.cs | 2 +- .../XMLSchema/Objects/XSModelGroup.cs | 2 +- .../Objects/XSModelGroupDefinition.cs | 2 +- .../XMLSchema/Objects/XSParticle.cs | 2 +- .../XMLSchema/Objects/XSPatternFacet.cs | 2 +- .../Objects/XSSimpleTypeDefinition.cs | 2 +- .../XMLSchema/Objects/XSTotalDigitsFacet.cs | 2 +- .../XMLSchema/Objects/XSWhitespaceFacet.cs | 2 +- .../XMLSchema/Objects/XSWildcard.cs | 2 +- .../Xml/XSLTransform.cs | 436 ++++--- .../Xml/XmlGlobalFunctions.cs | 2 +- .../Xml/XmlReaderImpl.cs | 2 +- .../Xml/XmlSpaceEnum.cs | 3 - .../Xml/XmlWriterImpl.cs | 2 +- .../Zip/ZipReader.cs | 2 +- .../Zip/ZipWriter.cs | 2 +- .../DefaultEventProcessor.cs | 2 +- .../FileSystemDependencyResolver.cs | 2 +- .../LibraryLoader.cs | 1 + .../SystemGlobalContext.cs | 2 - .../TemplateStorage.cs | 2 +- .../Compiler/StackMachineCodeGenerator.cs | 2 +- .../Hosting/EngineBuilderExtensions.cs | 1 - src/ScriptEngine/ICompilerService.cs | 1 - .../Machine/ComReflectionNameToIdMapper.cs | 1 + .../Contexts/AttachedScriptsFactory.cs | 1 + .../Machine/Contexts/AutoContext.cs | 2 +- .../Contexts/AutoScriptDrivenObject.cs | 3 +- .../Machine/Contexts/COMWrapperContext.cs | 1 + .../Machine/Contexts/ContextIValueImpl.cs | 640 +++++----- .../Machine/Contexts/ContextMethodMapper.cs | 2 +- .../Machine/Contexts/ContextPropertyMapper.cs | 376 +++--- .../Contexts/ContextValuesMarshaller.cs | 1 + .../Contexts/DynamicPropertiesAccessor.cs | 2 +- .../Contexts/DynamicPropertiesHolder.cs | 1 + .../Machine/Contexts/EnumerationValue.cs | 2 +- .../Contexts/ManagedCOMWrapperContext.cs | 2 +- .../Contexts/PropertyNameIndexAccessor.cs | 2 +- .../Machine/Contexts/ScriptDrivenObject.cs | 2 +- .../Contexts/ThisAwareScriptedObjectBase.cs | 1 - .../Contexts/UnmanagedCOMWrapperContext.cs | 6 +- .../Contexts/UserScriptContextInstance.cs | 1 + .../Machine/DefaultTypeManager.cs | 1 + src/ScriptEngine/Machine/MachineInstance.cs | 1 + .../Machine/ParametrizedRuntimeException.cs | 2 +- .../Machine/RciHelperExtensions.cs | 2 +- src/ScriptEngine/Machine/RuntimeExceptions.cs | 139 +-- src/ScriptEngine/Machine/TypeFactory.cs | 2 +- .../Machine/ValueAdoptionExtensions.cs | 2 +- src/ScriptEngine/Machine/ValueFactory.cs | 2 +- src/ScriptEngine/ScriptingEngine.cs | 1 - src/TestApp/Controls/ProcedureListWnd.xaml.cs | 7 - .../NativeCompilerTest.cs | 1 - .../ObsoleteMethodAttributeTest.cs | 2 +- .../TestUserScriptProperties.cs | 1 - src/Tests/OneScript.Core.Tests/ValuesTest.cs | 1 + .../Compiler_Api_Tests.cs | 2 - .../DynamicOperationsTest.cs | 2 +- src/VSCode.DebugAdapter/Program.cs | 2 - src/oscript/CgiBehavior.cs | 2 +- src/oscript/ShowUsageBehavior.cs | 74 +- src/oscript/ShowVersionBehavior.cs | 36 +- 157 files changed, 1518 insertions(+), 1526 deletions(-) rename src/OneScript.Core/{Commons => Exceptions}/BslCoreException.cs (95%) rename src/OneScript.Core/{Commons => Exceptions}/BslExceptions.cs (98%) rename src/OneScript.Core/{Commons => Exceptions}/DependencyResolveException.cs (94%) rename src/OneScript.Core/{Commons => Exceptions}/PropertyAccessException.cs (98%) rename src/OneScript.Core/{Commons => Exceptions}/RuntimeException.cs (99%) rename src/OneScript.Core/{Commons => Exceptions}/TypeConversionException.cs (94%) diff --git a/src/OneScript.Core/Compilation/Binding/SymbolTable.cs b/src/OneScript.Core/Compilation/Binding/SymbolTable.cs index 4c6c8aac1..7c5ae829c 100644 --- a/src/OneScript.Core/Compilation/Binding/SymbolTable.cs +++ b/src/OneScript.Core/Compilation/Binding/SymbolTable.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using OneScript.Contexts; -using OneScript.Values; namespace OneScript.Compilation.Binding { diff --git a/src/OneScript.Core/Compilation/ICompilerBackend.cs b/src/OneScript.Core/Compilation/ICompilerBackend.cs index 2904c8317..158210d98 100644 --- a/src/OneScript.Core/Compilation/ICompilerBackend.cs +++ b/src/OneScript.Core/Compilation/ICompilerBackend.cs @@ -10,7 +10,6 @@ This Source Code Form is subject to the terms of the using OneScript.Compilation.Binding; using OneScript.Execution; using OneScript.Language.SyntaxAnalysis.AstNodes; -using OneScript.Sources; namespace OneScript.Compilation { diff --git a/src/OneScript.Core/Commons/BslCoreException.cs b/src/OneScript.Core/Exceptions/BslCoreException.cs similarity index 95% rename from src/OneScript.Core/Commons/BslCoreException.cs rename to src/OneScript.Core/Exceptions/BslCoreException.cs index 40e63ec95..2788a978f 100644 --- a/src/OneScript.Core/Commons/BslCoreException.cs +++ b/src/OneScript.Core/Exceptions/BslCoreException.cs @@ -8,7 +8,7 @@ This Source Code Form is subject to the terms of the using System; using OneScript.Localization; -namespace OneScript.Commons +namespace OneScript.Exceptions { public class BslCoreException : ApplicationException { diff --git a/src/OneScript.Core/Commons/BslExceptions.cs b/src/OneScript.Core/Exceptions/BslExceptions.cs similarity index 98% rename from src/OneScript.Core/Commons/BslExceptions.cs rename to src/OneScript.Core/Exceptions/BslExceptions.cs index 55242a7ba..1bccf03a7 100644 --- a/src/OneScript.Core/Commons/BslExceptions.cs +++ b/src/OneScript.Core/Exceptions/BslExceptions.cs @@ -8,7 +8,7 @@ This Source Code Form is subject to the terms of the using OneScript.Localization; using OneScript.Values; -namespace OneScript.Commons +namespace OneScript.Exceptions { public static class BslExceptions { diff --git a/src/OneScript.Core/Commons/DependencyResolveException.cs b/src/OneScript.Core/Exceptions/DependencyResolveException.cs similarity index 94% rename from src/OneScript.Core/Commons/DependencyResolveException.cs rename to src/OneScript.Core/Exceptions/DependencyResolveException.cs index 31454a1f1..8d101f87d 100644 --- a/src/OneScript.Core/Commons/DependencyResolveException.cs +++ b/src/OneScript.Core/Exceptions/DependencyResolveException.cs @@ -7,7 +7,7 @@ This Source Code Form is subject to the terms of the using OneScript.Localization; -namespace OneScript.Commons +namespace OneScript.Exceptions { public class DependencyResolveException : RuntimeException { diff --git a/src/OneScript.Core/Commons/PropertyAccessException.cs b/src/OneScript.Core/Exceptions/PropertyAccessException.cs similarity index 98% rename from src/OneScript.Core/Commons/PropertyAccessException.cs rename to src/OneScript.Core/Exceptions/PropertyAccessException.cs index 42010b1dd..8cf87fc25 100644 --- a/src/OneScript.Core/Commons/PropertyAccessException.cs +++ b/src/OneScript.Core/Exceptions/PropertyAccessException.cs @@ -8,7 +8,7 @@ This Source Code Form is subject to the terms of the using System; using OneScript.Localization; -namespace OneScript.Commons +namespace OneScript.Exceptions { public class PropertyAccessException : RuntimeException { diff --git a/src/OneScript.Core/Commons/RuntimeException.cs b/src/OneScript.Core/Exceptions/RuntimeException.cs similarity index 99% rename from src/OneScript.Core/Commons/RuntimeException.cs rename to src/OneScript.Core/Exceptions/RuntimeException.cs index e14fdfeb4..51af3297f 100644 --- a/src/OneScript.Core/Commons/RuntimeException.cs +++ b/src/OneScript.Core/Exceptions/RuntimeException.cs @@ -8,7 +8,7 @@ This Source Code Form is subject to the terms of the using System; using OneScript.Localization; -namespace OneScript.Commons +namespace OneScript.Exceptions { public class RuntimeException : BslCoreException { diff --git a/src/OneScript.Core/Commons/TypeConversionException.cs b/src/OneScript.Core/Exceptions/TypeConversionException.cs similarity index 94% rename from src/OneScript.Core/Commons/TypeConversionException.cs rename to src/OneScript.Core/Exceptions/TypeConversionException.cs index ae3b145e9..98e330f34 100644 --- a/src/OneScript.Core/Commons/TypeConversionException.cs +++ b/src/OneScript.Core/Exceptions/TypeConversionException.cs @@ -7,7 +7,7 @@ This Source Code Form is subject to the terms of the using OneScript.Localization; -namespace OneScript.Commons +namespace OneScript.Exceptions { public class TypeConversionException : RuntimeException { diff --git a/src/OneScript.Core/Values/BslBooleanValue.cs b/src/OneScript.Core/Values/BslBooleanValue.cs index 3d97ba981..e852331b0 100644 --- a/src/OneScript.Core/Values/BslBooleanValue.cs +++ b/src/OneScript.Core/Values/BslBooleanValue.cs @@ -6,7 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.Localization; using OneScript.Types; diff --git a/src/OneScript.Core/Values/BslDateValue.cs b/src/OneScript.Core/Values/BslDateValue.cs index 93c025527..205dedd4a 100644 --- a/src/OneScript.Core/Values/BslDateValue.cs +++ b/src/OneScript.Core/Values/BslDateValue.cs @@ -7,7 +7,7 @@ This Source Code Form is subject to the terms of the using System; using System.Globalization; -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.Types; namespace OneScript.Values diff --git a/src/OneScript.Core/Values/BslNumericValue.cs b/src/OneScript.Core/Values/BslNumericValue.cs index 67426e215..f75d81561 100644 --- a/src/OneScript.Core/Values/BslNumericValue.cs +++ b/src/OneScript.Core/Values/BslNumericValue.cs @@ -8,7 +8,7 @@ This Source Code Form is subject to the terms of the using System; using System.Dynamic; using System.Globalization; -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.Types; namespace OneScript.Values diff --git a/src/OneScript.Core/Values/BslObjectValue.cs b/src/OneScript.Core/Values/BslObjectValue.cs index 4bfe1f555..10226630d 100644 --- a/src/OneScript.Core/Values/BslObjectValue.cs +++ b/src/OneScript.Core/Values/BslObjectValue.cs @@ -5,7 +5,7 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.Localization; namespace OneScript.Values diff --git a/src/OneScript.Core/Values/BslPrimitiveValue.cs b/src/OneScript.Core/Values/BslPrimitiveValue.cs index 162d93dc9..24bc8000d 100644 --- a/src/OneScript.Core/Values/BslPrimitiveValue.cs +++ b/src/OneScript.Core/Values/BslPrimitiveValue.cs @@ -6,7 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using OneScript.Commons; +using OneScript.Exceptions; namespace OneScript.Values { diff --git a/src/OneScript.Core/Values/BslTypeValue.cs b/src/OneScript.Core/Values/BslTypeValue.cs index 979323cc5..dab5b65a0 100644 --- a/src/OneScript.Core/Values/BslTypeValue.cs +++ b/src/OneScript.Core/Values/BslTypeValue.cs @@ -6,7 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using OneScript.Types; -using System; namespace OneScript.Values { diff --git a/src/OneScript.Core/Values/BslValue.cs b/src/OneScript.Core/Values/BslValue.cs index 523d96641..514bf5ec5 100644 --- a/src/OneScript.Core/Values/BslValue.cs +++ b/src/OneScript.Core/Values/BslValue.cs @@ -7,7 +7,7 @@ This Source Code Form is subject to the terms of the using System; using System.Dynamic; -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.Core/Values/PropertyValueReference.cs b/src/OneScript.Core/Values/PropertyValueReference.cs index 67563cf4d..bead9213d 100644 --- a/src/OneScript.Core/Values/PropertyValueReference.cs +++ b/src/OneScript.Core/Values/PropertyValueReference.cs @@ -5,8 +5,8 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ using System; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using ScriptEngine.Machine; namespace OneScript.Values diff --git a/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs b/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs index b1e7cf70f..b2f1788ed 100644 --- a/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs +++ b/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs @@ -5,7 +5,6 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System.IO; using System.Net.Sockets; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; diff --git a/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs b/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs index ad0d9a566..a8fe3a796 100644 --- a/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs +++ b/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs @@ -10,8 +10,6 @@ This Source Code Form is subject to the terms of the using System.Linq.Expressions; using System.Reflection; using OneScript.Language.SyntaxAnalysis.AstNodes; -using OneScript.Native.Runtime; -using OneScript.Values; namespace OneScript.Native.Compiler { diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index 5ff812802..249eb29fa 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -18,6 +18,7 @@ This Source Code Form is subject to the terms of the using OneScript.Compilation.Binding; using OneScript.Contexts; using OneScript.DependencyInjection; +using OneScript.Exceptions; using OneScript.Language; using OneScript.Language.LexicalAnalysis; using OneScript.Language.SyntaxAnalysis; diff --git a/src/OneScript.Native/Compiler/ModuleCompiler.cs b/src/OneScript.Native/Compiler/ModuleCompiler.cs index bfe09047e..07c200a31 100644 --- a/src/OneScript.Native/Compiler/ModuleCompiler.cs +++ b/src/OneScript.Native/Compiler/ModuleCompiler.cs @@ -6,11 +6,11 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Linq; -using OneScript.Commons; using OneScript.Compilation; using OneScript.Compilation.Binding; using OneScript.Contexts; using OneScript.DependencyInjection; +using OneScript.Exceptions; using OneScript.Language; using OneScript.Language.LexicalAnalysis; using OneScript.Language.SyntaxAnalysis; diff --git a/src/OneScript.Native/Compiler/NativeCompilerException.cs b/src/OneScript.Native/Compiler/NativeCompilerException.cs index 795b2a9ba..b461f80fa 100644 --- a/src/OneScript.Native/Compiler/NativeCompilerException.cs +++ b/src/OneScript.Native/Compiler/NativeCompilerException.cs @@ -7,7 +7,7 @@ This Source Code Form is subject to the terms of the using System; using System.Linq.Expressions; -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.Language; using OneScript.Localization; diff --git a/src/OneScript.Native/Extensions/ServiceRegistrationExtensions.cs b/src/OneScript.Native/Extensions/ServiceRegistrationExtensions.cs index 53aeb356b..e74af7327 100644 --- a/src/OneScript.Native/Extensions/ServiceRegistrationExtensions.cs +++ b/src/OneScript.Native/Extensions/ServiceRegistrationExtensions.cs @@ -5,7 +5,6 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using OneScript.Contexts; using OneScript.DependencyInjection; using OneScript.Execution; using OneScript.Language.SyntaxAnalysis; diff --git a/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs b/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs index e6dc4b64a..c7dcce459 100644 --- a/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs +++ b/src/OneScript.Native/Runtime/BslNativeMethodInfo.cs @@ -5,12 +5,11 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System.Diagnostics; using System.Globalization; using System.Linq.Expressions; using System.Reflection; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Values; namespace OneScript.Native.Runtime diff --git a/src/OneScript.Native/Runtime/BuiltInFunctions.cs b/src/OneScript.Native/Runtime/BuiltInFunctions.cs index 62f9a0306..37320fa11 100644 --- a/src/OneScript.Native/Runtime/BuiltInFunctions.cs +++ b/src/OneScript.Native/Runtime/BuiltInFunctions.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using System.Runtime.CompilerServices; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Values; namespace OneScript.Native.Runtime diff --git a/src/OneScript.Native/Runtime/DynamicOperations.cs b/src/OneScript.Native/Runtime/DynamicOperations.cs index 09ee83c5f..de38b667c 100644 --- a/src/OneScript.Native/Runtime/DynamicOperations.cs +++ b/src/OneScript.Native/Runtime/DynamicOperations.cs @@ -8,9 +8,9 @@ This Source Code Form is subject to the terms of the using System; using System.Linq; using System.Runtime.CompilerServices; -using OneScript.Commons; using OneScript.Contexts; using OneScript.DependencyInjection; +using OneScript.Exceptions; using OneScript.Language; using OneScript.Localization; using OneScript.Types; diff --git a/src/OneScript.StandardLibrary/Binary/BinaryDataBuffer.cs b/src/OneScript.StandardLibrary/Binary/BinaryDataBuffer.cs index 218e29f52..07321e0a3 100644 --- a/src/OneScript.StandardLibrary/Binary/BinaryDataBuffer.cs +++ b/src/OneScript.StandardLibrary/Binary/BinaryDataBuffer.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using System.Linq; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Binary/BinaryDataContext.cs b/src/OneScript.StandardLibrary/Binary/BinaryDataContext.cs index 7332aa17c..abe63ec88 100644 --- a/src/OneScript.StandardLibrary/Binary/BinaryDataContext.cs +++ b/src/OneScript.StandardLibrary/Binary/BinaryDataContext.cs @@ -9,8 +9,8 @@ This Source Code Form is subject to the terms of the using System.Diagnostics; using System.IO; using System.Text; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Binary/DataReader.cs b/src/OneScript.StandardLibrary/Binary/DataReader.cs index a6f29186d..efa3be574 100644 --- a/src/OneScript.StandardLibrary/Binary/DataReader.cs +++ b/src/OneScript.StandardLibrary/Binary/DataReader.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using System.Text; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Text; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Binary/DataWriter.cs b/src/OneScript.StandardLibrary/Binary/DataWriter.cs index a9bfbfab8..e0d0669ea 100644 --- a/src/OneScript.StandardLibrary/Binary/DataWriter.cs +++ b/src/OneScript.StandardLibrary/Binary/DataWriter.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using System.Text; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Text; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Binary/GenericStreamImpl.cs b/src/OneScript.StandardLibrary/Binary/GenericStreamImpl.cs index a0ffa7dfb..385081d6a 100644 --- a/src/OneScript.StandardLibrary/Binary/GenericStreamImpl.cs +++ b/src/OneScript.StandardLibrary/Binary/GenericStreamImpl.cs @@ -6,7 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.IO; -using OneScript.Commons; +using OneScript.Exceptions; using ScriptEngine.Machine; namespace OneScript.StandardLibrary.Binary diff --git a/src/OneScript.StandardLibrary/Binary/GlobalBinaryData.cs b/src/OneScript.StandardLibrary/Binary/GlobalBinaryData.cs index 71251dd21..458cdd030 100644 --- a/src/OneScript.StandardLibrary/Binary/GlobalBinaryData.cs +++ b/src/OneScript.StandardLibrary/Binary/GlobalBinaryData.cs @@ -9,8 +9,8 @@ This Source Code Form is subject to the terms of the using OneScript.StandardLibrary.Collections; using OneScript.StandardLibrary.Text; using System.Text; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.Binary diff --git a/src/OneScript.StandardLibrary/Collections/ArrayImpl.cs b/src/OneScript.StandardLibrary/Collections/ArrayImpl.cs index 2f0f70f13..b9a6fcf76 100644 --- a/src/OneScript.StandardLibrary/Collections/ArrayImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/ArrayImpl.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Collections.Generic; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Collections/FixedArrayImpl.cs b/src/OneScript.StandardLibrary/Collections/FixedArrayImpl.cs index c38e93e79..5a8d1e8a1 100644 --- a/src/OneScript.StandardLibrary/Collections/FixedArrayImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/FixedArrayImpl.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Collections.Generic; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/FixedMapImpl.cs b/src/OneScript.StandardLibrary/Collections/FixedMapImpl.cs index 5718cb435..63f07d21e 100644 --- a/src/OneScript.StandardLibrary/Collections/FixedMapImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/FixedMapImpl.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Collections.Generic; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/FixedStructureImpl.cs b/src/OneScript.StandardLibrary/Collections/FixedStructureImpl.cs index 4ccf23153..4c7c208b0 100644 --- a/src/OneScript.StandardLibrary/Collections/FixedStructureImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/FixedStructureImpl.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Collections.Generic; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/MapImpl.cs b/src/OneScript.StandardLibrary/Collections/MapImpl.cs index 6888d8c9b..4ba66aae1 100644 --- a/src/OneScript.StandardLibrary/Collections/MapImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/MapImpl.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Collections.Generic; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/StructureImpl.cs b/src/OneScript.StandardLibrary/Collections/StructureImpl.cs index 62af03daf..c520aa6a3 100644 --- a/src/OneScript.StandardLibrary/Collections/StructureImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/StructureImpl.cs @@ -8,6 +8,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/ValueList/ValueListImpl.cs b/src/OneScript.StandardLibrary/Collections/ValueList/ValueListImpl.cs index d8e799944..2cc898256 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueList/ValueListImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueList/ValueListImpl.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; using System.Linq; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs index a52462df3..eb52b0a8f 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; using System.Linq; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumn.cs b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumn.cs index f07499b7c..5c9ce285c 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumn.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumn.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.TypeDescriptions; using OneScript.Types; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumnCollection.cs b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumnCollection.cs index 10f1fdd9d..578e6b01a 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumnCollection.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumnCollection.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.TypeDescriptions; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumn.cs b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumn.cs index 0cad12a2a..7a127fa96 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumn.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumn.cs @@ -5,8 +5,8 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.TypeDescriptions; using OneScript.Types; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumnCollection.cs b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumnCollection.cs index 6be65dd0a..62c0d7350 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumnCollection.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumnCollection.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; using System.Linq; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.TypeDescriptions; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRow.cs b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRow.cs index 50b5c743c..b0ce73dd9 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRow.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRow.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Collections.Generic; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs index 506b1a74a..bcacce1d5 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; using System.Linq; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/DynamicLoadingFunctions.cs b/src/OneScript.StandardLibrary/DynamicLoadingFunctions.cs index 9fc74e7ae..51745e97e 100644 --- a/src/OneScript.StandardLibrary/DynamicLoadingFunctions.cs +++ b/src/OneScript.StandardLibrary/DynamicLoadingFunctions.cs @@ -8,6 +8,7 @@ This Source Code Form is subject to the terms of the using OneScript.Commons; using OneScript.Compilation; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Language; using OneScript.StandardLibrary.Collections; using OneScript.StandardLibrary.NativeApi; diff --git a/src/OneScript.StandardLibrary/GlobalBitFunctions.cs b/src/OneScript.StandardLibrary/GlobalBitFunctions.cs index 285ef46a7..302950b5a 100644 --- a/src/OneScript.StandardLibrary/GlobalBitFunctions.cs +++ b/src/OneScript.StandardLibrary/GlobalBitFunctions.cs @@ -5,8 +5,8 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary diff --git a/src/OneScript.StandardLibrary/GuidWrapper.cs b/src/OneScript.StandardLibrary/GuidWrapper.cs index 61cd024a0..78f754950 100644 --- a/src/OneScript.StandardLibrary/GuidWrapper.cs +++ b/src/OneScript.StandardLibrary/GuidWrapper.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using System.Reflection; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Hash/HashImpl.cs b/src/OneScript.StandardLibrary/Hash/HashImpl.cs index 6ca4065bd..99008ba20 100644 --- a/src/OneScript.StandardLibrary/Hash/HashImpl.cs +++ b/src/OneScript.StandardLibrary/Hash/HashImpl.cs @@ -9,8 +9,8 @@ This Source Code Form is subject to the terms of the using System.IO; using System.Security.Cryptography; using System.Text; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Binary; using OneScript.Values; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Http/HttpConnectionContext.cs b/src/OneScript.StandardLibrary/Http/HttpConnectionContext.cs index be91599d4..3b9ab8ab2 100644 --- a/src/OneScript.StandardLibrary/Http/HttpConnectionContext.cs +++ b/src/OneScript.StandardLibrary/Http/HttpConnectionContext.cs @@ -11,8 +11,8 @@ This Source Code Form is subject to the terms of the using System.Net; using System.Reflection; using System.Text; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Collections; using OneScript.Types; using RegExp = System.Text.RegularExpressions; diff --git a/src/OneScript.StandardLibrary/Http/HttpRequestContext.cs b/src/OneScript.StandardLibrary/Http/HttpRequestContext.cs index 46b7c0571..c3fada9ce 100644 --- a/src/OneScript.StandardLibrary/Http/HttpRequestContext.cs +++ b/src/OneScript.StandardLibrary/Http/HttpRequestContext.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.IO; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Binary; using OneScript.StandardLibrary.Collections; using OneScript.StandardLibrary.Text; diff --git a/src/OneScript.StandardLibrary/Http/InternetProxyContext.cs b/src/OneScript.StandardLibrary/Http/InternetProxyContext.cs index ea79041d9..36433cbc4 100644 --- a/src/OneScript.StandardLibrary/Http/InternetProxyContext.cs +++ b/src/OneScript.StandardLibrary/Http/InternetProxyContext.cs @@ -9,8 +9,8 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Linq; using System.Net; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Collections; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Json/GlobalJsonFunctions.cs b/src/OneScript.StandardLibrary/Json/GlobalJsonFunctions.cs index cd6224d61..939c2d02d 100644 --- a/src/OneScript.StandardLibrary/Json/GlobalJsonFunctions.cs +++ b/src/OneScript.StandardLibrary/Json/GlobalJsonFunctions.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using Newtonsoft.Json; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Collections; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Json/JSONDataExtractor.cs b/src/OneScript.StandardLibrary/Json/JSONDataExtractor.cs index 47da1907d..71721f391 100644 --- a/src/OneScript.StandardLibrary/Json/JSONDataExtractor.cs +++ b/src/OneScript.StandardLibrary/Json/JSONDataExtractor.cs @@ -1,536 +1,535 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ - -using System; -using System.IO; -using System.Text; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using ScriptEngine.Machine; -using ScriptEngine.Machine.Contexts; -using OneScript.Commons; -using OneScript.Contexts; -using OneScript.Types; -using OneScript.StandardLibrary; -using OneScript.StandardLibrary.Collections; -using OneScript.StandardLibrary.Text; -using OneScript.StandardLibrary.Binary; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace OneScript.StandardLibrary.Json -{ - /// - /// Предоставляет методы для извлечения данных из JSON по запросу JSON-path - /// - [ContextClass("ИзвлечениеДанныхJSON", "JSONDataExtractor")] - public class JSONDataExtractor : AutoContext - { - private JToken _jsonData; - - /// - /// Устанавливает строку JSON для последующей обработки - /// - /// Строка. Строка JSON. - [ContextMethod("УстановитьСтроку", "SetString")] - public void SetString(string JSONString) - { - - _jsonData = JToken.Parse(JSONString); - - } - - /// - /// Читает файл, содержащий данные JSON для последующей обработки - /// - /// Строка. Путь к файлу. - /// КодировкаТекста. кодировка файла. - [ContextMethod("ОткрытьФайл", "OpenFile")] - public void OpenFile(string JSONFileName, IValue encoding = null) - { - - StreamReader _fileReader; - - try - { - if (encoding == null) - _fileReader = FileOpener.OpenReader(JSONFileName, Encoding.Default); - else - _fileReader = FileOpener.OpenReader(JSONFileName, TextEncodingEnum.GetEncoding(encoding)); - } - catch (Exception e) - { - throw new RuntimeException(e.Message, e); - } - - _jsonData = JToken.Parse(_fileReader.ReadToEnd()); - - _fileReader.Close(); - - } - - /// - /// Читает данные из потока JSON для последующей обработки - /// - /// Поток. поток с данными JSON. - /// КодировкаТекста. кодировка файла. - [ContextMethod("ОткрытьПоток", "OpenStream")] - public void OpenStream(IValue JSONStream, IValue encoding = null) - { - - string _JSONString = "{}"; - Encoding _encoding; - - if (encoding == null) - _encoding = Encoding.Default; - else - _encoding = TextEncodingEnum.GetEncoding(encoding); - - using (Stream _underlyingStream = ((IStreamWrapper)JSONStream).GetUnderlyingStream()) - { - byte[] buffer = new byte[1000]; - StringBuilder builder = new StringBuilder(); - int read = -1; - - while (true) - { - AutoResetEvent gotInput = new AutoResetEvent(false); - Thread inputThread = new Thread(() => - { - try - { - read = _underlyingStream.Read(buffer, 0, buffer.Length); - gotInput.Set(); - } - catch (ThreadAbortException) - { - Thread.ResetAbort(); - } - }) - { - IsBackground = true - }; - - inputThread.Start(); - - // Timeout expired? - if (!gotInput.WaitOne(100)) - { - inputThread.Abort(); - break; - } - - // End of stream? - if (read == 0) - { - _JSONString = builder.ToString(); - break; - } - - // Got data - builder.Append(_encoding.GetString(buffer, 0, read)); - } - } - - string _BOMMarkUTF8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble()); - - if (_JSONString.StartsWith(_BOMMarkUTF8, StringComparison.Ordinal)) - _JSONString = _JSONString.Remove(0, _BOMMarkUTF8.Length); - - _jsonData = JToken.Parse(_JSONString.Trim()); - - } - - /// - /// Выполняет выборку из JSON по указанному JSON-path - /// - /// Строка. JSON-path. - /// Булево. Если результирующий массив содержит единственное значение, то: - /// Истина - будет возвращено значение; - /// Ложь - будет возвращен массив. - /// Булево. Истина - объекты будут возвращены в виде строки JSON; - /// Ложь - Объекты будут возвращены в виде соответствия. - /// Строка - Выбранные данные - [ContextMethod("Выбрать", "Select")] - public IValue Select(string path, bool extractSingleValue = true, bool getObjectAsJSON = true) - { - IValue result; - - AggregateFuncEnum aggregateFunc = GetAggregateFunc(path, out path); - - List parseResult = _jsonData.SelectTokens(path).ToList(); - - if (parseResult.Count() == 0) - { - result = ValueFactory.Create(); - } - else - { - StringBuilder sb = new StringBuilder(); - StringWriter sw = new StringWriter(sb); - - using (JsonWriter writer = new JsonTextWriter(sw)) - { - writer.Formatting = Formatting.Indented; - - writer.WriteStartArray(); - foreach (JToken token in parseResult) - { - writer.WriteToken(token.CreateReader(), true); - } - writer.WriteEndArray(); - } - result = JSONToDataStructure(sb.ToString()); - } - - if (aggregateFunc != AggregateFuncEnum.none) - result = CalculateAggregateFunc(result, aggregateFunc); - - if (result is ArrayImpl && ((ArrayImpl)result.AsObject()).Count() == 1 && extractSingleValue) - { - result = ((ArrayImpl)result.AsObject()).Get(0); - } - - if ((result is ArrayImpl || result is MapImpl) && getObjectAsJSON) - { - result = ValueFactory.Create(DataStructureToJSON(result)); - } - - return result; - } - - #region JSON conversion - - /// - /// Преобразует строку JSON в соответствие или массив - /// - /// Строка. Строка JSON. - /// Соответствие, Массив - Результат преобразования строки JSON в соответствие или массив - private IValue JSONToDataStructure(string JSONString) - { - JSONReader reader = new JSONReader(); - reader.SetString(JSONString); - - return ((GlobalJsonFunctions)GlobalJsonFunctions.CreateInstance()).ReadJSONInMap(reader); - } - - /// - /// Преобразует соответствие или массив в строку JSON - /// - /// Соответствие, Массив. Соответствие или массив для преобразования в строку JSON. - /// Строка - Результат преобразования соответствия или массива в строку JSON - private string DataStructureToJSON(IValue inputStruct) - { - JSONWriter writer = new JSONWriter(); - writer.SetString(); - - ((GlobalJsonFunctions)GlobalJsonFunctions.CreateInstance()).WriteJSON(writer, inputStruct); - - return writer.Close(); - } - - #endregion - - #region Aggregate calculation - - /// - /// Вычисляет агрегатную функцию над переданными данными - /// - /// Соответствие, Массив. Соответствие или массив для вычисления агрегатной функции. - /// Агрегатнаная функция. - /// Строка - Результат вычисления функции - private IValue CalculateAggregateFunc(IValue sourceData, AggregateFuncEnum aggregateFunc) - { - - IValue result; - - if (aggregateFunc == AggregateFuncEnum.length) - result = CalculateLength(sourceData); - else if (aggregateFunc == AggregateFuncEnum.sum) - result = CalculateSum(sourceData); - else if (aggregateFunc == AggregateFuncEnum.avg) - result = CalculateAvg(sourceData); - else if (aggregateFunc == AggregateFuncEnum.min) - result = CalculateMin(sourceData); - else if (aggregateFunc == AggregateFuncEnum.max) - result = CalculateMax(sourceData); - else if (aggregateFunc == AggregateFuncEnum.first) - result = CalculateFirst(sourceData); - else if (aggregateFunc == AggregateFuncEnum.last) - result = CalculateLast(sourceData); - else if (aggregateFunc == AggregateFuncEnum.keys) - result = CalculateKeys(sourceData); - else - result = sourceData; - - return result; - } - - /// - /// Вычисляет размер переданного массива или соответствия - /// - /// Соответствие, Массив. Соответствие или массив для обработки. - /// Число - Размер переданного массива или соответствия - private IValue CalculateLength(IValue sourceData) - { - - IValue result = ValueFactory.Create(); - - if (sourceData is ArrayImpl) - result = ValueFactory.Create(((ArrayImpl)sourceData).Count()); - else if (sourceData is MapImpl) - result = ValueFactory.Create(((MapImpl)sourceData).Count()); - - return result; - } - - /// - /// Вычисляет сумму чисел в переданном массиве - /// - /// Массив. Соответствие или массив для обработки. - /// Число - Сумма чисел в переданном массиве - private IValue CalculateSum(IValue sourceData) - { - - IValue result = ValueFactory.Create(); - - if (((ArrayImpl)sourceData).Count() == 0) - return result; - - decimal fullSum = 0; - - foreach (IValue value in (ArrayImpl)sourceData) - fullSum += value.AsNumber(); - - result = ValueFactory.Create(fullSum); - - return result; - } - - /// - /// Вычисляет среднее значение в переданном массиве - /// - /// Массив. Соответствие или массив для обработки. - /// Число - Среднее значение в переданном массиве - private IValue CalculateAvg(IValue sourceData) - { - - IValue result = ValueFactory.Create(); - - if (!(sourceData is ArrayImpl)) - return result; - - if (((ArrayImpl)sourceData).Count() == 0) - return result; - - decimal fullSum = 0; - - foreach (IValue value in (ArrayImpl)sourceData) - fullSum += value.AsNumber(); - - result = ValueFactory.Create(fullSum / ((ArrayImpl)sourceData).Count()); - - return result; - } - - /// - /// Вычисляет минимально значение в переданном массиве - /// - /// Массив. Соответствие или массив для обработки. - /// Число - Минимальное значение в переданном массиве - private IValue CalculateMin(IValue sourceData) - { - - IValue result = ValueFactory.Create(); - - if (!(sourceData is ArrayImpl)) - return result; - - if (((ArrayImpl)sourceData).Count() == 0) - return result; - - decimal numericResult = ((ArrayImpl)sourceData).Get(0).AsNumber(); - - foreach (IValue value in (ArrayImpl)sourceData) - numericResult = value.AsNumber() < numericResult ? value.AsNumber() : numericResult; - - result = ValueFactory.Create(numericResult); - - return result; - } - - /// - /// Вычисляет максимальное значение в переданном массиве - /// - /// Массив. Соответствие или массив для обработки. - /// Число - Максимальное значение в переданном массиве - private IValue CalculateMax(IValue sourceData) - { - - IValue result = ValueFactory.Create(); - - if (!(sourceData is ArrayImpl)) - return result; - - if (((ArrayImpl)sourceData).Count() == 0) - return result; - - decimal numericResult = ((ArrayImpl)sourceData).Get(0).AsNumber(); - - foreach (IValue value in (ArrayImpl)sourceData) - numericResult = value.AsNumber() > numericResult ? value.AsNumber() : numericResult; - - result = ValueFactory.Create(numericResult); - - return result; - } - - /// - /// Получает первое значение из переданного массива - /// - /// Массив. Массив для обработки. - /// Произвольный - Первое значение из переданного массива - private IValue CalculateFirst(IValue sourceData) - { - - IValue result = ValueFactory.Create(); - - if (!(sourceData is ArrayImpl)) - return result; - - if (((ArrayImpl)sourceData).Count() == 0) - return result; - - result = ((ArrayImpl)sourceData).Get(0); - - return result; - } - - /// - /// Получает последнее значение из переданного массива - /// - /// Массив. Массив для обработки. - /// Произвольный - Последнее значение из переданного массива - private IValue CalculateLast(IValue sourceData) - { - - IValue result = ValueFactory.Create(); - - if (!(sourceData is ArrayImpl)) - return result; - - if (((ArrayImpl)sourceData).Count() == 0) - return result; - - int lastIndex = ((ArrayImpl)sourceData).UpperBound(); - result = ((ArrayImpl)sourceData).Get(lastIndex); - - return result; - } - - /// - /// Получает массив ключей из переданного соответствия или массив индексов из переданного массива - /// если переданный массив содержит единственное соответствие, то возвращаются ключи соответствия - /// - /// Соответствие, Массив. Соответствие или массив для обработки. - /// Массив - Ключи соответствия или индексы массива - private IValue CalculateKeys(IValue sourceData) - { - - IValue result = ValueFactory.Create(); - - if (sourceData is ArrayImpl && ((ArrayImpl)sourceData).Count() == 1) - sourceData = ((ArrayImpl)sourceData).Get(0); - - if (!(sourceData is MapImpl)) - return result; - - ArrayImpl keyArray = new ArrayImpl(); - if (sourceData is MapImpl) - foreach (KeyAndValueImpl KeyValue in (MapImpl)sourceData) - keyArray.Add(KeyValue.Key); - else if (sourceData is ArrayImpl) - for (int i = 0; i < ((ArrayImpl)sourceData).Count(); i++) - keyArray.Add(ValueFactory.Create(i)); - - return keyArray; - } - - /// - /// Доступные агрегатные функции - /// - private enum AggregateFuncEnum - { - none, - length, - sum, - avg, - min, - max, - first, - last, - keys - } - - /// - /// Получает используемую агрегатную функцию из переданного пути JSON path - /// - /// Строка. исходный путь JSON-path. - /// Строка. путь JSON-path без агрегатной функции. - /// AggregateFuncEnum - используемуя агрегатная функция - private AggregateFuncEnum GetAggregateFunc(string path, out string mainPath) - { - Dictionary aggregateFuncs = new Dictionary(); - aggregateFuncs.Add("count", AggregateFuncEnum.length); - aggregateFuncs.Add("length", AggregateFuncEnum.length); - aggregateFuncs.Add("sum", AggregateFuncEnum.sum); - aggregateFuncs.Add("avg", AggregateFuncEnum.avg); - aggregateFuncs.Add("min", AggregateFuncEnum.min); - aggregateFuncs.Add("max", AggregateFuncEnum.max); - aggregateFuncs.Add("first", AggregateFuncEnum.first); - aggregateFuncs.Add("last", AggregateFuncEnum.last); - aggregateFuncs.Add("keys", AggregateFuncEnum.keys); - - AggregateFuncEnum result = AggregateFuncEnum.none; - mainPath = path; - - string[] parts = path.Split('.'); - - if (parts.Length == 0) - return result; - - string aggregateFunc = parts[parts.GetUpperBound(0)].Trim(); - - if (!aggregateFunc.Trim().EndsWith("()")) - return result; - - aggregateFunc = aggregateFunc.Substring(0, aggregateFunc.Length - 2); - - if (aggregateFuncs.TryGetValue(aggregateFunc.ToLower(), out result)) - { - mainPath = String.Join(".", parts, 0, parts.Length - 1); - return result; - } - - return result; - } - - #endregion - - /// - /// Создает ИзвлечениеДанныхJSON - /// - /// ИзвлечениеДанныхJSON - [ScriptConstructor] - public static IRuntimeContextInstance Constructor() - { - return new JSONDataExtractor(); - } - - } -} +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.IO; +using System.Text; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using ScriptEngine.Machine; +using ScriptEngine.Machine.Contexts; +using OneScript.Commons; +using OneScript.Contexts; +using OneScript.StandardLibrary.Collections; +using OneScript.StandardLibrary.Text; +using OneScript.StandardLibrary.Binary; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using OneScript.Exceptions; + +namespace OneScript.StandardLibrary.Json +{ + /// + /// Предоставляет методы для извлечения данных из JSON по запросу JSON-path + /// + [ContextClass("ИзвлечениеДанныхJSON", "JSONDataExtractor")] + public class JSONDataExtractor : AutoContext + { + private JToken _jsonData; + + /// + /// Устанавливает строку JSON для последующей обработки + /// + /// Строка. Строка JSON. + [ContextMethod("УстановитьСтроку", "SetString")] + public void SetString(string JSONString) + { + + _jsonData = JToken.Parse(JSONString); + + } + + /// + /// Читает файл, содержащий данные JSON для последующей обработки + /// + /// Строка. Путь к файлу. + /// КодировкаТекста. кодировка файла. + [ContextMethod("ОткрытьФайл", "OpenFile")] + public void OpenFile(string JSONFileName, IValue encoding = null) + { + + StreamReader _fileReader; + + try + { + if (encoding == null) + _fileReader = FileOpener.OpenReader(JSONFileName, Encoding.Default); + else + _fileReader = FileOpener.OpenReader(JSONFileName, TextEncodingEnum.GetEncoding(encoding)); + } + catch (Exception e) + { + throw new RuntimeException(e.Message, e); + } + + _jsonData = JToken.Parse(_fileReader.ReadToEnd()); + + _fileReader.Close(); + + } + + /// + /// Читает данные из потока JSON для последующей обработки + /// + /// Поток. поток с данными JSON. + /// КодировкаТекста. кодировка файла. + [ContextMethod("ОткрытьПоток", "OpenStream")] + public void OpenStream(IValue JSONStream, IValue encoding = null) + { + + string _JSONString = "{}"; + Encoding _encoding; + + if (encoding == null) + _encoding = Encoding.Default; + else + _encoding = TextEncodingEnum.GetEncoding(encoding); + + using (Stream _underlyingStream = ((IStreamWrapper)JSONStream).GetUnderlyingStream()) + { + byte[] buffer = new byte[1000]; + StringBuilder builder = new StringBuilder(); + int read = -1; + + while (true) + { + AutoResetEvent gotInput = new AutoResetEvent(false); + Thread inputThread = new Thread(() => + { + try + { + read = _underlyingStream.Read(buffer, 0, buffer.Length); + gotInput.Set(); + } + catch (ThreadAbortException) + { + Thread.ResetAbort(); + } + }) + { + IsBackground = true + }; + + inputThread.Start(); + + // Timeout expired? + if (!gotInput.WaitOne(100)) + { + inputThread.Abort(); + break; + } + + // End of stream? + if (read == 0) + { + _JSONString = builder.ToString(); + break; + } + + // Got data + builder.Append(_encoding.GetString(buffer, 0, read)); + } + } + + string _BOMMarkUTF8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble()); + + if (_JSONString.StartsWith(_BOMMarkUTF8, StringComparison.Ordinal)) + _JSONString = _JSONString.Remove(0, _BOMMarkUTF8.Length); + + _jsonData = JToken.Parse(_JSONString.Trim()); + + } + + /// + /// Выполняет выборку из JSON по указанному JSON-path + /// + /// Строка. JSON-path. + /// Булево. Если результирующий массив содержит единственное значение, то: + /// Истина - будет возвращено значение; + /// Ложь - будет возвращен массив. + /// Булево. Истина - объекты будут возвращены в виде строки JSON; + /// Ложь - Объекты будут возвращены в виде соответствия. + /// Строка - Выбранные данные + [ContextMethod("Выбрать", "Select")] + public IValue Select(string path, bool extractSingleValue = true, bool getObjectAsJSON = true) + { + IValue result; + + AggregateFuncEnum aggregateFunc = GetAggregateFunc(path, out path); + + List parseResult = _jsonData.SelectTokens(path).ToList(); + + if (parseResult.Count() == 0) + { + result = ValueFactory.Create(); + } + else + { + StringBuilder sb = new StringBuilder(); + StringWriter sw = new StringWriter(sb); + + using (JsonWriter writer = new JsonTextWriter(sw)) + { + writer.Formatting = Formatting.Indented; + + writer.WriteStartArray(); + foreach (JToken token in parseResult) + { + writer.WriteToken(token.CreateReader(), true); + } + writer.WriteEndArray(); + } + result = JSONToDataStructure(sb.ToString()); + } + + if (aggregateFunc != AggregateFuncEnum.none) + result = CalculateAggregateFunc(result, aggregateFunc); + + if (result is ArrayImpl && ((ArrayImpl)result.AsObject()).Count() == 1 && extractSingleValue) + { + result = ((ArrayImpl)result.AsObject()).Get(0); + } + + if ((result is ArrayImpl || result is MapImpl) && getObjectAsJSON) + { + result = ValueFactory.Create(DataStructureToJSON(result)); + } + + return result; + } + + #region JSON conversion + + /// + /// Преобразует строку JSON в соответствие или массив + /// + /// Строка. Строка JSON. + /// Соответствие, Массив - Результат преобразования строки JSON в соответствие или массив + private IValue JSONToDataStructure(string JSONString) + { + JSONReader reader = new JSONReader(); + reader.SetString(JSONString); + + return ((GlobalJsonFunctions)GlobalJsonFunctions.CreateInstance()).ReadJSONInMap(reader); + } + + /// + /// Преобразует соответствие или массив в строку JSON + /// + /// Соответствие, Массив. Соответствие или массив для преобразования в строку JSON. + /// Строка - Результат преобразования соответствия или массива в строку JSON + private string DataStructureToJSON(IValue inputStruct) + { + JSONWriter writer = new JSONWriter(); + writer.SetString(); + + ((GlobalJsonFunctions)GlobalJsonFunctions.CreateInstance()).WriteJSON(writer, inputStruct); + + return writer.Close(); + } + + #endregion + + #region Aggregate calculation + + /// + /// Вычисляет агрегатную функцию над переданными данными + /// + /// Соответствие, Массив. Соответствие или массив для вычисления агрегатной функции. + /// Агрегатнаная функция. + /// Строка - Результат вычисления функции + private IValue CalculateAggregateFunc(IValue sourceData, AggregateFuncEnum aggregateFunc) + { + + IValue result; + + if (aggregateFunc == AggregateFuncEnum.length) + result = CalculateLength(sourceData); + else if (aggregateFunc == AggregateFuncEnum.sum) + result = CalculateSum(sourceData); + else if (aggregateFunc == AggregateFuncEnum.avg) + result = CalculateAvg(sourceData); + else if (aggregateFunc == AggregateFuncEnum.min) + result = CalculateMin(sourceData); + else if (aggregateFunc == AggregateFuncEnum.max) + result = CalculateMax(sourceData); + else if (aggregateFunc == AggregateFuncEnum.first) + result = CalculateFirst(sourceData); + else if (aggregateFunc == AggregateFuncEnum.last) + result = CalculateLast(sourceData); + else if (aggregateFunc == AggregateFuncEnum.keys) + result = CalculateKeys(sourceData); + else + result = sourceData; + + return result; + } + + /// + /// Вычисляет размер переданного массива или соответствия + /// + /// Соответствие, Массив. Соответствие или массив для обработки. + /// Число - Размер переданного массива или соответствия + private IValue CalculateLength(IValue sourceData) + { + + IValue result = ValueFactory.Create(); + + if (sourceData is ArrayImpl) + result = ValueFactory.Create(((ArrayImpl)sourceData).Count()); + else if (sourceData is MapImpl) + result = ValueFactory.Create(((MapImpl)sourceData).Count()); + + return result; + } + + /// + /// Вычисляет сумму чисел в переданном массиве + /// + /// Массив. Соответствие или массив для обработки. + /// Число - Сумма чисел в переданном массиве + private IValue CalculateSum(IValue sourceData) + { + + IValue result = ValueFactory.Create(); + + if (((ArrayImpl)sourceData).Count() == 0) + return result; + + decimal fullSum = 0; + + foreach (IValue value in (ArrayImpl)sourceData) + fullSum += value.AsNumber(); + + result = ValueFactory.Create(fullSum); + + return result; + } + + /// + /// Вычисляет среднее значение в переданном массиве + /// + /// Массив. Соответствие или массив для обработки. + /// Число - Среднее значение в переданном массиве + private IValue CalculateAvg(IValue sourceData) + { + + IValue result = ValueFactory.Create(); + + if (!(sourceData is ArrayImpl)) + return result; + + if (((ArrayImpl)sourceData).Count() == 0) + return result; + + decimal fullSum = 0; + + foreach (IValue value in (ArrayImpl)sourceData) + fullSum += value.AsNumber(); + + result = ValueFactory.Create(fullSum / ((ArrayImpl)sourceData).Count()); + + return result; + } + + /// + /// Вычисляет минимально значение в переданном массиве + /// + /// Массив. Соответствие или массив для обработки. + /// Число - Минимальное значение в переданном массиве + private IValue CalculateMin(IValue sourceData) + { + + IValue result = ValueFactory.Create(); + + if (!(sourceData is ArrayImpl)) + return result; + + if (((ArrayImpl)sourceData).Count() == 0) + return result; + + decimal numericResult = ((ArrayImpl)sourceData).Get(0).AsNumber(); + + foreach (IValue value in (ArrayImpl)sourceData) + numericResult = value.AsNumber() < numericResult ? value.AsNumber() : numericResult; + + result = ValueFactory.Create(numericResult); + + return result; + } + + /// + /// Вычисляет максимальное значение в переданном массиве + /// + /// Массив. Соответствие или массив для обработки. + /// Число - Максимальное значение в переданном массиве + private IValue CalculateMax(IValue sourceData) + { + + IValue result = ValueFactory.Create(); + + if (!(sourceData is ArrayImpl)) + return result; + + if (((ArrayImpl)sourceData).Count() == 0) + return result; + + decimal numericResult = ((ArrayImpl)sourceData).Get(0).AsNumber(); + + foreach (IValue value in (ArrayImpl)sourceData) + numericResult = value.AsNumber() > numericResult ? value.AsNumber() : numericResult; + + result = ValueFactory.Create(numericResult); + + return result; + } + + /// + /// Получает первое значение из переданного массива + /// + /// Массив. Массив для обработки. + /// Произвольный - Первое значение из переданного массива + private IValue CalculateFirst(IValue sourceData) + { + + IValue result = ValueFactory.Create(); + + if (!(sourceData is ArrayImpl)) + return result; + + if (((ArrayImpl)sourceData).Count() == 0) + return result; + + result = ((ArrayImpl)sourceData).Get(0); + + return result; + } + + /// + /// Получает последнее значение из переданного массива + /// + /// Массив. Массив для обработки. + /// Произвольный - Последнее значение из переданного массива + private IValue CalculateLast(IValue sourceData) + { + + IValue result = ValueFactory.Create(); + + if (!(sourceData is ArrayImpl)) + return result; + + if (((ArrayImpl)sourceData).Count() == 0) + return result; + + int lastIndex = ((ArrayImpl)sourceData).UpperBound(); + result = ((ArrayImpl)sourceData).Get(lastIndex); + + return result; + } + + /// + /// Получает массив ключей из переданного соответствия или массив индексов из переданного массива + /// если переданный массив содержит единственное соответствие, то возвращаются ключи соответствия + /// + /// Соответствие, Массив. Соответствие или массив для обработки. + /// Массив - Ключи соответствия или индексы массива + private IValue CalculateKeys(IValue sourceData) + { + + IValue result = ValueFactory.Create(); + + if (sourceData is ArrayImpl && ((ArrayImpl)sourceData).Count() == 1) + sourceData = ((ArrayImpl)sourceData).Get(0); + + if (!(sourceData is MapImpl)) + return result; + + ArrayImpl keyArray = new ArrayImpl(); + if (sourceData is MapImpl) + foreach (KeyAndValueImpl KeyValue in (MapImpl)sourceData) + keyArray.Add(KeyValue.Key); + else if (sourceData is ArrayImpl) + for (int i = 0; i < ((ArrayImpl)sourceData).Count(); i++) + keyArray.Add(ValueFactory.Create(i)); + + return keyArray; + } + + /// + /// Доступные агрегатные функции + /// + private enum AggregateFuncEnum + { + none, + length, + sum, + avg, + min, + max, + first, + last, + keys + } + + /// + /// Получает используемую агрегатную функцию из переданного пути JSON path + /// + /// Строка. исходный путь JSON-path. + /// Строка. путь JSON-path без агрегатной функции. + /// AggregateFuncEnum - используемуя агрегатная функция + private AggregateFuncEnum GetAggregateFunc(string path, out string mainPath) + { + Dictionary aggregateFuncs = new Dictionary(); + aggregateFuncs.Add("count", AggregateFuncEnum.length); + aggregateFuncs.Add("length", AggregateFuncEnum.length); + aggregateFuncs.Add("sum", AggregateFuncEnum.sum); + aggregateFuncs.Add("avg", AggregateFuncEnum.avg); + aggregateFuncs.Add("min", AggregateFuncEnum.min); + aggregateFuncs.Add("max", AggregateFuncEnum.max); + aggregateFuncs.Add("first", AggregateFuncEnum.first); + aggregateFuncs.Add("last", AggregateFuncEnum.last); + aggregateFuncs.Add("keys", AggregateFuncEnum.keys); + + AggregateFuncEnum result = AggregateFuncEnum.none; + mainPath = path; + + string[] parts = path.Split('.'); + + if (parts.Length == 0) + return result; + + string aggregateFunc = parts[parts.GetUpperBound(0)].Trim(); + + if (!aggregateFunc.Trim().EndsWith("()")) + return result; + + aggregateFunc = aggregateFunc.Substring(0, aggregateFunc.Length - 2); + + if (aggregateFuncs.TryGetValue(aggregateFunc.ToLower(), out result)) + { + mainPath = String.Join(".", parts, 0, parts.Length - 1); + return result; + } + + return result; + } + + #endregion + + /// + /// Создает ИзвлечениеДанныхJSON + /// + /// ИзвлечениеДанныхJSON + [ScriptConstructor] + public static IRuntimeContextInstance Constructor() + { + return new JSONDataExtractor(); + } + + } +} diff --git a/src/OneScript.StandardLibrary/Json/JSONReader.cs b/src/OneScript.StandardLibrary/Json/JSONReader.cs index 3ff73e0b3..9eb28fedd 100644 --- a/src/OneScript.StandardLibrary/Json/JSONReader.cs +++ b/src/OneScript.StandardLibrary/Json/JSONReader.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using Newtonsoft.Json; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Text; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Json/JSONWriter.cs b/src/OneScript.StandardLibrary/Json/JSONWriter.cs index c558f21aa..db3b9bc31 100644 --- a/src/OneScript.StandardLibrary/Json/JSONWriter.cs +++ b/src/OneScript.StandardLibrary/Json/JSONWriter.cs @@ -12,8 +12,8 @@ This Source Code Form is subject to the terms of the using Newtonsoft.Json; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Text; -using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Native/CompiledBlock.cs b/src/OneScript.StandardLibrary/Native/CompiledBlock.cs index 447104c16..1f4e9fc52 100644 --- a/src/OneScript.StandardLibrary/Native/CompiledBlock.cs +++ b/src/OneScript.StandardLibrary/Native/CompiledBlock.cs @@ -14,6 +14,7 @@ This Source Code Form is subject to the terms of the using OneScript.Compilation.Binding; using OneScript.Contexts; using OneScript.DependencyInjection; +using OneScript.Exceptions; using OneScript.Language; using OneScript.Language.LexicalAnalysis; using OneScript.Language.SyntaxAnalysis; diff --git a/src/OneScript.StandardLibrary/NativeApi/NativeApiComponent.cs b/src/OneScript.StandardLibrary/NativeApi/NativeApiComponent.cs index 9eed43ae2..217932042 100644 --- a/src/OneScript.StandardLibrary/NativeApi/NativeApiComponent.cs +++ b/src/OneScript.StandardLibrary/NativeApi/NativeApiComponent.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/NativeApi/NativeApiLibrary.cs b/src/OneScript.StandardLibrary/NativeApi/NativeApiLibrary.cs index 139c74383..43462570e 100644 --- a/src/OneScript.StandardLibrary/NativeApi/NativeApiLibrary.cs +++ b/src/OneScript.StandardLibrary/NativeApi/NativeApiLibrary.cs @@ -9,7 +9,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/NativeApi/NativeApiPackage.cs b/src/OneScript.StandardLibrary/NativeApi/NativeApiPackage.cs index 268e63d52..1c8cdc09b 100644 --- a/src/OneScript.StandardLibrary/NativeApi/NativeApiPackage.cs +++ b/src/OneScript.StandardLibrary/NativeApi/NativeApiPackage.cs @@ -9,7 +9,7 @@ This Source Code Form is subject to the terms of the using System.IO; using System.Xml; using Ionic.Zip; -using OneScript.Commons; +using OneScript.Exceptions; namespace OneScript.StandardLibrary.NativeApi { diff --git a/src/OneScript.StandardLibrary/NativeApi/NativeApiValue.cs b/src/OneScript.StandardLibrary/NativeApi/NativeApiValue.cs index eaad39100..125323a66 100644 --- a/src/OneScript.StandardLibrary/NativeApi/NativeApiValue.cs +++ b/src/OneScript.StandardLibrary/NativeApi/NativeApiValue.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Processes/ProcessContext.cs b/src/OneScript.StandardLibrary/Processes/ProcessContext.cs index 2d3a0b364..9665dd729 100644 --- a/src/OneScript.StandardLibrary/Processes/ProcessContext.cs +++ b/src/OneScript.StandardLibrary/Processes/ProcessContext.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Diagnostics; using System.Linq; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Collections; using OneScript.StandardLibrary.Text; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/RandomNumberGenerator.cs b/src/OneScript.StandardLibrary/RandomNumberGenerator.cs index 450a806db..1a284cc48 100644 --- a/src/OneScript.StandardLibrary/RandomNumberGenerator.cs +++ b/src/OneScript.StandardLibrary/RandomNumberGenerator.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Reflector.cs b/src/OneScript.StandardLibrary/Reflector.cs index f7c27d4f1..fdb6e3ac3 100644 --- a/src/OneScript.StandardLibrary/Reflector.cs +++ b/src/OneScript.StandardLibrary/Reflector.cs @@ -9,8 +9,8 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Linq; using System.Reflection; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Execution; using OneScript.StandardLibrary.Collections; using OneScript.StandardLibrary.Collections.ValueTable; diff --git a/src/OneScript.StandardLibrary/StandardGlobalContext.cs b/src/OneScript.StandardLibrary/StandardGlobalContext.cs index 97dba0789..15f6f66e6 100644 --- a/src/OneScript.StandardLibrary/StandardGlobalContext.cs +++ b/src/OneScript.StandardLibrary/StandardGlobalContext.cs @@ -9,8 +9,8 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/StringOperations.cs b/src/OneScript.StandardLibrary/StringOperations.cs index f11a6cd73..c8321077f 100644 --- a/src/OneScript.StandardLibrary/StringOperations.cs +++ b/src/OneScript.StandardLibrary/StringOperations.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using OneScript.Commons; using OneScript.Contexts; using OneScript.Contexts.Enums; +using OneScript.Exceptions; using OneScript.StandardLibrary.Collections; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/SystemEnvironmentContext.cs b/src/OneScript.StandardLibrary/SystemEnvironmentContext.cs index 4d0bb299b..fd57231a2 100644 --- a/src/OneScript.StandardLibrary/SystemEnvironmentContext.cs +++ b/src/OneScript.StandardLibrary/SystemEnvironmentContext.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using System.Reflection; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Collections; using ScriptEngine; using ScriptEngine.HostedScript.Library; diff --git a/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs b/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs index ad667d873..4a3d23b94 100644 --- a/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs +++ b/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using System.Threading.Tasks; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Language; using OneScript.StandardLibrary.Collections; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Tasks/BackgroundTasksManager.cs b/src/OneScript.StandardLibrary/Tasks/BackgroundTasksManager.cs index 106e6ae04..b29110e35 100644 --- a/src/OneScript.StandardLibrary/Tasks/BackgroundTasksManager.cs +++ b/src/OneScript.StandardLibrary/Tasks/BackgroundTasksManager.cs @@ -12,6 +12,7 @@ This Source Code Form is subject to the terms of the using System.Threading.Tasks; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Collections; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Text/ConsoleContext.cs b/src/OneScript.StandardLibrary/Text/ConsoleContext.cs index 2d0ae2f46..2bab12cf9 100644 --- a/src/OneScript.StandardLibrary/Text/ConsoleContext.cs +++ b/src/OneScript.StandardLibrary/Text/ConsoleContext.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.IO; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Binary; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Text/TextDocumentContext.cs b/src/OneScript.StandardLibrary/Text/TextDocumentContext.cs index 5e7281fee..21ca9b1e1 100644 --- a/src/OneScript.StandardLibrary/Text/TextDocumentContext.cs +++ b/src/OneScript.StandardLibrary/Text/TextDocumentContext.cs @@ -12,6 +12,7 @@ This Source Code Form is subject to the terms of the using System.Text; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs b/src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs index 931e5ce21..46ccd36a6 100644 --- a/src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs +++ b/src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Text; -using OneScript.Commons; using OneScript.Contexts.Enums; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Text/TextReadImpl.cs b/src/OneScript.StandardLibrary/Text/TextReadImpl.cs index 049f2bfda..b66f5c5af 100644 --- a/src/OneScript.StandardLibrary/Text/TextReadImpl.cs +++ b/src/OneScript.StandardLibrary/Text/TextReadImpl.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using System.Text; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Binary; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Text/TextWriteImpl.cs b/src/OneScript.StandardLibrary/Text/TextWriteImpl.cs index aa93fabda..98d51b5d1 100644 --- a/src/OneScript.StandardLibrary/Text/TextWriteImpl.cs +++ b/src/OneScript.StandardLibrary/Text/TextWriteImpl.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.IO; using System.Text; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Timezones/GlobalTimezoneFunctions.cs b/src/OneScript.StandardLibrary/Timezones/GlobalTimezoneFunctions.cs index d8b17176a..5e7cbee32 100644 --- a/src/OneScript.StandardLibrary/Timezones/GlobalTimezoneFunctions.cs +++ b/src/OneScript.StandardLibrary/Timezones/GlobalTimezoneFunctions.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Linq; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Collections; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/BooleanTypeAdjuster.cs b/src/OneScript.StandardLibrary/TypeDescriptions/BooleanTypeAdjuster.cs index 58c6227f1..4ca274a7c 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/BooleanTypeAdjuster.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/BooleanTypeAdjuster.cs @@ -5,7 +5,7 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/NumberQualifiers.cs b/src/OneScript.StandardLibrary/TypeDescriptions/NumberQualifiers.cs index a65cb14b9..96ea0a8bf 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/NumberQualifiers.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/NumberQualifiers.cs @@ -7,6 +7,7 @@ This Source Code Form is subject to the terms of the using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs index 5822b2796..8585c1d59 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Linq; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Collections; using OneScript.Types; using OneScript.Values; diff --git a/src/OneScript.StandardLibrary/XDTO/XDTOSerializer.cs b/src/OneScript.StandardLibrary/XDTO/XDTOSerializer.cs index 4e2eec232..33aa18c94 100644 --- a/src/OneScript.StandardLibrary/XDTO/XDTOSerializer.cs +++ b/src/OneScript.StandardLibrary/XDTO/XDTOSerializer.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Xml; using OneScript.Types; using OneScript.Values; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XMLSchemaSet.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XMLSchemaSet.cs index 9b0e5b6d0..a29120f03 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XMLSchemaSet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XMLSchemaSet.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Linq; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Values; using ScriptEngine; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs index 9f20fbdec..672f94f97 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Interfaces; using OneScript.Values; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSNamedComponentMap.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSNamedComponentMap.cs index ad13233ca..99739deb7 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSNamedComponentMap.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSNamedComponentMap.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; using System.Linq; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Interfaces; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchema.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchema.cs index 84d422759..3d95f6691 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchema.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchema.cs @@ -10,8 +10,8 @@ This Source Code Form is subject to the terms of the using System.Text; using System.Xml; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XDTO; using OneScript.StandardLibrary.Xml; using OneScript.StandardLibrary.XMLSchema.Collections; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchemaSerializer.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchemaSerializer.cs index 96dad80b7..30d19fbd1 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchemaSerializer.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchemaSerializer.cs @@ -7,7 +7,7 @@ This Source Code Form is subject to the terms of the using System.Xml; using System.Xml.Schema; -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.StandardLibrary.Xml; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAnnotation.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAnnotation.cs index 8f5219b99..adefd01fc 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAnnotation.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAnnotation.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs index 225b042a1..b7a4bcc37 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Xml; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSEnumerationFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSEnumerationFacet.cs index 0ea561255..2a8423962 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSEnumerationFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSEnumerationFacet.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSFractionDigitsFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSFractionDigitsFacet.cs index 14857b168..5014f40f9 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSFractionDigitsFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSFractionDigitsFacet.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSIdentityConstraintDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSIdentityConstraintDefinition.cs index 444d023ad..d1aaf327a 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSIdentityConstraintDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSIdentityConstraintDefinition.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Xml; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSLengthFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSLengthFacet.cs index a7cc337b3..7ac5f7595 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSLengthFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSLengthFacet.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxExclusiveFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxExclusiveFacet.cs index df0941834..7ffbe5dd9 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxExclusiveFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxExclusiveFacet.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs index 54f8c7d8a..b4efde770 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxLengthFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxLengthFacet.cs index 4543d276e..47e281f27 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxLengthFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxLengthFacet.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinExclusiveFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinExclusiveFacet.cs index 11d28d4c7..8bf4ca067 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinExclusiveFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinExclusiveFacet.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinInclusiveFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinInclusiveFacet.cs index 57e328fd8..f122a0290 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinInclusiveFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinInclusiveFacet.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinLengthFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinLengthFacet.cs index dd22c808d..57cea6917 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinLengthFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinLengthFacet.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroup.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroup.cs index e3903fa1a..ac770d4e8 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroup.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroup.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroupDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroupDefinition.cs index ab072beb6..745e5ffac 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroupDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroupDefinition.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Xml; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSParticle.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSParticle.cs index b74c6036a..a4146fca0 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSParticle.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSParticle.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSPatternFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSPatternFacet.cs index 67c8f6892..fcb15227c 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSPatternFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSPatternFacet.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs index 4b8203354..eb61ed102 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Xml; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSTotalDigitsFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSTotalDigitsFacet.cs index 70d06b54d..f4ae00949 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSTotalDigitsFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSTotalDigitsFacet.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWhitespaceFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWhitespaceFacet.cs index f071416dc..a36bb7060 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWhitespaceFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWhitespaceFacet.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWildcard.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWildcard.cs index 33798f228..d770a6778 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWildcard.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWildcard.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Xml.Schema; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Collections; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; diff --git a/src/OneScript.StandardLibrary/Xml/XSLTransform.cs b/src/OneScript.StandardLibrary/Xml/XSLTransform.cs index f07ad7c9f..a352bfdfd 100644 --- a/src/OneScript.StandardLibrary/Xml/XSLTransform.cs +++ b/src/OneScript.StandardLibrary/Xml/XSLTransform.cs @@ -1,220 +1,218 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ - -using System; -using System.Xml; -using System.Xml.Xsl; -using OneScript.Commons; -using OneScript.Contexts; -using OneScript.Types; -using ScriptEngine.Machine; -using ScriptEngine.Machine.Contexts; - -namespace OneScript.StandardLibrary.Xml -{ - /// - /// Предназначен для преобразования текстов XML. - /// - [ContextClass("ПреобразованиеXSL", "XSLTransform")] - public class XSLTransform : AutoContext - { - private XslCompiledTransform _xslTransform; - private XsltArgumentList _argumentList; - - /// - /// Загружает таблицу стилей XSL - /// - /// ЧтениеXML. Объект чтения XML, из которого будет загружена таблица стилей XSL. - [ContextMethod("ЗагрузитьТаблицуСтилей", "LoadXSLStylesheet")] - public void LoadXSLStylesheet(XmlReaderImpl xmlReader) - { - _xslTransform.Load(xmlReader.GetNativeReader()); - } - - /// - /// Загружает таблицу стилей XSL - /// - /// Строка. Строка, содержащая описание преобразования XSL. - [ContextMethod("ЗагрузитьТаблицуСтилейXSLИзСтроки", "LoadXSLStylesheetFromString")] - public void LoadXSLStylesheetFromString(string xmlString) - { - XmlReaderImpl _reader = new XmlReaderImpl(); - - _reader.SetString(xmlString); - - LoadXSLStylesheet(_reader); - } - - /// - /// Загружает описание преобразования XSL из узла DOM. - /// - /// УзелDOM. Узел DOM, представляющий собой шаблон XSL. - [ContextMethod("ЗагрузитьТаблицуСтилейXSLИзУзла", "LoadXSLStylesheetFromNode")] - public void LoadXSLStylesheetFromNode(IValue xmlNode) - { - throw new NotImplementedException(); - } - - /// - /// Загружает описание преобразования XSL из файла. - /// - /// Строка. Имя файла, из которого должно быть загружено описание преобразования XSL. - [ContextMethod("ЗагрузитьТаблицуСтилейXSLИзФайла", "LoadXSLStylesheetFromFile")] - public void LoadXSLStylesheetFromFile(string fileName) - { - XmlReaderImpl _reader = new XmlReaderImpl(); - - _reader.OpenFile(fileName); - - LoadXSLStylesheet(_reader); - } - - /// - /// Очищает внутреннее состояние. - /// - [ContextMethod("Очистить", "Clear")] - public void Clear() - { - _xslTransform = new XslCompiledTransform(); - _argumentList = new XsltArgumentList(); - } - - /// - /// Выполняет преобразование XML-документа. - /// Используется описание преобразования и значения параметров, ранее установленные в данном объекте. - /// - /// ЧтениеXML. Объект чтения XML, из которого будет прочитан исходный XML документ для преобразования. - /// ЗаписьXML. Объект записи XML, в который будет записан результат преобразования. - [ContextMethod("Преобразовать", "Transform")] - public void Transform(XmlReaderImpl xmlReader, XmlWriterImpl xmlWriter) - { - - XmlReader _reader = xmlReader.GetNativeReader(); - XmlWriter _writer = xmlWriter.GetNativeWriter(); - - _xslTransform.Transform(_reader, _argumentList, _writer); - } - - /// - /// Выполняет преобразование XML-документа. - /// Используется описание преобразования и значения параметров, ранее установленные в данном объекте. - /// - /// Строка. Строка, в которой находится XML-документ. - /// ЗаписьXML. Объект записи XML, в который будет записан результат преобразования. - /// Указание данного параметра имеет смысл, если преобразование выполняется в документ XML. - /// При указании данного параметра результат преобразования будет записываться в объект ЗаписьXML, - /// возвращаемое значение в данном случае будет отсутствовать. - /// Строка. Результат преобразования. - [ContextMethod("ПреобразоватьИзСтроки", "TransformFromString")] - public string TransformFromString(string xmlString, XmlWriterImpl xmlWriter = null) - { - XmlReaderImpl _reader = new XmlReaderImpl(); - - _reader.SetString(xmlString); - - XmlWriterImpl _writer = new XmlWriterImpl(); - _writer.SetString(); - - Transform(_reader, _writer); - - string result = _writer.Close().ToString(); - - if (xmlWriter != null) - xmlWriter.WriteRaw(result); - - return result; - } - - /// - /// Выполняет преобразование XML-документа. - /// Используется описание преобразования и значения параметров, ранее установленные в данном объекте. - /// - /// УзелDOM. Узел DOM - исходное дерево для преобразования XSL. - /// ЗаписьXML. Объект записи XML, в который будет записан результат преобразования. - /// Указание данного параметра имеет смысл, если преобразование выполняется в документ XML. - /// При указании данного параметра результат преобразования будет записываться в объект ЗаписьXML, - /// возвращаемое значение в данном случае будет отсутствовать. - /// Строка. Результат преобразования. - [ContextMethod("ПреобразоватьИзУзла", "TransformFromNode")] - public string TransformFromNode(IValue xmlNode, XmlWriterImpl xmlWriter = null) - { - throw new NotImplementedException(); - } - - /// - /// Выполняет преобразование XML-документа. - /// Используется описание преобразования и значения параметров, ранее установленные в данном объекте. - /// - /// Строка. Имя файла, в котором находится преобразуемый XML-документ. - /// ЗаписьXML. Объект записи XML, в который будет записан результат преобразования. - /// Указание данного параметра имеет смысл, если преобразование выполняется в документ XML. - /// При указании данного параметра результат преобразования будет записываться в объект ЗаписьXML, - /// возвращаемое значение в данном случае будет отсутствовать. - /// Строка. Результат преобразования. - [ContextMethod("ПреобразоватьИзФайла", "TransformFromFile")] - public string TransformFromFile(string fileName, XmlWriterImpl xmlWriter = null) - { - XmlReaderImpl _reader = new XmlReaderImpl(); - - _reader.OpenFile(fileName); - - XmlWriterImpl _writer = new XmlWriterImpl(); - _writer.SetString(); - - Transform(_reader, _writer); - - string result = _writer.Close().ToString(); - - if (xmlWriter != null) - xmlWriter.WriteRaw(result); - - return result; - } - - /// - /// Добавляет значение параметра преобразования. - /// - /// Строка. Полное имя параметра. - /// Булево, Число, Строка. Значение параметра. - [ContextMethod("ДобавитьПараметр", "AddParameter")] - public void AddParameter(string fullName, IValue value) - { - var _value = ContextValuesMarshaller.ConvertToClrObject(value); - _argumentList.AddParam(fullName, "", _value); - } - - /// - /// Удаляет значение параметра преобразования. - /// - /// Строка. Полное имя параметра. - [ContextMethod("УдалитьПараметр", "RemoveParameter")] - public void RemoveParameter(string fullName) - { - _argumentList.RemoveParam(fullName, ""); - } - - /// - /// Создает XSLTransform - /// - /// XSLTransform - public XSLTransform() - { - _xslTransform = new XslCompiledTransform(); - _argumentList = new XsltArgumentList(); - } - - /// - /// Создает ПреобразованиеXSL - /// - /// ПреобразованиеXSL - [ScriptConstructor] - public static IRuntimeContextInstance Constructor() - { - return new XSLTransform(); - } - } +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.Xml; +using System.Xml.Xsl; +using OneScript.Contexts; +using ScriptEngine.Machine; +using ScriptEngine.Machine.Contexts; + +namespace OneScript.StandardLibrary.Xml +{ + /// + /// Предназначен для преобразования текстов XML. + /// + [ContextClass("ПреобразованиеXSL", "XSLTransform")] + public class XSLTransform : AutoContext + { + private XslCompiledTransform _xslTransform; + private XsltArgumentList _argumentList; + + /// + /// Загружает таблицу стилей XSL + /// + /// ЧтениеXML. Объект чтения XML, из которого будет загружена таблица стилей XSL. + [ContextMethod("ЗагрузитьТаблицуСтилей", "LoadXSLStylesheet")] + public void LoadXSLStylesheet(XmlReaderImpl xmlReader) + { + _xslTransform.Load(xmlReader.GetNativeReader()); + } + + /// + /// Загружает таблицу стилей XSL + /// + /// Строка. Строка, содержащая описание преобразования XSL. + [ContextMethod("ЗагрузитьТаблицуСтилейXSLИзСтроки", "LoadXSLStylesheetFromString")] + public void LoadXSLStylesheetFromString(string xmlString) + { + XmlReaderImpl _reader = new XmlReaderImpl(); + + _reader.SetString(xmlString); + + LoadXSLStylesheet(_reader); + } + + /// + /// Загружает описание преобразования XSL из узла DOM. + /// + /// УзелDOM. Узел DOM, представляющий собой шаблон XSL. + [ContextMethod("ЗагрузитьТаблицуСтилейXSLИзУзла", "LoadXSLStylesheetFromNode")] + public void LoadXSLStylesheetFromNode(IValue xmlNode) + { + throw new NotImplementedException(); + } + + /// + /// Загружает описание преобразования XSL из файла. + /// + /// Строка. Имя файла, из которого должно быть загружено описание преобразования XSL. + [ContextMethod("ЗагрузитьТаблицуСтилейXSLИзФайла", "LoadXSLStylesheetFromFile")] + public void LoadXSLStylesheetFromFile(string fileName) + { + XmlReaderImpl _reader = new XmlReaderImpl(); + + _reader.OpenFile(fileName); + + LoadXSLStylesheet(_reader); + } + + /// + /// Очищает внутреннее состояние. + /// + [ContextMethod("Очистить", "Clear")] + public void Clear() + { + _xslTransform = new XslCompiledTransform(); + _argumentList = new XsltArgumentList(); + } + + /// + /// Выполняет преобразование XML-документа. + /// Используется описание преобразования и значения параметров, ранее установленные в данном объекте. + /// + /// ЧтениеXML. Объект чтения XML, из которого будет прочитан исходный XML документ для преобразования. + /// ЗаписьXML. Объект записи XML, в который будет записан результат преобразования. + [ContextMethod("Преобразовать", "Transform")] + public void Transform(XmlReaderImpl xmlReader, XmlWriterImpl xmlWriter) + { + + XmlReader _reader = xmlReader.GetNativeReader(); + XmlWriter _writer = xmlWriter.GetNativeWriter(); + + _xslTransform.Transform(_reader, _argumentList, _writer); + } + + /// + /// Выполняет преобразование XML-документа. + /// Используется описание преобразования и значения параметров, ранее установленные в данном объекте. + /// + /// Строка. Строка, в которой находится XML-документ. + /// ЗаписьXML. Объект записи XML, в который будет записан результат преобразования. + /// Указание данного параметра имеет смысл, если преобразование выполняется в документ XML. + /// При указании данного параметра результат преобразования будет записываться в объект ЗаписьXML, + /// возвращаемое значение в данном случае будет отсутствовать. + /// Строка. Результат преобразования. + [ContextMethod("ПреобразоватьИзСтроки", "TransformFromString")] + public string TransformFromString(string xmlString, XmlWriterImpl xmlWriter = null) + { + XmlReaderImpl _reader = new XmlReaderImpl(); + + _reader.SetString(xmlString); + + XmlWriterImpl _writer = new XmlWriterImpl(); + _writer.SetString(); + + Transform(_reader, _writer); + + string result = _writer.Close().ToString(); + + if (xmlWriter != null) + xmlWriter.WriteRaw(result); + + return result; + } + + /// + /// Выполняет преобразование XML-документа. + /// Используется описание преобразования и значения параметров, ранее установленные в данном объекте. + /// + /// УзелDOM. Узел DOM - исходное дерево для преобразования XSL. + /// ЗаписьXML. Объект записи XML, в который будет записан результат преобразования. + /// Указание данного параметра имеет смысл, если преобразование выполняется в документ XML. + /// При указании данного параметра результат преобразования будет записываться в объект ЗаписьXML, + /// возвращаемое значение в данном случае будет отсутствовать. + /// Строка. Результат преобразования. + [ContextMethod("ПреобразоватьИзУзла", "TransformFromNode")] + public string TransformFromNode(IValue xmlNode, XmlWriterImpl xmlWriter = null) + { + throw new NotImplementedException(); + } + + /// + /// Выполняет преобразование XML-документа. + /// Используется описание преобразования и значения параметров, ранее установленные в данном объекте. + /// + /// Строка. Имя файла, в котором находится преобразуемый XML-документ. + /// ЗаписьXML. Объект записи XML, в который будет записан результат преобразования. + /// Указание данного параметра имеет смысл, если преобразование выполняется в документ XML. + /// При указании данного параметра результат преобразования будет записываться в объект ЗаписьXML, + /// возвращаемое значение в данном случае будет отсутствовать. + /// Строка. Результат преобразования. + [ContextMethod("ПреобразоватьИзФайла", "TransformFromFile")] + public string TransformFromFile(string fileName, XmlWriterImpl xmlWriter = null) + { + XmlReaderImpl _reader = new XmlReaderImpl(); + + _reader.OpenFile(fileName); + + XmlWriterImpl _writer = new XmlWriterImpl(); + _writer.SetString(); + + Transform(_reader, _writer); + + string result = _writer.Close().ToString(); + + if (xmlWriter != null) + xmlWriter.WriteRaw(result); + + return result; + } + + /// + /// Добавляет значение параметра преобразования. + /// + /// Строка. Полное имя параметра. + /// Булево, Число, Строка. Значение параметра. + [ContextMethod("ДобавитьПараметр", "AddParameter")] + public void AddParameter(string fullName, IValue value) + { + var _value = ContextValuesMarshaller.ConvertToClrObject(value); + _argumentList.AddParam(fullName, "", _value); + } + + /// + /// Удаляет значение параметра преобразования. + /// + /// Строка. Полное имя параметра. + [ContextMethod("УдалитьПараметр", "RemoveParameter")] + public void RemoveParameter(string fullName) + { + _argumentList.RemoveParam(fullName, ""); + } + + /// + /// Создает XSLTransform + /// + /// XSLTransform + public XSLTransform() + { + _xslTransform = new XslCompiledTransform(); + _argumentList = new XsltArgumentList(); + } + + /// + /// Создает ПреобразованиеXSL + /// + /// ПреобразованиеXSL + [ScriptConstructor] + public static IRuntimeContextInstance Constructor() + { + return new XSLTransform(); + } + } } \ No newline at end of file diff --git a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs index 1408014d6..5345c40d6 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Diagnostics; using System.Xml; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Binary; using OneScript.Types; using OneScript.Values; diff --git a/src/OneScript.StandardLibrary/Xml/XmlReaderImpl.cs b/src/OneScript.StandardLibrary/Xml/XmlReaderImpl.cs index 5a944cc51..4b9de8d2f 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlReaderImpl.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlReaderImpl.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.IO; using System.Xml; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Xml/XmlSpaceEnum.cs b/src/OneScript.StandardLibrary/Xml/XmlSpaceEnum.cs index 744f9edf4..671f629ee 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlSpaceEnum.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlSpaceEnum.cs @@ -5,12 +5,9 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System.Collections.Generic; -using System.Linq; using System.Xml; using OneScript.Contexts.Enums; using OneScript.Types; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.Xml diff --git a/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs b/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs index c43b2eee1..a6b72ce14 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs @@ -11,8 +11,8 @@ This Source Code Form is subject to the terms of the using System.Linq; using System.Text; using System.Xml; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Zip/ZipReader.cs b/src/OneScript.StandardLibrary/Zip/ZipReader.cs index 64701220b..4e7cb1a61 100644 --- a/src/OneScript.StandardLibrary/Zip/ZipReader.cs +++ b/src/OneScript.StandardLibrary/Zip/ZipReader.cs @@ -11,8 +11,8 @@ This Source Code Form is subject to the terms of the using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; using System.IO; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary.Binary; using OneScript.Types; diff --git a/src/OneScript.StandardLibrary/Zip/ZipWriter.cs b/src/OneScript.StandardLibrary/Zip/ZipWriter.cs index 733d300bb..856593a40 100644 --- a/src/OneScript.StandardLibrary/Zip/ZipWriter.cs +++ b/src/OneScript.StandardLibrary/Zip/ZipWriter.cs @@ -11,8 +11,8 @@ This Source Code Form is subject to the terms of the using System.Text; using Ionic.Zip; using Ionic.Zlib; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs b/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs index 9f055cf0f..aceb67955 100644 --- a/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs +++ b/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System; using System.Collections; using System.Collections.Generic; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs b/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs index f53a3013b..5549026c4 100644 --- a/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs +++ b/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs @@ -10,8 +10,8 @@ This Source Code Form is subject to the terms of the using System.IO; using System.Linq; using System.Text; -using OneScript.Commons; using OneScript.Compilation; +using OneScript.Exceptions; using OneScript.Localization; using OneScript.Sources; diff --git a/src/ScriptEngine.HostedScript/LibraryLoader.cs b/src/ScriptEngine.HostedScript/LibraryLoader.cs index a02ad4f1a..f0227b1ec 100644 --- a/src/ScriptEngine.HostedScript/LibraryLoader.cs +++ b/src/ScriptEngine.HostedScript/LibraryLoader.cs @@ -13,6 +13,7 @@ This Source Code Form is subject to the terms of the using System.Linq; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Execution; namespace ScriptEngine.HostedScript diff --git a/src/ScriptEngine.HostedScript/SystemGlobalContext.cs b/src/ScriptEngine.HostedScript/SystemGlobalContext.cs index 32a6a6dc6..cfe970db5 100644 --- a/src/ScriptEngine.HostedScript/SystemGlobalContext.cs +++ b/src/ScriptEngine.HostedScript/SystemGlobalContext.cs @@ -5,8 +5,6 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ using System; -using System.Collections.Generic; -using System.Linq; using OneScript.Contexts; using OneScript.StandardLibrary; using OneScript.StandardLibrary.Collections; diff --git a/src/ScriptEngine.HostedScript/TemplateStorage.cs b/src/ScriptEngine.HostedScript/TemplateStorage.cs index 9af73082b..0c41bd64e 100644 --- a/src/ScriptEngine.HostedScript/TemplateStorage.cs +++ b/src/ScriptEngine.HostedScript/TemplateStorage.cs @@ -7,9 +7,9 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; -using OneScript.Commons; using OneScript.Contexts; using OneScript.Contexts.Enums; +using OneScript.Exceptions; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs index abd2fdbad..c37e0938b 100644 --- a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs +++ b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs @@ -11,10 +11,10 @@ This Source Code Form is subject to the terms of the using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; -using OneScript.Commons; using OneScript.Compilation; using OneScript.Compilation.Binding; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Execution; using OneScript.Language; using OneScript.Language.Extensions; diff --git a/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs b/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs index d116223af..33887c4dc 100644 --- a/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs +++ b/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs @@ -13,7 +13,6 @@ This Source Code Form is subject to the terms of the using OneScript.Language; using OneScript.Language.SyntaxAnalysis; using OneScript.Types; -using ScriptEngine.Compiler; using ScriptEngine.Machine; namespace ScriptEngine.Hosting diff --git a/src/ScriptEngine/ICompilerService.cs b/src/ScriptEngine/ICompilerService.cs index 3b5cc8047..452a1b872 100644 --- a/src/ScriptEngine/ICompilerService.cs +++ b/src/ScriptEngine/ICompilerService.cs @@ -6,7 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using OneScript.Compilation.Binding; using OneScript.Contexts; using OneScript.Execution; using ScriptEngine.Machine; diff --git a/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs b/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs index 613f8b847..b7865000f 100644 --- a/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs +++ b/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using System.Linq; using System.Reflection; using OneScript.Commons; +using OneScript.Exceptions; namespace ScriptEngine.Machine { diff --git a/src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs b/src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs index aed9b8341..8412de908 100755 --- a/src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs +++ b/src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs @@ -13,6 +13,7 @@ This Source Code Form is subject to the terms of the using OneScript.Compilation; using OneScript.Compilation.Binding; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Execution; using OneScript.Types; diff --git a/src/ScriptEngine/Machine/Contexts/AutoContext.cs b/src/ScriptEngine/Machine/Contexts/AutoContext.cs index a29ba9559..ba81e2639 100644 --- a/src/ScriptEngine/Machine/Contexts/AutoContext.cs +++ b/src/ScriptEngine/Machine/Contexts/AutoContext.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Diagnostics; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; namespace ScriptEngine.Machine.Contexts diff --git a/src/ScriptEngine/Machine/Contexts/AutoScriptDrivenObject.cs b/src/ScriptEngine/Machine/Contexts/AutoScriptDrivenObject.cs index 8c360a660..520eaa9ae 100644 --- a/src/ScriptEngine/Machine/Contexts/AutoScriptDrivenObject.cs +++ b/src/ScriptEngine/Machine/Contexts/AutoScriptDrivenObject.cs @@ -6,11 +6,10 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using System.Collections.Generic; -using OneScript.Commons; using OneScript.Compilation; using OneScript.Compilation.Binding; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Execution; using OneScript.Sources; diff --git a/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs b/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs index c93b7221a..bdf4116d2 100644 --- a/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs +++ b/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using System.Linq; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using OneScript.Values; using ScriptEngine.Types; diff --git a/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs b/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs index de506b794..2404915e1 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs @@ -1,320 +1,320 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ -using System; -using System.Dynamic; -using System.Linq; -using OneScript.Commons; -using OneScript.Contexts; -using OneScript.Types; -using OneScript.Values; - -namespace ScriptEngine.Machine.Contexts -{ - public abstract class ContextIValueImpl : BslObjectValue, IRuntimeContextInstance, ISystemTypeAcceptor - { - private TypeDescriptor _type; - - protected ContextIValueImpl() : this(BasicTypes.UnknownType) - { - } - - protected ContextIValueImpl(TypeDescriptor type) - { - _type = type; - } - - void ISystemTypeAcceptor.AssignType(TypeDescriptor type) - { - _type = type; - } - - protected void DefineType(TypeDescriptor type) - { - _type = type; - } - - public override string ToString() - { - if (_type == BasicTypes.UnknownType) - TryDetermineOwnType(); - - return _type.Name; - } - - #region IValue Members - - public override TypeDescriptor SystemType - { - get - { - if (_type != BasicTypes.UnknownType) - return _type; - - if (!TryDetermineOwnType()) - { - throw new InvalidOperationException($"Type {GetType()} is not defined"); - } - - return _type; - } - } - - private bool TryDetermineOwnType() - { - var mgr = MachineInstance.Current?.TypeManager; - if (mgr?.IsKnownType(GetType()) ?? false) - { - _type = mgr.GetTypeByFrameworkType(GetType()); - return true; - } - - return false; - } - - #endregion - - #region IComparable Members - - public override int CompareTo(IValue other) - { - throw RuntimeException.ComparisonNotSupportedException(); - } - - #endregion - - #region IEquatable Members - - public override bool Equals(IValue other) - { - if (!(other is BslObjectValue _)) - return false; - - return ReferenceEquals(this, other); - } - - #endregion - - #region IRuntimeContextInstance Members - - public virtual bool IsIndexed => false; - - public virtual bool DynamicMethodSignatures => false; - - public virtual IValue GetIndexedValue(IValue index) - { - throw new NotImplementedException(); - } - - public virtual void SetIndexedValue(IValue index, IValue val) - { - throw new NotImplementedException(); - } - - public virtual int GetPropertyNumber(string name) - { - throw PropertyAccessException.PropNotFoundException(name); - } - public virtual bool IsPropReadable(int propNum) - { - throw new NotImplementedException(); - } - - public virtual bool IsPropWritable(int propNum) - { - throw new NotImplementedException(); - } - public virtual IValue GetPropValue(int propNum) - { - throw new NotImplementedException(); - } - public virtual void SetPropValue(int propNum, IValue newVal) - { - throw new NotImplementedException(); - } - - public virtual int GetPropCount() - { - throw new NotImplementedException(); - } - - public virtual string GetPropName(int propNum) - { - throw new NotImplementedException(); - } - - public virtual int GetMethodsCount() - { - throw new NotImplementedException(); - } - - public virtual int GetMethodNumber(string name) - { - throw RuntimeException.MethodNotFoundException(name); - } - - public virtual BslMethodInfo GetMethodInfo(int methodNumber) - { - throw new NotImplementedException(); - } - - public virtual BslPropertyInfo GetPropertyInfo(int propertyNumber) - { - throw new NotImplementedException(); - } - - public virtual void CallAsProcedure(int methodNumber, IValue[] arguments) - { - throw new NotImplementedException(); - } - public virtual void CallAsFunction(int methodNumber, IValue[] arguments, out IValue retValue) - { - throw new NotImplementedException(); - } - - #endregion - - #region DynamicObject members - - public override bool TryGetMember(GetMemberBinder binder, out object result) - { - try - { - var propIdx = GetPropertyNumber(binder.Name); - if (!IsPropReadable(propIdx)) - { - result = null; - return false; - } - - result = ContextValuesMarshaller.ConvertToClrObject(GetPropValue(propIdx)); - return true; - } - catch (PropertyAccessException) - { - result = null; - return false; - } - catch (ValueMarshallingException) - { - result = null; - return false; - } - } - - public override bool TrySetMember(SetMemberBinder binder, object value) - { - try - { - var propIdx = GetPropertyNumber(binder.Name); - if (!IsPropWritable(propIdx)) - { - return false; - } - - SetPropValue(propIdx, ContextValuesMarshaller.ConvertDynamicValue(value)); - return true; - } - catch (PropertyAccessException) - { - return false; - } - catch (NotSupportedException) - { - return false; - } - } - - public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) - { - if (!IsIndexed) - { - result = null; - return false; - } - - var index = ContextValuesMarshaller.ConvertDynamicIndex(indexes[0]); - result = ContextValuesMarshaller.ConvertToClrObject(GetIndexedValue(index)); - return true; - } - - public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value) - { - if (!IsIndexed) - { - return false; - } - - var index = ContextValuesMarshaller.ConvertDynamicIndex(indexes[0]); - SetIndexedValue(index, ContextValuesMarshaller.ConvertDynamicValue(value)); - return true; - } - - public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) - { - int methIdx; - try - { - methIdx = GetMethodNumber(binder.Name); - } - catch (MethodAccessException) - { - result = null; - return false; - } - - var parameters = GetMethodInfo(methIdx).GetParameters(); - if (args.Length > parameters.Length) - throw RuntimeException.TooManyArgumentsPassed(); - - var valueArgs = new IValue[parameters.Length]; - var passedArgs = args.Select(x => ContextValuesMarshaller.ConvertDynamicValue(x)).ToArray(); - - for (int i = 0; i < valueArgs.Length; i++) - { - if (i < passedArgs.Length) - valueArgs[i] = passedArgs[i]; - else - valueArgs[i] = ValueFactory.CreateInvalidValueMarker(); - } - - CallAsFunction(methIdx, valueArgs, out IValue methResult); - result = methResult == null ? null : ContextValuesMarshaller.ConvertToClrObject(methResult); - - return true; - } - - #endregion - - public override int CompareTo(BslValue other) - { - if (other.GetType() == GetType()) - { - if (this.Equals(other)) - { - return 0; - } - else - { - throw RuntimeException.ComparisonNotSupportedException(); - } - } - else - { - return this.GetType().ToString().CompareTo(other.GetType().ToString()); - } - } - - public override bool Equals(BslValue other) - { - if (other == null) - return false; - - return ReferenceEquals(this, other); - } - } - -} +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ +using System; +using System.Dynamic; +using System.Linq; +using OneScript.Contexts; +using OneScript.Exceptions; +using OneScript.Types; +using OneScript.Values; + +namespace ScriptEngine.Machine.Contexts +{ + public abstract class ContextIValueImpl : BslObjectValue, IRuntimeContextInstance, ISystemTypeAcceptor + { + private TypeDescriptor _type; + + protected ContextIValueImpl() : this(BasicTypes.UnknownType) + { + } + + protected ContextIValueImpl(TypeDescriptor type) + { + _type = type; + } + + void ISystemTypeAcceptor.AssignType(TypeDescriptor type) + { + _type = type; + } + + protected void DefineType(TypeDescriptor type) + { + _type = type; + } + + public override string ToString() + { + if (_type == BasicTypes.UnknownType) + TryDetermineOwnType(); + + return _type.Name; + } + + #region IValue Members + + public override TypeDescriptor SystemType + { + get + { + if (_type != BasicTypes.UnknownType) + return _type; + + if (!TryDetermineOwnType()) + { + throw new InvalidOperationException($"Type {GetType()} is not defined"); + } + + return _type; + } + } + + private bool TryDetermineOwnType() + { + var mgr = MachineInstance.Current?.TypeManager; + if (mgr?.IsKnownType(GetType()) ?? false) + { + _type = mgr.GetTypeByFrameworkType(GetType()); + return true; + } + + return false; + } + + #endregion + + #region IComparable Members + + public override int CompareTo(IValue other) + { + throw RuntimeException.ComparisonNotSupportedException(); + } + + #endregion + + #region IEquatable Members + + public override bool Equals(IValue other) + { + if (!(other is BslObjectValue _)) + return false; + + return ReferenceEquals(this, other); + } + + #endregion + + #region IRuntimeContextInstance Members + + public virtual bool IsIndexed => false; + + public virtual bool DynamicMethodSignatures => false; + + public virtual IValue GetIndexedValue(IValue index) + { + throw new NotImplementedException(); + } + + public virtual void SetIndexedValue(IValue index, IValue val) + { + throw new NotImplementedException(); + } + + public virtual int GetPropertyNumber(string name) + { + throw PropertyAccessException.PropNotFoundException(name); + } + public virtual bool IsPropReadable(int propNum) + { + throw new NotImplementedException(); + } + + public virtual bool IsPropWritable(int propNum) + { + throw new NotImplementedException(); + } + public virtual IValue GetPropValue(int propNum) + { + throw new NotImplementedException(); + } + public virtual void SetPropValue(int propNum, IValue newVal) + { + throw new NotImplementedException(); + } + + public virtual int GetPropCount() + { + throw new NotImplementedException(); + } + + public virtual string GetPropName(int propNum) + { + throw new NotImplementedException(); + } + + public virtual int GetMethodsCount() + { + throw new NotImplementedException(); + } + + public virtual int GetMethodNumber(string name) + { + throw RuntimeException.MethodNotFoundException(name); + } + + public virtual BslMethodInfo GetMethodInfo(int methodNumber) + { + throw new NotImplementedException(); + } + + public virtual BslPropertyInfo GetPropertyInfo(int propertyNumber) + { + throw new NotImplementedException(); + } + + public virtual void CallAsProcedure(int methodNumber, IValue[] arguments) + { + throw new NotImplementedException(); + } + public virtual void CallAsFunction(int methodNumber, IValue[] arguments, out IValue retValue) + { + throw new NotImplementedException(); + } + + #endregion + + #region DynamicObject members + + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + try + { + var propIdx = GetPropertyNumber(binder.Name); + if (!IsPropReadable(propIdx)) + { + result = null; + return false; + } + + result = ContextValuesMarshaller.ConvertToClrObject(GetPropValue(propIdx)); + return true; + } + catch (PropertyAccessException) + { + result = null; + return false; + } + catch (ValueMarshallingException) + { + result = null; + return false; + } + } + + public override bool TrySetMember(SetMemberBinder binder, object value) + { + try + { + var propIdx = GetPropertyNumber(binder.Name); + if (!IsPropWritable(propIdx)) + { + return false; + } + + SetPropValue(propIdx, ContextValuesMarshaller.ConvertDynamicValue(value)); + return true; + } + catch (PropertyAccessException) + { + return false; + } + catch (NotSupportedException) + { + return false; + } + } + + public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) + { + if (!IsIndexed) + { + result = null; + return false; + } + + var index = ContextValuesMarshaller.ConvertDynamicIndex(indexes[0]); + result = ContextValuesMarshaller.ConvertToClrObject(GetIndexedValue(index)); + return true; + } + + public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value) + { + if (!IsIndexed) + { + return false; + } + + var index = ContextValuesMarshaller.ConvertDynamicIndex(indexes[0]); + SetIndexedValue(index, ContextValuesMarshaller.ConvertDynamicValue(value)); + return true; + } + + public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) + { + int methIdx; + try + { + methIdx = GetMethodNumber(binder.Name); + } + catch (MethodAccessException) + { + result = null; + return false; + } + + var parameters = GetMethodInfo(methIdx).GetParameters(); + if (args.Length > parameters.Length) + throw RuntimeException.TooManyArgumentsPassed(); + + var valueArgs = new IValue[parameters.Length]; + var passedArgs = args.Select(x => ContextValuesMarshaller.ConvertDynamicValue(x)).ToArray(); + + for (int i = 0; i < valueArgs.Length; i++) + { + if (i < passedArgs.Length) + valueArgs[i] = passedArgs[i]; + else + valueArgs[i] = ValueFactory.CreateInvalidValueMarker(); + } + + CallAsFunction(methIdx, valueArgs, out IValue methResult); + result = methResult == null ? null : ContextValuesMarshaller.ConvertToClrObject(methResult); + + return true; + } + + #endregion + + public override int CompareTo(BslValue other) + { + if (other.GetType() == GetType()) + { + if (this.Equals(other)) + { + return 0; + } + else + { + throw RuntimeException.ComparisonNotSupportedException(); + } + } + else + { + return this.GetType().ToString().CompareTo(other.GetType().ToString()); + } + } + + public override bool Equals(BslValue other) + { + if (other == null) + return false; + + return ReferenceEquals(this, other); + } + } + +} diff --git a/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs b/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs index e199a4db2..1967c74ca 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs @@ -10,8 +10,8 @@ This Source Code Form is subject to the terms of the using System.Linq; using System.Linq.Expressions; using System.Reflection; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Language; namespace ScriptEngine.Machine.Contexts diff --git a/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs b/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs index b1ae1a721..faef57057 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs @@ -1,188 +1,188 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using OneScript.Commons; -using OneScript.Contexts; - -namespace ScriptEngine.Machine.Contexts -{ - public class PropertyTarget - { - private readonly BslPropertyInfo _propertyInfo; - - public PropertyTarget(PropertyInfo propInfo) - { - _propertyInfo = new ContextPropertyInfo(propInfo); - Name = _propertyInfo.Name; - Alias = _propertyInfo.Alias; - - if (string.IsNullOrEmpty(Alias)) - Alias = propInfo.Name; - - IValue CantReadAction(TInstance inst) - { - throw PropertyAccessException.PropIsNotReadableException(Name); - } - - void CantWriteAction(TInstance inst, IValue val) - { - throw PropertyAccessException.PropIsNotWritableException(Name); - } - - if (_propertyInfo.CanRead) - { - var getMethodInfo = propInfo.GetGetMethod(); - if (getMethodInfo == null) - { - Getter = CantReadAction; - } - else - { - var genericGetter = typeof(PropertyTarget).GetMembers(BindingFlags.NonPublic | BindingFlags.Instance) - .Where(x => x.MemberType == MemberTypes.Method && x.Name == nameof(CreateGetter)) - .Select(x => (MethodInfo)x) - .First(); - - var resolvedGetter = genericGetter.MakeGenericMethod(propInfo.PropertyType); - - Getter = (Func)resolvedGetter.Invoke(this, new object[] { getMethodInfo }); - } - } - else - { - Getter = CantReadAction; - } - - if (_propertyInfo.CanWrite) - { - var setMethodInfo = propInfo.GetSetMethod(); - if (setMethodInfo == null) - { - Setter = CantWriteAction; - } - else - { - var genericSetter = typeof(PropertyTarget).GetMembers(BindingFlags.NonPublic | BindingFlags.Instance) - .Where(x => x.MemberType == MemberTypes.Method && x.Name == nameof(CreateSetter)) - .Select(x => (MethodInfo)x) - .First(); - - var resolvedSetter = genericSetter.MakeGenericMethod(propInfo.PropertyType); - - Setter = (Action)resolvedSetter.Invoke(this, new object[] { setMethodInfo }); - } - } - else - { - Setter = CantWriteAction; - } - } - - public Func Getter { get; } - - public Action Setter { get; } - - public string Name { get; } - - public string Alias { get; } - - public bool CanRead => _propertyInfo.CanRead; - public bool CanWrite => _propertyInfo.CanWrite; - - public BslPropertyInfo PropertyInfo => _propertyInfo; - - private Func CreateGetter(MethodInfo methInfo) - { - var method = (Func)Delegate.CreateDelegate(typeof(Func), methInfo); - return inst => ConvertReturnValue(method(inst)); - } - - private Action CreateSetter(MethodInfo methInfo) - { - var method = (Action)Delegate.CreateDelegate(typeof(Action), methInfo); - return (inst, val) => method(inst, ConvertParam(val)); - } - - private T ConvertParam(IValue value) - { - return ContextValuesMarshaller.ConvertParam(value); - } - - private IValue ConvertReturnValue(TRet param) - { - return ContextValuesMarshaller.ConvertReturnValue(param); - } - - } - - public class ContextPropertyMapper - { - private List> _properties; - private readonly object _locker = new object(); - - private void Init() - { - if (_properties != null) - return; - - lock (_locker) - { - if (_properties == null) - { - _properties = FindProperties(); - } - } - } - - private List> FindProperties() - { - return typeof(TInstance).GetProperties() - .Where(x => x.GetCustomAttributes(typeof(ContextPropertyAttribute), false).Any()) - .Select(x => new PropertyTarget(x)).ToList(); - } - - public bool ContainsProperty(string name) - { - return GetPropertyIndex(name) >= 0; - } - - public int FindProperty(string name) - { - var idx = GetPropertyIndex(name); - if (idx < 0) - throw PropertyAccessException.PropNotFoundException(name); - - return idx; - } - - public PropertyTarget GetProperty(int index) - { - Init(); - return _properties[index]; - } - - public int Count - { - get - { - Init(); - return _properties.Count; - } - } - - private int GetPropertyIndex(string name) - { - Init(); - return _properties.FindIndex(x => String.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase) - || String.Equals(x.Alias, name, StringComparison.OrdinalIgnoreCase)); - } - } -} +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using OneScript.Contexts; +using OneScript.Exceptions; + +namespace ScriptEngine.Machine.Contexts +{ + public class PropertyTarget + { + private readonly BslPropertyInfo _propertyInfo; + + public PropertyTarget(PropertyInfo propInfo) + { + _propertyInfo = new ContextPropertyInfo(propInfo); + Name = _propertyInfo.Name; + Alias = _propertyInfo.Alias; + + if (string.IsNullOrEmpty(Alias)) + Alias = propInfo.Name; + + IValue CantReadAction(TInstance inst) + { + throw PropertyAccessException.PropIsNotReadableException(Name); + } + + void CantWriteAction(TInstance inst, IValue val) + { + throw PropertyAccessException.PropIsNotWritableException(Name); + } + + if (_propertyInfo.CanRead) + { + var getMethodInfo = propInfo.GetGetMethod(); + if (getMethodInfo == null) + { + Getter = CantReadAction; + } + else + { + var genericGetter = typeof(PropertyTarget).GetMembers(BindingFlags.NonPublic | BindingFlags.Instance) + .Where(x => x.MemberType == MemberTypes.Method && x.Name == nameof(CreateGetter)) + .Select(x => (MethodInfo)x) + .First(); + + var resolvedGetter = genericGetter.MakeGenericMethod(propInfo.PropertyType); + + Getter = (Func)resolvedGetter.Invoke(this, new object[] { getMethodInfo }); + } + } + else + { + Getter = CantReadAction; + } + + if (_propertyInfo.CanWrite) + { + var setMethodInfo = propInfo.GetSetMethod(); + if (setMethodInfo == null) + { + Setter = CantWriteAction; + } + else + { + var genericSetter = typeof(PropertyTarget).GetMembers(BindingFlags.NonPublic | BindingFlags.Instance) + .Where(x => x.MemberType == MemberTypes.Method && x.Name == nameof(CreateSetter)) + .Select(x => (MethodInfo)x) + .First(); + + var resolvedSetter = genericSetter.MakeGenericMethod(propInfo.PropertyType); + + Setter = (Action)resolvedSetter.Invoke(this, new object[] { setMethodInfo }); + } + } + else + { + Setter = CantWriteAction; + } + } + + public Func Getter { get; } + + public Action Setter { get; } + + public string Name { get; } + + public string Alias { get; } + + public bool CanRead => _propertyInfo.CanRead; + public bool CanWrite => _propertyInfo.CanWrite; + + public BslPropertyInfo PropertyInfo => _propertyInfo; + + private Func CreateGetter(MethodInfo methInfo) + { + var method = (Func)Delegate.CreateDelegate(typeof(Func), methInfo); + return inst => ConvertReturnValue(method(inst)); + } + + private Action CreateSetter(MethodInfo methInfo) + { + var method = (Action)Delegate.CreateDelegate(typeof(Action), methInfo); + return (inst, val) => method(inst, ConvertParam(val)); + } + + private T ConvertParam(IValue value) + { + return ContextValuesMarshaller.ConvertParam(value); + } + + private IValue ConvertReturnValue(TRet param) + { + return ContextValuesMarshaller.ConvertReturnValue(param); + } + + } + + public class ContextPropertyMapper + { + private List> _properties; + private readonly object _locker = new object(); + + private void Init() + { + if (_properties != null) + return; + + lock (_locker) + { + if (_properties == null) + { + _properties = FindProperties(); + } + } + } + + private List> FindProperties() + { + return typeof(TInstance).GetProperties() + .Where(x => x.GetCustomAttributes(typeof(ContextPropertyAttribute), false).Any()) + .Select(x => new PropertyTarget(x)).ToList(); + } + + public bool ContainsProperty(string name) + { + return GetPropertyIndex(name) >= 0; + } + + public int FindProperty(string name) + { + var idx = GetPropertyIndex(name); + if (idx < 0) + throw PropertyAccessException.PropNotFoundException(name); + + return idx; + } + + public PropertyTarget GetProperty(int index) + { + Init(); + return _properties[index]; + } + + public int Count + { + get + { + Init(); + return _properties.Count; + } + } + + private int GetPropertyIndex(string name) + { + Init(); + return _properties.FindIndex(x => String.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase) + || String.Equals(x.Alias, name, StringComparison.OrdinalIgnoreCase)); + } + } +} diff --git a/src/ScriptEngine/Machine/Contexts/ContextValuesMarshaller.cs b/src/ScriptEngine/Machine/Contexts/ContextValuesMarshaller.cs index 6213b3184..8f5de8357 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextValuesMarshaller.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextValuesMarshaller.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using OneScript.Commons; using OneScript.Contexts; using OneScript.Contexts.Enums; +using OneScript.Exceptions; using OneScript.Values; namespace ScriptEngine.Machine.Contexts diff --git a/src/ScriptEngine/Machine/Contexts/DynamicPropertiesAccessor.cs b/src/ScriptEngine/Machine/Contexts/DynamicPropertiesAccessor.cs index 128110dfc..ca4096b06 100644 --- a/src/ScriptEngine/Machine/Contexts/DynamicPropertiesAccessor.cs +++ b/src/ScriptEngine/Machine/Contexts/DynamicPropertiesAccessor.cs @@ -6,7 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Collections.Generic; -using OneScript.Commons; +using OneScript.Exceptions; namespace ScriptEngine.Machine.Contexts { diff --git a/src/ScriptEngine/Machine/Contexts/DynamicPropertiesHolder.cs b/src/ScriptEngine/Machine/Contexts/DynamicPropertiesHolder.cs index df7159490..34642871a 100644 --- a/src/ScriptEngine/Machine/Contexts/DynamicPropertiesHolder.cs +++ b/src/ScriptEngine/Machine/Contexts/DynamicPropertiesHolder.cs @@ -8,6 +8,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; namespace ScriptEngine.Machine.Contexts { diff --git a/src/ScriptEngine/Machine/Contexts/EnumerationValue.cs b/src/ScriptEngine/Machine/Contexts/EnumerationValue.cs index c126e57a6..ae3c79d4a 100644 --- a/src/ScriptEngine/Machine/Contexts/EnumerationValue.cs +++ b/src/ScriptEngine/Machine/Contexts/EnumerationValue.cs @@ -5,7 +5,7 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.Types; using OneScript.Values; diff --git a/src/ScriptEngine/Machine/Contexts/ManagedCOMWrapperContext.cs b/src/ScriptEngine/Machine/Contexts/ManagedCOMWrapperContext.cs index 299b1e9da..b60cfd6b8 100644 --- a/src/ScriptEngine/Machine/Contexts/ManagedCOMWrapperContext.cs +++ b/src/ScriptEngine/Machine/Contexts/ManagedCOMWrapperContext.cs @@ -11,8 +11,8 @@ This Source Code Form is subject to the terms of the using System.Diagnostics; using System.Linq; using System.Reflection; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Values; namespace ScriptEngine.Machine.Contexts diff --git a/src/ScriptEngine/Machine/Contexts/PropertyNameIndexAccessor.cs b/src/ScriptEngine/Machine/Contexts/PropertyNameIndexAccessor.cs index edd4f14cb..e5cf19a79 100644 --- a/src/ScriptEngine/Machine/Contexts/PropertyNameIndexAccessor.cs +++ b/src/ScriptEngine/Machine/Contexts/PropertyNameIndexAccessor.cs @@ -5,7 +5,7 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.Types; namespace ScriptEngine.Machine.Contexts diff --git a/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs b/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs index ea5ec0df8..7f475506f 100644 --- a/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs +++ b/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs @@ -8,8 +8,8 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Execution; namespace ScriptEngine.Machine.Contexts diff --git a/src/ScriptEngine/Machine/Contexts/ThisAwareScriptedObjectBase.cs b/src/ScriptEngine/Machine/Contexts/ThisAwareScriptedObjectBase.cs index 8c51f2267..de802eeed 100644 --- a/src/ScriptEngine/Machine/Contexts/ThisAwareScriptedObjectBase.cs +++ b/src/ScriptEngine/Machine/Contexts/ThisAwareScriptedObjectBase.cs @@ -6,7 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using System.Collections.Generic; using OneScript.Commons; using OneScript.Compilation; using OneScript.Compilation.Binding; diff --git a/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs b/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs index 2546f9892..1d6c8549d 100644 --- a/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs +++ b/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs @@ -9,8 +9,8 @@ This Source Code Form is subject to the terms of the using System.Collections; using System.Collections.Generic; using System.Linq; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Rcw; using OneScript.Values; using ScriptEngine.Machine.Rcw; @@ -158,11 +158,11 @@ public override void SetPropValue(int propNum, IValue newVal) } catch (System.MissingMemberException) { - throw OneScript.Commons.PropertyAccessException.PropNotFoundException(prop.Name); + throw PropertyAccessException.PropNotFoundException(prop.Name); } catch (System.MemberAccessException) { - throw OneScript.Commons.PropertyAccessException.PropIsNotWritableException(prop.Name); + throw PropertyAccessException.PropIsNotWritableException(prop.Name); } } diff --git a/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs b/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs index e61dd271b..873cbec53 100644 --- a/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs +++ b/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs @@ -12,6 +12,7 @@ This Source Code Form is subject to the terms of the using OneScript.Compilation; using OneScript.Compilation.Binding; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Execution; using OneScript.Types; using OneScript.Values; diff --git a/src/ScriptEngine/Machine/DefaultTypeManager.cs b/src/ScriptEngine/Machine/DefaultTypeManager.cs index 34865ec74..3be4bd521 100644 --- a/src/ScriptEngine/Machine/DefaultTypeManager.cs +++ b/src/ScriptEngine/Machine/DefaultTypeManager.cs @@ -11,6 +11,7 @@ This Source Code Form is subject to the terms of the using System.Reflection; using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using ScriptEngine.Machine.Contexts; using ScriptEngine.Types; diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index dec64bd21..21ecd9ff1 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -15,6 +15,7 @@ This Source Code Form is subject to the terms of the using OneScript.Commons; using OneScript.Compilation.Binding; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Language; using OneScript.Sources; using OneScript.Types; diff --git a/src/ScriptEngine/Machine/ParametrizedRuntimeException.cs b/src/ScriptEngine/Machine/ParametrizedRuntimeException.cs index b80eee270..22f5e4e0b 100644 --- a/src/ScriptEngine/Machine/ParametrizedRuntimeException.cs +++ b/src/ScriptEngine/Machine/ParametrizedRuntimeException.cs @@ -5,7 +5,7 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using OneScript.Commons; +using OneScript.Exceptions; namespace ScriptEngine.Machine { diff --git a/src/ScriptEngine/Machine/RciHelperExtensions.cs b/src/ScriptEngine/Machine/RciHelperExtensions.cs index 871c70c84..d4943a4f3 100644 --- a/src/ScriptEngine/Machine/RciHelperExtensions.cs +++ b/src/ScriptEngine/Machine/RciHelperExtensions.cs @@ -7,8 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; namespace ScriptEngine.Machine { diff --git a/src/ScriptEngine/Machine/RuntimeExceptions.cs b/src/ScriptEngine/Machine/RuntimeExceptions.cs index ff706ec96..20aea0343 100644 --- a/src/ScriptEngine/Machine/RuntimeExceptions.cs +++ b/src/ScriptEngine/Machine/RuntimeExceptions.cs @@ -1,69 +1,70 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ -using System; -using OneScript.Commons; - -namespace ScriptEngine.Machine -{ - public class WrongStackConditionException : ApplicationException - { - public WrongStackConditionException() - : base("Внутренняя ошибка: неверное состояние стека") - { - - } - } - - public class ValueMarshallingException : RuntimeException - { - public ValueMarshallingException() : this("Неклассифицированная ошибка маршаллинга значений") - { - } - - public ValueMarshallingException(string message) : base(message) - { - } - - public static ValueMarshallingException TypeNotSupported(Type type) - { - return new ValueMarshallingException(string.Format(Locale.NStr - ("ru='Возвращаемый тип {0} не поддерживается'; en='Return type {0} is not supported'"), type)); - } - - public static ValueMarshallingException InvalidEnum(Type type) - { - return new ValueMarshallingException(string.Format(Locale.NStr - ("ru = 'Некорректный тип конвертируемого перечисления: {0}'; en = 'Invalid enum return type: {0}'"), type)); - } - - public static ValueMarshallingException EnumWithNoAttribute(Type type) - { - return new ValueMarshallingException(string.Format(Locale.NStr - ("ru='Значение перечисления {0} должно быть помечено атрибутом EnumItemAttribute';" - + "en='An enumeration value {0} must be marked with the EnumItemAttribute attribute"), type)); - } - - public static ValueMarshallingException NoConversionToCLR(Type type) - { - return new ValueMarshallingException(string.Format(Locale.NStr - ("ru='Тип {0} не поддерживает преобразование в CLR-объект';" - +"en='Type {0} does not support conversion to CLR object'"), type)); - } - public static ValueMarshallingException InvalidNullValue() - { - return new ValueMarshallingException(Locale.NStr - ("ru = 'Значение не может быть null'; en = 'Value cannot be null'")); - } - - public static ValueMarshallingException InvalidNullIndex() - { - return new ValueMarshallingException(Locale.NStr - ("ru = 'Индекс не может быть null'; en = 'Index cannot be null'")); - } - - } -} +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ +using System; +using OneScript.Commons; +using OneScript.Exceptions; + +namespace ScriptEngine.Machine +{ + public class WrongStackConditionException : ApplicationException + { + public WrongStackConditionException() + : base("Внутренняя ошибка: неверное состояние стека") + { + + } + } + + public class ValueMarshallingException : RuntimeException + { + public ValueMarshallingException() : this("Неклассифицированная ошибка маршаллинга значений") + { + } + + public ValueMarshallingException(string message) : base(message) + { + } + + public static ValueMarshallingException TypeNotSupported(Type type) + { + return new ValueMarshallingException(string.Format(Locale.NStr + ("ru='Возвращаемый тип {0} не поддерживается'; en='Return type {0} is not supported'"), type)); + } + + public static ValueMarshallingException InvalidEnum(Type type) + { + return new ValueMarshallingException(string.Format(Locale.NStr + ("ru = 'Некорректный тип конвертируемого перечисления: {0}'; en = 'Invalid enum return type: {0}'"), type)); + } + + public static ValueMarshallingException EnumWithNoAttribute(Type type) + { + return new ValueMarshallingException(string.Format(Locale.NStr + ("ru='Значение перечисления {0} должно быть помечено атрибутом EnumItemAttribute';" + + "en='An enumeration value {0} must be marked with the EnumItemAttribute attribute"), type)); + } + + public static ValueMarshallingException NoConversionToCLR(Type type) + { + return new ValueMarshallingException(string.Format(Locale.NStr + ("ru='Тип {0} не поддерживает преобразование в CLR-объект';" + +"en='Type {0} does not support conversion to CLR object'"), type)); + } + public static ValueMarshallingException InvalidNullValue() + { + return new ValueMarshallingException(Locale.NStr + ("ru = 'Значение не может быть null'; en = 'Value cannot be null'")); + } + + public static ValueMarshallingException InvalidNullIndex() + { + return new ValueMarshallingException(Locale.NStr + ("ru = 'Индекс не может быть null'; en = 'Index cannot be null'")); + } + + } +} diff --git a/src/ScriptEngine/Machine/TypeFactory.cs b/src/ScriptEngine/Machine/TypeFactory.cs index 39e398bc4..b6c365068 100644 --- a/src/ScriptEngine/Machine/TypeFactory.cs +++ b/src/ScriptEngine/Machine/TypeFactory.cs @@ -12,8 +12,8 @@ This Source Code Form is subject to the terms of the using System.Linq; using System.Linq.Expressions; using OneScript.Types; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using ScriptEngine.Types; using Refl = System.Reflection; diff --git a/src/ScriptEngine/Machine/ValueAdoptionExtensions.cs b/src/ScriptEngine/Machine/ValueAdoptionExtensions.cs index b53cc9ac5..6887efedf 100644 --- a/src/ScriptEngine/Machine/ValueAdoptionExtensions.cs +++ b/src/ScriptEngine/Machine/ValueAdoptionExtensions.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Values; using ScriptEngine.Machine.Contexts; diff --git a/src/ScriptEngine/Machine/ValueFactory.cs b/src/ScriptEngine/Machine/ValueFactory.cs index 81dea903e..86fc2e10a 100644 --- a/src/ScriptEngine/Machine/ValueFactory.cs +++ b/src/ScriptEngine/Machine/ValueFactory.cs @@ -6,8 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; using System.Diagnostics; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Types; using OneScript.Values; diff --git a/src/ScriptEngine/ScriptingEngine.cs b/src/ScriptEngine/ScriptingEngine.cs index cfc95835f..f627292e9 100644 --- a/src/ScriptEngine/ScriptingEngine.cs +++ b/src/ScriptEngine/ScriptingEngine.cs @@ -15,7 +15,6 @@ This Source Code Form is subject to the terms of the using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; using ScriptEngine.Compiler; -using ScriptEngine.Hosting; namespace ScriptEngine { diff --git a/src/TestApp/Controls/ProcedureListWnd.xaml.cs b/src/TestApp/Controls/ProcedureListWnd.xaml.cs index 5df7d6bb8..24d23349f 100644 --- a/src/TestApp/Controls/ProcedureListWnd.xaml.cs +++ b/src/TestApp/Controls/ProcedureListWnd.xaml.cs @@ -5,13 +5,6 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; - namespace V8Reader.Controls { /// diff --git a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs index 30cb1bb17..11303f2cc 100644 --- a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs +++ b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs @@ -10,7 +10,6 @@ This Source Code Form is subject to the terms of the using System.Linq; using System.Linq.Expressions; using FluentAssertions; -using Microsoft.VisualBasic; using OneScript.Compilation.Binding; using OneScript.DependencyInjection; using OneScript.Native.Runtime; diff --git a/src/Tests/OneScript.Core.Tests/ObsoleteMethodAttributeTest.cs b/src/Tests/OneScript.Core.Tests/ObsoleteMethodAttributeTest.cs index 995071a0b..2deae0ae4 100644 --- a/src/Tests/OneScript.Core.Tests/ObsoleteMethodAttributeTest.cs +++ b/src/Tests/OneScript.Core.Tests/ObsoleteMethodAttributeTest.cs @@ -9,7 +9,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using FluentAssertions; using Moq; -using OneScript.Commons; +using OneScript.Exceptions; using ScriptEngine; using Xunit; diff --git a/src/Tests/OneScript.Core.Tests/TestUserScriptProperties.cs b/src/Tests/OneScript.Core.Tests/TestUserScriptProperties.cs index 1a00839c1..2a728ba1a 100644 --- a/src/Tests/OneScript.Core.Tests/TestUserScriptProperties.cs +++ b/src/Tests/OneScript.Core.Tests/TestUserScriptProperties.cs @@ -11,7 +11,6 @@ This Source Code Form is subject to the terms of the using OneScript.Values; using ScriptEngine.Hosting; using ScriptEngine.Machine; -using ScriptEngine.Machine.Contexts; using Xunit; namespace OneScript.Core.Tests diff --git a/src/Tests/OneScript.Core.Tests/ValuesTest.cs b/src/Tests/OneScript.Core.Tests/ValuesTest.cs index 31cbf4c60..9aeca7058 100644 --- a/src/Tests/OneScript.Core.Tests/ValuesTest.cs +++ b/src/Tests/OneScript.Core.Tests/ValuesTest.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using FluentAssertions; using Moq; using OneScript.Commons; +using OneScript.Exceptions; using OneScript.StandardLibrary; using OneScript.Types; using OneScript.Values; diff --git a/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs b/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs index 35e85f0df..c44e603d2 100644 --- a/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs +++ b/src/Tests/OneScript.Dynamic.Tests/Compiler_Api_Tests.cs @@ -7,10 +7,8 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using FluentAssertions; -using OneScript.Compilation.Binding; using OneScript.Language; using OneScript.Language.SyntaxAnalysis; -using OneScript.Native.Compiler; using Xunit; namespace OneScript.Dynamic.Tests diff --git a/src/Tests/OneScript.Dynamic.Tests/DynamicOperationsTest.cs b/src/Tests/OneScript.Dynamic.Tests/DynamicOperationsTest.cs index c2be899a2..9fa15c9cd 100644 --- a/src/Tests/OneScript.Dynamic.Tests/DynamicOperationsTest.cs +++ b/src/Tests/OneScript.Dynamic.Tests/DynamicOperationsTest.cs @@ -7,7 +7,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using FluentAssertions; -using OneScript.Commons; +using OneScript.Exceptions; using OneScript.Native.Runtime; using OneScript.Values; using Xunit; diff --git a/src/VSCode.DebugAdapter/Program.cs b/src/VSCode.DebugAdapter/Program.cs index 41fe253c7..d3cfffde4 100644 --- a/src/VSCode.DebugAdapter/Program.cs +++ b/src/VSCode.DebugAdapter/Program.cs @@ -6,8 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; using System.IO; -using System.Net; -using System.Net.Sockets; namespace VSCode.DebugAdapter { diff --git a/src/oscript/CgiBehavior.cs b/src/oscript/CgiBehavior.cs index 193f10f42..4c1532c66 100644 --- a/src/oscript/CgiBehavior.cs +++ b/src/oscript/CgiBehavior.cs @@ -10,8 +10,8 @@ This Source Code Form is subject to the terms of the using System.IO; using System.Linq; using System.Text; -using OneScript.Commons; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.StandardLibrary; using oscript.Web; diff --git a/src/oscript/ShowUsageBehavior.cs b/src/oscript/ShowUsageBehavior.cs index c24e0c830..5b5baba3a 100644 --- a/src/oscript/ShowUsageBehavior.cs +++ b/src/oscript/ShowUsageBehavior.cs @@ -1,39 +1,37 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ - -using System.Reflection; - -namespace oscript -{ - internal class ShowUsageBehavior : AppBehavior - { - public override int Execute() - { - Output.WriteLine($"1Script Execution Engine. Version {Program.GetVersion()}"); - Output.WriteLine(); - Output.WriteLine("Usage:"); - Output.WriteLine(); - Output.WriteLine("I. Script execution: oscript.exe [script arguments..]"); - Output.WriteLine(); - Output.WriteLine("II. Special mode: oscript.exe [script arguments..]"); - Output.WriteLine("Mode can be one of these:"); - Output.WriteLine($" {"-measure",-12}measures execution time"); - Output.WriteLine($" {"-compile",-12}shows compiled module without execution"); - Output.WriteLine($" {"-check [-env=]",-12}provides syntax check"); - Output.WriteLine($" {"-check -cgi",-12}provides syntax check in CGI-mode"); - Output.WriteLine($" {"-version",-12}output version string"); - Output.WriteLine(); - Output.WriteLine(" -encoding= set output encoding"); - Output.WriteLine(" -codestat= write code statistics"); - Output.WriteLine(); - Output.WriteLine("III. Run as CGI application: oscript.exe -cgi [script arguments..]"); - Output.WriteLine(" Runs as CGI application under HTTP-server (Apache/Nginx/IIS/etc...)"); - - return 0; - } - } +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +namespace oscript +{ + internal class ShowUsageBehavior : AppBehavior + { + public override int Execute() + { + Output.WriteLine($"1Script Execution Engine. Version {Program.GetVersion()}"); + Output.WriteLine(); + Output.WriteLine("Usage:"); + Output.WriteLine(); + Output.WriteLine("I. Script execution: oscript.exe [script arguments..]"); + Output.WriteLine(); + Output.WriteLine("II. Special mode: oscript.exe [script arguments..]"); + Output.WriteLine("Mode can be one of these:"); + Output.WriteLine($" {"-measure",-12}measures execution time"); + Output.WriteLine($" {"-compile",-12}shows compiled module without execution"); + Output.WriteLine($" {"-check [-env=]",-12}provides syntax check"); + Output.WriteLine($" {"-check -cgi",-12}provides syntax check in CGI-mode"); + Output.WriteLine($" {"-version",-12}output version string"); + Output.WriteLine(); + Output.WriteLine(" -encoding= set output encoding"); + Output.WriteLine(" -codestat= write code statistics"); + Output.WriteLine(); + Output.WriteLine("III. Run as CGI application: oscript.exe -cgi [script arguments..]"); + Output.WriteLine(" Runs as CGI application under HTTP-server (Apache/Nginx/IIS/etc...)"); + + return 0; + } + } } \ No newline at end of file diff --git a/src/oscript/ShowVersionBehavior.cs b/src/oscript/ShowVersionBehavior.cs index 02ef0119f..bdb13a095 100644 --- a/src/oscript/ShowVersionBehavior.cs +++ b/src/oscript/ShowVersionBehavior.cs @@ -1,20 +1,18 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ - -using System.Reflection; - -namespace oscript -{ - internal class ShowVersionBehavior : AppBehavior - { - public override int Execute() - { - Output.WriteLine(Program.GetVersion()); - return 0; - } - } +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +namespace oscript +{ + internal class ShowVersionBehavior : AppBehavior + { + public override int Execute() + { + Output.WriteLine(Program.GetVersion()); + return 0; + } + } } \ No newline at end of file From 01b4bbc9c99c44d98f1a15eb40de4eeaa397a825 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Tue, 8 Aug 2023 20:12:32 +0300 Subject: [PATCH 069/126] =?UTF-8?q?fixes=20#1324=20=D0=B2=D1=8B=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=BD=D1=8B=D0=B5=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D1=8B=20=D0=B2=20=D0=B2=D1=8B=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=85=20COM=D0=9E=D0=B1=D1=8A=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Core/Rcw/DispatchUtility.cs | 24 ++++++++++++++++--- .../Machine/ComReflectionNameToIdMapper.cs | 2 ++ .../Machine/Contexts/COMWrapperContext.cs | 24 +++++++++++++++---- .../Contexts/UnmanagedCOMWrapperContext.cs | 21 ++++++++++++++-- src/ScriptEngine/Machine/MachineInstance.cs | 4 ++-- 5 files changed, 63 insertions(+), 12 deletions(-) diff --git a/src/OneScript.Core/Rcw/DispatchUtility.cs b/src/OneScript.Core/Rcw/DispatchUtility.cs index 2426dca43..08dd51882 100644 --- a/src/OneScript.Core/Rcw/DispatchUtility.cs +++ b/src/OneScript.Core/Rcw/DispatchUtility.cs @@ -98,9 +98,27 @@ public static bool TryGetDispId(object obj, string name, out int dispId) /// This can invoke a method or a property get accessor. /// public static object Invoke(object obj, int dispId, object[] args) + { + object result = Invoke(obj, dispId, args, null); + return result; + } + + /// + /// Invokes a member by DISPID. + /// + /// An object that implements IDispatch. + /// The DISPID of a member. This can be obtained using + /// . + /// The arguments to pass to the member. + /// ByRef modifiers + /// The member's return value. + /// + /// This can invoke a method or a property get accessor. + /// + public static object Invoke(object obj, int dispId, object[] args, ParameterModifier[] modifiers) { string memberName = "[DispId=" + dispId + "]"; - object result = Invoke(obj, memberName, args); + object result = Invoke(obj, memberName, args, modifiers); return result; } @@ -114,12 +132,12 @@ public static object Invoke(object obj, int dispId, object[] args) /// /// This can invoke a method or a property get accessor. /// - public static object Invoke(object obj, string memberName, object[] args) + public static object Invoke(object obj, string memberName, object[] args, ParameterModifier[] modifiers) { RequireReference(obj, "obj"); Type type = obj.GetType(); object result = type.InvokeMember(memberName, BindingFlags.InvokeMethod | BindingFlags.GetProperty, - null, obj, args, null); + null, obj, args, modifiers, null, null); return result; } diff --git a/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs b/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs index b7865000f..8db869186 100644 --- a/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs +++ b/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs @@ -9,7 +9,9 @@ This Source Code Form is subject to the terms of the using System.Linq; using System.Reflection; using OneScript.Commons; +using OneScript.Contexts; using OneScript.Exceptions; +using ScriptEngine.Machine.Contexts; namespace ScriptEngine.Machine { diff --git a/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs b/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs index bdf4116d2..80f620dda 100644 --- a/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs +++ b/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs @@ -1,4 +1,4 @@ -/*---------------------------------------------------------- +/*---------------------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v.2.0. If a copy of the MPL was not distributed with this file, You can obtain one @@ -14,6 +14,7 @@ This Source Code Form is subject to the terms of the using OneScript.Types; using OneScript.Values; using ScriptEngine.Types; +using System.Reflection; namespace ScriptEngine.Machine.Contexts { @@ -84,7 +85,7 @@ private static COMWrapperContext Create(string progId, IValue[] arguments) type = type.MakeGenericType(genericTypes.ToArray()); } - object instance = Activator.CreateInstance(type, MarshalArguments(arguments)); + object instance = Activator.CreateInstance(type, MarshalArguments(arguments).values); return InitByInstance(type, instance); } @@ -123,10 +124,23 @@ private static bool TypeIsRuntimeCallableWrapper(Type type) return type.FullName == "System.__ComObject" || type.BaseType.FullName == "System.__ComObject"; // string, cause it's hidden type } - public static object[] MarshalArguments(IValue[] arguments) + protected static (object[] values, ParameterModifier[] flags) MarshalArguments(IValue[] arguments) { - var args = arguments.Select(x => MarshalIValue(x)).ToArray(); - return args; + var values = new object[arguments.Length]; + ParameterModifier[] flagsArray = null; + if (arguments.Length > 0) + { + var flags = new ParameterModifier(arguments.Length); + for (int i = 0; i < arguments.Length; i++) + { + values[i] = MarshalIValue(arguments[i]); + flags[i] = arguments[i] is IVariable; + } + + flagsArray = new[] { flags }; + } + + return (values, flagsArray); } public static object MarshalIValue(IValue val) diff --git a/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs b/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs index 1d6c8549d..fb71fd69c 100644 --- a/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs +++ b/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs @@ -13,6 +13,7 @@ This Source Code Form is subject to the terms of the using OneScript.Exceptions; using OneScript.Rcw; using OneScript.Values; +using System.Reflection; using ScriptEngine.Machine.Rcw; namespace ScriptEngine.Machine.Contexts @@ -196,7 +197,9 @@ public override void CallAsProcedure(int methodNumber, IValue[] arguments) { try { - DispatchUtility.Invoke(Instance, dispId, MarshalArguments(arguments)); + var argsData = MarshalArguments(arguments); + DispatchUtility.Invoke(Instance, dispId, argsData.values, argsData.flags); + RemapOutputParams(arguments, argsData.values, argsData.flags[0]); } catch (System.Reflection.TargetInvocationException e) { @@ -222,7 +225,9 @@ public override void CallAsFunction(int methodNumber, IValue[] arguments, out IV { try { - var result = DispatchUtility.Invoke(Instance, dispId, MarshalArguments(arguments)); + var argsData = MarshalArguments(arguments); + var result = DispatchUtility.Invoke(Instance, dispId, argsData.values, argsData.flags); + RemapOutputParams(arguments, argsData.values, argsData.flags[0]); retValue = CreateIValue(result); } catch (System.Reflection.TargetInvocationException e) @@ -235,6 +240,18 @@ public override void CallAsFunction(int methodNumber, IValue[] arguments, out IV throw RuntimeException.MethodNotFoundException(method.Name); } } + + private void RemapOutputParams(IValue[] arguments, object[] values, ParameterModifier flags) + { + for (int i = 0; i < arguments.Length; i++) + { + if (flags[i]) + { + var variable = (IVariable)arguments[i]; + variable.Value = CreateIValue(values[i]); + } + } + } private bool TryFindMethod(string name, out RcwMethodMetadata md) { diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index 21ecd9ff1..2d4db6b97 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -1,4 +1,4 @@ -/*---------------------------------------------------------- +/*---------------------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v.2.0. If a copy of the MPL was not distributed with this file, You can obtain one @@ -1173,7 +1173,7 @@ private void PrepareContextCallArguments(int arg, out IRuntimeContextInstance co var argValue = factArgs[i]; if (!argValue.IsSkippedArgument()) { - argValues[i] = argValue.GetRawValue(); + argValues[i] = argValue; } } } From aacfd62663b1c9431635ec001e233274bbd9a01e Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Tue, 8 Aug 2023 21:58:06 +0300 Subject: [PATCH 070/126] =?UTF-8?q?fixed=20#1317=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B5=D0=B7=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B0=20=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=B3=D0=B0=D1=82=D0=B0=20=D0=B2=20=D1=84=D0=BE=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=BC=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.StandardLibrary/DelegateAction.cs | 1 + tests/tasks.os | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/OneScript.StandardLibrary/DelegateAction.cs b/src/OneScript.StandardLibrary/DelegateAction.cs index 2e0510254..cad964779 100644 --- a/src/OneScript.StandardLibrary/DelegateAction.cs +++ b/src/OneScript.StandardLibrary/DelegateAction.cs @@ -67,6 +67,7 @@ public override BslMethodInfo GetMethodInfo(int methodNumber) { return BslMethodBuilder.Create() .SetNames(MethodName_Ru, MethodName_En) + .ReturnType(typeof(BslValue)) .Build(); } diff --git a/tests/tasks.os b/tests/tasks.os index a09b38028..42e1f2c42 100644 --- a/tests/tasks.os +++ b/tests/tasks.os @@ -19,6 +19,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьОжиданиеКонкретногоЗадания"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВЗаданииПроставленаИнформацияОбОшибке"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозвращаетсяРезультат"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозвращаетсяРезультатДелегата"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоРаботаетБлокировка"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоКодМожетОпределитьИДЗадания"); @@ -179,6 +180,22 @@ КонецПроцедуры +Процедура ТестДолжен_ПроверитьЧтоВозвращаетсяРезультатДелегата() Экспорт + + Делегат = Новый Действие(ЭтотОбъект, "ПодсчетСуммы"); + + МассивПараметров = Новый Массив(2); + МассивПараметров[0] = 1; + МассивПараметров[1] = 5; + + ФЗ = ФоновыеЗадания.Выполнить(Делегат, "Выполнить", МассивПараметров); + + ФЗ.ОжидатьЗавершения(); + + юТест.ПроверитьРавенство(15, ФЗ.Результат); + +КонецПроцедуры + Процедура ТестДолжен_ПроверитьЧтоРаботаетБлокировка() Экспорт глБлокировка = Новый БлокировкаРесурса; From 1ca47ec4cf82d555e0cd6d688ca848a145de039c Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 9 Aug 2023 10:24:15 +0300 Subject: [PATCH 071/126] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=D0=B0=20=D0=B8=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/TestApp/Controls/ProcedureListWnd.xaml.cs | 7 +++++++ src/VSCode.DebugAdapter/Program.cs | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/TestApp/Controls/ProcedureListWnd.xaml.cs b/src/TestApp/Controls/ProcedureListWnd.xaml.cs index 24d23349f..5df7d6bb8 100644 --- a/src/TestApp/Controls/ProcedureListWnd.xaml.cs +++ b/src/TestApp/Controls/ProcedureListWnd.xaml.cs @@ -5,6 +5,13 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; + namespace V8Reader.Controls { /// diff --git a/src/VSCode.DebugAdapter/Program.cs b/src/VSCode.DebugAdapter/Program.cs index d3cfffde4..41fe253c7 100644 --- a/src/VSCode.DebugAdapter/Program.cs +++ b/src/VSCode.DebugAdapter/Program.cs @@ -6,6 +6,8 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; using System.IO; +using System.Net; +using System.Net.Sockets; namespace VSCode.DebugAdapter { From 3cd1176821a0fb3d8b766ad8fff288025e4262b1 Mon Sep 17 00:00:00 2001 From: Dmitriy Korolev Date: Wed, 9 Aug 2023 16:38:14 +0700 Subject: [PATCH 072/126] =?UTF-8?q?#1299=20fix:=20=D0=A3=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=D0=B8=D1=80=D1=83?= =?UTF-8?q?=D1=8E=D1=89=D0=B8=D0=B5=20=D0=B0=D1=80=D0=B3=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=20=D0=BA=D0=B0=D0=B2=D1=8B=D1=87=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Processes/ArgumentsParser.cs | 6 ++++-- src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs b/src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs index effdca348..7acae754a 100644 --- a/src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs +++ b/src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs @@ -69,8 +69,10 @@ private void HandleQuotes(char quoteChar) _isInQuotes = false; _currentQuote = default; } - - PushChar(quoteChar); + else + { + PushChar(quoteChar); + } } private void PushChar(char ch) diff --git a/src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs b/src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs index 1db6cc11d..fa0a903ed 100644 --- a/src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs +++ b/src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs @@ -7,12 +7,12 @@ namespace OneScript.Core.Tests; public class ArgumentParserTests { [Theory] - [InlineData("-c 'oscript -version'", "-c", "'oscript -version'")] + [InlineData("-c 'oscript -version'", "-c", "oscript -version")] [InlineData("-c oscript -version", "-c", "oscript", "-version")] - [InlineData("-c '\"oscript\" -version'", "-c", "'\"oscript\" -version'")] - [InlineData("-c \"'oscript' -version\"", "-c", "\"'oscript' -version\"")] + [InlineData("-c '\"oscript\" -version'", "-c", "\"oscript\" -version")] + [InlineData("-c \"'oscript' -version\"", "-c", "'oscript' -version")] + [InlineData("'aaa\"", "aaa\"")] [InlineData(" ")] - [InlineData("'aaa\"", "'aaa\"")] public void Should_Parse_Arguments(string input, params string[] expected) { var parser = new ArgumentsParser(input); From 64a28d1b7a9bab4273ceb1143e508253c71213cd Mon Sep 17 00:00:00 2001 From: Dmitriy Korolev Date: Wed, 9 Aug 2023 16:53:59 +0700 Subject: [PATCH 073/126] =?UTF-8?q?#1299=20fix:=20=D0=9B=D0=B8=D1=86=D0=B5?= =?UTF-8?q?=D0=BD=D0=B7=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs | 7 +++++++ src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs b/src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs index 7acae754a..88e22b283 100644 --- a/src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs +++ b/src/OneScript.StandardLibrary/Processes/ArgumentsParser.cs @@ -1,3 +1,10 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + using System; using System.Collections.Generic; using System.Text; diff --git a/src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs b/src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs index fa0a903ed..cbca74f67 100644 --- a/src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs +++ b/src/Tests/OneScript.Core.Tests/ArgumentParserTests.cs @@ -1,3 +1,10 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + using FluentAssertions; using OneScript.StandardLibrary.Processes; using Xunit; From a53e2f0ad8f72b99db653813057377635b01c91f Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Thu, 17 Aug 2023 11:28:59 +0300 Subject: [PATCH 074/126] =?UTF-8?q?#1327:=20=D0=9A=D1=80=D0=B0=D1=81=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/typedescription.os | 145 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) diff --git a/tests/typedescription.os b/tests/typedescription.os index d780c3620..c9e0846c8 100644 --- a/tests/typedescription.os +++ b/tests/typedescription.os @@ -32,6 +32,11 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеБезПриведения"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеЧисел"); + ВсеТесты.Добавить("ТестДолжен_Преобразование_ОписаниеБезТипов"); + ВсеТесты.Добавить("ТестДолжен_Преобразование_ОписаниеБезТипов_КвалификаторыИгнорируются"); + + ВсеТесты.Добавить("ТестДолжен_ПроверитьОдинаковыйПорядокТипов"); + Возврат ВсеТесты; КонецФункции @@ -445,3 +450,143 @@ юТест.ПроверитьРавенство(Описание.ПривестиЗначение(12345.555), 999.99, "Забивает девятками"); КонецПроцедуры + +Процедура ТестДолжен_Преобразование_ОписаниеБезТипов() Экспорт + + МассивТиповНеопределено = Новый Массив; + МассивТиповНеопределено.Добавить(Тип("Неопределено")); + + ПроверяемыеОписания = Новый СписокЗначений; + ПроверяемыеОписания.Добавить( + Новый ОписаниеТипов, + "Новый ОписаниеТипов" + ); + ПроверяемыеОписания.Добавить( + Новый ОписаниеТипов("Неопределено"), + "Новый ОписаниеТипов(""Неопределено"")" + ); + ПроверяемыеОписания.Добавить( + Новый ОписаниеТипов(МассивТиповНеопределено), + "Новый ОписаниеТипов(МассивТиповНеопределено)" + ); + ПроверяемыеОписания.Добавить( + Новый ОписаниеТипов("Undefined"), + "Новый ОписаниеТипов(""Undefined"")" + ); + + Для Каждого мЭлементПроверки Из ПроверяемыеОписания Цикл + + ОписаниеБезТипов = мЭлементПроверки.Значение; + ОписаниеСлучая = мЭлементПроверки.Представление; + + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(), Неопределено, "Приведение без параметра. " + ОписаниеСлучая); + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(1), 1, "Приведение числа. " + ОписаниеСлучая); + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение("1"), "1", "Приведение строки. " + ОписаниеСлучая); + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(Тип("Строка")), Тип("Строка"), "Приведение Типа. " + ОписаниеСлучая); + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение('20230817104356'), '20230817104356', "Приведение даты. " + ОписаниеСлучая); + + ДД = ПолучитьДвоичныеДанныеИзСтроки("Строка"); + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(ДД), ДД, "Двоичные данные не ломаются. " + ОписаниеСлучая); + + юТест.ПроверитьРавенство(ОписаниеБезТипов.Типы().Количество(), 0, "Типы() пустой. " + ОписаниеСлучая); + юТест.ПроверитьЛожь(ОписаниеБезТипов.СодержитТип(Тип("Неопределено")), "Нет типа Неопределено. " + ОписаниеСлучая); + + КонецЦикла; + +КонецПроцедуры + +Процедура ТестДолжен_Преобразование_ОписаниеБезТипов_КвалификаторыИгнорируются() Экспорт + + КЧ = Новый КвалификаторыЧисла(1); + КС = Новый КвалификаторыСтроки(1); + КД = Новый КвалификаторыДаты(ЧастиДаты.Время); + + МассивТиповНеопределено = Новый Массив; + МассивТиповНеопределено.Добавить(Тип("Неопределено")); + + ПроверяемыеОписания = Новый СписокЗначений; + ПроверяемыеОписания.Добавить( + Новый ОписаниеТипов(, КЧ, КС, КД), + "Новый ОписаниеТипов(, КЧ, КС, КД)" + ); + ПроверяемыеОписания.Добавить( + Новый ОписаниеТипов("Неопределено", КЧ, КС, КД), + "Новый ОписаниеТипов(""Неопределено"", КЧ, КС, КД)" + ); + ПроверяемыеОписания.Добавить( + Новый ОписаниеТипов(МассивТиповНеопределено, КЧ, КС, КД), + "Новый ОписаниеТипов(МассивТиповНеопределено, КЧ, КС, КД)" + ); + ПроверяемыеОписания.Добавить( + Новый ОписаниеТипов("Undefined", КЧ, КС, КД), + "Новый ОписаниеТипов(""Undefined"", КЧ, КС, КД)" + ); + + Для Каждого мЭлементПроверки Из ПроверяемыеОписания Цикл + + ОписаниеБезТипов = мЭлементПроверки.Значение; + ОписаниеСлучая = мЭлементПроверки.Представление; + + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(), Неопределено, "Приведение без параметра. " + ОписаниеСлучая); + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(123), 123, "Число не режется. " + ОписаниеСлучая); // не 1 + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение("123"), "123", "Строка не режется. " + ОписаниеСлучая); // не "1" + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(Тип("Строка")), Тип("Строка"), "Значение типа Тип не ломается. " + ОписаниеСлучая); + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение('20230817104356'), '20230817104356', "Дата не режется. " + ОписаниеСлучая); // не `00010101104356` + + ДД = ПолучитьДвоичныеДанныеИзСтроки("Строка"); + юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(ДД), ДД, "Двоичные данные не ломаются. " + ОписаниеСлучая); + + юТест.ПроверитьРавенство(ОписаниеБезТипов.Типы().Количество(), 0, "Типы() пустой. " + ОписаниеСлучая); + юТест.ПроверитьЛожь(ОписаниеБезТипов.СодержитТип(Тип("Неопределено")), "Нет типа Неопределено. " + ОписаниеСлучая); + + КонецЦикла; + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьОдинаковыйПорядокТипов() Экспорт + + ОТ = Новый ОписаниеТипов("Число, Строка"); + ПроверитьПорядокТипов(ОТ.Типы(), "Строка, Число"); + + ОТ = Новый ОписаниеТипов("Строка, Число"); + ПроверитьПорядокТипов(ОТ.Типы(), "Строка, Число"); + + ОТ = Новый ОписаниеТипов("Строка, Число, Строка"); + ПроверитьПорядокТипов(ОТ.Типы(), "Строка, Число"); + + ОТ = Новый ОписаниеТипов("Число, Число, Строка"); + ПроверитьПорядокТипов(ОТ.Типы(), "Строка, Число"); + + ОТ = Новый ОписаниеТипов("Число, Число, Строка, Дата, Булево, Неопределено"); + ПроверитьПорядокТипов(ОТ.Типы(), "Булево, Строка, Дата, Число"); + + ОТ = Новый ОписаниеТипов("Неопределено, Число, Дата, Строка, Дата, Булево"); + ПроверитьПорядокТипов(ОТ.Типы(), "Булево, Строка, Дата, Число"); + +КонецПроцедуры + +Процедура ПроверитьПорядокТипов(Знач ТипыОписанияТипов, Знач ОжидаемыйПорядок, Знач Текст = Неопределено) + + Если Текст = Неопределено Тогда + Текст = СтрШаблон("Ожидаемый порядок: %1 + |Полученный порядок: %2", ОжидаемыйПорядок, СтрСоединить(ТипыОписанияТипов, ", ") + ); + КонецЕсли; + + ТипыСтроками = СтрРазделить(ОжидаемыйПорядок, ","); + + юТест.ПроверитьБольшеИлиРавно(ТипыОписанияТипов.Количество(), ТипыСтроками.Количество(), Текст); + + ИндексТипа = 0; + Для Каждого мТипСтрокой Из ТипыСтроками Цикл + + ТипОписания = ТипыОписанияТипов[ИндексТипа]; + ТипОжидаемый = Тип(СокрЛП(мТипСтрокой)); + + юТест.ПроверитьРавенство(ТипОписания, ТипОжидаемый); + + ИндексТипа = ИндексТипа + 1; + + КонецЦикла; + +КонецПроцедуры From ffc423076c6860b30108b66213c798b3d0b1d655 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Thu, 24 Aug 2023 18:02:05 +0300 Subject: [PATCH 075/126] =?UTF-8?q?#1327:=20=D0=A0=D0=B5=D1=84=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=9E=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TypeDescriptions/TypeDescription.cs | 186 +++++------------- .../TypeDescriptionBuilder.cs | 116 +++++++++++ .../TypeDescriptions/TypeList.cs | 121 ++++++++++++ 3 files changed, 290 insertions(+), 133 deletions(-) create mode 100644 src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs create mode 100644 src/OneScript.StandardLibrary/TypeDescriptions/TypeList.cs diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs index 8585c1d59..b133c3fbf 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs @@ -5,6 +5,7 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +using System; using System.Collections.Generic; using System.Linq; using OneScript.Contexts; @@ -24,25 +25,34 @@ public class TypeDescription : AutoContext private const string TYPE_BINARYDATA_NAME = "ДвоичныеДанные"; - public TypeDescription(IEnumerable types = null, - NumberQualifiers numberQualifiers = null, - StringQualifiers stringQualifiers = null, - DateQualifiers dateQualifiers = null, - BinaryDataQualifiers binaryDataQualifiers = null) + public TypeDescription(IEnumerable types = null) { if (types != null) { _types.AddRange(types); } + + NumberQualifiers = new NumberQualifiers(); + StringQualifiers = new StringQualifiers(); + DateQualifiers = new DateQualifiers(); + BinaryDataQualifiers = new BinaryDataQualifiers(); + } - NumberQualifiers = numberQualifiers != null && _types.Contains(TypeNumber()) ? - numberQualifiers : new NumberQualifiers(); - StringQualifiers = stringQualifiers != null && _types.Contains(TypeString()) ? - stringQualifiers : new StringQualifiers(); - DateQualifiers = dateQualifiers != null && _types.Contains(TypeDate()) ? - dateQualifiers : new DateQualifiers(); - BinaryDataQualifiers = binaryDataQualifiers != null && _types.Any(x => x.TypeValue.Name == TYPE_BINARYDATA_NAME) ? - binaryDataQualifiers : new BinaryDataQualifiers(); + internal TypeDescription(IEnumerable types, + NumberQualifiers numberQualifiers, + StringQualifiers stringQualifiers, + DateQualifiers dateQualifiers, + BinaryDataQualifiers binaryDataQualifiers) + { + if (types != null) + { + _types.AddRange(types); + } + + NumberQualifiers = numberQualifiers; + StringQualifiers = stringQualifiers; + DateQualifiers = dateQualifiers; + BinaryDataQualifiers = binaryDataQualifiers; } [ContextProperty("КвалификаторыЧисла", "NumberQualifiers")] @@ -70,6 +80,11 @@ public ArrayImpl Types() return result; } + internal IEnumerable TypesInternal() + { + return _types; + } + [ContextMethod("СодержитТип", "ContainsType")] public bool ContainsType(IValue type) { @@ -136,62 +151,22 @@ public IValue AdjustValue(IValue value = null) return adjuster?.Adjust(value) ?? ValueFactory.Create(); } - private static IList ConstructTypeList(ITypeManager typeManager, IValue types) - { - var typesList = new List(); - if (types == null) - return typesList; - - types = types.GetRawValue(); - if (types.SystemType == BasicTypes.String) - { - var typeNames = types.AsString().Split(','); - foreach (var typeName in typeNames) - { - if (string.IsNullOrWhiteSpace(typeName)) - continue; - - var typeValue = new BslTypeValue(typeManager.GetTypeByName(typeName.Trim())); - if (!typesList.Contains(typeValue)) - typesList.Add(typeValue); - } - } else if (types is ArrayImpl arrayOfTypes) - { - foreach (var type in arrayOfTypes) - { - var rawType = type.GetRawValue() as BslTypeValue; - if (rawType == null) - continue; - - if (!typesList.Contains(rawType)) - typesList.Add(rawType); - } - } - else if (types.SystemType != BasicTypes.Undefined) - { - return null; // далее будет исключение - } - // для Неопределено возвращается пустой список - - return typesList; - } - - static BslTypeValue TypeNumber() + internal static BslTypeValue TypeNumber() { return new BslTypeValue(BasicTypes.Number); } - static BslTypeValue TypeBoolean() + internal static BslTypeValue TypeBoolean() { return new BslTypeValue(BasicTypes.Boolean); } - static BslTypeValue TypeString() + internal static BslTypeValue TypeString() { return new BslTypeValue(BasicTypes.String); } - static BslTypeValue TypeDate() + internal static BslTypeValue TypeDate() { return new BslTypeValue(BasicTypes.Date); } @@ -199,54 +174,18 @@ static BslTypeValue TypeDate() public static TypeDescription StringType(int length = 0, AllowedLengthEnum allowedLength = AllowedLengthEnum.Variable) { - var stringQualifier = new StringQualifiers(length, allowedLength); - return new TypeDescription(new BslTypeValue[] { TypeString() }, null, stringQualifier); + return TypeDescriptionBuilder.Build(TypeString(), new StringQualifiers(length, allowedLength)); } public static TypeDescription IntegerType(int length = 10, AllowedSignEnum allowedSign = AllowedSignEnum.Any) { - var numberQualifier = new NumberQualifiers(length, 0, allowedSign); - return new TypeDescription(new BslTypeValue[] { TypeNumber() }, numberQualifier); + return TypeDescriptionBuilder.Build(TypeNumber(), new NumberQualifiers(length, 0, allowedSign)); } public static TypeDescription BooleanType() { - return new TypeDescription(new BslTypeValue[] { TypeBoolean() }); - } - - - private class TypeQualifiersSet - { - public readonly NumberQualifiers numberQualifiers = null; - public readonly StringQualifiers stringQualifiers = null; - public readonly DateQualifiers dateQualifiers = null; - public readonly BinaryDataQualifiers binaryDataQualifiers = null; - - public TypeQualifiersSet(IValue p2, IValue p3, IValue p4, IValue p5, IValue p6, IValue p7) - { - int nParam = 1; - foreach (var qual in new[] { p2, p3, p4, p5, p6, p7 }) - { - nParam++; - - if (qual == null || qual.Equals(BslUndefinedValue.Instance)) - continue; - - switch (qual.GetRawValue()) - { - case NumberQualifiers nq: numberQualifiers = nq; break; - - case StringQualifiers sq: stringQualifiers = sq; break; - - case DateQualifiers dq: dateQualifiers = dq; break; - - case BinaryDataQualifiers bdq: binaryDataQualifiers = bdq; break; - - default: throw RuntimeException.InvalidNthArgumentType(nParam); - } - } - } + return TypeDescriptionBuilder.Build(TypeBoolean()); } [ScriptConstructor] @@ -267,10 +206,8 @@ public static TypeDescription Constructor( // пустой первый параметр - нет объекта-основания // добавляемые/вычитаемые типы не допускаются, квалификаторы игнорируются - // только для контроля типов - var _ = new TypeQualifiersSet(p2, p3, p4, p5, p6, p7); - - return new TypeDescription(); + // квалификакторы передаются только для контроля типов + return ConstructByQualifiers(context.TypeManager, new TypeDescription(), p2, p3, p4, p5, p6, p7); } if (rawSource is TypeDescription) @@ -286,7 +223,7 @@ public static TypeDescription Constructor( throw RuntimeException.InvalidArgumentValue(); } - public static TypeDescription ConstructByQualifiers(ITypeManager typeManager, IValue types, + private static TypeDescription ConstructByQualifiers(ITypeManager typeManager, IValue types, IValue p2 = null, IValue p3 = null, IValue p4 = null, @@ -294,20 +231,16 @@ public static TypeDescription ConstructByQualifiers(ITypeManager typeManager, IV IValue p6 = null, IValue p7 = null) { - var typesList = ConstructTypeList(typeManager, types); - if (typesList == null) - throw RuntimeException.InvalidNthArgumentType(1); + var builder = new TypeDescriptionBuilder(); + var typesList = TypeList.Construct(typeManager, types, 1); + builder.AddTypes(typesList.List()); - var qualSet = new TypeQualifiersSet(p2,p3,p4,p5,p6,p7); + builder.AddQualifiers(new[] { p2, p3, p4, p5, p6, p7 }, 1); - return new TypeDescription(typesList, - qualSet.numberQualifiers, - qualSet.stringQualifiers, - qualSet.dateQualifiers, - qualSet.binaryDataQualifiers); + return builder.Build(); } - public static TypeDescription ConstructByOtherDescription(ITypeManager typeManager, + private static TypeDescription ConstructByOtherDescription(ITypeManager typeManager, IValue typeDescription = null, IValue addTypes = null, IValue removeTypes = null, @@ -316,34 +249,21 @@ public static TypeDescription ConstructByOtherDescription(ITypeManager typeManag IValue p6 = null, IValue p7 = null) { - var removeTypesList = ConstructTypeList(typeManager, removeTypes); - if (removeTypesList == null) - throw RuntimeException.InvalidNthArgumentType(3); + var builder = new TypeDescriptionBuilder(); - var typesList = new List(); if (typeDescription is TypeDescription typeDesc) { - foreach (var type in typeDesc._types) - { - if (!removeTypesList.Contains(type)) - { - typesList.Add(type); - } - } + builder.SourceDescription(typeDesc); } + + var removeTypesList = TypeList.Construct(typeManager, removeTypes, 3); + builder.RemoveTypes(removeTypesList.List()); - var addTypesList = ConstructTypeList(typeManager, addTypes); - if (addTypesList == null) - throw RuntimeException.InvalidNthArgumentType(2); - typesList.AddRange(addTypesList); - - var qualSet = new TypeQualifiersSet(null, null, p4, p5, p6, p7); + var addTypesList = TypeList.Construct(typeManager, addTypes, 2); + builder.AddTypes(addTypesList.List()); + builder.AddQualifiers(new[] { p4, p5, p6, p7 }, 3); - return new TypeDescription(typesList, - qualSet.numberQualifiers, - qualSet.stringQualifiers, - qualSet.dateQualifiers, - qualSet.binaryDataQualifiers); + return builder.Build(); } } } diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs new file mode 100644 index 000000000..e330cc2c7 --- /dev/null +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs @@ -0,0 +1,116 @@ +using System.Collections.Generic; +using System.Linq; +using OneScript.Exceptions; +using OneScript.Values; +using ScriptEngine.Machine; + +namespace OneScript.StandardLibrary.TypeDescriptions +{ + internal class TypeDescriptionBuilder + { + private NumberQualifiers _numberQualifiers; + private StringQualifiers _stringQualifiers; + private DateQualifiers _dateQualifiers; + private BinaryDataQualifiers _binaryDataQualifiers; + + private const string TYPE_BINARYDATA_NAME = "ДвоичныеДанные"; + + private List _types = new List(); + + internal TypeDescriptionBuilder() + { + } + + public TypeDescriptionBuilder SourceDescription(TypeDescription source) + { + _numberQualifiers = source.NumberQualifiers; + _stringQualifiers = source.StringQualifiers; + _dateQualifiers = source.DateQualifiers; + _binaryDataQualifiers = source.BinaryDataQualifiers; + return AddTypes(source.TypesInternal()); + } + + public TypeDescriptionBuilder AddTypes(IEnumerable types) + { + _types.AddRange(types); + return this; + } + + public TypeDescriptionBuilder RemoveTypes(IEnumerable types) + { + _types.RemoveAll(types.Contains); + return this; + } + + public TypeDescriptionBuilder AddQualifiers(IValue[] qualifiers, int nParam = 0) + { + foreach (var qualifier in qualifiers) + { + nParam++; + AddQualifier(qualifier, nParam); + } + + return this; + } + + public TypeDescriptionBuilder AddQualifier(IValue qualifier, int nParam = 0) + { + if (qualifier != null && !qualifier.Equals(BslUndefinedValue.Instance)) + { + switch (qualifier.GetRawValue()) + { + case NumberQualifiers nq: + _numberQualifiers = nq; + break; + + case StringQualifiers sq: + _stringQualifiers = sq; + break; + + case DateQualifiers dq: + _dateQualifiers = dq; + break; + + case BinaryDataQualifiers bdq: + _binaryDataQualifiers = bdq; + break; + + default: + throw nParam == 0 + ? RuntimeException.InvalidArgumentType() + : RuntimeException.InvalidNthArgumentType(nParam); + } + } + + return this; + } + + public TypeDescription Build() + { + _types = new List(_types.Distinct()); + var hasNumber = _types.Contains(TypeDescription.TypeNumber()); + var hasString =_types.Contains(TypeDescription.TypeString()); + var hasDate = _types.Contains(TypeDescription.TypeDate()); + var hasBinaryData = _types.Any(x => x.TypeValue.Name == TYPE_BINARYDATA_NAME); + + if (!hasNumber || _numberQualifiers == null) _numberQualifiers = new NumberQualifiers(); + if (!hasString || _stringQualifiers == null) _stringQualifiers = new StringQualifiers(); + if (!hasDate || _dateQualifiers == null) _dateQualifiers = new DateQualifiers(); + if (!hasBinaryData || _binaryDataQualifiers == null) _binaryDataQualifiers = new BinaryDataQualifiers(); + + return new TypeDescription(_types, + _numberQualifiers, + _stringQualifiers, + _dateQualifiers, + _binaryDataQualifiers + ); + + } + + public static TypeDescription Build(BslTypeValue type, IValue qualifier = null) + { + var builder = new TypeDescriptionBuilder(); + return builder.AddTypes(new[] { type }).AddQualifier(qualifier).Build(); + } + } +} \ No newline at end of file diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeList.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeList.cs new file mode 100644 index 000000000..ebf80b0bc --- /dev/null +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeList.cs @@ -0,0 +1,121 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using OneScript.Exceptions; +using OneScript.StandardLibrary.Collections; +using OneScript.Types; +using OneScript.Values; +using ScriptEngine.Machine; + +namespace OneScript.StandardLibrary.TypeDescriptions +{ + internal class TypeList + { + private readonly IList _list; + + public TypeList(IEnumerable list) + { + _list = new List(list); + } + + public int Count => _list.Count; + + public bool Contains(BslTypeValue type) + { + return _list.Contains(type); + } + + public bool Contains(string typeName) + { + return _list.Any(x => string.Compare( + x.TypeValue.Name, + typeName, + StringComparison.OrdinalIgnoreCase) == 0 + ); + } + + public IList List() + { + return _list; + } + + /// + /// Возвращает типы как Массив + /// + /// Массив, содержащий элементы типа Тип + public ArrayImpl AsArray() + { + return new ArrayImpl(_list); + } + + public TypeList Modify(TypeList typesToRemove, TypeList typesToAdd) + { + var typesList = _list.Where(type => !typesToRemove.Contains(type)).ToList(); + typesList.AddRange(typesToAdd._list); + return new TypeList(typesList); + } + + public TypeList Modify(TypeList typesToRemove) + { + var typesList = _list.Where(type => !typesToRemove.Contains(type)).ToList(); + return new TypeList(typesList); + } + + public static TypeList Construct(ITypeManager typeManager, IValue types, int nParam) + { + types = types?.GetRawValue(); + if (types == null || types.SystemType == BasicTypes.Undefined) + return new TypeList(Array.Empty()); + + if (types.SystemType == BasicTypes.String) + { + return FromTypeNames(typeManager, types.AsString()); + } + if (types is ArrayImpl arrayOfTypes) + { + return FromArrayOfTypes(arrayOfTypes); + } + + throw RuntimeException.InvalidNthArgumentType(nParam); + } + + public static TypeList FromTypeNames(ITypeManager typeManager, string types) + { + var typeNames = types.Split(','); + var typesList = new List(); + foreach (var typeName in typeNames) + { + if (string.IsNullOrWhiteSpace(typeName)) + continue; + + var typeValue = new BslTypeValue(typeManager.GetTypeByName(typeName.Trim())); + if (!typesList.Contains(typeValue)) + typesList.Add(typeValue); + } + + return new TypeList(typesList); + } + + public static TypeList FromArrayOfTypes(ArrayImpl arrayOfTypes) + { + var typesList = new List(); + foreach (var type in arrayOfTypes) + { + var rawType = type.GetRawValue() as BslTypeValue; + if (rawType == null) + continue; + + if (!typesList.Contains(rawType)) + typesList.Add(rawType); + } + return new TypeList(typesList); + } + } +} \ No newline at end of file From 9bb678ca5df43f236afee31a519604d0b9db3450 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Fri, 1 Sep 2023 23:10:30 +0300 Subject: [PATCH 076/126] =?UTF-8?q?#1327=20=D0=9F=D0=BE=D1=80=D1=8F=D0=B4?= =?UTF-8?q?=D0=BE=D0=BA=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B2=20=D0=9E?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=A2=D0=B8=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TypeDescriptions/TypeDescription.cs | 2 +- .../TypeDescriptionBuilder.cs | 56 ++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs index b133c3fbf..51bd1275a 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs @@ -207,7 +207,7 @@ public static TypeDescription Constructor( // добавляемые/вычитаемые типы не допускаются, квалификаторы игнорируются // квалификакторы передаются только для контроля типов - return ConstructByQualifiers(context.TypeManager, new TypeDescription(), p2, p3, p4, p5, p6, p7); + return ConstructByQualifiers(context.TypeManager, BslUndefinedValue.Instance, p2, p3, p4, p5, p6, p7); } if (rawSource is TypeDescription) diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs index e330cc2c7..38fd9f17d 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs @@ -1,6 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using OneScript.Exceptions; +using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; @@ -88,6 +90,8 @@ public TypeDescriptionBuilder AddQualifier(IValue qualifier, int nParam = 0) public TypeDescription Build() { _types = new List(_types.Distinct()); + _types.RemoveAll(type => type.TypeValue.ImplementingClass == typeof(BslUndefinedValue)); + _types.Sort(new TypeComparer()); var hasNumber = _types.Contains(TypeDescription.TypeNumber()); var hasString =_types.Contains(TypeDescription.TypeString()); var hasDate = _types.Contains(TypeDescription.TypeDate()); @@ -112,5 +116,55 @@ public static TypeDescription Build(BslTypeValue type, IValue qualifier = null) var builder = new TypeDescriptionBuilder(); return builder.AddTypes(new[] { type }).AddQualifier(qualifier).Build(); } + + private class TypeComparer : IComparer + { + private static readonly IDictionary primitives = new Dictionary(); + public int Compare(BslTypeValue x, BslTypeValue y) + { + if (x.TypeValue.Equals(y)) return 0; + + var primitiveX = PrimitiveIndex(x); + var primitiveY = PrimitiveIndex(y); + + if (primitiveX != -1) + { + if (primitiveY != -1) + return primitiveX - primitiveY; + + return -1; + } + + if (primitiveY != -1) + return 1; + + return x.TypeValue.Id.CompareTo(y.TypeValue.Id); + } + + private int PrimitiveIndex(BslTypeValue type) + { + if (StringComparer.CurrentCultureIgnoreCase.Equals(type.TypeValue.Name, TYPE_BINARYDATA_NAME)) + { + // Пора двоичным данным стать примитивом + return 1; + } + + if (primitives.ContainsKey(type.TypeValue)) + return primitives[type.TypeValue]; + + return -1; + } + + static TypeComparer() + { + primitives.Add(BasicTypes.Boolean, 0); + primitives.Add(BasicTypes.String, 2); + primitives.Add(BasicTypes.Date, 3); + primitives.Add(BasicTypes.Null, 4); + primitives.Add(BasicTypes.Number, 5); + primitives.Add(BasicTypes.Type, 6); + } + + } } } \ No newline at end of file From 37d99c8b6884b1711f1abb6e7ce6fa0076ccdced Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Fri, 1 Sep 2023 23:14:05 +0300 Subject: [PATCH 077/126] =?UTF-8?q?#1327=20=D0=A2=D0=B5=D1=81=D1=82=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/typedescription.os | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/typedescription.os b/tests/typedescription.os index c9e0846c8..65592c65c 100644 --- a/tests/typedescription.os +++ b/tests/typedescription.os @@ -563,6 +563,9 @@ ОТ = Новый ОписаниеТипов("Неопределено, Число, Дата, Строка, Дата, Булево"); ПроверитьПорядокТипов(ОТ.Типы(), "Булево, Строка, Дата, Число"); + ОТ = Новый ОписаниеТипов("ДвоичныеДанные, Неопределено, Тип, NULL, Число, Дата, Строка, Дата, Булево"); + ПроверитьПорядокТипов(ОТ.Типы(), "Булево, ДвоичныеДанные, Строка, Дата, Null, Число, Тип"); + КонецПроцедуры Процедура ПроверитьПорядокТипов(Знач ТипыОписанияТипов, Знач ОжидаемыйПорядок, Знач Текст = Неопределено) From 1748964883ae092c02e1c8a459aa31d55eeb3084 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Sat, 2 Sep 2023 10:34:28 +0300 Subject: [PATCH 078/126] =?UTF-8?q?#1327=20=D0=9B=D0=B8=D1=86=D0=B5=D0=BD?= =?UTF-8?q?=D0=B7=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TypeDescriptions/TypeDescriptionBuilder.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs index 38fd9f17d..d1731a4f4 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs @@ -1,4 +1,11 @@ -using System; +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; using System.Collections.Generic; using System.Linq; using OneScript.Exceptions; From b6ad81a91f3940076f7b2135a5d8b68a6b907d67 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 4 Sep 2023 09:10:06 +0300 Subject: [PATCH 079/126] =?UTF-8?q?=D0=92=D0=B5=D1=80=D0=BD=D1=83=D0=BB=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=20=D0=BD=D0=B0=20=D0=BC=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/engine-behaviors.os | 90 +++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/tests/engine-behaviors.os b/tests/engine-behaviors.os index f97183364..01867ddf2 100644 --- a/tests/engine-behaviors.os +++ b/tests/engine-behaviors.os @@ -462,52 +462,50 @@ КонецФункции -// отключим пока, т.к. идет обсуждение этого поведения -// см https://github.com/EvilBeaver/OneScript/pull/1306 -//Процедура ТестДолжен_ПроверитьПропускПараметров() Экспорт -// -// П = ПропущенныеПараметры1(,);F -// юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); -// -// -// П = ПропущенныеПараметры1(,,); -// юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); -// -// -// П = ПропущенныеПараметры1(, 2); -// юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П2, 2, "Параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); -// -// -// П = ПропущенныеПараметры1(3,); -// юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); -// -// -// П = ПропущенныеПараметры1(3,,); -// юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); -// -// -// П = ПропущенныеПараметры1(,,"4"); -// юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П3, "4", "Параметр со значением по-умолчанию"); -// -// -// П = ПропущенныеПараметры1(, 2, "6"); -// юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П2, 2, "Параметр без значения по-умолчанию"); -// юТест.ПроверитьРавенство(П.П3, "6", "Параметр со значением по-умолчанию"); -// -//КонецПроцедуры +Процедура ТестДолжен_ПроверитьПропускПараметров() Экспорт + + П = ПропущенныеПараметры1(,); + юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(,,); + юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(, 2); + юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, 2, "Параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(3,); + юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(3,,); + юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(,,"4"); + юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "4", "Параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(, 2, "6"); + юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, 2, "Параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "6", "Параметр со значением по-умолчанию"); + +КонецПроцедуры Процедура ТестДолжен_ПроверитьФинальнуюЗапятуюВОбъявленииМетода() Экспорт From ca6e32408b573e26ea85f7746fc67e6f26020d60 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 4 Sep 2023 16:19:23 +0300 Subject: [PATCH 080/126] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=20=D0=98=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=D0=9E=D0=B1=D0=9E=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B5=D0=A8=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD.=20=D0=A0=D0=B5?= =?UTF-8?q?=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Exceptions/BslCoreException.cs | 3 +- .../Exceptions/RuntimeException.cs | 2 - src/OneScript.Language/ErrorPositionInfo.cs | 1 + src/OneScript.Language/ScriptException.cs | 17 +- .../Compiler/BinaryOperationCompiler.cs | 2 +- .../Compiler/DateOperations.cs | 2 +- .../Compiler/ExpressionHelpers.cs | 6 +- .../Compiler/MethodCompiler.cs | 12 +- .../Compiler/NativeCompilerException.cs | 17 +- .../Runtime/DynamicOperations.cs | 2 +- .../Runtime/ExceptionInfoClass.cs | 2 +- .../StandardGlobalContext.cs | 2 +- .../Tasks/BackgroundTask.cs | 5 - .../Machine/Contexts/ExceptionInfoContext.cs | 393 +++++++++--------- .../Machine/Contexts/ExceptionTemplate.cs | 35 -- src/ScriptEngine/Machine/MachineInstance.cs | 20 +- 16 files changed, 247 insertions(+), 274 deletions(-) delete mode 100644 src/ScriptEngine/Machine/Contexts/ExceptionTemplate.cs diff --git a/src/OneScript.Core/Exceptions/BslCoreException.cs b/src/OneScript.Core/Exceptions/BslCoreException.cs index 2788a978f..5de478ca8 100644 --- a/src/OneScript.Core/Exceptions/BslCoreException.cs +++ b/src/OneScript.Core/Exceptions/BslCoreException.cs @@ -6,11 +6,12 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using OneScript.Language; using OneScript.Localization; namespace OneScript.Exceptions { - public class BslCoreException : ApplicationException + public class BslCoreException : ScriptException { public BslCoreException(BilingualString message) : base(message.ToString()) { diff --git a/src/OneScript.Core/Exceptions/RuntimeException.cs b/src/OneScript.Core/Exceptions/RuntimeException.cs index 51af3297f..b751762b4 100644 --- a/src/OneScript.Core/Exceptions/RuntimeException.cs +++ b/src/OneScript.Core/Exceptions/RuntimeException.cs @@ -20,8 +20,6 @@ public RuntimeException(BilingualString message) : base(message) { } - - #region Static Factory Methods public static RuntimeException DeprecatedMethodCall(string name) diff --git a/src/OneScript.Language/ErrorPositionInfo.cs b/src/OneScript.Language/ErrorPositionInfo.cs index 4f559c6d6..ed68a6272 100644 --- a/src/OneScript.Language/ErrorPositionInfo.cs +++ b/src/OneScript.Language/ErrorPositionInfo.cs @@ -22,5 +22,6 @@ public ErrorPositionInfo() public string Code { get; set; } public string ModuleName { get; set; } + public bool IsEmpty => LineNumber == OUT_OF_TEXT && ColumnNumber == OUT_OF_TEXT && ModuleName == default; } } diff --git a/src/OneScript.Language/ScriptException.cs b/src/OneScript.Language/ScriptException.cs index f438bfb13..ff5918106 100644 --- a/src/OneScript.Language/ScriptException.cs +++ b/src/OneScript.Language/ScriptException.cs @@ -15,12 +15,12 @@ public class ScriptException : ApplicationException { private readonly ErrorPositionInfo _codePosition; - public ScriptException(string message) - : this(new ErrorPositionInfo(), message, null) + public ScriptException(string message, Exception innerException = null) + : this(new ErrorPositionInfo(), message, innerException) { } - public ScriptException(ErrorPositionInfo errorInfo, string message, Exception innerException = null) + protected ScriptException(ErrorPositionInfo errorInfo, string message, Exception innerException = null) : base(message, innerException) { _codePosition = errorInfo ?? throw new ArgumentNullException(nameof(errorInfo)); @@ -104,5 +104,16 @@ public override string Message } public object RuntimeSpecificInfo { get; set; } + + public void SetPositionIfEmpty(ErrorPositionInfo newPosition) + { + if (!_codePosition.IsEmpty) + return; + + _codePosition.LineNumber = newPosition.LineNumber; + _codePosition.ColumnNumber = newPosition.ColumnNumber; + _codePosition.Code = newPosition.Code; + _codePosition.ModuleName = newPosition.ModuleName; + } } } diff --git a/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs b/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs index a8fe3a796..76f47f7a8 100644 --- a/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs +++ b/src/OneScript.Native/Compiler/BinaryOperationCompiler.cs @@ -199,7 +199,7 @@ private Expression CompileDynamicOperation(Expression left, Expression right) case ExpressionType.OrElse: return MakeLogicalOperation(left, right); default: - throw new NativeCompilerException($"Operation {_opCode} is not defined for IValues"); + throw NativeCompilerException.OperationNotDefined(_opCode, left.Type, right.Type); } } diff --git a/src/OneScript.Native/Compiler/DateOperations.cs b/src/OneScript.Native/Compiler/DateOperations.cs index 91ca2cd06..4627a2d2f 100644 --- a/src/OneScript.Native/Compiler/DateOperations.cs +++ b/src/OneScript.Native/Compiler/DateOperations.cs @@ -34,7 +34,7 @@ public static Expression DateOffsetOperation(Expression left, Expression right, { ExpressionType.Add => toDouble, ExpressionType.Subtract => Expression.Negate(toDouble), - _ => throw new NativeCompilerException($"Operation {opCode} is not defined for dates") + _ => throw NativeCompilerException.OperationNotDefined(opCode, left.Type, right.Type) }; return Expression.Call(left, adder, arg); diff --git a/src/OneScript.Native/Compiler/ExpressionHelpers.cs b/src/OneScript.Native/Compiler/ExpressionHelpers.cs index 633e11144..5e8fcc744 100644 --- a/src/OneScript.Native/Compiler/ExpressionHelpers.cs +++ b/src/OneScript.Native/Compiler/ExpressionHelpers.cs @@ -184,7 +184,7 @@ private static Expression ConvertBslValueToPrimitiveType(Expression right, Type { return TryConvertBslValueToPrimitiveType(right, type) ?? throw new NativeCompilerException( - new BilingualString( + BilingualString.Localize( $"Преобразование {right.Type} в тип {type} недоступно", $"Conversion from {right.Type} to {type} is unavailable") ); @@ -398,7 +398,7 @@ public static Expression ConvertToBslValue(Expression value) nameof(DynamicOperations.WrapClrObjectToValue)); return Expression.Call(meth, value); } - throw new NativeCompilerException(new BilingualString( + throw new NativeCompilerException(BilingualString.Localize( $"Преобразование из типа {value.Type} в тип BslValue не поддерживается", $"Conversion from type {value.Type} into BslValue is not supported")); } @@ -490,7 +490,7 @@ public static Expression CreateAssignmentSource(Expression source, Type targetTy if (canBeCasted) return conversion; - throw new NativeCompilerException(new BilingualString( + throw new NativeCompilerException(BilingualString.Localize( $"Преобразование из типа {source.Type} в тип {targetType} не поддерживается", $"Conversion from type {source.Type} into {targetType} is not supported")); } diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index 249eb29fa..6805245f9 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -187,11 +187,11 @@ protected override void VisitStatement(BslSyntaxNode statement) catch (NativeCompilerException e) { RestoreNestingLevel(nestingLevel); - e.Position ??= ToCodePosition(statement.Location); + e.SetPositionIfEmpty(ToCodePosition(statement.Location)); AddError(new CodeError { Description = e.Message, - Position = e.Position, + Position = e.GetPosition(), ErrorId = nameof(NativeCompilerException) }); } @@ -201,7 +201,7 @@ protected override void VisitStatement(BslSyntaxNode statement) RestoreNestingLevel(nestingLevel); if (e is NativeCompilerException ce) { - ce.Position ??= ToCodePosition(statement.Location); + ce.SetPositionIfEmpty(ToCodePosition(statement.Location)); throw; } @@ -1147,7 +1147,7 @@ protected override void VisitObjectFunctionCall(BslSyntaxNode node) var methodInfo = FindMethodOfType(node, targetType, name); if (methodInfo.ReturnType == typeof(void)) { - throw new NativeCompilerException(new BilingualString( + throw new NativeCompilerException(BilingualString.Localize( $"Метод {targetType}.{name} не является функцией", $"Method {targetType}.{name} is not a function"), ToCodePosition(node.Location)); } @@ -1194,7 +1194,7 @@ private MethodInfo FindMethodOfType(BslSyntaxNode node, Type targetType, string } catch (InvalidOperationException) { - throw new NativeCompilerException(new BilingualString( + throw new NativeCompilerException(BilingualString.Localize( $"Метод {name} не определен для типа {targetType}", $"Method {name} is not defined for type {targetType}"), ToCodePosition(node.Location)); } @@ -1226,7 +1226,7 @@ private PropertyInfo FindPropertyOfType(BslSyntaxNode node, Type targetType, str } catch (InvalidOperationException) { - throw new NativeCompilerException(new BilingualString( + throw new NativeCompilerException(BilingualString.Localize( $"Свойство {name} не определено для типа {targetType}", $"Property {name} is not defined for type {targetType}")); } diff --git a/src/OneScript.Native/Compiler/NativeCompilerException.cs b/src/OneScript.Native/Compiler/NativeCompilerException.cs index b461f80fa..534fce904 100644 --- a/src/OneScript.Native/Compiler/NativeCompilerException.cs +++ b/src/OneScript.Native/Compiler/NativeCompilerException.cs @@ -7,33 +7,26 @@ This Source Code Form is subject to the terms of the using System; using System.Linq.Expressions; +using OneScript.Compilation; using OneScript.Exceptions; using OneScript.Language; using OneScript.Localization; namespace OneScript.Native.Compiler { - public class NativeCompilerException : BslCoreException + public class NativeCompilerException : CompilerException { - public ErrorPositionInfo Position { get; set; } - - public NativeCompilerException(BilingualString message) : base(message) - { - } - - public NativeCompilerException(BilingualString message, ErrorPositionInfo position) : base(message) + public NativeCompilerException(string message) : base(message) { - Position = position; } - public NativeCompilerException(BilingualString message, ErrorPositionInfo position, Exception innerException) : base(message, innerException) + public NativeCompilerException(string message, ErrorPositionInfo position) : base(message, position) { - Position = position; } public static NativeCompilerException OperationNotDefined(ExpressionType opCode, Type left, Type right) => new NativeCompilerException( - new BilingualString( + BilingualString.Localize( $"Операция {opCode} не определена для типов {left} и {right}", $"Operation {opCode} is not defined for {left} and {right}") ); diff --git a/src/OneScript.Native/Runtime/DynamicOperations.cs b/src/OneScript.Native/Runtime/DynamicOperations.cs index de38b667c..c76a7ba5b 100644 --- a/src/OneScript.Native/Runtime/DynamicOperations.cs +++ b/src/OneScript.Native/Runtime/DynamicOperations.cs @@ -167,7 +167,7 @@ public static ExceptionInfoClass GetExceptionInfo(Exception e) { if (e is ScriptException s) return new ExceptionInfoClass(s); - + var wrapper = new ExternalSystemException(e); return new ExceptionInfoClass(wrapper); diff --git a/src/OneScript.Native/Runtime/ExceptionInfoClass.cs b/src/OneScript.Native/Runtime/ExceptionInfoClass.cs index 365995626..ff11e4cd6 100644 --- a/src/OneScript.Native/Runtime/ExceptionInfoClass.cs +++ b/src/OneScript.Native/Runtime/ExceptionInfoClass.cs @@ -32,7 +32,7 @@ public ExceptionInfoClass(ScriptException lineAwareException) { } - public ExceptionInfoClass(Exception externalException, ErrorPositionInfo position) + private ExceptionInfoClass(Exception externalException, ErrorPositionInfo position) { _errorPosition = position; _exc = externalException; diff --git a/src/OneScript.StandardLibrary/StandardGlobalContext.cs b/src/OneScript.StandardLibrary/StandardGlobalContext.cs index 15f6f66e6..015ecc7a7 100644 --- a/src/OneScript.StandardLibrary/StandardGlobalContext.cs +++ b/src/OneScript.StandardLibrary/StandardGlobalContext.cs @@ -93,7 +93,7 @@ public string BriefErrorDescription(ExceptionInfoContext errInfo) [ContextMethod("ПодробноеПредставлениеОшибки", "DetailErrorDescription")] public string DetailErrorDescription(ExceptionInfoContext errInfo) { - return errInfo.DetailedDescription; + return errInfo.GetDetailedDescription(); } [ContextMethod("ТекущаяУниверсальнаяДата", "CurrentUniversalDate")] diff --git a/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs b/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs index 4a3d23b94..fdf1793ce 100644 --- a/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs +++ b/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs @@ -113,11 +113,6 @@ public void ExecuteOnCurrentThread() State = TaskStateEnum.CompletedWithErrors; ExceptionInfo = new ExceptionInfoContext(exception); } - catch (BslCoreException exception) - { - State = TaskStateEnum.CompletedWithErrors; - ExceptionInfo = new ExceptionInfoContext(new ScriptException(exception)); - } } } } diff --git a/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs b/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs index 051bbf1bd..deced153a 100644 --- a/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs +++ b/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs @@ -1,189 +1,204 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ -using System; -using System.Collections.Generic; -using System.Text; -using OneScript.Commons; -using OneScript.Contexts; -using OneScript.Language; - -namespace ScriptEngine.Machine.Contexts -{ - /// - /// Класс позволяет узнать информацию о произошедшем исключении. - /// - [ContextClass("ИнформацияОбОшибке", "ErrorInfo")] - public class ExceptionInfoContext : AutoContext - { - readonly ScriptException _exc; - IValue _innerException; - - public ExceptionInfoContext(ScriptException source) - { - _exc = source ?? throw new ArgumentNullException(); - if (source.InnerException is ParametrizedRuntimeException pre) - { - Parameters = pre.Parameter; - } - } - - /// - /// Значение, переданное при создании исключения в конструкторе объекта ИнформацияОбОшибке. - /// - [ContextProperty("Параметры", "Parameters", CanWrite = false)] - public IValue Parameters - { - get; - private set; - } - - /// - /// Содержит краткое описание ошибки. Эквивалент Exception.Message в C# - /// - [ContextProperty("Описание", "Description")] - public string Description - { - get { return _exc.ErrorDescription; } - } - - public string MessageWithoutCodeFragment - { - get { return _exc.MessageWithoutCodeFragment; } - } - - public string DetailedDescription - { - get - { - var sb = new StringBuilder(_exc.Message); - var inner = _exc.InnerException; - while (inner != default) - { - sb.AppendLine(); - sb.AppendLine(Locale.NStr("ru = 'по причине:';en = 'caused by:'")); - sb.AppendLine(inner.Message); - inner = inner.InnerException; - } - - return sb.ToString(); - } - } - - /// - /// Имя модуля, вызвавшего исключение. - /// - [ContextProperty("ИмяМодуля", "ModuleName")] - public string ModuleName => _exc.ModuleName ?? string.Empty; - - /// - /// Номер строки, вызвавшей исключение. - /// - [ContextProperty("НомерСтроки", "LineNumber")] - public int LineNumber => _exc.LineNumber; - - /// - /// Строка исходного кода, вызвавшего исключение. - /// - [ContextProperty("ИсходнаяСтрока", "SourceLine")] - public string SourceLine => _exc.Code ?? string.Empty; - - /// - /// Предоставляет доступ к стеку вызовов процедур. - /// Подробнее см. класс КоллекцияКадровСтекаВызовов - /// - /// - [ContextMethod("ПолучитьСтекВызовов", "GetStackTrace")] - public IValue GetStackTrace() - { - if (_exc.RuntimeSpecificInfo is IList frames) - { - // var frames = rte.CallStackFrames; - // if (frames == null) - // return ValueFactory.Create(); - return new StackTraceCollectionContext(frames); - } - return ValueFactory.Create(); - } - - /// - /// Содержит вложенное исключение, если таковое было. Эквивалент Exception.InnerException в C# - /// - [ContextProperty("Причина", "Cause")] - public IValue InnerException - { - get - { - if (_innerException == null) - _innerException = CreateInnerExceptionInfo(); - - return _innerException; - } - } - - private IValue CreateInnerExceptionInfo() - { - if (_exc.InnerException == null) - return ValueFactory.Create(); - - bool alreadyWrapped = _exc is ExternalSystemException; - if (!alreadyWrapped) - { - ScriptException inner; - inner = _exc.InnerException as ScriptException; - if (inner == null) - { - inner = new ExternalSystemException(_exc.InnerException); - } - if (inner.ModuleName == null) - inner.ModuleName = _exc.ModuleName; - if (inner.Code == null) - inner.Code = _exc.Code; - return new ExceptionInfoContext(inner); - } - else - { - if (_exc.InnerException.InnerException == null) - return ValueFactory.Create(); - - var inner = new ExternalSystemException(_exc.InnerException.InnerException); - if (inner.LineNumber == ErrorPositionInfo.OUT_OF_TEXT) - { - inner.ModuleName = this.ModuleName; - inner.Code = this.SourceLine; - inner.LineNumber = this.LineNumber; - } - - return new ExceptionInfoContext(inner); - } - } - - /// - /// Содержит подробное описание исключения, включая стек вызовов среды исполнения CLR. - /// т.е. не стек вызовов скрипта, а стек вызовов скриптового движка. - /// Эквивалентно функции Exception.ToString() в C#. - /// - /// Строка. - [ContextMethod("ПодробноеОписаниеОшибки", "DetailedDescription")] - public string GetDescription() - { - return _exc.ToString(); - } - - public override string ToString() - { - return Description; - } - - - [ScriptConstructor(Name = "С возможностью передачи параметров")] - public static ExceptionTemplate Create(IValue msg, IValue parameter) - { - return new ExceptionTemplate(msg.AsString(), parameter); - } - - } -} +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ +using System; +using System.Collections.Generic; +using System.Text; +using OneScript.Commons; +using OneScript.Contexts; +using OneScript.Exceptions; +using OneScript.Language; +using OneScript.Localization; +using OneScript.Types; +using ScriptEngine.Types; + +namespace ScriptEngine.Machine.Contexts +{ + /// + /// Класс позволяет узнать информацию о произошедшем исключении. + /// + [ContextClass("ИнформацияОбОшибке", "ErrorInfo", TypeUUID = "E0EDED59-D37A-42E7-9796-D6C061934B5D")] + public class ExceptionInfoContext : AutoContext + { + private static readonly TypeDescriptor ObjectType = typeof(ExceptionInfoContext).GetTypeFromClassMarkup(); + + private ScriptException _exc; + private IValue _innerException; + + public ExceptionInfoContext(ScriptException source) : base(ObjectType) + { + SetActualException(source); + } + + private ExceptionInfoContext(string message, IValue parameters) : base(ObjectType) + { + Description = message; + Parameters = parameters; + } + + public bool IsErrorTemplate => _exc == null; + + public void SetActualException(ScriptException exception) + { + _exc = exception ?? throw new ArgumentNullException(); + Description = _exc.ErrorDescription; + if (exception.InnerException is ParametrizedRuntimeException pre) + { + Parameters = pre.Parameter; + } + } + + private ScriptException ActualException() + { + if (IsErrorTemplate) + { + throw new RuntimeException(BilingualString.Localize( + "Эта ИнформацияОбОшибке еще не была выброшена оператором ВызватьИсключение", + "This ErrorInfo is not have been thrown by Raise operator yet")); + } + + return _exc; + } + + /// + /// Значение, переданное при создании исключения в конструкторе объекта ИнформацияОбОшибке. + /// + [ContextProperty("Параметры", "Parameters", CanWrite = false)] + public IValue Parameters + { + get; + private set; + } + + /// + /// Содержит краткое описание ошибки. Эквивалент Exception.Message в C# + /// + [ContextProperty("Описание", "Description")] + public string Description { get; private set; } + + public string MessageWithoutCodeFragment => ActualException().MessageWithoutCodeFragment; + + public string GetDetailedDescription() + { + var exc = ActualException(); + var sb = new StringBuilder(exc.Message); + var inner = exc.InnerException; + while (inner != default) + { + sb.AppendLine(); + sb.AppendLine(Locale.NStr("ru = 'по причине:';en = 'caused by:'")); + sb.AppendLine(inner.Message); + inner = inner.InnerException; + } + + return sb.ToString(); + } + + /// + /// Имя модуля, вызвавшего исключение. + /// + [ContextProperty("ИмяМодуля", "ModuleName")] + public string ModuleName => ActualException().ModuleName ?? string.Empty; + + /// + /// Номер строки, вызвавшей исключение. + /// + [ContextProperty("НомерСтроки", "LineNumber")] + public int LineNumber => ActualException().LineNumber; + + /// + /// Строка исходного кода, вызвавшего исключение. + /// + [ContextProperty("ИсходнаяСтрока", "SourceLine")] + public string SourceLine => ActualException().Code ?? string.Empty; + + /// + /// Предоставляет доступ к стеку вызовов процедур. + /// Подробнее см. класс КоллекцияКадровСтекаВызовов + /// + /// + [ContextMethod("ПолучитьСтекВызовов", "GetStackTrace")] + public IValue GetStackTrace() + { + if (ActualException().RuntimeSpecificInfo is IList frames) + { + return new StackTraceCollectionContext(frames); + } + return ValueFactory.Create(); + } + + /// + /// Содержит вложенное исключение, если таковое было. Эквивалент Exception.InnerException в C# + /// + [ContextProperty("Причина", "Cause")] + public IValue InnerException + { + get + { + if (_innerException == null) + _innerException = CreateInnerExceptionInfo(); + + return _innerException; + } + } + + private IValue CreateInnerExceptionInfo() + { + var exc = ActualException(); + if (exc.InnerException == null) + return ValueFactory.Create(); + + var alreadyWrapped = ActualException() is ExternalSystemException; + if (!alreadyWrapped) + { + var inner = exc.InnerException as ScriptException ?? new ExternalSystemException(exc.InnerException); + inner.ModuleName ??= exc.ModuleName; + inner.Code ??= exc.Code; + return new ExceptionInfoContext(inner); + } + else + { + if (exc.InnerException.InnerException == null) + return ValueFactory.Create(); + + var inner = new ExternalSystemException(exc.InnerException.InnerException); + if (inner.LineNumber == ErrorPositionInfo.OUT_OF_TEXT) + { + inner.ModuleName = this.ModuleName; + inner.Code = this.SourceLine; + inner.LineNumber = this.LineNumber; + } + + return new ExceptionInfoContext(inner); + } + } + + /// + /// Содержит подробное описание исключения, включая стек вызовов среды исполнения CLR. + /// т.е. не стек вызовов скрипта, а стек вызовов скриптового движка. + /// Эквивалентно функции Exception.ToString() в C#. + /// + /// Строка. + [ContextMethod("ПодробноеОписаниеОшибки", "DetailedDescription")] + public string GetDescription() + { + return ActualException().ToString(); + } + + public override string ToString() + { + return Description; + } + + + [ScriptConstructor(Name = "С возможностью передачи параметров")] + public static ExceptionInfoContext Create(IValue msg, IValue parameter) + { + return new ExceptionInfoContext(msg.AsString(), parameter); + } + + } +} diff --git a/src/ScriptEngine/Machine/Contexts/ExceptionTemplate.cs b/src/ScriptEngine/Machine/Contexts/ExceptionTemplate.cs deleted file mode 100644 index 484553d1b..000000000 --- a/src/ScriptEngine/Machine/Contexts/ExceptionTemplate.cs +++ /dev/null @@ -1,35 +0,0 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ - -using OneScript.Contexts; -using OneScript.Types; -using ScriptEngine.Types; - -namespace ScriptEngine.Machine.Contexts -{ - /// - /// Служебный класс, создаваемый конструктором объекта "ИнформацияОбОшибке". - /// Превращается в полноценный объект ИнформацияОбОшибке в момент выброса исключения. - /// - /// Данный класс предназначен для создания параметризованных исключений. - /// - /// ВызватьИсключение Новый ИнформацияОбОшибке("Текст ошибки", ДополнительныеДанные); - [ContextClass("ИнформацияОбОшибкеШаблон", "ExceptionInfoTemplate", TypeUUID = "E0EDED59-D37A-42E7-9796-D6C061934B5D")] - public class ExceptionTemplate : ContextIValueImpl - { - private static readonly TypeDescriptor _objectType = typeof(ExceptionTemplate).GetTypeFromClassMarkup(); - - public string Message { get; private set; } - public IValue Parameter { get; private set; } - - public ExceptionTemplate(string msg, IValue parameter) : base(_objectType) - { - this.Message = msg; - this.Parameter = parameter; - } - } -} diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index 2d4db6b97..e8d4bde3e 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -533,8 +533,7 @@ private void ExecuteCode() } catch (ScriptException exc) { - if(exc.LineNumber == ErrorPositionInfo.OUT_OF_TEXT) - SetScriptExceptionSource(exc); + SetScriptExceptionSource(exc); if (ShouldRethrowException(exc)) throw; @@ -628,14 +627,12 @@ private void MainCommandLoop() { throw; } - catch (ScriptException) + catch (ScriptException exc) { + exc.SetPositionIfEmpty(GetPositionInfo()); + throw; } - catch (BslCoreException exc) - { - throw new ScriptException(GetPositionInfo(), exc); - } catch (Exception exc) { var excWrapper = new ExternalSystemException(exc); @@ -663,10 +660,7 @@ private ErrorPositionInfo GetPositionInfo() private void SetScriptExceptionSource(ScriptException exc) { - var epi = GetPositionInfo(); - exc.Code = epi.Code; - exc.LineNumber = epi.LineNumber; - exc.ModuleName = epi.ModuleName; + exc.SetPositionIfEmpty(GetPositionInfo()); } #region Commands @@ -1410,9 +1404,9 @@ private void RaiseException(int arg) else { var exceptionValue = _operationStack.Pop().GetRawValue(); - if (exceptionValue is ExceptionTemplate excInfo) + if (exceptionValue is ExceptionInfoContext { IsErrorTemplate: true } excInfo) { - throw new ParametrizedRuntimeException(excInfo.Message, excInfo.Parameter); + throw new ParametrizedRuntimeException(excInfo.Description, excInfo.Parameters); } else { From 5ee8dfaeec893e09f2663f33ca067cfe0b3a1fdb Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 4 Sep 2023 18:05:30 +0300 Subject: [PATCH 081/126] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=BA=D0=B0=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=B2=20native?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Exceptions/IExceptionInfoFactory.cs | 24 +++++ .../Compiler/ExpressionHelpers.cs | 16 +++- .../Compiler/MethodCompiler.cs | 54 ++++++----- .../Runtime/DynamicOperations.cs | 16 +--- .../Runtime/ExceptionInfoClass.cs | 89 ------------------- .../Runtime/ExternalSystemException.cs | 20 ----- .../Hosting/EngineBuilderExtensions.cs | 2 + .../Machine/Contexts/ExceptionInfoContext.cs | 4 +- .../Machine/ExceptionInfoFactory.cs | 47 ++++++++++ .../NativeCompilerTest.cs | 3 +- tests/engine-behaviors.os | 1 + 11 files changed, 125 insertions(+), 151 deletions(-) create mode 100644 src/OneScript.Core/Exceptions/IExceptionInfoFactory.cs delete mode 100644 src/OneScript.Native/Runtime/ExceptionInfoClass.cs delete mode 100644 src/OneScript.Native/Runtime/ExternalSystemException.cs create mode 100644 src/ScriptEngine/Machine/ExceptionInfoFactory.cs diff --git a/src/OneScript.Core/Exceptions/IExceptionInfoFactory.cs b/src/OneScript.Core/Exceptions/IExceptionInfoFactory.cs new file mode 100644 index 000000000..42e716317 --- /dev/null +++ b/src/OneScript.Core/Exceptions/IExceptionInfoFactory.cs @@ -0,0 +1,24 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using OneScript.Contexts; + +namespace OneScript.Exceptions +{ + /// + /// Фабрика объекта ИнформацияОбОшибке по исключению. + /// + public interface IExceptionInfoFactory + { + IRuntimeContextInstance GetExceptionInfo(Exception exception); + + string GetExceptionDescription(IRuntimeContextInstance exceptionInfo); + + Exception Raise(object raiseValue); + } +} \ No newline at end of file diff --git a/src/OneScript.Native/Compiler/ExpressionHelpers.cs b/src/OneScript.Native/Compiler/ExpressionHelpers.cs index 5e8fcc744..c141e641a 100644 --- a/src/OneScript.Native/Compiler/ExpressionHelpers.cs +++ b/src/OneScript.Native/Compiler/ExpressionHelpers.cs @@ -12,8 +12,10 @@ This Source Code Form is subject to the terms of the using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; +using System.Runtime.ExceptionServices; using Microsoft.CSharp.RuntimeBinder; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Language.LexicalAnalysis; using OneScript.Localization; using OneScript.Native.Runtime; @@ -550,13 +552,23 @@ public static Expression TypeByNameCall(ITypeManager manager, Expression argumen return Expression.Call(method, Expression.Constant(manager), argument); } - public static Expression GetExceptionInfo(ParameterExpression excVariable) + public static Expression GetExceptionInfo(Expression factory, ParameterExpression excVariable) { var method = OperationsCache.GetOrAdd( typeof(DynamicOperations), nameof(DynamicOperations.GetExceptionInfo)); - return Expression.Call(method, excVariable); + return Expression.Call(method, factory, excVariable); + } + + public static Expression CallOfInstanceMethod(Expression instance, string name, params Expression[] arguments) + { + var method = OperationsCache.GetOrAdd( + instance.Type, + name, + BindingFlags.Public | BindingFlags.Instance); + + return Expression.Call(instance, method, arguments); } public static Expression AccessModuleVariable(ParameterExpression thisArg, int variableIndex) diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index 6805245f9..b4e46dc14 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -43,6 +43,7 @@ public class MethodCompiler : ExpressionTreeGeneratorBase private readonly BinaryOperationCompiler _binaryOperationCompiler = new BinaryOperationCompiler(); private ITypeManager _typeManager; + private IExceptionInfoFactory _exceptionInfoFactory; private readonly IServiceContainer _services; private readonly BuiltInFunctionsCache _builtInFunctions = new BuiltInFunctionsCache(); @@ -57,19 +58,20 @@ public MethodCompiler(BslWalkerContext walkContext, BslNativeMethodInfo method) _source = walkContext.Source; } - private ITypeManager CurrentTypeManager + private ITypeManager CurrentTypeManager => GetService(_services, ref _typeManager); + + private IExceptionInfoFactory ExceptionInfoFactory => GetService(_services, ref _exceptionInfoFactory); + + private static T GetService(IServiceContainer services, ref T value) where T : class { - get - { - if (_typeManager != default) - return _typeManager; + if (value != default) + return value; - _typeManager = _services.TryResolve(); - if (_typeManager == default) - throw new NotSupportedException("Type manager is not registered in services."); + value = services.TryResolve(); + if (value == default) + throw new NotSupportedException($"{typeof(T)} is not registered in services."); - return _typeManager; - } + return value; } public void CompileMethod(MethodNode methodNode) @@ -1037,15 +1039,13 @@ protected override void VisitRaiseNode(BslSyntaxNode node) else { VisitExpression(node.Children[0]); - var expression = Expression.Call( - _statementBuildParts.Pop(), - typeof(object).GetMethod("ToString")); + var raiseArgExpression = _statementBuildParts.Pop(); + + var exceptionExpression = ExpressionHelpers.CallOfInstanceMethod( + Expression.Constant(ExceptionInfoFactory), + nameof(IExceptionInfoFactory.Raise), + raiseArgExpression); - var exceptionType = typeof(RuntimeException); - var ctor = exceptionType.GetConstructor(new Type[] {typeof(BilingualString)}); - var exceptionExpression = Expression.New( - ctor, - Expression.Convert(expression, typeof(BilingualString))); _blocks.Add(Expression.Throw(exceptionExpression)); } base.VisitRaiseNode(node); @@ -1322,11 +1322,15 @@ private Expression CreateBuiltInFunctionCall(CallNode node) private Expression GetRuntimeExceptionDescription() { - var excInfo = GetRuntimeExceptionObject(); - if (excInfo.Type == typeof(BslUndefinedValue)) - return excInfo; + var excVariable = _blocks.GetCurrentBlock().CurrentException; + if (excVariable == null) + return Expression.Constant(BslUndefinedValue.Instance); - return Expression.Property(excInfo, nameof(ExceptionInfoClass.Description)); + var factory = Expression.Constant(ExceptionInfoFactory); + return ExpressionHelpers.CallOfInstanceMethod( + factory, + nameof(IExceptionInfoFactory.GetExceptionDescription), + excVariable); } private Expression GetRuntimeExceptionObject() @@ -1335,7 +1339,11 @@ private Expression GetRuntimeExceptionObject() if (excVariable == null) return Expression.Constant(BslUndefinedValue.Instance); - return ExpressionHelpers.GetExceptionInfo(excVariable); + var factory = Expression.Constant(ExceptionInfoFactory); + return ExpressionHelpers.CallOfInstanceMethod( + factory, + nameof(IExceptionInfoFactory.GetExceptionInfo), + excVariable); } private void CheckArgumentsCount(BslSyntaxNode argList, int needed) diff --git a/src/OneScript.Native/Runtime/DynamicOperations.cs b/src/OneScript.Native/Runtime/DynamicOperations.cs index c76a7ba5b..9458afffd 100644 --- a/src/OneScript.Native/Runtime/DynamicOperations.cs +++ b/src/OneScript.Native/Runtime/DynamicOperations.cs @@ -163,26 +163,14 @@ public static T StrictConstructorCall(ITypeManager typeManager, IServiceConta return (T) ConstructorCall(typeManager, services, typeName, args); } - public static ExceptionInfoClass GetExceptionInfo(Exception e) + public static IRuntimeContextInstance GetExceptionInfo(IExceptionInfoFactory factory, Exception e) { - if (e is ScriptException s) - return new ExceptionInfoClass(s); - - var wrapper = new ExternalSystemException(e); - - return new ExceptionInfoClass(wrapper); + return factory.GetExceptionInfo(e); } public static BslTypeValue GetTypeByName(ITypeManager manager, string name) { var foundType = manager.GetTypeByName(name); - - // костыль подмены типа для Тип("ИнформацияОбОшибке") - if (foundType.Name == ExceptionInfoClass.LanguageType.Name) - { - foundType = ExceptionInfoClass.LanguageType; - } - return new BslTypeValue(foundType); } diff --git a/src/OneScript.Native/Runtime/ExceptionInfoClass.cs b/src/OneScript.Native/Runtime/ExceptionInfoClass.cs deleted file mode 100644 index ff11e4cd6..000000000 --- a/src/OneScript.Native/Runtime/ExceptionInfoClass.cs +++ /dev/null @@ -1,89 +0,0 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ - -using System; -using OneScript.Contexts; -using OneScript.Language; -using OneScript.Types; -using OneScript.Values; - -namespace OneScript.Native.Runtime -{ - public class ExceptionInfoClass : BslObjectValue - { - private static TypeDescriptor type = new TypeDescriptor( - new Guid("9783123B-DF0D-4821-A2B9-A9244A3530F5"), - "ИнформацияОбОшибке", - "ErrorInfo", - typeof(ExceptionInfoClass)); - - public static TypeDescriptor LanguageType => type; - - private ErrorPositionInfo _errorPosition; - private Exception _exc; - private Lazy _innerException; - - public ExceptionInfoClass(ScriptException lineAwareException) - : this(lineAwareException, lineAwareException.GetPosition()) - { - } - - private ExceptionInfoClass(Exception externalException, ErrorPositionInfo position) - { - _errorPosition = position; - _exc = externalException; - _innerException = new Lazy(WrapInnerException); - } - - public override TypeDescriptor SystemType => type; - - /// - /// Содержит краткое описание ошибки. Эквивалент Exception.Message в C# - /// - [ContextProperty("Описание", "Description")] - public string Description => - _exc switch - { - ScriptException s => s.MessageWithoutCodeFragment, - _ => _exc.Message - }; - - /// - /// Имя модуля, вызвавшего исключение. - /// - [ContextProperty("ИмяМодуля", "ModuleName")] - public string ModuleName => _errorPosition.ModuleName ?? string.Empty; - - /// - /// Номер строки, вызвавшей исключение. - /// - [ContextProperty("НомерСтроки", "LineNumber")] - public int LineNumber => _errorPosition.LineNumber; - - /// - /// Строка исходного кода, вызвавшего исключение. - /// - [ContextProperty("ИсходнаяСтрока", "SourceLine")] - public string SourceLine => _errorPosition.Code ?? string.Empty; - - /// - /// Содержит вложенное исключение, если таковое было. Эквивалент Exception.InnerException в C# - /// - [ContextProperty("Причина", "Cause")] - public ExceptionInfoClass InnerException => _innerException.Value; - - private ExceptionInfoClass WrapInnerException() - { - if (_exc.InnerException == null) - return null; - - var position = _exc.InnerException is ScriptException scr ? scr.GetPosition() : _errorPosition; - - return new ExceptionInfoClass(_exc.InnerException, position); - } - } -} \ No newline at end of file diff --git a/src/OneScript.Native/Runtime/ExternalSystemException.cs b/src/OneScript.Native/Runtime/ExternalSystemException.cs deleted file mode 100644 index 42c2ac7f0..000000000 --- a/src/OneScript.Native/Runtime/ExternalSystemException.cs +++ /dev/null @@ -1,20 +0,0 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ - -using System; -using OneScript.Language; - -namespace OneScript.Native.Runtime -{ - public class ExternalSystemException : ScriptException - { - public ExternalSystemException(Exception reason) - : base(new ErrorPositionInfo(), $"Внешнее исключение ({reason.GetType().FullName}): {reason.Message}", reason) - { - } - } -} \ No newline at end of file diff --git a/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs b/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs index 33887c4dc..ccb3981a8 100644 --- a/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs +++ b/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using System.Diagnostics.CodeAnalysis; using OneScript.Compilation; using OneScript.DependencyInjection; +using OneScript.Exceptions; using OneScript.Execution; using OneScript.Language; using OneScript.Language.SyntaxAnalysis; @@ -48,6 +49,7 @@ public static IEngineBuilder SetDefaultOptions(this IEngineBuilder builder) services.RegisterSingleton(); services.RegisterSingleton(); services.RegisterSingleton(svc => new ThrowingErrorSink(CompilerException.FromCodeError)); + services.RegisterSingleton(); services.Register(); services.Register(); diff --git a/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs b/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs index deced153a..819bb7526 100644 --- a/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs +++ b/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs @@ -41,11 +41,11 @@ private ExceptionInfoContext(string message, IValue parameters) : base(ObjectTyp public bool IsErrorTemplate => _exc == null; - public void SetActualException(ScriptException exception) + private void SetActualException(ScriptException exception) { _exc = exception ?? throw new ArgumentNullException(); Description = _exc.ErrorDescription; - if (exception.InnerException is ParametrizedRuntimeException pre) + if (exception is ParametrizedRuntimeException pre) { Parameters = pre.Parameter; } diff --git a/src/ScriptEngine/Machine/ExceptionInfoFactory.cs b/src/ScriptEngine/Machine/ExceptionInfoFactory.cs new file mode 100644 index 000000000..67ffc865b --- /dev/null +++ b/src/ScriptEngine/Machine/ExceptionInfoFactory.cs @@ -0,0 +1,47 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using OneScript.Contexts; +using OneScript.Exceptions; +using OneScript.Language; +using OneScript.Values; +using ScriptEngine.Machine.Contexts; + +namespace ScriptEngine.Machine +{ + /// + /// Уровень косвенности между нативным рантаймом и ExceptionInfoContext, который тот не видит. + /// + public class ExceptionInfoFactory : IExceptionInfoFactory + { + public IRuntimeContextInstance GetExceptionInfo(Exception exception) + { + if (exception is ScriptException script) + return new ExceptionInfoContext(script); + + return new ExceptionInfoContext(new ExternalSystemException(exception)); + } + + public string GetExceptionDescription(IRuntimeContextInstance exceptionInfo) + { + var info = (ExceptionInfoContext)exceptionInfo; + return info.MessageWithoutCodeFragment; + } + + public Exception Raise(object raiseValue) + { + return raiseValue switch + { + ExceptionInfoContext { IsErrorTemplate: true } excInfo => + new ParametrizedRuntimeException(excInfo.Description, excInfo.Parameters), + BslValue bslVal => new RuntimeException(bslVal.AsString()), + _ => new RuntimeException(raiseValue.ToString()) + }; + } + } +} \ No newline at end of file diff --git a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs index 11303f2cc..a96782310 100644 --- a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs +++ b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs @@ -24,6 +24,7 @@ This Source Code Form is subject to the terms of the using OneScript.Values; using ScriptEngine.Hosting; using ScriptEngine.Machine; +using ScriptEngine.Machine.Contexts; using ScriptEngine.Types; using Xunit; @@ -1029,7 +1030,7 @@ public void ExceptionInfo_ReturnsClass_InCatch() tryBlock.Handlers.First().Body.As().Expressions[0].Type .Should() - .Be(typeof(ExceptionInfoClass)); + .Be(typeof(ExceptionInfoContext)); } [Fact] diff --git a/tests/engine-behaviors.os b/tests/engine-behaviors.os index f97183364..0c187865b 100644 --- a/tests/engine-behaviors.os +++ b/tests/engine-behaviors.os @@ -3,6 +3,7 @@ // Тест проверки поведения движка // /////////////////////////////////////////////////////////////////////// +#native Перем юТест; Перем глТестоваяПеременная; From 9667d9e9031ccf36cba1c2ba8d0e87126ff80423 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 6 Sep 2023 10:34:13 +0300 Subject: [PATCH 082/126] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=BA=D0=B0=20=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=98=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=D0=9E=D0=B1=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Compiler/MethodCompiler.cs | 23 +++++++++++++------ .../Machine/Contexts/ExceptionInfoContext.cs | 18 +++++++++++++++ .../Machine/ExceptionInfoFactory.cs | 12 +++++++++- src/ScriptEngine/Machine/MachineInstance.cs | 16 +------------ 4 files changed, 46 insertions(+), 23 deletions(-) diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index b4e46dc14..bec54d0fa 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -1323,27 +1323,36 @@ private Expression CreateBuiltInFunctionCall(CallNode node) private Expression GetRuntimeExceptionDescription() { var excVariable = _blocks.GetCurrentBlock().CurrentException; - if (excVariable == null) - return Expression.Constant(BslUndefinedValue.Instance); - + Expression factoryArgument; + // нас вызвали вне попытки-исключения + factoryArgument = excVariable == null ? Expression.Constant(null, typeof(IRuntimeContextInstance)) : GetRuntimeExceptionObject(); + var factory = Expression.Constant(ExceptionInfoFactory); return ExpressionHelpers.CallOfInstanceMethod( factory, nameof(IExceptionInfoFactory.GetExceptionDescription), - excVariable); + factoryArgument); } private Expression GetRuntimeExceptionObject() { var excVariable = _blocks.GetCurrentBlock().CurrentException; + Expression factoryArgument; if (excVariable == null) - return Expression.Constant(BslUndefinedValue.Instance); - + { + // нас вызвали вне попытки-исключения + factoryArgument = Expression.Constant(null, typeof(Exception)); + } + else + { + factoryArgument = excVariable; + } + var factory = Expression.Constant(ExceptionInfoFactory); return ExpressionHelpers.CallOfInstanceMethod( factory, nameof(IExceptionInfoFactory.GetExceptionInfo), - excVariable); + factoryArgument); } private void CheckArgumentsCount(BslSyntaxNode argList, int needed) diff --git a/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs b/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs index 819bb7526..ce73700d3 100644 --- a/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs +++ b/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs @@ -200,5 +200,23 @@ public static ExceptionInfoContext Create(IValue msg, IValue parameter) return new ExceptionInfoContext(msg.AsString(), parameter); } + public static ExceptionInfoContext EmptyExceptionInfo() + { + return new ExceptionInfoContext(EmptyScriptException.Instance); + } + + private class EmptyScriptException : ScriptException + { + public static EmptyScriptException Instance = new EmptyScriptException(); + private EmptyScriptException() : base("") + { + LineNumber = 0; + ColumnNumber = 0; + } + + public override string Message => ""; + + public override string ToString() => ""; + } } } diff --git a/src/ScriptEngine/Machine/ExceptionInfoFactory.cs b/src/ScriptEngine/Machine/ExceptionInfoFactory.cs index 67ffc865b..d6da3c696 100644 --- a/src/ScriptEngine/Machine/ExceptionInfoFactory.cs +++ b/src/ScriptEngine/Machine/ExceptionInfoFactory.cs @@ -21,14 +21,24 @@ public class ExceptionInfoFactory : IExceptionInfoFactory { public IRuntimeContextInstance GetExceptionInfo(Exception exception) { + if (exception == null) + { + return ExceptionInfoContext.EmptyExceptionInfo(); + } + if (exception is ScriptException script) return new ExceptionInfoContext(script); - + return new ExceptionInfoContext(new ExternalSystemException(exception)); } public string GetExceptionDescription(IRuntimeContextInstance exceptionInfo) { + if (exceptionInfo == null) + { + return ""; + } + var info = (ExceptionInfoContext)exceptionInfo; return info.MessageWithoutCodeFragment; } diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index e8d4bde3e..4759269da 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -52,20 +52,7 @@ private MachineInstance() } public event EventHandler MachineStopped; - - private class EmptyExceptionInfo : ScriptException - { - public EmptyExceptionInfo() : base("") - { - LineNumber = 0; - ColumnNumber = 0; - } - public override string Message => ""; - - public override string ToString() => ""; - } - public void AttachContext(IAttachableContext context) { _scopes.Add(CreateModuleScope(context)); @@ -2457,8 +2444,7 @@ private void ExceptionInfo(int arg) } else { - var noDataException = new EmptyExceptionInfo(); - _operationStack.Push(new ExceptionInfoContext(noDataException)); + _operationStack.Push(ExceptionInfoContext.EmptyExceptionInfo()); } NextInstruction(); } From fcb9dd5dc7b6d6f1a72c38ca1d506f805fbc8383 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Thu, 7 Sep 2023 07:53:58 +0300 Subject: [PATCH 083/126] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20native?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D1=82=D0=B5=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/engine-behaviors.os | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/engine-behaviors.os b/tests/engine-behaviors.os index 24a0b4339..01867ddf2 100644 --- a/tests/engine-behaviors.os +++ b/tests/engine-behaviors.os @@ -3,7 +3,6 @@ // Тест проверки поведения движка // /////////////////////////////////////////////////////////////////////// -#native Перем юТест; Перем глТестоваяПеременная; From 66c35d0a87d7b3e31ffcebc666677c3f777c0cb0 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 15 Sep 2023 22:08:25 +0300 Subject: [PATCH 084/126] =?UTF-8?q?=D0=9F=D0=BE=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8,=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20Dispose=20=D1=82=D0=B0=D0=BC,=20=D0=B3?= =?UTF-8?q?=D0=B4=D0=B5=20=D0=B5=D0=B3=D0=BE=20=D0=BD=D0=B5=20=D0=B1=D1=8B?= =?UTF-8?q?=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit d85fb5074acb1835157abdb00278ca2d272d1fb0) --- .../TcpServer/DefaultMessageServer.cs | 10 ++++++++++ src/OneScript.DebugServices/MachineWaitToken.cs | 16 +++++++++------- src/OneScript.DebugServices/ThreadManager.cs | 1 + src/ScriptEngine/ScriptingEngine.cs | 3 ++- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs b/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs index 022d44625..cfe81ab1b 100644 --- a/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs +++ b/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs @@ -21,6 +21,11 @@ public DefaultMessageServer(ICommunicationChannel protocolChannel) { _protocolChannel = protocolChannel; } + + /// + /// Имя, назначаемое потоку сервера. Полезно для отладки и диагностики. + /// + public string ServerThreadName { get; set; } public void Start() { @@ -85,6 +90,11 @@ private void RunCommandsLoop() }); _messageThread.IsBackground = true; + if (ServerThreadName != default) + { + _messageThread.Name = ServerThreadName; + } + _messageThread.Start(); } diff --git a/src/OneScript.DebugServices/MachineWaitToken.cs b/src/OneScript.DebugServices/MachineWaitToken.cs index 732fa143a..6b2e3bc80 100644 --- a/src/OneScript.DebugServices/MachineWaitToken.cs +++ b/src/OneScript.DebugServices/MachineWaitToken.cs @@ -5,20 +5,16 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +using System; using System.Threading; using ScriptEngine.Machine; namespace OneScript.DebugServices { - public class MachineWaitToken + public class MachineWaitToken: IDisposable { - private ManualResetEventSlim _threadEvent; + private ManualResetEventSlim _threadEvent = new ManualResetEventSlim(); - public MachineWaitToken() - { - _threadEvent = new ManualResetEventSlim(); - } - public MachineInstance Machine { get; set; } public void Wait() => _threadEvent.Wait(); @@ -26,5 +22,11 @@ public MachineWaitToken() public void Set() => _threadEvent.Set(); public void Reset() => _threadEvent.Reset(); + + public void Dispose() + { + Machine.UnsetDebugMode(); + _threadEvent.Dispose(); + } } } \ No newline at end of file diff --git a/src/OneScript.DebugServices/ThreadManager.cs b/src/OneScript.DebugServices/ThreadManager.cs index 06033ed85..e19d28d0b 100644 --- a/src/OneScript.DebugServices/ThreadManager.cs +++ b/src/OneScript.DebugServices/ThreadManager.cs @@ -87,6 +87,7 @@ public void Dispose() foreach (var machineWaitToken in tokens) { machineWaitToken.Machine.MachineStopped -= Machine_MachineStopped; + machineWaitToken.Dispose(); } _machinesOnThreads.Clear(); diff --git a/src/ScriptEngine/ScriptingEngine.cs b/src/ScriptEngine/ScriptingEngine.cs index f627292e9..8a5bc73bb 100644 --- a/src/ScriptEngine/ScriptingEngine.cs +++ b/src/ScriptEngine/ScriptingEngine.cs @@ -1,4 +1,4 @@ -/*---------------------------------------------------------- +/*---------------------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v.2.0. If a copy of the MPL was not distributed with this file, You can obtain one @@ -196,6 +196,7 @@ public void SetCodeStatisticsCollector(ICodeStatCollector collector) public void Dispose() { + DebugController?.Dispose(); AttachedScriptsFactory.SetInstance(null); } From 604ec354869155fd00acb155e10bfd2a2c631772 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Sat, 16 Sep 2023 22:26:04 +0300 Subject: [PATCH 085/126] =?UTF-8?q?#1327:=20=D0=9F=D0=BE=D1=80=D1=8F=D0=B4?= =?UTF-8?q?=D0=BE=D0=BA=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TypeDescriptions/TypeDescription.cs | 29 ++++++++----------- tests/typedescription.os | 12 ++++++++ 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs index 51bd1275a..59528f4d4 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs @@ -114,41 +114,36 @@ IValueAdjuster GetAdjusterForType(BslTypeValue type) } [ContextMethod("ПривестиЗначение", "AdjustValue")] - public IValue AdjustValue(IValue value = null) + public IValue AdjustValue(IValue pValue = null) { - + var value = pValue?.GetRawValue(); if (_types.Count == 0) { return value ?? ValueFactory.Create(); } - BslTypeValue typeToCast = null; - if (value != null && value.SystemType != BasicTypes.Undefined) { var valueType = new BslTypeValue(value.SystemType); if (_types.Contains(valueType)) { // Если такой тип у нас есть - typeToCast = valueType; + var adjuster = GetAdjusterForType(valueType); + var adjustedValue = adjuster.Adjust(value); + if (adjustedValue != null) + return adjustedValue; } } - if (typeToCast == null) + foreach (var type in _types) { - // Если типа нет, то нужно брать значение по-умолчанию - if (_types.Count != 1) - { - // много типов - Неопределено - return ValueFactory.Create(); - } - - typeToCast = _types[0]; + var adjuster = GetAdjusterForType(type); + var adjustedValue = adjuster?.Adjust(value); + if (adjustedValue != null) + return adjustedValue; } - var adjuster = GetAdjusterForType(typeToCast); - - return adjuster?.Adjust(value) ?? ValueFactory.Create(); + return ValueFactory.Create(); } internal static BslTypeValue TypeNumber() diff --git a/tests/typedescription.os b/tests/typedescription.os index 65592c65c..4bec441b9 100644 --- a/tests/typedescription.os +++ b/tests/typedescription.os @@ -36,6 +36,7 @@ ВсеТесты.Добавить("ТестДолжен_Преобразование_ОписаниеБезТипов_КвалификаторыИгнорируются"); ВсеТесты.Добавить("ТестДолжен_ПроверитьОдинаковыйПорядокТипов"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПорядокПриведенияТипов"); Возврат ВсеТесты; @@ -543,6 +544,17 @@ КонецПроцедуры +Процедура ТестДолжен_ПроверитьПорядокПриведенияТипов() Экспорт + + ОписаниеТипов = Новый ОписаниеТипов("Число, Строка", Новый КвалификаторыСтроки(1)); + + юТест.ПроверитьРавенство(ОписаниеТипов.ПривестиЗначение(Истина), "Д"); // TODO: локализация + юТест.ПроверитьРавенство(ОписаниеТипов.ПривестиЗначение("Строка"), "С"); + юТест.ПроверитьРавенство(ОписаниеТипов.ПривестиЗначение(15), 15); + юТест.ПроверитьРавенство(ОписаниеТипов.ПривестиЗначение('20230911'), "1"); // TODO: локализация + +КонецПроцедуры + Процедура ТестДолжен_ПроверитьОдинаковыйПорядокТипов() Экспорт ОТ = Новый ОписаниеТипов("Число, Строка"); From e4060c23100e7f910143f5541a27d9fa7e4e02e6 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 17 Sep 2023 20:29:20 +0200 Subject: [PATCH 086/126] Create sonar.yml --- .github/workflows/sonar.yml | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/sonar.yml diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml new file mode 100644 index 000000000..60c221c94 --- /dev/null +++ b/.github/workflows/sonar.yml @@ -0,0 +1,45 @@ +name: QA + +on: + push: + pull_request: + +jobs: + sonar: + name: Build + runs-on: windows-latest + steps: + - name: Set up JDK 17 + uses: actions/setup-java@v1 + with: + java-version: 1.17 + - uses: actions/checkout@v2 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: Cache SonarQube packages + uses: actions/cache@v1 + with: + path: ~\sonar\cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + - name: Cache SonarQube scanner + id: cache-sonar-scanner + uses: actions/cache@v1 + with: + path: .\.sonar\scanner + key: ${{ runner.os }}-sonar-scanner + restore-keys: ${{ runner.os }}-sonar-scanner + - name: Install SonarQube scanner + if: steps.cache-sonar-scanner.outputs.cache-hit != 'true' + shell: powershell + run: | + New-Item -Path .\.sonar\scanner -ItemType Directory + dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner + - name: Build and analyze + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + shell: powershell + run: | + .\.sonar\scanner\dotnet-sonarscanner begin /k:"1script" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" + dotnet build + .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" From 6a022d5e8cbdaf2b04d0159e624a0e3c202c3900 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 17 Sep 2023 20:35:11 +0200 Subject: [PATCH 087/126] Update sonar.yml --- .github/workflows/sonar.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 60c221c94..d4e7c52d2 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -41,5 +41,5 @@ jobs: shell: powershell run: | .\.sonar\scanner\dotnet-sonarscanner begin /k:"1script" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" - dotnet build + dotnet build Build_Core.csproj .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" From 47fa376e07be5a9ed7735a9fede9c563bc386cff Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 17 Sep 2023 20:55:25 +0200 Subject: [PATCH 088/126] Update sonar.yml --- .github/workflows/sonar.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index d4e7c52d2..553c460e9 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -41,5 +41,5 @@ jobs: shell: powershell run: | .\.sonar\scanner\dotnet-sonarscanner begin /k:"1script" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" - dotnet build Build_Core.csproj + dotnet publish Build_Core.csproj .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" From f6e1a771db2788f6a95d6bfac4549e7a8bd1f4a2 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 17 Sep 2023 21:04:59 +0200 Subject: [PATCH 089/126] Update sonar.yml --- .github/workflows/sonar.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 553c460e9..3679bd2f1 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -41,5 +41,5 @@ jobs: shell: powershell run: | .\.sonar\scanner\dotnet-sonarscanner begin /k:"1script" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" - dotnet publish Build_Core.csproj + dotnet publish src/oscript/oscript.csproj .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" From 3a6d270d10bdd18d71b5018a3bae2bab7d175c96 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 17 Sep 2023 22:03:17 +0200 Subject: [PATCH 090/126] Update sonar.yml --- .github/workflows/sonar.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 3679bd2f1..4eec1ded6 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -40,6 +40,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any shell: powershell run: | - .\.sonar\scanner\dotnet-sonarscanner begin /k:"1script" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" + .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" dotnet publish src/oscript/oscript.csproj .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" From 3c6c79f6f7032c1dc1645988c81b4720a42a12bc Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 17 Sep 2023 22:15:26 +0200 Subject: [PATCH 091/126] Update sonar.yml --- .github/workflows/sonar.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 4eec1ded6..5b01e8e9c 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -40,6 +40,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any shell: powershell run: | - .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" + .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" dotnet publish src/oscript/oscript.csproj - .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" + .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}" From cd268ca373ec82cf5a823274c88865824e6e375e Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Sat, 16 Sep 2023 09:25:12 +0300 Subject: [PATCH 092/126] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=20=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D1=87=D0=B8=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Новое логирование в адаптере * Реализация команды disconnect отладчика * Добавлены примеры в README пакета * Добавлено управление флагом debug.wait для режима oscript.web * Правильно обрабатывается Disconnect в режиме attach (не завершает процесс) --- .../Abstractions/ICommunicationServer.cs | 3 + .../IDebugEventListener.cs | 3 + .../IDebuggerService.cs | 9 ++ .../TcpServer/BinaryChannel.cs | 3 + .../TcpServer/DefaultMessageServer.cs | 2 +- .../TcpServer/DispatchingServer.cs | 7 +- .../TcpServer/StopServiceException.cs | 18 ++++ .../BinaryTcpDebugServer.cs | 5 +- .../DefaultBreakpointManager.cs | 5 + .../DefaultDebugController.cs | 5 + .../DefaultDebugService.cs | 27 ++++-- .../MachineWaitToken.cs | 1 + src/OneScript.DebugServices/ThreadManager.cs | 9 +- src/ScriptEngine/Machine/IDebugController.cs | 2 + src/VSCode.DebugAdapter/DebugSession.cs | 3 +- src/VSCode.DebugAdapter/DebugeeProcess.cs | 43 ++++++--- .../OscriptDebugSession.cs | 94 ++++++++++++------- .../OscriptProtocols/Tcp/RpcProcessor.cs | 14 ++- ...ugConnector.cs => TcpDebugServerClient.cs} | 28 ++++-- src/VSCode.DebugAdapter/Program.cs | 72 +++----------- src/VSCode.DebugAdapter/Protocol.cs | 29 ++---- src/VSCode.DebugAdapter/README.md | 46 ++++++++- src/VSCode.DebugAdapter/ServerProcess.cs | 5 +- src/VSCode.DebugAdapter/SessionLog.cs | 58 ------------ .../VSCode.DebugAdapter.csproj | 3 + src/VSCode.DebugAdapter/WebLaunchOptions.cs | 2 + src/VSCode.DebugAdapter/package.json | 10 +- 27 files changed, 288 insertions(+), 218 deletions(-) create mode 100644 src/OneScript.DebugProtocol/TcpServer/StopServiceException.cs rename src/VSCode.DebugAdapter/OscriptProtocols/Tcp/{TcpDebugConnector.cs => TcpDebugServerClient.cs} (84%) delete mode 100644 src/VSCode.DebugAdapter/SessionLog.cs diff --git a/src/OneScript.DebugProtocol/Abstractions/ICommunicationServer.cs b/src/OneScript.DebugProtocol/Abstractions/ICommunicationServer.cs index b964431db..f13e0418e 100644 --- a/src/OneScript.DebugProtocol/Abstractions/ICommunicationServer.cs +++ b/src/OneScript.DebugProtocol/Abstractions/ICommunicationServer.cs @@ -9,6 +9,9 @@ This Source Code Form is subject to the terms of the namespace OneScript.DebugProtocol.Abstractions { + /// + /// Сервис прослушивания сетевого канала и отправки в него сообщений + /// public interface ICommunicationServer { void Start(); diff --git a/src/OneScript.DebugProtocol/IDebugEventListener.cs b/src/OneScript.DebugProtocol/IDebugEventListener.cs index 29c627639..def15c4bc 100644 --- a/src/OneScript.DebugProtocol/IDebugEventListener.cs +++ b/src/OneScript.DebugProtocol/IDebugEventListener.cs @@ -7,6 +7,9 @@ This Source Code Form is subject to the terms of the namespace OneScript.DebugProtocol { + /// + /// Интерфейс слушателя событий отладки (сообщений, инициируемых со стороны BSL) + /// public interface IDebugEventListener { void ThreadStopped(int threadId, ThreadStopReason reason); diff --git a/src/OneScript.DebugProtocol/IDebuggerService.cs b/src/OneScript.DebugProtocol/IDebuggerService.cs index 91c421d2b..84f7593f4 100644 --- a/src/OneScript.DebugProtocol/IDebuggerService.cs +++ b/src/OneScript.DebugProtocol/IDebuggerService.cs @@ -7,6 +7,9 @@ This Source Code Form is subject to the terms of the namespace OneScript.DebugProtocol { + /// + /// Сервис непосредственной работы с командами отладки, шагами, брейкпоинтами и пр. + /// public interface IDebuggerService { /// @@ -59,6 +62,12 @@ public interface IDebuggerService void StepOut(int threadId); + /// + /// Отключение сеанса отладки по инициативе IDE + /// + /// + void Disconnect(bool terminate); + int[] GetThreads(); int GetProcessId(); diff --git a/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs b/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs index b2f1788ed..5f7b99a93 100644 --- a/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs +++ b/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs @@ -12,6 +12,9 @@ This Source Code Form is subject to the terms of the namespace OneScript.DebugProtocol { + /// + /// TCP-канал, использующий стандартную Binary-сериализацию .NET + /// public class BinaryChannel : ICommunicationChannel { private readonly TcpClient _client; diff --git a/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs b/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs index cfe81ab1b..3f70cff8a 100644 --- a/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs +++ b/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs @@ -84,7 +84,6 @@ private void RunCommandsLoop() catch (Exception) { _serverStopped = true; - break; } } }); @@ -108,6 +107,7 @@ public void Stop() if (_messageThread?.IsAlive == true) { _protocolChannel.Dispose(); + _messageThread.Interrupt(); } } diff --git a/src/OneScript.DebugProtocol/TcpServer/DispatchingServer.cs b/src/OneScript.DebugProtocol/TcpServer/DispatchingServer.cs index 13cace284..5d0ec7cd0 100644 --- a/src/OneScript.DebugProtocol/TcpServer/DispatchingServer.cs +++ b/src/OneScript.DebugProtocol/TcpServer/DispatchingServer.cs @@ -56,9 +56,14 @@ private void ProcessSuccess(RpcCall message, ICommunicationChannel responseChann try { var methodResult = _requestProcessor.Dispatch(_requestService, message.Id, message.Parameters); - if(methodResult != null) + if (methodResult != null) callResult = RpcCallResult.Respond(message, methodResult); } + catch (StopServiceException) + { + Stop(); + return; + } catch (Exception e) { callResult = RpcCallResult.Exception(message, e); diff --git a/src/OneScript.DebugProtocol/TcpServer/StopServiceException.cs b/src/OneScript.DebugProtocol/TcpServer/StopServiceException.cs new file mode 100644 index 000000000..359e4427f --- /dev/null +++ b/src/OneScript.DebugProtocol/TcpServer/StopServiceException.cs @@ -0,0 +1,18 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; + +namespace OneScript.DebugProtocol.TcpServer +{ + /// + /// Прерывание сервера со стороны прикладного интерфейса. Кнопка "Выход" из диспетчера + /// + public class StopServiceException : ApplicationException + { + } +} \ No newline at end of file diff --git a/src/OneScript.DebugServices/BinaryTcpDebugServer.cs b/src/OneScript.DebugServices/BinaryTcpDebugServer.cs index c20c1d622..9648e4b4b 100644 --- a/src/OneScript.DebugServices/BinaryTcpDebugServer.cs +++ b/src/OneScript.DebugServices/BinaryTcpDebugServer.cs @@ -24,7 +24,10 @@ public IDebugController CreateDebugController() { var listener = TcpListener.Create(_port); var channel = new DelayedConnectionChannel(listener); - var ipcServer = new DefaultMessageServer(channel); + var ipcServer = new DefaultMessageServer(channel) + { + ServerThreadName = "debug-server" + }; var callback = new TcpEventCallbackChannel(channel); var threadManager = new ThreadManager(); var breakpoints = new DefaultBreakpointManager(); diff --git a/src/OneScript.DebugServices/DefaultBreakpointManager.cs b/src/OneScript.DebugServices/DefaultBreakpointManager.cs index 82745fdbf..ef74bb911 100644 --- a/src/OneScript.DebugServices/DefaultBreakpointManager.cs +++ b/src/OneScript.DebugServices/DefaultBreakpointManager.cs @@ -32,5 +32,10 @@ public bool Find(string module, int line) var found = _breakpoints.Find(x => x.Module.Equals(module) && x.LineNumber == line); return found != null; } + + public void Clear() + { + _breakpoints.Clear(); + } } } \ No newline at end of file diff --git a/src/OneScript.DebugServices/DefaultDebugController.cs b/src/OneScript.DebugServices/DefaultDebugController.cs index ea548d5bb..7c09b9a54 100644 --- a/src/OneScript.DebugServices/DefaultDebugController.cs +++ b/src/OneScript.DebugServices/DefaultDebugController.cs @@ -13,6 +13,11 @@ This Source Code Form is subject to the terms of the namespace OneScript.DebugServices { + /// + /// Простой односессионный контроллер отладки. Поддерживает только один сеанс отладки на процесс. + /// Также поддерживает только один BSL-процесс на приложение. При получении NotifyProcessExited отключает отладчик + /// и к нему нельзя подключиться еще раз. + /// public class DefaultDebugController : IDebugController { private readonly ICommunicationServer _server; diff --git a/src/OneScript.DebugServices/DefaultDebugService.cs b/src/OneScript.DebugServices/DefaultDebugService.cs index e9478c14f..c7b035baf 100644 --- a/src/OneScript.DebugServices/DefaultDebugService.cs +++ b/src/OneScript.DebugServices/DefaultDebugService.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using System.Linq; using OneScript.Contexts; using OneScript.DebugProtocol; +using OneScript.DebugProtocol.TcpServer; using OneScript.Language; using ScriptEngine.Machine; using StackFrame = OneScript.DebugProtocol.StackFrame; @@ -50,7 +51,7 @@ public void Execute(int threadId) } } - public virtual Breakpoint[] SetMachineBreakpoints(Breakpoint[] breaksToSet) + public Breakpoint[] SetMachineBreakpoints(Breakpoint[] breaksToSet) { var confirmedBreakpoints = new List(); @@ -83,7 +84,7 @@ public virtual Breakpoint[] SetMachineBreakpoints(Breakpoint[] breaksToSet) return confirmedBreakpoints.ToArray(); } - public virtual StackFrame[] GetStackFrames(int threadId) + public StackFrame[] GetStackFrames(int threadId) { var machine = _threadManager.GetTokenForThread(threadId).Machine; var frames = machine.GetExecutionFrames(); @@ -113,7 +114,7 @@ private MachineInstance GetMachine(int threadId) return savedMachine; } - public virtual Variable[] GetVariables(int threadId, int frameIndex, int[] path) + public Variable[] GetVariables(int threadId, int frameIndex, int[] path) { var machine = GetMachine(threadId); @@ -128,7 +129,7 @@ public virtual Variable[] GetVariables(int threadId, int frameIndex, int[] path) return GetDebugVariables(locals); } - public virtual Variable[] GetEvaluatedVariables(string expression, int threadId, int frameIndex, int[] path) + public Variable[] GetEvaluatedVariables(string expression, int threadId, int frameIndex, int[] path) { IValue value; @@ -152,7 +153,7 @@ public virtual Variable[] GetEvaluatedVariables(string expression, int threadId, return GetDebugVariables(locals); } - public virtual Variable Evaluate(int threadId, int contextFrame, string expression) + public Variable Evaluate(int threadId, int contextFrame, string expression) { try { @@ -170,28 +171,36 @@ public virtual Variable Evaluate(int threadId, int contextFrame, string expressi } } - public virtual void Next(int threadId) + public void Next(int threadId) { var t = _threadManager.GetTokenForThread(threadId); t.Machine.StepOver(); t.Set(); } - public virtual void StepIn(int threadId) + public void StepIn(int threadId) { var t = _threadManager.GetTokenForThread(threadId); t.Machine.StepIn(); t.Set(); } - public virtual void StepOut(int threadId) + public void StepOut(int threadId) { var t = _threadManager.GetTokenForThread(threadId); t.Machine.StepOut(); t.Set(); } - public virtual int[] GetThreads() + public void Disconnect(bool terminate) + { + _breakpointManager.Clear(); + _threadManager.ReleaseAllThreads(); + + throw new StopServiceException(); + } + + public int[] GetThreads() { return _threadManager.GetAllThreadIds(); } diff --git a/src/OneScript.DebugServices/MachineWaitToken.cs b/src/OneScript.DebugServices/MachineWaitToken.cs index 6b2e3bc80..ddb22b481 100644 --- a/src/OneScript.DebugServices/MachineWaitToken.cs +++ b/src/OneScript.DebugServices/MachineWaitToken.cs @@ -26,6 +26,7 @@ public class MachineWaitToken: IDisposable public void Dispose() { Machine.UnsetDebugMode(); + _threadEvent.Set(); _threadEvent.Dispose(); } } diff --git a/src/OneScript.DebugServices/ThreadManager.cs b/src/OneScript.DebugServices/ThreadManager.cs index e19d28d0b..2dc31f3fa 100644 --- a/src/OneScript.DebugServices/ThreadManager.cs +++ b/src/OneScript.DebugServices/ThreadManager.cs @@ -80,8 +80,8 @@ public int[] GetAllThreadIds() { return _machinesOnThreads.Keys.ToArray(); } - - public void Dispose() + + public void ReleaseAllThreads() { var tokens = GetAllTokens(); foreach (var machineWaitToken in tokens) @@ -92,5 +92,10 @@ public void Dispose() _machinesOnThreads.Clear(); } + + public void Dispose() + { + ReleaseAllThreads(); + } } } \ No newline at end of file diff --git a/src/ScriptEngine/Machine/IDebugController.cs b/src/ScriptEngine/Machine/IDebugController.cs index fae8a2812..e3801e3ac 100644 --- a/src/ScriptEngine/Machine/IDebugController.cs +++ b/src/ScriptEngine/Machine/IDebugController.cs @@ -27,5 +27,7 @@ public interface IBreakpointManager void SetLineStops(string module, int[] lines); bool Find(string module, int line); + + void Clear(); } } diff --git a/src/VSCode.DebugAdapter/DebugSession.cs b/src/VSCode.DebugAdapter/DebugSession.cs index c78b7a0c5..ced5ff0e3 100644 --- a/src/VSCode.DebugAdapter/DebugSession.cs +++ b/src/VSCode.DebugAdapter/DebugSession.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.IO; +using Serilog; using VSCode.DebugAdapter; namespace VSCodeDebug @@ -180,6 +181,7 @@ public class Capabilities : ResponseBody { public bool supportsConditionalBreakpoints; public bool supportsEvaluateForHovers; public dynamic[] exceptionBreakpointFilters; + public bool supportTerminateDebuggee; } public class ErrorResponseBody : ResponseBody { @@ -449,7 +451,6 @@ public virtual void SetExceptionBreakpoints(Response response, dynamic arguments protected virtual void OnRequestError(Exception e) { - SessionLog.WriteLine(e.ToString()); } public abstract void SetBreakpoints(Response response, dynamic arguments); diff --git a/src/VSCode.DebugAdapter/DebugeeProcess.cs b/src/VSCode.DebugAdapter/DebugeeProcess.cs index 19c8d16a0..e6071a512 100644 --- a/src/VSCode.DebugAdapter/DebugeeProcess.cs +++ b/src/VSCode.DebugAdapter/DebugeeProcess.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Linq; using Newtonsoft.Json.Linq; +using Serilog; using StackFrame = OneScript.DebugProtocol.StackFrame; namespace VSCode.DebugAdapter @@ -21,6 +22,7 @@ internal abstract class DebugeeProcess private bool _terminated; private bool _stdoutEOF; private bool _stderrEOF; + private bool _attachMode; private IDebuggerService _debugger; @@ -53,12 +55,21 @@ public void Start() _process.OutputDataReceived += Process_OutputDataReceived; _process.ErrorDataReceived += Process_ErrorDataReceived; _process.Exited += Process_Exited; - + _attachMode = false; _process.Start(); System.Threading.Thread.Sleep(1500); _process.BeginOutputReadLine(); _process.BeginErrorReadLine(); } + + public void InitAttached() + { + var pid = _debugger.GetProcessId(); + _process = Process.GetProcessById(pid); + _attachMode = true; + _process.EnableRaisingEvents = true; + _process.Exited += Process_Exited; + } public void Init(JObject args) { @@ -139,14 +150,30 @@ private void Terminate() } } - public void Kill() + public void HandleDisconnect(bool terminate) { - if (_process != null && !_process.HasExited) + if (_debugger == null) { - _process.Kill(); + Log.Debug("Debugger is not connected. Nothing to disconnect"); + return; + } + _debugger.Disconnect(terminate); + + var mustKill = terminate || !_attachMode; + + if (mustKill && _process != null && !_process.HasExited) + { + if (!_process.WaitForExit(2000)) + _process.Kill(); } } + public void Kill() + { + _process.Kill(); + _process.WaitForExit(1500); + } + public Breakpoint[] SetBreakpoints(IEnumerable breakpoints) { var confirmedBreaks = _debugger.SetMachineBreakpoints(breakpoints.ToArray()); @@ -216,13 +243,5 @@ public int[] GetThreads() { return _debugger.GetThreads(); } - - public void InitAttached() - { - var pid = _debugger.GetProcessId(); - _process = Process.GetProcessById(pid); - _process.EnableRaisingEvents = true; - _process.Exited += Process_Exited; - } } } diff --git a/src/VSCode.DebugAdapter/OscriptDebugSession.cs b/src/VSCode.DebugAdapter/OscriptDebugSession.cs index a7ac7019e..7cc50e153 100644 --- a/src/VSCode.DebugAdapter/OscriptDebugSession.cs +++ b/src/VSCode.DebugAdapter/OscriptDebugSession.cs @@ -7,7 +7,10 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; using System.IO; +using System.Runtime.CompilerServices; +using Newtonsoft.Json; using OneScript.DebugProtocol; +using Serilog; using VSCodeDebug; @@ -19,6 +22,8 @@ internal class OscriptDebugSession : DebugSession, IDebugEventListener private bool _startupPerformed = false; private readonly Handles _framesHandles; private readonly Handles _variableHandles; + + private static readonly ILogger Log = Serilog.Log.ForContext(); public OscriptDebugSession() : base(true, false) { @@ -30,18 +35,19 @@ public OscriptDebugSession() : base(true, false) public override void Initialize(Response response, dynamic args) { - SessionLog.WriteLine("Initialize:" + args); + LogCommandReceived(); AdapterID = (string) args.adapterID; _process = DebugeeFactory.CreateProcess(AdapterID, PathStrategy); - SendResponse(response, new Capabilities() + SendResponse(response, new Capabilities { supportsConditionalBreakpoints = false, supportsFunctionBreakpoints = false, supportsConfigurationDoneRequest = true, exceptionBreakpointFilters = new dynamic[0], - supportsEvaluateForHovers = true + supportsEvaluateForHovers = true, + supportTerminateDebuggee = true }); SendEvent(new InitializedEvent()); @@ -49,38 +55,38 @@ public override void Initialize(Response response, dynamic args) public override void Launch(Response response, dynamic args) { - SessionLog.WriteLine("Launch command accepted"); - + LogCommandReceived(); try { _process.Init(args); } catch (InvalidDebugeeOptionsException e) { + Log.Error(e, "Wrong options received {ErrorCode}: {Message}", e.ErrorCode, e.Message); SendErrorResponse(response, e.ErrorCode, e.Message); return; } _process.OutputReceived += (s, e) => { - SessionLog.WriteLine("output received: " + e.Content); + Log.Debug("Output received {Output}", e.Content); SendOutput(e.Category, e.Content); }; _process.ProcessExited += (s, e) => { - SessionLog.WriteLine("_process exited"); + Log.Information("Debuggee has exited"); SendEvent(new TerminatedEvent()); }; try { _process.Start(); - SessionLog.WriteLine("Debuggee started"); + Log.Information("Debuggee started"); } catch (Exception e) { - SessionLog.WriteLine(e.ToString()); + Log.Error(e, "Can't launch debuggee"); SendErrorResponse(response, 3012, "Can't launch debugee ({reason}).", new { reason = e.Message }); return; } @@ -88,7 +94,7 @@ public override void Launch(Response response, dynamic args) try { IDebuggerService service; - var tcpConnector = new TcpDebugConnector(_process.DebugPort, this); + var tcpConnector = new TcpDebugServerClient(_process.DebugPort, this); tcpConnector.Connect(); service = tcpConnector; @@ -97,8 +103,8 @@ public override void Launch(Response response, dynamic args) catch (Exception e) { _process.Kill(); - _process = null; - SessionLog.WriteLine(e.ToString()); + SendEvent(new TerminatedEvent()); + Log.Error(e, "Can't connect to debug server"); SendErrorResponse(response, 4550, "Can't connect: " + e.ToString()); return; } @@ -109,20 +115,20 @@ public override void Launch(Response response, dynamic args) public override void Attach(Response response, dynamic arguments) { - SessionLog.WriteLine("Attach command received"); + LogCommandReceived(); _process.DebugPort = getInt(arguments, "debugPort", 2801); _process.ProcessExited += (s, e) => { - SessionLog.WriteLine("_process exited"); + Log.Information("Debuggee has exited"); SendEvent(new TerminatedEvent()); }; try { IDebuggerService service; - var tcpConnector = new TcpDebugConnector(_process.DebugPort, this); + var tcpConnector = new TcpDebugServerClient(_process.DebugPort, this); tcpConnector.Connect(); - SessionLog.WriteLine($"Connected to host on port {_process.DebugPort}"); + Log.Debug("Connected to debuggee on port {Port}", _process.DebugPort); service = tcpConnector; _process.SetConnection(service); @@ -130,7 +136,7 @@ public override void Attach(Response response, dynamic arguments) } catch (Exception e) { - SessionLog.WriteLine(e.ToString()); + Log.Error(e, "Can't connect debuggee"); SendErrorResponse(response, 4550, "Can't connect: " + e.ToString()); return; } @@ -140,14 +146,18 @@ public override void Attach(Response response, dynamic arguments) public override void Disconnect(Response response, dynamic arguments) { - _process.Kill(); + LogCommandReceived(arguments); + bool terminateDebuggee = arguments.terminateDebuggee == true; + + _process.HandleDisconnect(terminateDebuggee); SendResponse(response); } public override void SetBreakpoints(Response response, dynamic arguments) { - SessionLog.WriteLine($"Set breakpoints command accepted {arguments}"); - + LogCommandReceived(); + Log.Debug("Breakpoints: {Data}", JsonConvert.SerializeObject(arguments)); + if ((bool)arguments.sourceModified) { if (_startupPerformed) @@ -207,7 +217,7 @@ private string NormalizeDriveLetter(string path) public void ThreadStopped(int threadId, ThreadStopReason reason) { - SessionLog.WriteLine("thread stopped"); + LogEventOccured(); _framesHandles.Reset(); _variableHandles.Reset(); SendEvent(new StoppedEvent(threadId, reason.ToString())); @@ -215,7 +225,7 @@ public void ThreadStopped(int threadId, ThreadStopReason reason) public void ProcessExited(int exitCode) { - SessionLog.WriteLine("Exited event recieved"); + LogEventOccured(); SendEvent(new ExitedEvent(exitCode)); } @@ -223,11 +233,11 @@ public override void ConfigurationDone(Response response, dynamic args) { if (_process == null) { - SessionLog.WriteLine("Config Done. Process is not started"); + Log.Debug("Config Done. Process is not started"); SendResponse(response); return; } - SessionLog.WriteLine("Config Done. Process is started"); + Log.Debug("Config Done. Process is started, sending Execute"); _process.BeginExecution(-1); _startupPerformed = true; SendResponse(response); @@ -235,12 +245,14 @@ public override void ConfigurationDone(Response response, dynamic args) public override void Continue(Response response, dynamic arguments) { + LogCommandReceived(); SendResponse(response); _process.BeginExecution(-1); } public override void Next(Response response, dynamic arguments) { + LogCommandReceived(); SendResponse(response); lock (_process) { @@ -254,6 +266,7 @@ public override void Next(Response response, dynamic arguments) public override void StepIn(Response response, dynamic arguments) { + LogCommandReceived(); SendResponse(response); lock (_process) { @@ -266,6 +279,7 @@ public override void StepIn(Response response, dynamic arguments) public override void StepOut(Response response, dynamic arguments) { + LogCommandReceived(); SendResponse(response); lock (_process) { @@ -278,13 +292,13 @@ public override void StepOut(Response response, dynamic arguments) public override void Pause(Response response, dynamic arguments) { + LogCommandReceived(); throw new NotImplementedException(); } public override void StackTrace(Response response, dynamic arguments) { - SessionLog.WriteLine("Stacktrace request accepted"); - SessionLog.WriteLine(arguments.ToString()); + LogCommandReceived(); var firstFrameIdx = (int?)arguments.startFrame ?? 0; var limit = (int?) arguments.levels ?? 0; var threadId = (int) arguments.threadId; @@ -304,6 +318,7 @@ public override void StackTrace(Response response, dynamic arguments) public override void Scopes(Response response, dynamic arguments) { + LogCommandReceived(); int frameId = getInt(arguments, "frameId"); var frame = _framesHandles.Get(frameId, null); if (frame == null) @@ -315,13 +330,12 @@ public override void Scopes(Response response, dynamic arguments) var frameVariablesHandle = _variableHandles.Create(frame); var localScope = new Scope("Локальные переменные", frameVariablesHandle); SendResponse(response, new ScopesResponseBody(new Scope[] {localScope})); - SessionLog.WriteLine("Scopes done"); } public override void Variables(Response response, dynamic arguments) { + LogCommandReceived(); int varsHandle = getInt(arguments, "variablesReference"); - SessionLog.WriteLine($"variables request {varsHandle}"); var variables = _variableHandles.Get(varsHandle, null); if (variables == null) { @@ -354,8 +368,8 @@ public override void Variables(Response response, dynamic arguments) public override void Threads(Response response, dynamic arguments) { + LogCommandReceived(); var threads = new List(); - SessionLog.WriteLine("Threads request accepted"); var processThreads = _process.GetThreads(); for (int i = 0; i < processThreads.Length; i++) { @@ -363,11 +377,11 @@ public override void Threads(Response response, dynamic arguments) } SendResponse(response, new ThreadsResponseBody(threads)); - SessionLog.WriteLine("Threads processed"); } public override void Evaluate(Response response, dynamic arguments) { + LogCommandReceived(); // expression, frameId, context int frameId = getInt(arguments, "frameId"); var frame = _framesHandles.Get(frameId, null); @@ -379,6 +393,8 @@ public override void Evaluate(Response response, dynamic arguments) var expression = (string) arguments.expression; var context = (string) arguments.context; + + Log.Debug("Evaluate {Expression} in {Context}", expression, context); int id = -1; OneScript.DebugProtocol.Variable evalResult; @@ -432,12 +448,22 @@ private static int getInt(dynamic container, string propertyName, int dflt = 0) return dflt; } - - private void RequestDummy(string message, Response response, dynamic arguments) + protected override void OnRequestError(Exception e) { - SessionLog.WriteLine(message); - SendResponse(response, arguments); + Log.Error(e, "Unhandled request processing error"); } + private void LogCommandReceived(dynamic args = null, [CallerMemberName] string commandName = "") + { + if (args == null) + Log.Debug("Command received {Command}", commandName); + else + Log.Debug("Command received {Command}: {Args}", commandName, JsonConvert.SerializeObject(args)); + } + + private void LogEventOccured([CallerMemberName] string eventName = "") + { + Log.Debug("Event occured {Event}", eventName); + } } } diff --git a/src/VSCode.DebugAdapter/OscriptProtocols/Tcp/RpcProcessor.cs b/src/VSCode.DebugAdapter/OscriptProtocols/Tcp/RpcProcessor.cs index a1e20d51f..ffe0e8333 100644 --- a/src/VSCode.DebugAdapter/OscriptProtocols/Tcp/RpcProcessor.cs +++ b/src/VSCode.DebugAdapter/OscriptProtocols/Tcp/RpcProcessor.cs @@ -11,6 +11,7 @@ This Source Code Form is subject to the terms of the using OneScript.DebugProtocol; using OneScript.DebugProtocol.Abstractions; using OneScript.DebugProtocol.TcpServer; +using Serilog; namespace VSCode.DebugAdapter { @@ -21,6 +22,8 @@ public class RpcProcessor private readonly Queue _responses = new Queue(); private readonly AutoResetEvent _responseAvailable = new AutoResetEvent(false); + private static readonly ILogger Log = Serilog.Log.ForContext(); + private struct ChannelRecord { public IMethodsDispatcher Dispatcher; @@ -46,14 +49,14 @@ public void Stop() private void ServerOnDataReceived(object sender, CommunicationEventArgs e) { - SessionLog.WriteLine("Data received " + e.Data); if (e.Exception == null) { + Log.Debug("Data received {@Data}", (TcpProtocolDtoBase)e.Data); DispatchMessage((TcpProtocolDtoBase)e.Data, e.Channel); } else { - SessionLog.WriteLine("RPC Exception " + e.Exception + " critical: " + e.Exception.StopChannel); + Log.Error(e.Exception, "RPC Exception received. Critical: {Critical}", e.Exception.StopChannel); if (e.Exception.StopChannel) { Stop(); @@ -65,23 +68,24 @@ private void DispatchMessage(TcpProtocolDtoBase data, ICommunicationChannel resp { if (!_dispatchers.TryGetValue(data.ServiceName, out var serviceRecord)) { - SessionLog.WriteLine("No dispatcher for " + data.ServiceName); + Log.Warning("No dispatcher for {ServiceName}", data.ServiceName); return; } if (data is RpcCall rpcCall) { - SessionLog.WriteLine("Processing call to " + rpcCall.Id); + Log.Debug("Processing call to {Id}", rpcCall.Id); var result = serviceRecord.Dispatcher.Dispatch(serviceRecord.ServiceInstance, rpcCall.Id, rpcCall.Parameters); if (result != null) { var callResult = RpcCallResult.Respond(rpcCall, result); + Log.Debug("Sending response {Result}", callResult.ReturnValue); responseChannel.Write(callResult); } } else if(data is RpcCallResult result) { - SessionLog.WriteLine("Saving response to " + result.Id); + Log.Debug("Enque response to {Id}. Value {Value}", result.Id, result.ReturnValue); lock (_responses) { _responses.Enqueue(result); diff --git a/src/VSCode.DebugAdapter/OscriptProtocols/Tcp/TcpDebugConnector.cs b/src/VSCode.DebugAdapter/OscriptProtocols/Tcp/TcpDebugServerClient.cs similarity index 84% rename from src/VSCode.DebugAdapter/OscriptProtocols/Tcp/TcpDebugConnector.cs rename to src/VSCode.DebugAdapter/OscriptProtocols/Tcp/TcpDebugServerClient.cs index 4f4c6d9d6..3953079de 100644 --- a/src/VSCode.DebugAdapter/OscriptProtocols/Tcp/TcpDebugConnector.cs +++ b/src/VSCode.DebugAdapter/OscriptProtocols/Tcp/TcpDebugServerClient.cs @@ -12,17 +12,20 @@ This Source Code Form is subject to the terms of the using OneScript.DebugProtocol; using OneScript.DebugProtocol.Abstractions; using OneScript.DebugProtocol.TcpServer; +using Serilog; namespace VSCode.DebugAdapter { - public class TcpDebugConnector : IDebuggerService + public class TcpDebugServerClient : IDebuggerService { private readonly int _port; private readonly IDebugEventListener _eventBackChannel; private BinaryChannel _commandsChannel; private RpcProcessor _processor; + + private static readonly ILogger Log = Serilog.Log.ForContext(); - public TcpDebugConnector(int port, IDebugEventListener eventBackChannel) + public TcpDebugServerClient(int port, IDebugEventListener eventBackChannel) { _port = port; _eventBackChannel = eventBackChannel; @@ -32,13 +35,11 @@ public void Connect() { var debuggerUri = GetDebuggerUri(_port); - SessionLog.WriteLine("Creating commands tcp channel"); - var client = new TcpClient(); TryConnect(client, debuggerUri); _commandsChannel = new BinaryChannel(client); - SessionLog.WriteLine("connected"); + Log.Debug("Connected to {Host}:{Port}", debuggerUri.Host, debuggerUri.Port); RunEventsListener(_commandsChannel); } @@ -69,7 +70,7 @@ private static void TryConnect(TcpClient client, Uri debuggerUri) if (i == limit - 1) throw; - SessionLog.WriteLine("Error. Retry connect"); + Log.Warning("Error. Retry connect {Attempt}", i); Thread.Sleep(1500); } } @@ -95,26 +96,28 @@ private void RunEventsListener(ICommunicationChannel channelToListen) private void WriteCommand(T data, [CallerMemberName] string command = "") { - SessionLog.WriteLine($"Sending {command} to debuggee"); + Log.Verbose("Sending {Command} to debuggee, param {Parameter}", command, data); var dto = RpcCall.Create(nameof(IDebuggerService), command, data); _commandsChannel.Write(dto); + Log.Verbose("Successfully written: {Command}", command); } private void WriteCommand(object[] data, [CallerMemberName] string command = "") { - SessionLog.WriteLine($"Sending {command} to debuggee"); + Log.Verbose("Sending {Command} to debuggee, params {Parameters}", command, data); var dto = RpcCall.Create(nameof(IDebuggerService), command, data); _commandsChannel.Write(dto); + Log.Verbose("Successfully written: {Command}", command); } private T GetResponse() { var rpcResult = _processor.GetResult(); - SessionLog.WriteLine("Response received " + rpcResult.Id + " t = " + rpcResult.ReturnValue); + Log.Verbose("Response received {Result} = {Value}", rpcResult.Id, rpcResult.ReturnValue); if (rpcResult.ReturnValue is RpcExceptionDto excDto) { - SessionLog.WriteLine($"Exception received: {excDto.Description}"); + Log.Verbose("RPC Exception received: {Description}", excDto.Description); throw new RpcOperationException(excDto); } @@ -190,6 +193,11 @@ public void StepOut(int threadId) WriteCommand(threadId); } + public void Disconnect(bool terminate) + { + WriteCommand(terminate); + } + public int[] GetThreads() { WriteCommand(null); diff --git a/src/VSCode.DebugAdapter/Program.cs b/src/VSCode.DebugAdapter/Program.cs index 41fe253c7..c3a621604 100644 --- a/src/VSCode.DebugAdapter/Program.cs +++ b/src/VSCode.DebugAdapter/Program.cs @@ -8,6 +8,7 @@ This Source Code Form is subject to the terms of the using System.IO; using System.Net; using System.Net.Sockets; +using Serilog; namespace VSCode.DebugAdapter { @@ -15,81 +16,30 @@ class Program { static void Main(string[] args) { - bool showTrace = false; - - foreach (var argument in args) - { - switch (argument) - { - case "-trace": - showTrace = true; - break; - } - } - - AppDomain currentDomain = AppDomain.CurrentDomain; - currentDomain.UnhandledException += (s, e) => - { - SessionLog.WriteLine(e.ExceptionObject.ToString()); - }; - - StartSession(showTrace, Console.OpenStandardInput(), Console.OpenStandardOutput()); + StartSession(Console.OpenStandardInput(), Console.OpenStandardOutput()); } - private static void StartSession(bool showTrace, Stream input, Stream output) + private static void StartSession(Stream input, Stream output) { var session = new OscriptDebugSession(); - session.TRACE = showTrace; - session.TRACE_RESPONSE = showTrace; - SessionLog.Open(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "/debug.log"); + + Log.Logger = new LoggerConfiguration() + .ReadFrom.AppSettings() + .Enrich.FromLogContext() + .CreateLogger(); + try { session.Start(input, output); } catch (Exception e) { - SessionLog.WriteLine(e.ToString()); + Log.Fatal(e, "Exception on session start"); } finally { - SessionLog.Close(); + Log.CloseAndFlush(); } } - - -#if DEBUG - private static void RunServer(int port) - { - TcpListener serverSocket = new TcpListener(IPAddress.Parse("127.0.0.1"), port); - serverSocket.Start(); - - new System.Threading.Thread(() => { - while (true) - { - var clientSocket = serverSocket.AcceptSocket(); - if (clientSocket != null) - { - Console.Error.WriteLine(">> accepted connection from client"); - - new System.Threading.Thread(() => { - using (var networkStream = new NetworkStream(clientSocket)) - { - try - { - StartSession(true, networkStream, networkStream); - } - catch (Exception e) - { - Console.Error.WriteLine("Exception: " + e); - } - } - clientSocket.Close(); - Console.Error.WriteLine(">> client connection closed"); - }).Start(); - } - } - }).Start(); - } -#endif } } diff --git a/src/VSCode.DebugAdapter/Protocol.cs b/src/VSCode.DebugAdapter/Protocol.cs index 8c1f0c497..fad6cd03b 100644 --- a/src/VSCode.DebugAdapter/Protocol.cs +++ b/src/VSCode.DebugAdapter/Protocol.cs @@ -13,6 +13,7 @@ This Source Code Form is subject to the terms of the using System.IO; using System.Text.RegularExpressions; using Newtonsoft.Json; +using Serilog; namespace VSCodeDebug { @@ -93,31 +94,22 @@ public Event(string type, dynamic bdy = null) : base("event") { */ public abstract class ProtocolServer { - public bool TRACE; - public bool TRACE_RESPONSE; - protected const int BUFFER_SIZE = 4096; protected const string TWO_CRLF = "\r\n\r\n"; protected static readonly Regex CONTENT_LENGTH_MATCHER = new Regex(@"Content-Length: (\d+)"); protected static readonly Encoding Encoding = System.Text.Encoding.UTF8; - private int _sequenceNumber; + private int _sequenceNumber = 1; private Stream _outputStream; - private ByteBuffer _rawData; - private int _bodyLength; + private ByteBuffer _rawData = new ByteBuffer(); + private int _bodyLength = -1; private bool _stopRequested; - public ProtocolServer() { - _sequenceNumber = 1; - _bodyLength = -1; - _rawData = new ByteBuffer(); - } - public void Start(Stream inputStream, Stream outputStream) { _outputStream = outputStream; @@ -190,9 +182,8 @@ private void Dispatch(string req) { var request = JsonConvert.DeserializeObject(req); if (request != null && request.type == "request") { - if (TRACE) - Console.Error.WriteLine(string.Format("C {0}: {1}", request.command, JsonConvert.SerializeObject(request.arguments))); - + Log.Verbose("Got {Command} with args {Args}", request.command, JsonConvert.SerializeObject(request.arguments)); + var response = new Response(request); DispatchRequest(request.command, request.arguments, response); @@ -205,12 +196,12 @@ protected void SendMessage(ProtocolMessage message) { message.seq = _sequenceNumber++; - if (TRACE_RESPONSE && message.type == "response") { - Console.Error.WriteLine(string.Format(" R: {0}", JsonConvert.SerializeObject(message))); + if (message.type == "response") { + Log.Verbose("Response {Response}", JsonConvert.SerializeObject(message)); } - if (TRACE && message.type == "event") { + if (message.type == "event") { Event e = (Event)message; - Console.Error.WriteLine(string.Format("E {0}: {1}", e.eventType, JsonConvert.SerializeObject(e.body))); + Log.Verbose("Event {EventType} with args {Args}", e.eventType, JsonConvert.SerializeObject(e.body)); } var data = ConvertToBytes(message); diff --git a/src/VSCode.DebugAdapter/README.md b/src/VSCode.DebugAdapter/README.md index 4e2c3743c..0c3805040 100644 --- a/src/VSCode.DebugAdapter/README.md +++ b/src/VSCode.DebugAdapter/README.md @@ -14,4 +14,48 @@ ### Подробное описание каждого параметра выводится при наведении мышки на опцию в файле launch.json. -При возникновении вопросов напишите обращение на https://github.com/EvilBeaver/OneScript/issues. Мы обязательно вам поможем. \ No newline at end of file +При возникновении вопросов напишите обращение на https://github.com/EvilBeaver/OneScript/issues. Мы обязательно вам поможем. + +## Примеры конфигураций запуска + +### Запуск 1Script, файл my-program.os с передачей аргументов командной строки и установкой переменных окружения + +```json +{ + "name": "Отладка 1Script", + "type": "oscript", + "request": "launch", + "cwd": "${workspaceRoot}/src", + "program": "my-program.os", + "args": ["arg1", "arg2"], + "env": { + "OSCRIPT_CONFIG": "lib.system=D:/myOsLibraries", + "JAVA_HOME": "D:/MyJava/JDK_29_Full" + }, + "debugPort": 5051 +} +``` + +### Запуск сервера 1Script.Web, установленного по пути e:/osweb на порту 5051 + +```json +{ + "name": "Отладка 1Script.Web", + "type": "oscript.web", + "request": "launch", + "appDir": "${workspaceRoot}/src", + "runtimeExecutable": "e:/osweb/OneScript.WebHost.exe", + "debugPort": 5051 +} +``` + +### Подключение к работающему процессу 1Script.Web на порту 5051 + +```json +{ + "name": "Отладка 1Script.Web (attach)", + "type": "oscript.web", + "request": "attach", + "debugPort": 5051 +} +``` \ No newline at end of file diff --git a/src/VSCode.DebugAdapter/ServerProcess.cs b/src/VSCode.DebugAdapter/ServerProcess.cs index ad9c8c9be..ffc12fadd 100644 --- a/src/VSCode.DebugAdapter/ServerProcess.cs +++ b/src/VSCode.DebugAdapter/ServerProcess.cs @@ -26,6 +26,8 @@ public ServerProcess(PathHandlingStrategy pathHandling) : base(pathHandling) public IDictionary Environment { get; set; } = new Dictionary(); + public bool WaitOnStart { get; set; } + protected override Process CreateProcess() { var dbgArgs = new List(); @@ -34,7 +36,7 @@ protected override Process CreateProcess() dbgArgs.Add($"--debug.port={DebugPort}"); } dbgArgs.Add("--debug.protocol=tcp"); - dbgArgs.Add("--debug.wait=1"); + dbgArgs.Add($"--debug.wait={(WaitOnStart ? "1" : "0")}"); var debugArguments = string.Join(" ", dbgArgs); var process = new Process(); @@ -104,6 +106,7 @@ protected override void InitInternal(JObject args) DebugPort = options.DebugPort; Environment = options.Env; DebugProtocol = "tcp"; + WaitOnStart = options.WaitOnStart; } } } \ No newline at end of file diff --git a/src/VSCode.DebugAdapter/SessionLog.cs b/src/VSCode.DebugAdapter/SessionLog.cs deleted file mode 100644 index 5ff5e7747..000000000 --- a/src/VSCode.DebugAdapter/SessionLog.cs +++ /dev/null @@ -1,58 +0,0 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ -using System; -using System.Diagnostics; -using System.IO; - -namespace VSCode.DebugAdapter -{ - static class SessionLog - { - private static StreamWriter _log; - private static object lockObj = new object(); - - private static string _path; - [Conditional("DEBUG")] - public static void Open(string path) - { - _path = path; - _log = new StreamWriter(path); - _log.AutoFlush = true; - _log.WriteLine("started: " + DateTime.Now); - } - - public static void WriteLine(string text) - { -#if DEBUG - lock (lockObj) - { - if (_log == null) - { - _log = new StreamWriter(_path, true); - _log.AutoFlush = true; - _log.WriteLine("started: " + DateTime.Now); - } - _log.WriteLine(text); - } -#endif - } - - [Conditional("DEBUG")] - public static void Close() - { - lock (lockObj) - { - if(_log == null) - return; - - _log.WriteLine("closed: " + DateTime.Now); - _log.Dispose(); - _log = null; - } - } - } -} diff --git a/src/VSCode.DebugAdapter/VSCode.DebugAdapter.csproj b/src/VSCode.DebugAdapter/VSCode.DebugAdapter.csproj index d421361ae..cc5e71fe0 100644 --- a/src/VSCode.DebugAdapter/VSCode.DebugAdapter.csproj +++ b/src/VSCode.DebugAdapter/VSCode.DebugAdapter.csproj @@ -20,6 +20,9 @@ false + + + diff --git a/src/VSCode.DebugAdapter/WebLaunchOptions.cs b/src/VSCode.DebugAdapter/WebLaunchOptions.cs index 5c287305c..f53df4c5f 100644 --- a/src/VSCode.DebugAdapter/WebLaunchOptions.cs +++ b/src/VSCode.DebugAdapter/WebLaunchOptions.cs @@ -10,5 +10,7 @@ namespace VSCode.DebugAdapter public class WebLaunchOptions : CommonLaunchOptions { public string AppDir { get; set; } + + public bool WaitOnStart { get; set; } } } \ No newline at end of file diff --git a/src/VSCode.DebugAdapter/package.json b/src/VSCode.DebugAdapter/package.json index 3df58bfa6..fb5098a29 100644 --- a/src/VSCode.DebugAdapter/package.json +++ b/src/VSCode.DebugAdapter/package.json @@ -1,7 +1,7 @@ { "name": "oscript-debug", "displayName": "OneScript Debug (BSL)", - "version": "0.7.2", + "version": "0.8.0", "publisher": "EvilBeaver", "description": "Visual Studio Code debugger extension for OneScript (BSL)", "icon": "images/logo-dbg.png", @@ -131,7 +131,8 @@ "env": {}, "runtimeExecutable": null, "runtimeArgs" : [], - "debugPort": 2801 + "debugPort": 2801, + "waitOnStart": false } ], "configurationAttributes": { @@ -166,6 +167,11 @@ "type": "number", "description": "Порт для запуска отладчика. Одновременные сеансы отладки должны быть разделены по портам", "default": 2801 + }, + "waitOnStart": { + "type": "boolean", + "description": "Ожидать подключения отладчика при старте приложения (не выполнять bsl до его подключения)", + "default": false } } }, From faa820b3b64accda42a5ac26eedd5ad88e1b6f1e Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Mon, 18 Sep 2023 03:34:14 +0200 Subject: [PATCH 093/126] Update sonar.yml (#1342) * Update sonar.yml * Update sonar.yml --- .github/workflows/sonar.yml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 5b01e8e9c..6ddbfc0fb 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -8,6 +8,7 @@ jobs: sonar: name: Build runs-on: windows-latest + if: (github.repository == 'EvilBeaver/OneScript' ) && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.event.repository.full_name) steps: - name: Set up JDK 17 uses: actions/setup-java@v1 @@ -35,11 +36,28 @@ jobs: run: | New-Item -Path .\.sonar\scanner -ItemType Directory dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner + - name: Compute branch name + uses: nelonoel/branch-name@v1.0.1 + - name: Prepare analysis (branch) + if: github.event_name == 'push' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + shell: powershell + run: | + .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.branch.name=${{ env.BRANCH_NAME }} /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" + - name: Prepare analysis (pull-request) + if: github.event_name == 'pull_request' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + shell: powershell + run: | + .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.pullrequest.key=${{ github.event.pull_request.number }} /d:sonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} /d:sonar.pullrequest.base=${{ github.event.pull_request.base.ref }} /d:sonar.scm.revision=${{ github.event.pull_request.head.sha }} /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" - name: Build and analyze env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any shell: powershell run: | - .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" dotnet publish src/oscript/oscript.csproj .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}" From aff63d3d82d8f1439565996290583a339f5b0737 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Mon, 18 Sep 2023 10:17:32 +0200 Subject: [PATCH 094/126] Add code coverage --- .github/workflows/sonar.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 6ddbfc0fb..75fbf5b17 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -36,6 +36,10 @@ jobs: run: | New-Item -Path .\.sonar\scanner -ItemType Directory dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner + - name: Install coverage tool + shell: powershell + run: | + dotnet tool install --global dotnet-coverage - name: Compute branch name uses: nelonoel/branch-name@v1.0.1 - name: Prepare analysis (branch) @@ -45,7 +49,7 @@ jobs: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} shell: powershell run: | - .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.branch.name=${{ env.BRANCH_NAME }} /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" + .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.cs.vscoveragexml.reportsPaths=coverage.xml /d:sonar.branch.name=${{ env.BRANCH_NAME }} /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" - name: Prepare analysis (pull-request) if: github.event_name == 'pull_request' env: @@ -53,11 +57,12 @@ jobs: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} shell: powershell run: | - .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.pullrequest.key=${{ github.event.pull_request.number }} /d:sonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} /d:sonar.pullrequest.base=${{ github.event.pull_request.base.ref }} /d:sonar.scm.revision=${{ github.event.pull_request.head.sha }} /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" + .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.cs.vscoveragexml.reportsPaths=coverage.xml /d:sonar.pullrequest.key=${{ github.event.pull_request.number }} /d:sonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} /d:sonar.pullrequest.base=${{ github.event.pull_request.base.ref }} /d:sonar.scm.revision=${{ github.event.pull_request.head.sha }} /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru" - name: Build and analyze env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any shell: powershell run: | dotnet publish src/oscript/oscript.csproj + dotnet-coverage collect "dotnet msbuild Build_Core.csproj -t:UnitTests" -f xml -o "coverage.xml" .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}" From 1757fee6e1ab2353294dbd826bbfbad582b17068 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Mon, 18 Sep 2023 15:43:26 +0200 Subject: [PATCH 095/126] Create dependabot.yml --- .github/dependabot.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..8331a54b4 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + From 7f20a026b236a4f5c17201a531e3c2ff250a4287 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 13:44:03 +0000 Subject: [PATCH 096/126] Bump actions/cache from 1 to 3 Bumps [actions/cache](https://github.com/actions/cache) from 1 to 3. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v1...v3) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/sonar.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 75fbf5b17..f8c1633e6 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -18,14 +18,14 @@ jobs: with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Cache SonarQube packages - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~\sonar\cache key: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar - name: Cache SonarQube scanner id: cache-sonar-scanner - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: .\.sonar\scanner key: ${{ runner.os }}-sonar-scanner From 74074fa41cac33a0d126e61e9611903415b997a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 15:46:44 +0200 Subject: [PATCH 097/126] Bump actions/setup-java from 1 to 3 (#1346) * Bump actions/setup-java from 1 to 3 Bumps [actions/setup-java](https://github.com/actions/setup-java) from 1 to 3. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v1...v3) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Update sonar.yml --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nikita Fedkin --- .github/workflows/sonar.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 75fbf5b17..516219548 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -11,9 +11,10 @@ jobs: if: (github.repository == 'EvilBeaver/OneScript' ) && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.event.repository.full_name) steps: - name: Set up JDK 17 - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: - java-version: 1.17 + java-version: 17 + distribution: temurin - uses: actions/checkout@v2 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis From fc69d313ebdd31508866d5403aec152c9a785062 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 13:47:16 +0000 Subject: [PATCH 098/126] Bump actions/checkout from 2 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/sonar.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 516219548..77abfe8eb 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -15,7 +15,7 @@ jobs: with: java-version: 17 distribution: temurin - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Cache SonarQube packages From a7f8b77cfc60d12a8638adaff4216196982eefc6 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Mon, 18 Sep 2023 15:50:31 +0200 Subject: [PATCH 099/126] Create rebase.yml --- .github/workflows/rebase.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/rebase.yml diff --git a/.github/workflows/rebase.yml b/.github/workflows/rebase.yml new file mode 100644 index 000000000..c06a1bcdf --- /dev/null +++ b/.github/workflows/rebase.yml @@ -0,0 +1,19 @@ +name: Automatic Rebase +on: + issue_comment: + types: [created] +jobs: + rebase: + name: Rebase + if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase') + runs-on: ubuntu-latest + steps: + - name: Checkout the latest code + uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + fetch-depth: 0 # otherwise, you will fail to push refs to dest repo + - name: Automatic Rebase + uses: cirrus-actions/rebase@1.8 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From f561cd09acb0b13682b95a41935a65a489830f50 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Fri, 22 Sep 2023 15:47:32 +0400 Subject: [PATCH 100/126] =?UTF-8?q?=D0=9A=20#1332:=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=B9=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=8B=20=D1=81=20XML,=20=D1=81=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Xml/XmlGlobalFunctions.cs | 99 ++++++++++++-- tests/global-funcs.os | 125 ++++++++++++++++++ 2 files changed, 216 insertions(+), 8 deletions(-) diff --git a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs index 5345c40d6..65d2ad8fc 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs @@ -6,11 +6,13 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Collections.Generic; using System.Diagnostics; using System.Xml; using OneScript.Contexts; using OneScript.Exceptions; using OneScript.StandardLibrary.Binary; +using OneScript.StandardLibrary.TypeDescriptions; using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; @@ -21,10 +23,30 @@ namespace OneScript.StandardLibrary.Xml [GlobalContext(Category="Функции работы с XML")] public class XmlGlobalFunctions : GlobalContextBase { + private static readonly Dictionary _allowedEnums = new Dictionary + {{typeof(ClrEnumValueWrapper),typeof(AllowedSignEnum)}, + {typeof(ClrEnumValueWrapper),typeof(AllowedLengthEnum)}, + {typeof(ClrEnumValueWrapper),typeof(DateFractionsEnum)} + }; + + /// + /// Получает XML представление значения для помещения в текст элемента или значение атрибута XML. + /// + /// + /// Значение. Допустимые типы: Булево, Число, Строка, Дата, УникальныйИдентификатор, ДвоичныеДанные, + /// Неопределено, Null, а также значения перечислений ДопустимыйЗнак, ДопустимаяДлина, ЧастиДаты + /// + /// + /// Строковое представление значения. Для двоичных данных - строка в формате Вase64. + /// При недопустимом типе значения выбрасывается исключение + /// + /// [ContextMethod("XMLСтрока", "XMLString")] public string XMLString(IValue value) { - if (value.SystemType == BasicTypes.Undefined) + if (value.SystemType == BasicTypes.String) + return value.AsString(); + else if (value.SystemType == BasicTypes.Undefined || value.SystemType == BasicTypes.Null) return ""; else if(value.SystemType == BasicTypes.Boolean) return XmlConvert.ToString(value.AsBoolean()); @@ -34,23 +56,47 @@ public string XMLString(IValue value) return XmlConvert.ToString(value.AsNumber()); else { - if(value.GetRawValue() is BinaryDataContext bdc) + var rawValue = value.GetRawValue(); + if(rawValue is BinaryDataContext bdc) { return Convert.ToBase64String(bdc.Buffer, Base64FormattingOptions.InsertLineBreaks); } - else + if(rawValue is GuidWrapper guid) + { + return guid.AsString(); + } + else if (_allowedEnums.ContainsKey(rawValue.GetType())) { - return value.GetRawValue().AsString(); + return rawValue.AsString(); } } + + throw RuntimeException.InvalidArgumentValue(); } + /// + /// Выполняет преобразование из строки, полученной из текста элемента или значения атрибута XML, + /// в значение в соответствии с указанным типом. Действие, обратное действию метода XMLСтрока + /// + /// + /// Тип, значение которого надо получить при преобразовании из строкового представления XML. + /// Допустимые типы: Булево, Число, Строка, Дата, УникальныйИдентификатор, ДвоичныеДанные, + /// Неопределено, Null, перечисления ДопустимыйЗнак, ДопустимаяДлина, ЧастиДаты + /// + /// + /// Строка, содержащая строковое представление значения соответствующего типа + /// + /// + /// Значение заданного типа. + /// При недопустимом типе или неправильном строковом представлении выбрасывается исключение + /// + /// [ContextMethod("XMLЗначение", "XMLValue")] public IValue XMLValue(IValue givenType, string presentation) { if (givenType.GetRawValue().SystemType != BasicTypes.Type) { - throw new ArgumentException(nameof(givenType)); + throw RuntimeException.InvalidNthArgumentType(1); } var dataType = givenType.GetRawValue() as BslTypeValue; @@ -74,19 +120,56 @@ public IValue XMLValue(IValue givenType, string presentation) { return ValueFactory.Create(presentation); } - else if (typeValue.Equals(BasicTypes.Undefined) && presentation == "") + else if (typeValue.Equals(BasicTypes.Undefined)) + { + if (presentation.Trim() == "") + return ValueFactory.Create(); + else + { + throw RuntimeException.InvalidNthArgumentValue(2); + } + return ValueFactory.Create(); + } + else if (typeValue.Equals(BasicTypes.Null)) { + if (presentation.Trim() == "") + return ValueFactory.CreateNullValue(); + else + { + throw RuntimeException.InvalidNthArgumentValue(2); + } return ValueFactory.Create(); } + else if (typeValue.ImplementingClass == typeof(GuidWrapper)) + { + try + { + return new GuidWrapper(presentation); + } + catch + { + throw RuntimeException.InvalidNthArgumentValue(2); + } + } else if (typeValue.ImplementingClass == typeof(BinaryDataContext)) { byte[] bytes = Convert.FromBase64String(presentation); return new BinaryDataContext(bytes); } - else + else if (_allowedEnums.TryGetValue(typeValue.ImplementingClass, out var enumType)) { - throw RuntimeException.InvalidArgumentValue(); + try + { + var enumerationContext = GlobalsHelper.GetEnum(enumType); + return enumerationContext[presentation]; + } + catch (RuntimeException) + { + throw RuntimeException.InvalidNthArgumentValue(2); + } } + + throw RuntimeException.InvalidNthArgumentType(1); } diff --git a/tests/global-funcs.os b/tests/global-funcs.os index 9bce86e3c..50d9d4d37 100644 --- a/tests/global-funcs.os +++ b/tests/global-funcs.os @@ -43,6 +43,15 @@ ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаДвоичныеДанные"); ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаСтрокаИзПеременной"); ВсеТесты.Добавить("ТестДолжен_Проверить_XMLЗначениеДвоичныеДанные"); + ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаNULL"); + ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаGUID"); + ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаПеречисления"); + ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаНедопустимыеТипы"); + ВсеТесты.Добавить("ТестДолжен_Проверить_XMLЗначениеNULL"); + ВсеТесты.Добавить("ТестДолжен_Проверить_XMLЗначениеGUID"); + ВсеТесты.Добавить("ТестДолжен_Проверить_XMLЗначениеПеречисления"); + ВсеТесты.Добавить("ТестДолжен_Проверить_XMLЗначениеНедопустимыеТипы"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьВBase64"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтениеИзBase64"); @@ -374,6 +383,122 @@ КонецПроцедуры +Процедура ТестДолжен_Проверить_XMLСтрокаNULL() Экспорт + + юТест.ПроверитьРавенство("", XMLСтрока(NULL)); + +КонецПроцедуры + +Процедура ТестДолжен_Проверить_XMLЗначениеNULL() Экспорт + + Тип = Тип("NULL"); + + Значение = XMLЗначение(Тип, " "); + юТест.ПроверитьТип(Значение, Тип); + + БылоИсключение = Ложь; + Попытка + Значение = XMLЗначение(Тип, "NULL"); + Исключение + БылоИсключение = Истина; + КонецПопытки; + + юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом представлении NULL в XMLЗначение"); + +КонецПроцедуры + +Процедура ТестДолжен_Проверить_XMLСтрокаGUID() Экспорт + + Строка = "ae1d6d78-c3d5-4ef0-b096-2fb4f8e4717e"; + GUID = Новый УникальныйИдентификатор(Строка); + юТест.ПроверитьРавенство(Строка, XMLСтрока(GUID)); + +КонецПроцедуры + +Процедура ТестДолжен_Проверить_XMLЗначениеGUID() Экспорт + + Тип = Тип("УникальныйИдентификатор"); + Строка = "ae1d6d78-c3d5-4ef0-b096-2fb4f8e4717e"; + + Значение = XMLЗначение(Тип, Строка); + юТест.ПроверитьТип(Значение, Тип); + юТест.ПроверитьРавенство(Строка(Значение), Строка); + + БылоИсключение = Ложь; + Попытка + Значение = XMLЗначение(Тип, "-a-e1d6d78c3d54ef0b0962fb4f8e4717e"); + Исключение + БылоИсключение = Истина; + КонецПопытки; + + юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом представлении GUID в XMLЗначение"); + +КонецПроцедуры + +Процедура ТестДолжен_Проверить_XMLСтрокаПеречисления() Экспорт + + Перечисление = ДопустимыйЗнак.Неотрицательный; + юТест.ПроверитьРавенство("Неотрицательный", XMLСтрока(Перечисление)); // нужно "Nonnegative" + +КонецПроцедуры + +Процедура ТестДолжен_Проверить_XMLЗначениеПеречисления() Экспорт + Тип = Тип("ДопустимаяДлина"); + Значение = XMLЗначение(Тип, "Fixed"); + + юТест.ПроверитьТип(Значение, Тип); + юТест.ПроверитьРавенство(Значение, ДопустимаяДлина.Фиксированная); + +КонецПроцедуры + +Процедура ТестДолжен_Проверить_XMLСтрокаНедопустимыеТипы() Экспорт + + Массив = Новый Массив(1); + БылоИсключение = Ложь; + Попытка + Стр = XMLСтрока(Массив); + Исключение + БылоИсключение = Истина; + КонецПопытки; + + юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом типе в XMLСтрока"); + + Перечисление = НаправлениеСортировки.Возр; + БылоИсключение = Ложь; + Попытка + Стр = XMLСтрока(Перечисление); + Исключение + БылоИсключение = Истина; + КонецПопытки; + + юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом перечислении в XMLСтрока"); + +КонецПроцедуры + +Процедура ТестДолжен_Проверить_XMLЗначениеНедопустимыеТипы() Экспорт + + БылоИсключение = Ложь; + Попытка + Значение = XMLЗначение(Тип("НаправлениеСортировки"), "Возр"); + Исключение + БылоИсключение = Истина; + КонецПопытки; + + юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом типе в XMLСтрока"); + + Перечисление = НаправлениеСортировки.Возр; + БылоИсключение = Ложь; + Попытка + Значение = XMLЗначение(Тип("ДопустимаяДлина"), "Возр"); + Исключение + БылоИсключение = Истина; + КонецПопытки; + + юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом значении в XMLСтрока"); + +КонецПроцедуры + + Функция ПрочитатьФайлСкрипта(Знач Файл) Ч = Новый ЧтениеТекста(Файл); From b770ac9f644e73d1b7d186882ab77d7695d3858f Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Sat, 23 Sep 2023 01:04:55 +0400 Subject: [PATCH 101/126] =?UTF-8?q?=D0=98=D0=B7=D0=B2=D0=BB=D0=B5=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA?= =?UTF-8?q?=D1=81=D1=82=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D1=87=D0=B8=D1=81?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Xml/XmlGlobalFunctions.cs | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs index 65d2ad8fc..fe5d82420 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs @@ -15,6 +15,7 @@ This Source Code Form is subject to the terms of the using OneScript.StandardLibrary.TypeDescriptions; using OneScript.Types; using OneScript.Values; +using ScriptEngine; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; @@ -23,12 +24,21 @@ namespace OneScript.StandardLibrary.Xml [GlobalContext(Category="Функции работы с XML")] public class XmlGlobalFunctions : GlobalContextBase { - private static readonly Dictionary _allowedEnums = new Dictionary - {{typeof(ClrEnumValueWrapper),typeof(AllowedSignEnum)}, - {typeof(ClrEnumValueWrapper),typeof(AllowedLengthEnum)}, - {typeof(ClrEnumValueWrapper),typeof(DateFractionsEnum)} - }; - + private static readonly Dictionary _allowedEnums + = new Dictionary(); + + private XmlGlobalFunctions(IGlobalsManager mgr) + { + foreach (var e in new[] { + (typeof(ClrEnumValueWrapper), typeof(AllowedSignEnum)), + (typeof(ClrEnumValueWrapper), typeof(AllowedLengthEnum)), + (typeof(ClrEnumValueWrapper), typeof(DateFractionsEnum)) + }) + { + _allowedEnums.Add(e.Item1, (EnumerationContext)mgr.GetInstance(e.Item2)); + } + } + /// /// Получает XML представление значения для помещения в текст элемента или значение атрибута XML. /// @@ -156,11 +166,10 @@ public IValue XMLValue(IValue givenType, string presentation) byte[] bytes = Convert.FromBase64String(presentation); return new BinaryDataContext(bytes); } - else if (_allowedEnums.TryGetValue(typeValue.ImplementingClass, out var enumType)) + else if (_allowedEnums.TryGetValue(typeValue.ImplementingClass, out var enumerationContext)) { try { - var enumerationContext = GlobalsHelper.GetEnum(enumType); return enumerationContext[presentation]; } catch (RuntimeException) @@ -170,12 +179,11 @@ public IValue XMLValue(IValue givenType, string presentation) } throw RuntimeException.InvalidNthArgumentType(1); - } - public static IAttachableContext CreateInstance() + public static IAttachableContext CreateInstance(IGlobalsManager mgr) { - return new XmlGlobalFunctions(); + return new XmlGlobalFunctions(mgr); } } From d520b8559be9c1e8a34a71e7b70262281776f02a Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sat, 23 Sep 2023 08:55:53 +0200 Subject: [PATCH 102/126] =?UTF-8?q?=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B8=D0=BC=D1=8F=20=D0=B4=D0=B6=D0=BE=D0=B1=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BD=D1=8F=D1=82=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/sonar.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 14e253dc3..ea0b66d77 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -6,7 +6,7 @@ on: jobs: sonar: - name: Build + name: SonarQube runs-on: windows-latest if: (github.repository == 'EvilBeaver/OneScript' ) && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.event.repository.full_name) steps: From e897c3e03da6a50427ef0e04d1ed377ecdf9c075 Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Sat, 23 Sep 2023 09:32:18 +0200 Subject: [PATCH 103/126] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D0=B5=D1=87=D0=BD=D0=BE=D0=B9=20=D1=80=D0=B5=D0=BA=D1=83?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B8=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9=20=D1=81=D1=85?= =?UTF-8?q?=D0=B5=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../XMLSchema/Objects/XMLSchema.cs | 8 ++++-- .../XMLSchema/Objects/XSImport.cs | 18 +++++++----- .../XMLSchema/Objects/XSInclude.cs | 15 ++++++---- .../XMLSchema/Objects/XSRedefine.cs | 28 +++++++++---------- 4 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchema.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchema.cs index 3d95f6691..524eaf759 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchema.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchema.cs @@ -25,13 +25,15 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("СхемаXML", "XMLSchema")] - public class XMLSchema : AutoContext, IXSComponent, IXDTOSerializableXML + public sealed class XMLSchema : AutoContext, IXSComponent, IXDTOSerializableXML { private readonly XmlSchema _schema; - private XMLSchema() + private XMLSchema() : this(new XmlSchema()) { } + + public XMLSchema(XmlSchema xmlSchema) { - _schema = new XmlSchema(); + _schema = xmlSchema; Components = new XSComponentFixedList(); Annotations = new XSComponentFixedList(); diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSImport.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSImport.cs index f894fc9af..ce5bacf10 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSImport.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSImport.cs @@ -21,16 +21,17 @@ namespace OneScript.StandardLibrary.XMLSchema.Objects /// /// [ContextClass("ИмпортXS", "XSImport")] - public class XSImport : AutoContext, IXSDirective + public sealed class XSImport : AutoContext, IXSDirective { private readonly XmlSchemaImport _import; + private XMLSchema _resolvedSchema; - private XSImport() => _import = new XmlSchemaImport(); + private XSImport() : this(new XmlSchemaImport()) { } internal XSImport(XmlSchemaImport import) - : this() { _import = import; + _resolvedSchema = new XMLSchema(_import.Schema); } #region OneScript @@ -56,10 +57,13 @@ internal XSImport(XmlSchemaImport import) public XSComponentType ComponentType => XSComponentType.Import; [ContextProperty("РазрешеннаяСхема", "ResolvedSchema")] - public XMLSchema ResolvedSchema - { - get => ResolvedSchema; - set => ResolvedSchema = value; + public XMLSchema ResolvedSchema + { + get => _resolvedSchema; + set { + _resolvedSchema = value; + _import.Schema = _resolvedSchema.SchemaObject; + } } [ContextProperty("РасположениеСхемы", "SchemaLocation")] diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSInclude.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSInclude.cs index 380776fce..164986574 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSInclude.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSInclude.cs @@ -16,17 +16,18 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ВключениеXS", "XSInclude")] - public class XSInclude : AutoContext, IXSDirective + public sealed class XSInclude : AutoContext, IXSDirective { private readonly XmlSchemaInclude _include; + private XMLSchema _resolvedSchema; - private XSInclude() => _include = new XmlSchemaInclude(); + private XSInclude() : this(new XmlSchemaInclude()) { } internal XSInclude(XmlSchemaInclude include) - : this() { _include = include; + _resolvedSchema = new XMLSchema(_include.Schema); } #region OneScript @@ -54,8 +55,12 @@ internal XSInclude(XmlSchemaInclude include) [ContextProperty("РазрешеннаяСхема", "ResolvedSchema")] public XMLSchema ResolvedSchema { - get => ResolvedSchema; - set => ResolvedSchema = value; + get => _resolvedSchema; + set + { + _resolvedSchema = value; + _include.Schema = _resolvedSchema.SchemaObject; + } } [ContextProperty("РасположениеСхемы", "SchemaLocation")] diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSRedefine.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSRedefine.cs index 06769c0c2..752d39371 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSRedefine.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSRedefine.cs @@ -16,25 +16,21 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ПереопределениеXS", "XSRedefine")] - public class XSRedefine : AutoContext, IXSDirective + public sealed class XSRedefine : AutoContext, IXSDirective { private readonly XmlSchemaRedefine _redefine; + private XMLSchema _resolvedSchema; - private XSRedefine() - { - _redefine = new XmlSchemaRedefine(); - Components = new XSComponentFixedList(); - - Content = new XSComponentList(); - Content.Inserted += Content_Inserted; - Content.Cleared += Content_Cleared; - } + private XSRedefine() : this (new XmlSchemaRedefine()) { } internal XSRedefine(XmlSchemaRedefine redefine) - : this() { _redefine = redefine; + _resolvedSchema = new XMLSchema(_redefine.Schema); + + Components = new XSComponentFixedList(); + Content = new XSComponentList(); Content.Inserted -= Content_Inserted; Content.Cleared -= Content_Cleared; @@ -47,7 +43,7 @@ internal XSRedefine(XmlSchemaRedefine redefine) Components.Add(component); Content.Add(component); } - + Content.Inserted += Content_Inserted; Content.Cleared += Content_Cleared; } @@ -77,8 +73,12 @@ internal XSRedefine(XmlSchemaRedefine redefine) [ContextProperty("РазрешеннаяСхема", "ResolvedSchema")] public XMLSchema ResolvedSchema { - get => ResolvedSchema; - set => ResolvedSchema = value; + get => _resolvedSchema; + set + { + _resolvedSchema = value; + _redefine.Schema = _resolvedSchema.SchemaObject; + } } [ContextProperty("РасположениеСхемы", "SchemaLocation")] From 0d188d88fc9de55ce9626cf26eb1a414362a19b1 Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Sat, 23 Sep 2023 12:43:31 +0200 Subject: [PATCH 104/126] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=A1=D0=BE=D0=BD=D0=B0=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../XDTO/XDTOSerializer.cs | 4 ++-- .../XMLSchema/Collections/XSComponentFixedList.cs | 2 ++ .../Collections/XSDisallowedSubstitutionsUnion.cs | 9 ++++----- .../XMLSchema/Collections/XSSchemaFinalUnion.cs | 7 +++---- .../XMLSchema/Collections/XSSimpleFinalUnion.cs | 7 +++---- .../XMLSchema/Objects/XMLSchemaSerializer.cs | 5 +++-- .../XMLSchema/Objects/XSAppInfo.cs | 6 +++--- .../XMLSchema/Objects/XSComplexTypeDefinition.cs | 6 +++--- .../XMLSchema/Objects/XSDocumentation.cs | 6 +++--- .../XMLSchema/Objects/XSEnumerationFacet.cs | 12 +++++------- .../XMLSchema/Objects/XSFractionDigitsFacet.cs | 12 +++++------- .../XMLSchema/Objects/XSImport.cs | 2 +- .../XMLSchema/Objects/XSInclude.cs | 4 ++-- .../XMLSchema/Objects/XSLengthFacet.cs | 12 +++++------- .../XMLSchema/Objects/XSMaxExclusiveFacet.cs | 12 +++++------- .../XMLSchema/Objects/XSMaxInclusiveFacet.cs | 11 +++++------ .../XMLSchema/Objects/XSMaxLengthFacet.cs | 12 +++++------- .../XMLSchema/Objects/XSMinExclusiveFacet.cs | 14 +++++++------- .../XMLSchema/Objects/XSMinInclusiveFacet.cs | 13 ++++++------- .../XMLSchema/Objects/XSMinLengthFacet.cs | 12 +++++------- .../XMLSchema/Objects/XSModelGroupDefinition.cs | 10 +++++----- .../XMLSchema/Objects/XSPatternFacet.cs | 12 +++++------- .../XMLSchema/Objects/XSTotalDigitsFacet.cs | 12 +++++------- .../XMLSchema/Objects/XSWhitespaceFacet.cs | 12 +++++------- .../XMLSchema/Objects/XSWildcard.cs | 7 ++++--- .../XMLSchema/Objects/XSXPathDefinition.cs | 8 +++++--- 26 files changed, 106 insertions(+), 123 deletions(-) diff --git a/src/OneScript.StandardLibrary/XDTO/XDTOSerializer.cs b/src/OneScript.StandardLibrary/XDTO/XDTOSerializer.cs index 33aa18c94..9655f91ac 100644 --- a/src/OneScript.StandardLibrary/XDTO/XDTOSerializer.cs +++ b/src/OneScript.StandardLibrary/XDTO/XDTOSerializer.cs @@ -20,7 +20,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XDTO { [ContextClass("СериализаторXDTO", "XDTOSerializer")] - public class XDTOSerializer : AutoContext + public sealed class XDTOSerializer : AutoContext { private readonly ITypeManager _typeManager; private readonly XmlGlobalFunctions _xmlGlobalFunctions; @@ -223,7 +223,7 @@ public IValue ReadXML(XmlReaderImpl xmlReader, IValue valueType = null) } else if (xsiNil.SystemType == BasicTypes.String) typeValue = new BslTypeValue(BasicTypes.Undefined); - }; + } if (typeValue == null) throw RuntimeException.InvalidArgumentValue(); diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentFixedList.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentFixedList.cs index 183332a63..6ee48141a 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentFixedList.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentFixedList.cs @@ -21,6 +21,8 @@ public class XSComponentFixedList : AutoCollectionContext _items = new List(); + public static XSComponentFixedList EmptyList() => new XSComponentFixedList(); + public void Add(IXSComponent value) => _items.Add(value); public void Remove(IXSComponent value) => _items.Remove(value); public void Clear() => _items.Clear(); diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSDisallowedSubstitutionsUnion.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSDisallowedSubstitutionsUnion.cs index 2e7605838..a663f4538 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSDisallowedSubstitutionsUnion.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSDisallowedSubstitutionsUnion.cs @@ -10,20 +10,19 @@ This Source Code Form is subject to the terms of the using OneScript.StandardLibrary.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.Types; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.XMLSchema.Collections { [ContextClass("ОбъединениеНедопустимыхПодстановкиXS", "XSDisallowedSubstitutionsUnion")] - public class XsDisallowedSubstitutionsUnion : AutoContext + public sealed class XsDisallowedSubstitutionsUnion : AutoContext { - private ArrayImpl _values; + private readonly ArrayImpl _values; private bool Contains(XmlSchemaDerivationMethod value) { - XSDisallowedSubstitutions enumValue = EnumerationXSDisallowedSubstitutions.FromNativeValue(value); - IValue idx = _values.Find(enumValue); + var enumValue = EnumerationXSDisallowedSubstitutions.FromNativeValue(value); + var idx = _values.Find(enumValue); return (idx.SystemType != BasicTypes.Undefined); } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSchemaFinalUnion.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSchemaFinalUnion.cs index d333e0b98..28644c629 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSchemaFinalUnion.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSchemaFinalUnion.cs @@ -10,20 +10,19 @@ This Source Code Form is subject to the terms of the using OneScript.StandardLibrary.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.Types; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.XMLSchema.Collections { [ContextClass("ОбъединениеЗавершенностиСхемыXS", "XSSchemaFinalUnion")] - public class XSSchemaFinalUnion : AutoContext + public sealed class XSSchemaFinalUnion : AutoContext { - private ArrayImpl _values; + private readonly ArrayImpl _values; private bool Contains(XmlSchemaDerivationMethod value) { var enumValue = EnumerationXSSchemaFinal.Instance.FromNativeValue(value); - IValue idx = _values.Find(enumValue); + var idx = _values.Find(enumValue); return (idx.SystemType != BasicTypes.Undefined); } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSimpleFinalUnion.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSimpleFinalUnion.cs index 81490fc81..1cd14e6aa 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSimpleFinalUnion.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSimpleFinalUnion.cs @@ -10,20 +10,19 @@ This Source Code Form is subject to the terms of the using OneScript.StandardLibrary.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.Types; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.XMLSchema.Collections { [ContextClass("ОбъединениеЗавершенностиПростогоТипаXS", "XSSimpleFinalUnion")] - public class XSSimpleFinalUnion : AutoContext + public sealed class XSSimpleFinalUnion : AutoContext { private ArrayImpl _values; private bool Contains(XmlSchemaDerivationMethod _value) { - XSSimpleFinal enumValue = EnumerationXSSimpleFinal.FromNativeValue(_value); - IValue idx = _values.Find(enumValue); + var enumValue = EnumerationXSSimpleFinal.FromNativeValue(_value); + var idx = _values.Find(enumValue); return idx.SystemType != BasicTypes.Undefined; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchemaSerializer.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchemaSerializer.cs index 30d19fbd1..80421b16d 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchemaSerializer.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XMLSchemaSerializer.cs @@ -13,7 +13,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { - internal class XMLSchemaSerializer + internal static class XMLSchemaSerializer { internal static IXSComponent CreateInstance(XmlSchemaObject xmlSchemaObject) { @@ -93,7 +93,8 @@ private static IXSComponent CreateIXSAnnotated(XmlSchemaAnnotated xmlAnnotated) else if (xmlAnnotated is XmlSchemaGroup xmlGroup) return new XSModelGroupDefinition(xmlGroup); - + else if (xmlAnnotated is XmlSchemaXPath xmlPath) + return new XSXPathDefinition(xmlPath); else throw RuntimeException.InvalidArgumentType(); diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAppInfo.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAppInfo.cs index 5abfc37bf..a1b64664e 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAppInfo.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAppInfo.cs @@ -17,7 +17,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ИнформацияДляПриложенияXS", "XSAppInfo")] - public class XSAppInfo : AutoContext, IXSAnnotationItem + public sealed class XSAppInfo : AutoContext, IXSAnnotationItem { private readonly XmlSchemaAppInfo _appInfo; @@ -34,7 +34,7 @@ public class XSAppInfo : AutoContext, IXSAnnotationItem public XSAnnotation Annotation => null; [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container { get; private set; } @@ -60,7 +60,7 @@ public string Source #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs index b7a4bcc37..9891f2370 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs @@ -20,7 +20,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ОпределениеСоставногоТипаXS", "XSComplexTypeDefinition")] - public class XSComplexTypeDefinition : AutoContext, IXSType, IXSNamedComponent + public sealed class XSComplexTypeDefinition : AutoContext, IXSType, IXSNamedComponent { private readonly XmlSchemaComplexType _type; private XSAnnotation _annotation; @@ -417,7 +417,7 @@ public XSContentModel ContentModel //ОпределениеБазовогоТипа(BaseTypeDefinition) [ContextProperty("Смешанный", "Mixed")] - public bool Mixed => _type.ContentModel is XmlSchemaComplexContent complexContent ? complexContent.IsMixed : false; + public bool Mixed => _type.ContentModel is XmlSchemaComplexContent complexContent && complexContent.IsMixed; [ContextProperty("Содержимое", "Content")] public IXSComponent Content @@ -438,7 +438,7 @@ public IXSComponent Content #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSDocumentation.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSDocumentation.cs index 7bc8fe6ae..efbcebb8a 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSDocumentation.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSDocumentation.cs @@ -17,7 +17,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ДокументацияXS", "XSDocumentation")] - public class XSDocumentation : AutoContext, IXSAnnotationItem + public sealed class XSDocumentation : AutoContext, IXSAnnotationItem { private readonly XmlSchemaDocumentation _documentation; @@ -34,7 +34,7 @@ public class XSDocumentation : AutoContext, IXSAnnotationItem public XSAnnotation Annotation => null; [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container { get; private set; } @@ -67,7 +67,7 @@ public string Language #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSEnumerationFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSEnumerationFacet.cs index 2a8423962..3a299bd23 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSEnumerationFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSEnumerationFacet.cs @@ -6,9 +6,9 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетПеречисленияXS", "XSEnumerationFacet")] - public class XSEnumerationFacet : AutoContext, IXSFacet + public sealed class XSEnumerationFacet : AutoContext, IXSFacet { private readonly XmlSchemaEnumerationFacet _facet; private XSAnnotation _annotation; @@ -55,7 +55,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -106,7 +106,7 @@ public IValue Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -131,9 +131,7 @@ public IValue Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSFractionDigitsFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSFractionDigitsFacet.cs index 5014f40f9..5a7217d0b 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSFractionDigitsFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSFractionDigitsFacet.cs @@ -6,10 +6,10 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетКоличестваРазрядовДробнойЧастиXS", "XSFractionDigitsFacet")] - public class XSFractionDigitsFacet : AutoContext, IXSFacet + public sealed class XSFractionDigitsFacet : AutoContext, IXSFacet { private readonly XmlSchemaFractionDigitsFacet _facet; private XSAnnotation _annotation; @@ -53,7 +53,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -96,7 +96,7 @@ public decimal Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -121,9 +121,7 @@ public decimal Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSImport.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSImport.cs index ce5bacf10..5a62e242d 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSImport.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSImport.cs @@ -42,7 +42,7 @@ internal XSImport(XmlSchemaImport import) public XSAnnotation Annotation => null; [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container { get; private set; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSInclude.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSInclude.cs index 164986574..b759a6059 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSInclude.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSInclude.cs @@ -38,7 +38,7 @@ internal XSInclude(XmlSchemaInclude include) public XSAnnotation Annotation => null; [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container { get; private set; } @@ -75,7 +75,7 @@ public string SchemaLocation #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = false) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSLengthFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSLengthFacet.cs index 7ac5f7595..58d9751de 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSLengthFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSLengthFacet.cs @@ -6,10 +6,10 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетДлиныXS", "XSLengthFacet")] - public class XSLengthFacet : AutoContext, IXSFacet + public sealed class XSLengthFacet : AutoContext, IXSFacet { private readonly XmlSchemaLengthFacet _facet; private XSAnnotation _annotation; @@ -53,7 +53,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -96,7 +96,7 @@ public decimal Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -121,9 +121,7 @@ public decimal Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxExclusiveFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxExclusiveFacet.cs index 7ffbe5dd9..0d89d09b3 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxExclusiveFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxExclusiveFacet.cs @@ -6,9 +6,9 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетМаксимальногоИсключающегоЗначенияXS", "XSMaxExclusiveFacet")] - public class XSMaxExclusiveFacet : AutoContext, IXSFacet + public sealed class XSMaxExclusiveFacet : AutoContext, IXSFacet { private readonly XmlSchemaMaxExclusiveFacet _facet; private XSAnnotation _annotation; @@ -55,7 +55,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -112,7 +112,7 @@ public IValue Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -137,9 +137,7 @@ public IValue Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs index b4efde770..d1aab68db 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs @@ -6,6 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml.Schema; using OneScript.Contexts; using OneScript.Exceptions; @@ -18,7 +19,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетМаксимальногоВключающегоЗначенияXS", "XSMaxInclusiveFacet")] - public class XSMaxInclusiveFacet : AutoContext, IXSFacet + public sealed class XSMaxInclusiveFacet : AutoContext, IXSFacet { private readonly XmlSchemaMaxInclusiveFacet _facet; private XSAnnotation _annotation; @@ -55,7 +56,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -112,7 +113,7 @@ public IValue Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -137,9 +138,7 @@ public IValue Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxLengthFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxLengthFacet.cs index 47e281f27..397c0344d 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxLengthFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxLengthFacet.cs @@ -6,10 +6,10 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетМаксимальнойДлиныXS", "XSMaxLengthFacet")] - public class XSMaxLengthFacet : AutoContext, IXSFacet + public sealed class XSMaxLengthFacet : AutoContext, IXSFacet { private readonly XmlSchemaMaxLengthFacet _facet; private XSAnnotation _annotation; @@ -53,7 +53,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -96,7 +96,7 @@ public decimal Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -121,9 +121,7 @@ public decimal Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinExclusiveFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinExclusiveFacet.cs index 8bf4ca067..98a5d88b1 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinExclusiveFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinExclusiveFacet.cs @@ -6,9 +6,9 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; @@ -18,13 +18,14 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетМинимальногоИсключающегоЗначенияXS", "XSMinExclusiveFacet")] - public class XSMinExclusiveFacet : AutoContext, IXSFacet + public sealed class XSMinExclusiveFacet : AutoContext, IXSFacet { private readonly XmlSchemaMinExclusiveFacet _facet; private XSAnnotation _annotation; private IValue _value; private XSMinExclusiveFacet() => _facet = new XmlSchemaMinExclusiveFacet(); + internal XSMinExclusiveFacet(XmlSchemaMinExclusiveFacet minExclusiveFace) { _facet = minExclusiveFace; @@ -36,6 +37,7 @@ internal XSMinExclusiveFacet(XmlSchemaMinExclusiveFacet minExclusiveFace) _annotation.BindToContainer(RootContainer, this); } } + #region OneScript #region Properties @@ -53,7 +55,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -110,7 +112,7 @@ public IValue Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -135,9 +137,7 @@ public IValue Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinInclusiveFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinInclusiveFacet.cs index f122a0290..d4c83e859 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinInclusiveFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinInclusiveFacet.cs @@ -6,9 +6,9 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; @@ -18,13 +18,14 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетМинимальногоВключающегоЗначенияXS", "XSMinInclusiveFacet")] - public class XSMinInclusiveFacet : AutoContext, IXSFacet + public sealed class XSMinInclusiveFacet : AutoContext, IXSFacet { private readonly XmlSchemaMinInclusiveFacet _facet; private XSAnnotation _annotation; private IValue _value; private XSMinInclusiveFacet() => _facet = new XmlSchemaMinInclusiveFacet(); + internal XSMinInclusiveFacet(XmlSchemaMinInclusiveFacet minInclusiveFacet) { _facet = minInclusiveFacet; @@ -54,7 +55,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -111,7 +112,7 @@ public IValue Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -136,9 +137,7 @@ public IValue Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinLengthFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinLengthFacet.cs index 57cea6917..322763457 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinLengthFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMinLengthFacet.cs @@ -6,10 +6,10 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетМинимальнойДлиныXS", "XSMinLengthFacet")] - public class XSMinLengthFacet : AutoContext, IXSFacet + public sealed class XSMinLengthFacet : AutoContext, IXSFacet { private readonly XmlSchemaMinLengthFacet _facet; private XSAnnotation _annotation; @@ -53,7 +53,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -96,7 +96,7 @@ public decimal Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -121,9 +121,7 @@ public decimal Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroupDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroupDefinition.cs index 745e5ffac..c12979632 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroupDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroupDefinition.cs @@ -19,7 +19,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ОпределениеГруппыМоделиXS", "XSModelGroupDefinition")] - public class XSModelGroupDefinition : AutoContext, IXSFragment, IXSNamedComponent + public sealed class XSModelGroupDefinition : AutoContext, IXSFragment, IXSNamedComponent { private XmlSchemaAnnotated _group; private string _name; @@ -42,7 +42,7 @@ internal XSModelGroupDefinition(XmlSchemaGroup xmlGroup) if (xmlGroup.Particle is XmlSchemaGroupBase xmlGroupBase) { - IXSComponent component = XMLSchemaSerializer.CreateInstance(xmlGroupBase); + var component = XMLSchemaSerializer.CreateInstance(xmlGroupBase); if (component is XSParticle particle) _modelGroup = particle; @@ -52,7 +52,7 @@ internal XSModelGroupDefinition(XmlSchemaGroup xmlGroup) } } - internal XSModelGroupDefinition(XmlSchemaGroupRef xmlGroupRef) + internal XSModelGroupDefinition(in XmlSchemaGroupRef xmlGroupRef) { _group = xmlGroupRef; @@ -83,7 +83,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container { get; private set; } @@ -162,7 +162,7 @@ public XMLExpandedName Reference #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSPatternFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSPatternFacet.cs index fcb15227c..53792aa9c 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSPatternFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSPatternFacet.cs @@ -6,9 +6,9 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; @@ -17,7 +17,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетОбразцаXS", "XSPatternFacet")] - public class XSPatternFacet : AutoContext, IXSFacet + public sealed class XSPatternFacet : AutoContext, IXSFacet { private readonly XmlSchemaPatternFacet _facet; private XSAnnotation _annotation; @@ -52,7 +52,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -95,7 +95,7 @@ public string Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -120,9 +120,7 @@ public string Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSTotalDigitsFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSTotalDigitsFacet.cs index f4ae00949..498bae27d 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSTotalDigitsFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSTotalDigitsFacet.cs @@ -6,10 +6,10 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетОбщегоКоличестваРазрядовXS", "XSTotalDigitsFacet")] - public class XSTotalDigitsFacet : AutoContext, IXSFacet + public sealed class XSTotalDigitsFacet : AutoContext, IXSFacet { private readonly XmlSchemaTotalDigitsFacet _facet; private XSAnnotation _annotation; @@ -53,7 +53,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -96,7 +96,7 @@ public decimal Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -121,9 +121,7 @@ public decimal Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWhitespaceFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWhitespaceFacet.cs index a36bb7060..a71ce3216 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWhitespaceFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWhitespaceFacet.cs @@ -6,9 +6,9 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.StandardLibrary.XMLSchema.Interfaces; @@ -17,7 +17,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФасетПробельныхСимволовXS", "XSWhitespaceFacet")] - public class XSWhitespaceFacet : AutoContext, IXSFacet + public sealed class XSWhitespaceFacet : AutoContext, IXSFacet { private readonly XmlSchemaWhiteSpaceFacet _facet; private XSAnnotation _annotation; @@ -52,7 +52,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container => SimpleTypeDefinition; @@ -131,7 +131,7 @@ public XSWhitespaceHandling Value #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -156,9 +156,7 @@ public XSWhitespaceHandling Value void IXSComponent.BindToContainer(IXSComponent rootContainer, IXSComponent container) { - if (!(container is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires(container is XSSimpleTypeDefinition); RootContainer = rootContainer; SimpleTypeDefinition = container as XSSimpleTypeDefinition; } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWildcard.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWildcard.cs index d770a6778..f5718511d 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWildcard.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSWildcard.cs @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("МаскаXS", "XSWildcard")] - public class XSWildcard : AutoContext, IXSAnnotated, IXSFragment + public sealed class XSWildcard : AutoContext, IXSFragment { private XmlSchemaAnnotated _wildcard; private XSAnnotation _annotation; @@ -43,6 +43,7 @@ internal XSWildcard(XmlSchemaAny xmlAny) SetNamespaceConstraint(); } + internal XSWildcard(XmlSchemaAnyAttribute xmlAnyAttribute) { _wildcard = xmlAnyAttribute; @@ -120,7 +121,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container { get; private set; } @@ -164,7 +165,7 @@ public string LexicalNamespaceConstraint #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSXPathDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSXPathDefinition.cs index a2616af9c..9377abadd 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSXPathDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSXPathDefinition.cs @@ -16,13 +16,15 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ОпределенияXPathXS", "XSXPathDefinition")] - public class XSXPathDefinition : AutoContext, IXSAnnotated, IXSNamedComponent + public sealed class XSXPathDefinition : AutoContext, IXSAnnotated, IXSNamedComponent { private readonly XmlSchemaXPath _xpath; private XSAnnotation _annotation; private XSXPathDefinition() => _xpath = new XmlSchemaXPath(); - + + internal XSXPathDefinition(XmlSchemaXPath xpath) => _xpath = xpath; + #region OneScript #region Properties @@ -39,7 +41,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components => null; + public XSComponentFixedList Components => XSComponentFixedList.EmptyList(); [ContextProperty("Контейнер", "Container")] public IXSComponent Container { get; private set; } From 83ab2e01d0558dcfea9e2af47fec0267fc800cbf Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Sat, 23 Sep 2023 19:04:11 +0300 Subject: [PATCH 105/126] =?UTF-8?q?#1337:=20=D0=90=D0=B4=D0=B0=D0=BF=D1=82?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=202.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TypeDescriptions/TypeComparer.cs | 66 ++++++ .../TypeDescriptions/TypeDescription.cs | 218 ++++++++++++------ .../TypeDescriptionBuilder.cs | 113 ++------- .../TypeDescriptions/TypeList.cs | 121 ---------- tests/typedescription.os | 31 ++- 5 files changed, 266 insertions(+), 283 deletions(-) create mode 100644 src/OneScript.StandardLibrary/TypeDescriptions/TypeComparer.cs delete mode 100644 src/OneScript.StandardLibrary/TypeDescriptions/TypeList.cs diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeComparer.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeComparer.cs new file mode 100644 index 000000000..b48b568aa --- /dev/null +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeComparer.cs @@ -0,0 +1,66 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ +using System; +using System.Collections.Generic; +using OneScript.Types; +using OneScript.Values; + +namespace OneScript.StandardLibrary.TypeDescriptions +{ + internal class TypeComparer : IComparer + { + private const string TYPE_BINARYDATA_NAME = "ДвоичныеДанные"; + private static readonly IDictionary primitives = new Dictionary(); + + public int Compare(BslTypeValue x, BslTypeValue y) + { + if (x.TypeValue.Equals(y)) return 0; + + var primitiveX = PrimitiveIndex(x); + var primitiveY = PrimitiveIndex(y); + + if (primitiveX != -1) + { + if (primitiveY != -1) + return primitiveX - primitiveY; + + return -1; + } + + if (primitiveY != -1) + return 1; + + return x.TypeValue.Id.CompareTo(y.TypeValue.Id); + } + + private int PrimitiveIndex(BslTypeValue type) + { + if (StringComparer.CurrentCultureIgnoreCase.Equals(type.TypeValue.Name, TYPE_BINARYDATA_NAME)) + { + // Пора двоичным данным стать примитивом + return 1; + } + + if (primitives.TryGetValue(type.TypeValue, out var index)) + return index; + + return -1; + } + + static TypeComparer() + { + primitives.Add(BasicTypes.Boolean, 0); + primitives.Add(BasicTypes.String, 2); + primitives.Add(BasicTypes.Date, 3); + primitives.Add(BasicTypes.Null, 4); + primitives.Add(BasicTypes.Number, 5); + primitives.Add(BasicTypes.Type, 6); + } + + } +} + \ No newline at end of file diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs index 59528f4d4..c85daecc0 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs @@ -89,12 +89,21 @@ internal IEnumerable TypesInternal() public bool ContainsType(IValue type) { if (type is BslTypeValue typeVal) + { + if (typeVal.TypeValue.Equals(BasicTypes.Undefined)) + { + // тип "Неопределено" содержится в любом явно определенном составном типе + // и не содержится в типе Произвольный (когда явно не указан состав типов) + // или когда указан один конкретный тип + return (_types.Count > 1); + } return _types.Contains(typeVal); + } throw RuntimeException.InvalidArgumentType(nameof(type)); } - IValueAdjuster GetAdjusterForType(BslTypeValue type) + private IValueAdjuster GetAdjusterForType(BslTypeValue type) { var value = type.TypeValue; @@ -110,6 +119,9 @@ IValueAdjuster GetAdjusterForType(BslTypeValue type) if (value.Equals(BasicTypes.Boolean)) return new BooleanTypeAdjuster(); + if (value.Equals(BasicTypes.Undefined)) + return new UndefinedTypeAdjuster(); + return null; } @@ -122,16 +134,15 @@ public IValue AdjustValue(IValue pValue = null) return value ?? ValueFactory.Create(); } - if (value != null && value.SystemType != BasicTypes.Undefined) + if (value != null) { var valueType = new BslTypeValue(value.SystemType); - if (_types.Contains(valueType)) + if (ContainsType(valueType)) { // Если такой тип у нас есть var adjuster = GetAdjusterForType(valueType); - var adjustedValue = adjuster.Adjust(value); - if (adjustedValue != null) - return adjustedValue; + var adjustedValue = adjuster?.Adjust(value) ?? value; + return adjustedValue; } } @@ -146,41 +157,25 @@ public IValue AdjustValue(IValue pValue = null) return ValueFactory.Create(); } - internal static BslTypeValue TypeNumber() - { - return new BslTypeValue(BasicTypes.Number); - } - - internal static BslTypeValue TypeBoolean() - { - return new BslTypeValue(BasicTypes.Boolean); - } - - internal static BslTypeValue TypeString() - { - return new BslTypeValue(BasicTypes.String); - } - - internal static BslTypeValue TypeDate() - { - return new BslTypeValue(BasicTypes.Date); - } - public static TypeDescription StringType(int length = 0, - AllowedLengthEnum allowedLength = AllowedLengthEnum.Variable) + AllowedLengthEnum allowedLength = AllowedLengthEnum.Variable) { - return TypeDescriptionBuilder.Build(TypeString(), new StringQualifiers(length, allowedLength)); + return TypeDescriptionBuilder.OfType(BasicTypes.String) + .SetStringQualifiers(new StringQualifiers(length, allowedLength)) + .Build(); } public static TypeDescription IntegerType(int length = 10, - AllowedSignEnum allowedSign = AllowedSignEnum.Any) + AllowedSignEnum allowedSign = AllowedSignEnum.Any) { - return TypeDescriptionBuilder.Build(TypeNumber(), new NumberQualifiers(length, 0, allowedSign)); + return TypeDescriptionBuilder.OfType(BasicTypes.Number) + .SetNumberQualifiers(new NumberQualifiers(length, 0, allowedSign)) + .Build(); } public static TypeDescription BooleanType() { - return TypeDescriptionBuilder.Build(TypeBoolean()); + return TypeDescriptionBuilder.OfType(BasicTypes.Boolean).Build(); } [ScriptConstructor] @@ -194,71 +189,156 @@ public static TypeDescription Constructor( IValue p6 = null, IValue p7 = null) { + var builder = new TypeDescriptionBuilder(); + + // параметры, которые заведомо не квалификаторы, заменяем на null, но оставляем, + // чтобы указать номер параметра при выводе ошибки несоответствия типа + var qualifiers = new[] { null, p2, p3, p4, p5, p6, p7 }; + var rawSource = source?.GetRawValue(); - if (rawSource == null || rawSource.SystemType == BasicTypes.Undefined) { // пустой первый параметр - нет объекта-основания // добавляемые/вычитаемые типы не допускаются, квалификаторы игнорируются // квалификакторы передаются только для контроля типов - return ConstructByQualifiers(context.TypeManager, BslUndefinedValue.Instance, p2, p3, p4, p5, p6, p7); } - - if (rawSource is TypeDescription) + else + if (rawSource is TypeDescription typeDesc) { - return ConstructByOtherDescription(context.TypeManager, rawSource, p2, p3, p4, p5, p6, p7); - } + // Если 1 парарметр - ОписаниеТипов, то 2 - добавляемые типы, 3 - убираемые типы, + builder.SourceDescription(typeDesc); + + var typesToAdd = CheckAndParseTypeList(context.TypeManager, p2, 2); + var typesToRemove = CheckAndParseTypeList(context.TypeManager, p3, 3); + + builder.RemoveTypes(typesToRemove); + builder.AddTypes(typesToAdd); + qualifiers[1] = null; // эти параметры не квалификаторы + qualifiers[2] = null; // эти параметры не квалификаторы + + } + else if (rawSource.SystemType == BasicTypes.String || rawSource is ArrayImpl) { - return ConstructByQualifiers(context.TypeManager, rawSource, p2, p3, p4, p5, p6, p7); + // Если 1 парарметр - Массив или строка, то это набор конкретных типов + // остальные параметры (2 и далее) - клвалификаторы в произвольном порядке + var typesList = CheckAndParseTypeList(context.TypeManager, rawSource, 1); + builder.AddTypes(typesList); + } else + throw RuntimeException.InvalidArgumentValue(); + + CheckAndAddQualifiers(builder, qualifiers); + return builder.Build(); + } + + /// + /// Преобразует входящий параметр в список типов. + /// + /// В качестве типов могут быть переданы Строка или Массив Типов + /// Номер параметра, который будет указан в исключении, если параметр typeList задан неверно + /// Если typeList не может быть разобран как набор типов + /// Список переданных типов, приведенный к конкретным TypeTypeValue + private static List CheckAndParseTypeList(ITypeManager typeManager, IValue types, int nParam) + { + types = types?.GetRawValue(); + if (types == null || types.SystemType == BasicTypes.Undefined) + return new List(); + + if (types.SystemType == BasicTypes.String) + { + return FromTypeNames(typeManager, types.AsString()); + } + if (types is ArrayImpl arrayOfTypes) + { + return FromArrayOfTypes(arrayOfTypes); } - throw RuntimeException.InvalidArgumentValue(); + throw RuntimeException.InvalidNthArgumentType(nParam); } - private static TypeDescription ConstructByQualifiers(ITypeManager typeManager, IValue types, - IValue p2 = null, - IValue p3 = null, - IValue p4 = null, - IValue p5 = null, - IValue p6 = null, - IValue p7 = null) + private static List FromTypeNames(ITypeManager typeManager, string types) { - var builder = new TypeDescriptionBuilder(); - var typesList = TypeList.Construct(typeManager, types, 1); - builder.AddTypes(typesList.List()); + var typeNames = types.Split(','); + var typesList = new List(); + foreach (var typeName in typeNames) + { + if (string.IsNullOrWhiteSpace(typeName)) + continue; - builder.AddQualifiers(new[] { p2, p3, p4, p5, p6, p7 }, 1); + var typeValue = new BslTypeValue(typeManager.GetTypeByName(typeName.Trim())); + if (!typesList.Contains(typeValue)) + typesList.Add(typeValue); + } - return builder.Build(); + return typesList; } - private static TypeDescription ConstructByOtherDescription(ITypeManager typeManager, - IValue typeDescription = null, - IValue addTypes = null, - IValue removeTypes = null, - IValue p4 = null, - IValue p5 = null, - IValue p6 = null, - IValue p7 = null) + private static List FromArrayOfTypes(ArrayImpl arrayOfTypes) { - var builder = new TypeDescriptionBuilder(); + var typesList = new List(); + foreach (var type in arrayOfTypes) + { + if (type.GetRawValue() is BslTypeValue rawType) + { + typesList.Add(rawType); + } + } + return typesList; + } - if (typeDescription is TypeDescription typeDesc) + private static void CheckAndAddQualifiers(TypeDescriptionBuilder builder, IValue[] parameters) + { + for (var i = 0; i < parameters.Length; i++) { - builder.SourceDescription(typeDesc); + var rawQualifier = parameters[i]?.GetRawValue(); + if (rawQualifier != null && !rawQualifier.Equals(ValueFactory.Create())) + { + CheckAndAddOneQualifier(builder, rawQualifier, i + 1); + } } - - var removeTypesList = TypeList.Construct(typeManager, removeTypes, 3); - builder.RemoveTypes(removeTypesList.List()); + } - var addTypesList = TypeList.Construct(typeManager, addTypes, 2); - builder.AddTypes(addTypesList.List()); - builder.AddQualifiers(new[] { p4, p5, p6, p7 }, 3); + /// + /// Проверяет, что переданный параметр является квалификатором типа. + /// Если тип параметра не является квалификатором, бросает исключение с указанием номера параметра. + /// + /// Построитель описания типов, которому будет присвоен квалификатор + /// Проверяемый входящий параметр + /// Порядковый номер параметра для выброса исключения + /// Если qualifier не является квалификатором типа + private static void CheckAndAddOneQualifier(TypeDescriptionBuilder builder, IValue qualifier, int nParam) + { + switch (qualifier) + { + case NumberQualifiers nq: + builder.SetNumberQualifiers(nq); + break; - return builder.Build(); + case StringQualifiers sq: + builder.SetStringQualifiers(sq); + break; + + case DateQualifiers dq: + builder.SetDateQualifiers(dq); + break; + + case BinaryDataQualifiers bdq: + builder.SetBinaryDataQualifiers(bdq); + break; + + default: + throw RuntimeException.InvalidNthArgumentType(nParam); + } + } + } + + internal class UndefinedTypeAdjuster : IValueAdjuster + { + public IValue Adjust(IValue value) + { + return ValueFactory.Create(); } } } diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs index d1731a4f4..0b87a3186 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs @@ -5,17 +5,14 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System; using System.Collections.Generic; using System.Linq; -using OneScript.Exceptions; using OneScript.Types; using OneScript.Values; -using ScriptEngine.Machine; namespace OneScript.StandardLibrary.TypeDescriptions { - internal class TypeDescriptionBuilder + internal partial class TypeDescriptionBuilder { private NumberQualifiers _numberQualifiers; private StringQualifiers _stringQualifiers; @@ -51,46 +48,27 @@ public TypeDescriptionBuilder RemoveTypes(IEnumerable types) return this; } - public TypeDescriptionBuilder AddQualifiers(IValue[] qualifiers, int nParam = 0) + public TypeDescriptionBuilder SetNumberQualifiers(NumberQualifiers nq) { - foreach (var qualifier in qualifiers) - { - nParam++; - AddQualifier(qualifier, nParam); - } - + _numberQualifiers = nq; return this; } - public TypeDescriptionBuilder AddQualifier(IValue qualifier, int nParam = 0) + public TypeDescriptionBuilder SetStringQualifiers(StringQualifiers sq) { - if (qualifier != null && !qualifier.Equals(BslUndefinedValue.Instance)) - { - switch (qualifier.GetRawValue()) - { - case NumberQualifiers nq: - _numberQualifiers = nq; - break; - - case StringQualifiers sq: - _stringQualifiers = sq; - break; - - case DateQualifiers dq: - _dateQualifiers = dq; - break; - - case BinaryDataQualifiers bdq: - _binaryDataQualifiers = bdq; - break; + _stringQualifiers = sq; + return this; + } - default: - throw nParam == 0 - ? RuntimeException.InvalidArgumentType() - : RuntimeException.InvalidNthArgumentType(nParam); - } - } + public TypeDescriptionBuilder SetDateQualifiers(DateQualifiers dq) + { + _dateQualifiers = dq; + return this; + } + public TypeDescriptionBuilder SetBinaryDataQualifiers(BinaryDataQualifiers bq) + { + _binaryDataQualifiers = bq; return this; } @@ -99,9 +77,9 @@ public TypeDescription Build() _types = new List(_types.Distinct()); _types.RemoveAll(type => type.TypeValue.ImplementingClass == typeof(BslUndefinedValue)); _types.Sort(new TypeComparer()); - var hasNumber = _types.Contains(TypeDescription.TypeNumber()); - var hasString =_types.Contains(TypeDescription.TypeString()); - var hasDate = _types.Contains(TypeDescription.TypeDate()); + var hasNumber = _types.Any(type => type.TypeValue == BasicTypes.Number); + var hasString =_types.Any(type => type.TypeValue == BasicTypes.String); + var hasDate = _types.Any(type => type.TypeValue == BasicTypes.Date); var hasBinaryData = _types.Any(x => x.TypeValue.Name == TYPE_BINARYDATA_NAME); if (!hasNumber || _numberQualifiers == null) _numberQualifiers = new NumberQualifiers(); @@ -118,60 +96,11 @@ public TypeDescription Build() } - public static TypeDescription Build(BslTypeValue type, IValue qualifier = null) + public static TypeDescriptionBuilder OfType(TypeDescriptor commonType) { var builder = new TypeDescriptionBuilder(); - return builder.AddTypes(new[] { type }).AddQualifier(qualifier).Build(); - } - - private class TypeComparer : IComparer - { - private static readonly IDictionary primitives = new Dictionary(); - public int Compare(BslTypeValue x, BslTypeValue y) - { - if (x.TypeValue.Equals(y)) return 0; - - var primitiveX = PrimitiveIndex(x); - var primitiveY = PrimitiveIndex(y); - - if (primitiveX != -1) - { - if (primitiveY != -1) - return primitiveX - primitiveY; - - return -1; - } - - if (primitiveY != -1) - return 1; - - return x.TypeValue.Id.CompareTo(y.TypeValue.Id); - } - - private int PrimitiveIndex(BslTypeValue type) - { - if (StringComparer.CurrentCultureIgnoreCase.Equals(type.TypeValue.Name, TYPE_BINARYDATA_NAME)) - { - // Пора двоичным данным стать примитивом - return 1; - } - - if (primitives.ContainsKey(type.TypeValue)) - return primitives[type.TypeValue]; - - return -1; - } - - static TypeComparer() - { - primitives.Add(BasicTypes.Boolean, 0); - primitives.Add(BasicTypes.String, 2); - primitives.Add(BasicTypes.Date, 3); - primitives.Add(BasicTypes.Null, 4); - primitives.Add(BasicTypes.Number, 5); - primitives.Add(BasicTypes.Type, 6); - } - + builder.AddTypes(new[] { new BslTypeValue(commonType) }); + return builder; } } } \ No newline at end of file diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeList.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeList.cs deleted file mode 100644 index ebf80b0bc..000000000 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeList.cs +++ /dev/null @@ -1,121 +0,0 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using OneScript.Exceptions; -using OneScript.StandardLibrary.Collections; -using OneScript.Types; -using OneScript.Values; -using ScriptEngine.Machine; - -namespace OneScript.StandardLibrary.TypeDescriptions -{ - internal class TypeList - { - private readonly IList _list; - - public TypeList(IEnumerable list) - { - _list = new List(list); - } - - public int Count => _list.Count; - - public bool Contains(BslTypeValue type) - { - return _list.Contains(type); - } - - public bool Contains(string typeName) - { - return _list.Any(x => string.Compare( - x.TypeValue.Name, - typeName, - StringComparison.OrdinalIgnoreCase) == 0 - ); - } - - public IList List() - { - return _list; - } - - /// - /// Возвращает типы как Массив - /// - /// Массив, содержащий элементы типа Тип - public ArrayImpl AsArray() - { - return new ArrayImpl(_list); - } - - public TypeList Modify(TypeList typesToRemove, TypeList typesToAdd) - { - var typesList = _list.Where(type => !typesToRemove.Contains(type)).ToList(); - typesList.AddRange(typesToAdd._list); - return new TypeList(typesList); - } - - public TypeList Modify(TypeList typesToRemove) - { - var typesList = _list.Where(type => !typesToRemove.Contains(type)).ToList(); - return new TypeList(typesList); - } - - public static TypeList Construct(ITypeManager typeManager, IValue types, int nParam) - { - types = types?.GetRawValue(); - if (types == null || types.SystemType == BasicTypes.Undefined) - return new TypeList(Array.Empty()); - - if (types.SystemType == BasicTypes.String) - { - return FromTypeNames(typeManager, types.AsString()); - } - if (types is ArrayImpl arrayOfTypes) - { - return FromArrayOfTypes(arrayOfTypes); - } - - throw RuntimeException.InvalidNthArgumentType(nParam); - } - - public static TypeList FromTypeNames(ITypeManager typeManager, string types) - { - var typeNames = types.Split(','); - var typesList = new List(); - foreach (var typeName in typeNames) - { - if (string.IsNullOrWhiteSpace(typeName)) - continue; - - var typeValue = new BslTypeValue(typeManager.GetTypeByName(typeName.Trim())); - if (!typesList.Contains(typeValue)) - typesList.Add(typeValue); - } - - return new TypeList(typesList); - } - - public static TypeList FromArrayOfTypes(ArrayImpl arrayOfTypes) - { - var typesList = new List(); - foreach (var type in arrayOfTypes) - { - var rawType = type.GetRawValue() as BslTypeValue; - if (rawType == null) - continue; - - if (!typesList.Contains(rawType)) - typesList.Add(rawType); - } - return new TypeList(typesList); - } - } -} \ No newline at end of file diff --git a/tests/typedescription.os b/tests/typedescription.os index 4bec441b9..8a58a8228 100644 --- a/tests/typedescription.os +++ b/tests/typedescription.os @@ -31,6 +31,8 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеДат"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеБезПриведения"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеЧисел"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеНеопределено"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеОбъектов"); ВсеТесты.Добавить("ТестДолжен_Преобразование_ОписаниеБезТипов"); ВсеТесты.Добавить("ТестДолжен_Преобразование_ОписаниеБезТипов_КвалификаторыИгнорируются"); @@ -490,7 +492,7 @@ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(ДД), ДД, "Двоичные данные не ломаются. " + ОписаниеСлучая); юТест.ПроверитьРавенство(ОписаниеБезТипов.Типы().Количество(), 0, "Типы() пустой. " + ОписаниеСлучая); - юТест.ПроверитьЛожь(ОписаниеБезТипов.СодержитТип(Тип("Неопределено")), "Нет типа Неопределено. " + ОписаниеСлучая); + // юТест.ПроверитьЛожь(ОписаниеБезТипов.СодержитТип(Тип("Неопределено")), "Нет типа Неопределено. " + ОписаниеСлучая); КонецЦикла; @@ -580,6 +582,33 @@ КонецПроцедуры +Процедура ТестДолжен_ПроверитьПриведениеНеопределено() Экспорт + + ОТ = Новый ОписаниеТипов("Число, Строка"); + юТест.ПроверитьИстину(ОТ.СодержитТип(Тип("Неопределено")), "Неопределено содержится в описании типов"); + юТест.ПроверитьРавенство(ОТ.Типы().Найти(Тип("Неопределено")), Неопределено, "Неопределено не содержится в типах"); + юТест.ПроверитьРавенство(ОТ.ПривестиЗначение(Неопределено), Неопределено, "Неопределено в неопределено"); + + ОТ = Новый ОписаниеТипов; + юТест.ПроверитьРавенство(ОТ.ПривестиЗначение(Неопределено), Неопределено, "Неопределено в неопределено"); + юТест.ПроверитьЛожь(ОТ.СодержитТип(Тип("Неопределено")), "Неопределено не содержится в описании типов (без типов)"); + юТест.ПроверитьРавенство(ОТ.Типы().Найти(Тип("Неопределено")), Неопределено, "Неопределено не содержится в типах"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПриведениеОбъектов() Экспорт + + ОТ = Новый ОписаниеТипов("Массив, Структура, Строка"); + + М1 = Новый Массив; + М1.Добавить(1); + М1.Добавить(2); + + М2 = ОТ.ПривестиЗначение(М1); + юТест.ПроверитьРавенство(М2, М1, "Массив тот же самый"); + +КонецПроцедуры + Процедура ПроверитьПорядокТипов(Знач ТипыОписанияТипов, Знач ОжидаемыйПорядок, Знач Текст = Неопределено) Если Текст = Неопределено Тогда From 27432a2d19a574d2324b4105e81ee7305fdb6b97 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Thu, 21 Sep 2023 20:07:23 +0300 Subject: [PATCH 106/126] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83?= =?UTF-8?q?=20=D1=86=D0=B2=D0=B5=D1=82=D0=BE=D0=B2=20=D0=B2=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=81=D0=BE=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Text/ConsoleColorEnum.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/OneScript.StandardLibrary/Text/ConsoleColorEnum.cs b/src/OneScript.StandardLibrary/Text/ConsoleColorEnum.cs index 74b0722d5..adc8b984b 100644 --- a/src/OneScript.StandardLibrary/Text/ConsoleColorEnum.cs +++ b/src/OneScript.StandardLibrary/Text/ConsoleColorEnum.cs @@ -26,15 +26,23 @@ public static ConsoleColorEnum CreateInstance(ITypeManager typeManager) typeManager, (t,v) => new ConsoleColorEnum(t,v)); - instance.WrapClrValue("Белый", "White", ConsoleColor.White); instance.WrapClrValue("Черный", "Black", ConsoleColor.Black); + instance.WrapClrValue("ТемноСиний", "DarkBlue", ConsoleColor.DarkBlue); + instance.WrapClrValue("ТемноЗеленый", "DarkGreen", ConsoleColor.DarkGreen); + instance.WrapClrValue("ТемноБирюзовый", "DarkCyan", ConsoleColor.DarkCyan); + instance.WrapClrValue("ТемноКрасный", "DarkRed", ConsoleColor.DarkRed); + instance.WrapClrValue("ТемноМалиновый", "DarkMagenta", ConsoleColor.DarkMagenta); + instance.WrapClrValue("ТемноЖелтый", "DarkYellow", ConsoleColor.DarkYellow); + instance.WrapClrValue("Серый", "Gray", ConsoleColor.Gray); + + instance.WrapClrValue("ТемноСерый", "DarkGray", ConsoleColor.DarkGray); instance.WrapClrValue("Синий", "Blue", ConsoleColor.Blue); - instance.WrapClrValue("Желтый", "Yellow", ConsoleColor.Yellow); - instance.WrapClrValue("Красный", "Red", ConsoleColor.Red); instance.WrapClrValue("Зеленый", "Green", ConsoleColor.Green); instance.WrapClrValue("Бирюза", "Cyan", ConsoleColor.Cyan); + instance.WrapClrValue("Красный", "Red", ConsoleColor.Red); instance.WrapClrValue("Малиновый", "Magenta", ConsoleColor.Magenta); - instance.WrapClrValue("Серый", "Gray", ConsoleColor.Gray); + instance.WrapClrValue("Желтый", "Yellow", ConsoleColor.Yellow); + instance.WrapClrValue("Белый", "White", ConsoleColor.White); OnInstanceCreation(instance); From dc0bbf0299a915bb118afe80219015f007f24846 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Tue, 26 Sep 2023 16:16:45 +0300 Subject: [PATCH 107/126] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B8=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=20COM-=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20see=20#1331?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Core/Rcw/RcwMemberMetadata.cs | 23 ------------------- .../Rcw/RcwMembersMetadataCollection.cs | 13 +++-------- src/OneScript.Core/Rcw/RcwMetadata.cs | 3 +-- src/OneScript.Core/Rcw/RcwMethodMetadata.cs | 19 +++++++++++++++ src/OneScript.Core/Rcw/RcwPropertyMetadata.cs | 22 ++++++++++++++++++ .../Contexts/UnmanagedCOMWrapperContext.cs | 16 +++++++------ tests/managed-com.os | 16 ++++++++++++- 7 files changed, 69 insertions(+), 43 deletions(-) create mode 100644 src/OneScript.Core/Rcw/RcwMethodMetadata.cs create mode 100644 src/OneScript.Core/Rcw/RcwPropertyMetadata.cs diff --git a/src/OneScript.Core/Rcw/RcwMemberMetadata.cs b/src/OneScript.Core/Rcw/RcwMemberMetadata.cs index a784feb0b..2aff2f090 100644 --- a/src/OneScript.Core/Rcw/RcwMemberMetadata.cs +++ b/src/OneScript.Core/Rcw/RcwMemberMetadata.cs @@ -7,29 +7,6 @@ This Source Code Form is subject to the terms of the namespace OneScript.Rcw { - public class RcwMethodMetadata : RcwMemberMetadata - { - public bool? IsFunction { get; } - - public RcwMethodMetadata(string name, int dispId, bool? isFunc) : base(name, dispId) - { - IsFunction = isFunc; - } - } - - public class RcwPropertyMetadata : RcwMemberMetadata - { - public bool IsReadable { get; internal set; } - - public bool IsWritable { get; internal set; } - - public RcwPropertyMetadata(string name, int dispId) : base(name, dispId) - { - IsReadable = true; - IsWritable = true; - } - } - public abstract class RcwMemberMetadata { public int DispatchId { get; } diff --git a/src/OneScript.Core/Rcw/RcwMembersMetadataCollection.cs b/src/OneScript.Core/Rcw/RcwMembersMetadataCollection.cs index 28cf9d8a7..826162b36 100644 --- a/src/OneScript.Core/Rcw/RcwMembersMetadataCollection.cs +++ b/src/OneScript.Core/Rcw/RcwMembersMetadataCollection.cs @@ -13,9 +13,9 @@ namespace OneScript.Rcw { public class RcwMembersMetadataCollection where T : RcwMemberMetadata { - private readonly List _collection; - private readonly Dictionary _dispIds; - private readonly Dictionary _names; + private readonly List _collection = new List(); + private readonly Dictionary _dispIds = new Dictionary(); + private readonly Dictionary _names = new Dictionary(StringComparer.InvariantCultureIgnoreCase); public IReadOnlyDictionary DispatchIds => new ReadOnlyDictionary(_dispIds); @@ -23,13 +23,6 @@ public class RcwMembersMetadataCollection where T : RcwMemberMetadata public T this[int index] => _collection[index]; - public RcwMembersMetadataCollection() - { - _collection = new List(); - _dispIds = new Dictionary(); - _names = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - } - public int IndexOf(T item) => _collection.IndexOf(item); public void Add(T item) diff --git a/src/OneScript.Core/Rcw/RcwMetadata.cs b/src/OneScript.Core/Rcw/RcwMetadata.cs index c25b014b9..e4281775d 100644 --- a/src/OneScript.Core/Rcw/RcwMetadata.cs +++ b/src/OneScript.Core/Rcw/RcwMetadata.cs @@ -9,13 +9,12 @@ This Source Code Form is subject to the terms of the using System.Collections; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; -using OneScript.Rcw; using FUNCDESC = System.Runtime.InteropServices.ComTypes.FUNCDESC; using FUNCFLAGS = System.Runtime.InteropServices.ComTypes.FUNCFLAGS; using TYPEATTR = System.Runtime.InteropServices.ComTypes.TYPEATTR; using INVOKEKIND = System.Runtime.InteropServices.ComTypes.INVOKEKIND; -namespace ScriptEngine.Machine.Rcw +namespace OneScript.Rcw { public class RcwMetadata { diff --git a/src/OneScript.Core/Rcw/RcwMethodMetadata.cs b/src/OneScript.Core/Rcw/RcwMethodMetadata.cs new file mode 100644 index 000000000..53f806010 --- /dev/null +++ b/src/OneScript.Core/Rcw/RcwMethodMetadata.cs @@ -0,0 +1,19 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +namespace OneScript.Rcw +{ + public class RcwMethodMetadata : RcwMemberMetadata + { + public bool? IsFunction { get; } + + public RcwMethodMetadata(string name, int dispId, bool? isFunc) : base(name, dispId) + { + IsFunction = isFunc; + } + } +} \ No newline at end of file diff --git a/src/OneScript.Core/Rcw/RcwPropertyMetadata.cs b/src/OneScript.Core/Rcw/RcwPropertyMetadata.cs new file mode 100644 index 000000000..b2790a3e1 --- /dev/null +++ b/src/OneScript.Core/Rcw/RcwPropertyMetadata.cs @@ -0,0 +1,22 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +namespace OneScript.Rcw +{ + public class RcwPropertyMetadata : RcwMemberMetadata + { + public bool IsReadable { get; internal set; } + + public bool IsWritable { get; internal set; } + + public RcwPropertyMetadata(string name, int dispId) : base(name, dispId) + { + IsReadable = true; + IsWritable = true; + } + } +} \ No newline at end of file diff --git a/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs b/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs index fb71fd69c..058ed8715 100644 --- a/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs +++ b/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs @@ -14,14 +14,11 @@ This Source Code Form is subject to the terms of the using OneScript.Rcw; using OneScript.Values; using System.Reflection; -using ScriptEngine.Machine.Rcw; namespace ScriptEngine.Machine.Contexts { public class UnmanagedCOMWrapperContext : COMWrapperContext, IDebugPresentationAcceptor { - private const uint E_DISP_MEMBERNOTFOUND = 0x80020003; - private readonly RcwMembersMetadataCollection _props; private readonly RcwMembersMetadataCollection _methods; private readonly bool _isCollection; @@ -198,8 +195,10 @@ public override void CallAsProcedure(int methodNumber, IValue[] arguments) try { var argsData = MarshalArguments(arguments); + var initialValues = new object[argsData.values.Length]; + Array.Copy(argsData.values, initialValues, initialValues.Length); DispatchUtility.Invoke(Instance, dispId, argsData.values, argsData.flags); - RemapOutputParams(arguments, argsData.values, argsData.flags[0]); + RemapOutputParams(arguments, argsData.values, argsData.flags[0], initialValues); } catch (System.Reflection.TargetInvocationException e) { @@ -226,8 +225,10 @@ public override void CallAsFunction(int methodNumber, IValue[] arguments, out IV try { var argsData = MarshalArguments(arguments); + var initialValues = new object[argsData.values.Length]; + Array.Copy(argsData.values, initialValues, initialValues.Length); var result = DispatchUtility.Invoke(Instance, dispId, argsData.values, argsData.flags); - RemapOutputParams(arguments, argsData.values, argsData.flags[0]); + RemapOutputParams(arguments, argsData.values, argsData.flags[0], initialValues); retValue = CreateIValue(result); } catch (System.Reflection.TargetInvocationException e) @@ -241,11 +242,12 @@ public override void CallAsFunction(int methodNumber, IValue[] arguments, out IV } } - private void RemapOutputParams(IValue[] arguments, object[] values, ParameterModifier flags) + private void RemapOutputParams(IValue[] arguments, object[] values, ParameterModifier flags, + object[] initialValues) { for (int i = 0; i < arguments.Length; i++) { - if (flags[i]) + if (flags[i] && !initialValues[i].Equals(values[i])) { var variable = (IVariable)arguments[i]; variable.Value = CreateIValue(values[i]); diff --git a/tests/managed-com.os b/tests/managed-com.os index e92d6d6bc..8cf6bd4db 100644 --- a/tests/managed-com.os +++ b/tests/managed-com.os @@ -14,6 +14,7 @@ Если (Найти(СИ.ВерсияОС, "Windows") > 0) И Не (ПеременныеСреды().Получить("APPVEYOR") = "True") Тогда ВсеТесты.Добавить("ТестДолжен_ПроверитьУстановкуЧисловыхСвойств"); ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовСОпциональнымиПараметрами"); + ВсеТесты.Добавить("ПроверитьВыходныеПараметрыComОбъекта"); КонецЕсли; ВсеТесты.Добавить("ТестДолжен_ПроверитьСозданиеClrОбъекта"); @@ -24,7 +25,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуGetTypeДляЭлементовСписка"); ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуGetTypeДляCLRКоллекции"); ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуТипаНеИзЯдра"); - + Возврат ВсеТесты; КонецФункции @@ -176,3 +177,16 @@ ПроверитьРаботуGetTypeДляОдногоТипа(Ури, "System", "Uri"); КонецПроцедуры + +Процедура ПроверитьВыходныеПараметрыComОбъекта() Экспорт + // Проверяем, что выходной параметр установился, а также то, что попытки записи во входной параметр не было. + + Рег = Новый ФиксированнаяСтруктура("HKEY_LOCAL_MACHINE", "2147483650"); + ИмяФайлаКласса = ""; + РеестрОС = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"); + Рез=РеестрОС.GetStringValue(Рег.HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion","DevicePath", ИмяФайлаКласса); + + юТест.ПроверитьРавенство(0, Рез); + юТест.ПроверитьНеравенство("", ИмяФайлаКласса); + +КонецПроцедуры From 9a689c8e78d3da99a3de7423916f89e2b96505a9 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Tue, 26 Sep 2023 19:19:37 +0300 Subject: [PATCH 108/126] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BC=D0=B0=D0=B3=D0=B8=D1=8F=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20SCD?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BC=D0=B0=D0=BA=D0=BE=D1=81=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index c9efffdaf..7737b5d62 100644 --- a/README.md +++ b/README.md @@ -46,3 +46,11 @@ OneScript позволяет создавать и выполнять текст - выполнить команду `mono ovm.exe install stable` - выполнить команду `mono ovm.exe use stable` - перезапустить терминал + +Донастройка Self-Contained варианта поставки (не требующего инсталляции dotnet) + +``` +chmod +x ./oscript +xattr -d com.apple.quarantine *.dylib oscript +codesign -s - ./oscript +``` From 0b0ed0c622af8594efed29fb69fff68b4f85e0ea Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Tue, 26 Sep 2023 19:21:36 +0300 Subject: [PATCH 109/126] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=B7?= =?UTF-8?q?=D0=BB=D0=BE=D0=B4=D0=B5=D0=B9=D1=81=D0=BA=D0=B8=D0=B9=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82=20=D0=B8=D0=B7=20=D1=88=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20feature=20request?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 7d913545a73dfd057be2d27e95c8d9bbe2dc00ff) --- .github/ISSUE_TEMPLATE/feature_request.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index b9644c37b..9808531a8 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -4,20 +4,6 @@ about: Предложить идею для проекта --- - - # Описание задачи **Опишите вашу Цель, которую вы сможете достичь с помощью новой функциональности** From 7aa25f0e5787beff2a00352ccbb2055c629f7175 Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Wed, 27 Sep 2023 21:37:07 +0200 Subject: [PATCH 110/126] =?UTF-8?q?=D0=A3=D0=BF=D1=80=D0=BE=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=20=D1=81=D0=BE=D0=B3=D0=BB?= =?UTF-8?q?=D0=B0=D1=81=D0=BD=D0=BE=20=D1=80=D0=B5=D0=BA=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B4=D0=B0=D1=86=D0=B8=D1=8F=D0=BC=20=D0=A1=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Objects/XSComplexTypeDefinition.cs | 181 +++++++++--------- 1 file changed, 93 insertions(+), 88 deletions(-) diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs index 9891f2370..10fef35f7 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs @@ -6,10 +6,10 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.Xml; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; @@ -23,6 +23,8 @@ namespace OneScript.StandardLibrary.XMLSchema.Objects public sealed class XSComplexTypeDefinition : AutoContext, IXSType, IXSNamedComponent { private readonly XmlSchemaComplexType _type; + private readonly XSComponentFixedList _components = new XSComponentFixedList(); + private readonly XSComponentList _attributes = new XSComponentList(); private XSAnnotation _annotation; private XSAnnotation _contentModelAnnotation; private XSAnnotation _derivationAnnotation; @@ -32,17 +34,9 @@ public sealed class XSComplexTypeDefinition : AutoContext _components; [ContextProperty("Контейнер", "Container")] public IXSComponent Container { get; private set; } @@ -358,7 +365,7 @@ public XSAnnotation DerivationAnnotation } [ContextProperty("Атрибуты", "Attributes")] - public XSComponentList Attributes { get; } + public XSComponentList Attributes => _attributes; [ContextProperty("Блокировка", "Block")] public XsProhibitedSubstitutionsUnion Block { get; } @@ -444,7 +451,7 @@ public IXSComponent Content public void UpdateDOMElement() => throw new NotImplementedException(); [ContextMethod("Содержит", "Contains")] - public bool Contains(IXSComponent component) => Components.Contains(component); + public bool Contains(IXSComponent component) => _components.Contains(component); [ContextMethod("ЭтоОпределениеЗациклено", "IsCircular")] public bool IsCircular() => throw new NotImplementedException(); @@ -481,18 +488,16 @@ public void BindToContainer(IXSComponent rootContainer, IXSComponent container) private void Attributes_Inserted(object sender, XSComponentListEventArgs e) { IXSComponent component = e.Component; - if (!(component is IXSAttribute) && (!(component is XSAttributeGroupDefinition))) - throw RuntimeException.InvalidArgumentType(); - + Contract.Requires((component is IXSAttribute) || (component is XSAttributeGroupDefinition)); component.BindToContainer(RootContainer, this); - Components.Add(component); + _components.Add(component); _type.Attributes.Add(component.SchemaObject); } private void Attributes_Cleared(object sender, EventArgs e) { - Components.RemoveAll(x => (x is IXSAttribute)); + _components.RemoveAll(x => (x is IXSAttribute)); _type.Attributes.Clear(); } From f59e417b8d53429482682752e6c9a22bf3a41fcf Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Wed, 27 Sep 2023 22:27:26 +0200 Subject: [PATCH 111/126] =?UTF-8?q?=D0=94=D0=BB=D1=8F=20=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D1=81=D1=81=D0=BE=D0=B2=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=80=D0=B5=D1=89?= =?UTF-8?q?=D0=B0=D0=B5=D0=BC=20=D0=BD=D0=B0=D1=81=D0=BB=D0=B5=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../XMLSchema/Collections/XMLSchemaSet.cs | 2 +- .../XMLSchema/Collections/XSComplexFinalUnion.cs | 2 +- .../XMLSchema/Collections/XSComponentFixedList.cs | 2 +- .../XMLSchema/Collections/XSComponentList.cs | 2 +- .../XMLSchema/Collections/XSNamedComponentMap.cs | 2 +- .../Collections/XSProhibitedSubstitutionsUnion.cs | 2 +- .../Collections/XSSubstitutionGroupExclusionsUnion.cs | 2 +- .../XMLSchema/Enumerations/XSComplexFinal.cs | 8 +++----- .../XMLSchema/Enumerations/XSContentModel.cs | 6 ++++++ .../XMLSchema/Enumerations/XSDisallowedSubstitutions.cs | 4 ++-- .../XMLSchema/Enumerations/XSForm.cs | 4 ++-- .../XMLSchema/Enumerations/XSProhibitedSubstitutions.cs | 4 ++-- .../XMLSchema/Enumerations/XSSchemaFinal.cs | 4 ++-- .../XMLSchema/Enumerations/XSSimpleFinal.cs | 4 ++-- .../Enumerations/XSSubstitutionGroupExclusions.cs | 4 ++-- .../XMLSchema/Objects/XSAnnotation.cs | 2 +- .../XMLSchema/Objects/XSAttributeDeclaration.cs | 2 +- .../XMLSchema/Objects/XSAttributeGroupDefinition.cs | 2 +- .../XMLSchema/Objects/XSAttributeUse.cs | 2 +- .../XMLSchema/Objects/XSElementDeclaration.cs | 2 +- .../XMLSchema/Objects/XSIdentityConstraintDefinition.cs | 2 +- .../XMLSchema/Objects/XSModelGroup.cs | 2 +- .../XMLSchema/Objects/XSNotationDeclaration.cs | 2 +- .../XMLSchema/Objects/XSParticle.cs | 2 +- .../XMLSchema/Objects/XSSimpleTypeDefinition.cs | 2 +- 25 files changed, 38 insertions(+), 34 deletions(-) diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XMLSchemaSet.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XMLSchemaSet.cs index a29120f03..78a55450f 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XMLSchemaSet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XMLSchemaSet.cs @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Collections { [ContextClass("НаборСхемXML", "XMLSchemaSet")] - public class XMLSchemaSet : AutoCollectionContext + public sealed class XMLSchemaSet : AutoCollectionContext { private readonly XmlSchemaSet _schemaSet; private readonly List _items; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComplexFinalUnion.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComplexFinalUnion.cs index 15a1fe5cf..3ca016b24 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComplexFinalUnion.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComplexFinalUnion.cs @@ -16,7 +16,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Collections { [ContextClass("ОбъединениеЗавершенностиСоставногоТипаXS", "XSComplexFinalUnion")] - public class XSComplexFinalUnion : AutoContext + public sealed class XSComplexFinalUnion : AutoContext { private readonly ArrayImpl _values; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentFixedList.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentFixedList.cs index 6ee48141a..962311a1a 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentFixedList.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentFixedList.cs @@ -14,7 +14,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Collections { [ContextClass("ФиксированныйСписокКомпонентXS", "XSComponentFixedList")] - public class XSComponentFixedList : AutoCollectionContext + public sealed class XSComponentFixedList : AutoCollectionContext { private readonly List _items; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs index 672f94f97..6041a6f8b 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs @@ -17,7 +17,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Collections { [ContextClass("СписокКомпонентXS", "XSComponentList")] - public class XSComponentList : AutoCollectionContext + public sealed class XSComponentList : AutoCollectionContext { private readonly List _items; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSNamedComponentMap.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSNamedComponentMap.cs index 99739deb7..49e1ff972 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSNamedComponentMap.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSNamedComponentMap.cs @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Collections { [ContextClass("КоллекцияИменованныхКомпонентXS", "XSNamedComponentMap")] - public class XSNamedComponentMap : AutoCollectionContext + public sealed class XSNamedComponentMap : AutoCollectionContext { private readonly List _items; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSProhibitedSubstitutionsUnion.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSProhibitedSubstitutionsUnion.cs index 9763acb30..04e19508b 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSProhibitedSubstitutionsUnion.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSProhibitedSubstitutionsUnion.cs @@ -16,7 +16,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Collections { [ContextClass("ОбъединениеЗапрещенныхПодстановокXS", "XSProhibitedSubstitutionsUnion")] - public class XsProhibitedSubstitutionsUnion : AutoContext + public sealed class XsProhibitedSubstitutionsUnion : AutoContext { private readonly ArrayImpl _values; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSubstitutionGroupExclusionsUnion.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSubstitutionGroupExclusionsUnion.cs index 078f35d4a..489c33adf 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSubstitutionGroupExclusionsUnion.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSSubstitutionGroupExclusionsUnion.cs @@ -16,7 +16,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Collections { [ContextClass("ОбъединениеИсключенийГруппПодстановкиXS", "XSSubstitutionGroupExclusionsUnion")] - public class XsSubstitutionGroupExclusionsUnion : AutoContext + public sealed class XsSubstitutionGroupExclusionsUnion : AutoContext { private readonly ArrayImpl _values; private bool Contains(XmlSchemaDerivationMethod value) diff --git a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSComplexFinal.cs b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSComplexFinal.cs index 63311e279..dbdab2a8d 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSComplexFinal.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSComplexFinal.cs @@ -14,7 +14,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Enumerations { - public class XSComplexFinal : EnumerationValue + public sealed class XSComplexFinal : EnumerationValue { private readonly XmlSchemaDerivationMethod _derivationMethod; public XSComplexFinal(EnumerationContext owner, XmlSchemaDerivationMethod derivationMethod) @@ -28,7 +28,7 @@ public static XmlSchemaDerivationMethod ToNativeValue(XSComplexFinal wrapper) } [SystemEnum("ЗавершенностьСоставногоТипаXS", "XSComplexFinal")] - public class EnumerationXSComplexFinal : EnumerationContext + public sealed class EnumerationXSComplexFinal : EnumerationContext { private readonly Dictionary _valuesCache; @@ -70,6 +70,4 @@ public static EnumerationXSComplexFinal CreateInstance(ITypeManager typeManager) } } - - -} \ No newline at end of file +} diff --git a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSContentModel.cs b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSContentModel.cs index 4ef13998b..1b65c3801 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSContentModel.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSContentModel.cs @@ -18,9 +18,15 @@ public enum XSContentModel [EnumValue("EmptyRef", "ПустаяСсылка")] EmptyRef, + /// + /// Простая модель содержания. + /// [EnumValue("Simple", "Простая")] Simple, + /// + /// Составная модель содержания. + /// [EnumValue("Complex", "Составная")] Complex } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSDisallowedSubstitutions.cs b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSDisallowedSubstitutions.cs index 65f06a242..9a52f923c 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSDisallowedSubstitutions.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSDisallowedSubstitutions.cs @@ -14,7 +14,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Enumerations { - public class XSDisallowedSubstitutions : ClrEnumValueWrapper + public sealed class XSDisallowedSubstitutions : ClrEnumValueWrapper { internal XSDisallowedSubstitutions(EnumerationXSDisallowedSubstitutions instance, XmlSchemaDerivationMethod realValue) : base(instance, realValue) @@ -29,7 +29,7 @@ public static XmlSchemaDerivationMethod ToNativeValue(XSDisallowedSubstitutions } [SystemEnum("НедопустимыеПодстановкиXS", "XSDisallowedSubstitutions")] - public class EnumerationXSDisallowedSubstitutions : EnumerationContext + public sealed class EnumerationXSDisallowedSubstitutions : EnumerationContext { private readonly Dictionary _valuesCache; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSForm.cs b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSForm.cs index 9e9c4b18f..29b8ee707 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSForm.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSForm.cs @@ -14,7 +14,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Enumerations { - public class XSForm : ClrEnumValueWrapper + public sealed class XSForm : ClrEnumValueWrapper { internal XSForm(EnumerationXSForm instance, XmlSchemaForm realValue) : base(instance, realValue ) { @@ -26,7 +26,7 @@ internal XSForm(EnumerationXSForm instance, XmlSchemaForm realValue) : base(inst } [SystemEnum("ФормаПредставленияXS", "XSForm")] - public class EnumerationXSForm : EnumerationContext + public sealed class EnumerationXSForm : EnumerationContext { private readonly Dictionary _valuesCache; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSProhibitedSubstitutions.cs b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSProhibitedSubstitutions.cs index 344a85e16..e60bd06a4 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSProhibitedSubstitutions.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSProhibitedSubstitutions.cs @@ -14,7 +14,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Enumerations { - public class XSProhibitedSubstitutions : ClrEnumValueWrapper + public sealed class XSProhibitedSubstitutions : ClrEnumValueWrapper { internal XSProhibitedSubstitutions(EnumerationXSProhibitedSubstitutions instance, XmlSchemaDerivationMethod realValue) : base(instance, realValue) @@ -29,7 +29,7 @@ public static XmlSchemaDerivationMethod ToNativeValue(XSProhibitedSubstitutions } [SystemEnum("ЗапрещенныеПодстановкиXS", "EnumerationXSProhibitedSubstitutions")] - public class EnumerationXSProhibitedSubstitutions : EnumerationContext + public sealed class EnumerationXSProhibitedSubstitutions : EnumerationContext { private readonly Dictionary _valuesCache; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSchemaFinal.cs b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSchemaFinal.cs index 8d56229db..998213398 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSchemaFinal.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSchemaFinal.cs @@ -13,7 +13,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Enumerations { - public class XSSchemaFinal : ClrEnumValueWrapper + public sealed class XSSchemaFinal : ClrEnumValueWrapper { internal XSSchemaFinal(EnumerationXSSchemaFinal instance, XmlSchemaDerivationMethod realValue) : base(instance, realValue) @@ -22,7 +22,7 @@ internal XSSchemaFinal(EnumerationXSSchemaFinal instance, XmlSchemaDerivationMet } [SystemEnum("ЗавершенностьСхемыXS", "XSSchemaFinal")] - public class EnumerationXSSchemaFinal : ClrEnumWrapper + public sealed class EnumerationXSSchemaFinal : ClrEnumWrapper { private readonly Dictionary _valuesCache; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSimpleFinal.cs b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSimpleFinal.cs index 8010da761..281563283 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSimpleFinal.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSimpleFinal.cs @@ -14,7 +14,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Enumerations { - public class XSSimpleFinal : ClrEnumValueWrapper + public sealed class XSSimpleFinal : ClrEnumValueWrapper { internal XSSimpleFinal(EnumerationXSSimpleFinal instance, XmlSchemaDerivationMethod realValue) : base(instance, realValue) @@ -29,7 +29,7 @@ public static XmlSchemaDerivationMethod ToNativeValue(XSSimpleFinal wrapper) } [SystemEnum("ЗавершенностьПростогоТипаXS", "XSSimpleFinal")] - public class EnumerationXSSimpleFinal : EnumerationContext + public sealed class EnumerationXSSimpleFinal : EnumerationContext { private readonly Dictionary _valuesCache; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSubstitutionGroupExclusions.cs b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSubstitutionGroupExclusions.cs index 333d62ad6..a90644bb3 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSubstitutionGroupExclusions.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Enumerations/XSSubstitutionGroupExclusions.cs @@ -14,7 +14,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Enumerations { - public class XSSubstitutionGroupExclusions : ClrEnumValueWrapper + public sealed class XSSubstitutionGroupExclusions : ClrEnumValueWrapper { internal XSSubstitutionGroupExclusions(EnumerationXSSubstitutionGroupExclusions instance, XmlSchemaDerivationMethod realValue) : base(instance, realValue) @@ -29,7 +29,7 @@ public static XmlSchemaDerivationMethod ToNativeValue(XSSubstitutionGroupExclusi } [SystemEnum("ИсключенияГруппПодстановкиXS", "XSSubstitutionGroupExclusions")] - public class EnumerationXSSubstitutionGroupExclusions : EnumerationContext + public sealed class EnumerationXSSubstitutionGroupExclusions : EnumerationContext { private readonly Dictionary _valuesCache; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAnnotation.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAnnotation.cs index adefd01fc..c063335a3 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAnnotation.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAnnotation.cs @@ -17,7 +17,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("АннотацияXS", "XSAnnotation")] - public class XSAnnotation : AutoContext, IXSComponent + public sealed class XSAnnotation : AutoContext, IXSComponent { internal readonly XmlSchemaAnnotation InternalObject; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeDeclaration.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeDeclaration.cs index 85cacaa0b..a548df57d 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeDeclaration.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeDeclaration.cs @@ -19,7 +19,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ОбъявлениеАтрибутаXS", "XSAttributeDeclaration")] - public class XSAttributeDeclaration : AutoContext, IXSAnnotated, IXSAttribute, IXSNamedComponent + public sealed class XSAttributeDeclaration : AutoContext, IXSAnnotated, IXSAttribute, IXSNamedComponent { private readonly XmlSchemaAttribute _attribute; private XSAnnotation _annotation; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeGroupDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeGroupDefinition.cs index 77875b644..578d100c9 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeGroupDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeGroupDefinition.cs @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ОпределениеГруппыАтрибутовXS", "XSAttributeGroupDefinition")] - public class XSAttributeGroupDefinition : AutoContext, IXSAnnotated, IXSNamedComponent + public sealed class XSAttributeGroupDefinition : AutoContext, IXSAnnotated, IXSNamedComponent { private XmlSchemaAnnotated _attributeGroup; private XSAnnotation _annotation; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeUse.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeUse.cs index 4777b5c02..9a3d11754 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeUse.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSAttributeUse.cs @@ -17,7 +17,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ИспользованиеАтрибутаXS", "XSAttributeUse")] - public class XSAttributeUse : AutoContext, IXSComponent + public sealed class XSAttributeUse : AutoContext, IXSComponent { private IValue _value; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSElementDeclaration.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSElementDeclaration.cs index 69fe0eb6c..45f1fd7d4 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSElementDeclaration.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSElementDeclaration.cs @@ -19,7 +19,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ОбъявлениеЭлементаXS", "XSElementDeclaration")] - public class XSElementDeclaration : AutoContext, IXSFragment, IXSNamedComponent + public sealed class XSElementDeclaration : AutoContext, IXSFragment, IXSNamedComponent { private readonly XmlSchemaElement _element; private XSAnnotation _annotation; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSIdentityConstraintDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSIdentityConstraintDefinition.cs index d1aaf327a..d14c2c391 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSIdentityConstraintDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSIdentityConstraintDefinition.cs @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ОпределениеОграниченияИдентичностиXS", "XSIdentityConstraintDefinition")] - public class XSIdentityConstraintDefinition : AutoContext, IXSAnnotated, IXSNamedComponent + public sealed class XSIdentityConstraintDefinition : AutoContext, IXSAnnotated, IXSNamedComponent { private XmlSchemaIdentityConstraint _constraint; private XSAnnotation _annotation; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroup.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroup.cs index ac770d4e8..ed4905be5 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroup.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSModelGroup.cs @@ -18,7 +18,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ГруппаМоделиXS", "XSModelGroup")] - public class XSModelGroup : AutoContext, IXSFragment + public sealed class XSModelGroup : AutoContext, IXSFragment { private XmlSchemaGroupBase _group; private XSAnnotation _annotation; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSNotationDeclaration.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSNotationDeclaration.cs index f245270a3..a12229e61 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSNotationDeclaration.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSNotationDeclaration.cs @@ -16,7 +16,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ОбъявлениеНотацииXS", "XSNotationDeclaration")] - public class XSNotationDeclaration : AutoContext, IXSAnnotated, IXSNamedComponent + public sealed class XSNotationDeclaration : AutoContext, IXSAnnotated, IXSNamedComponent { private readonly XmlSchemaNotation _notation; private XSAnnotation _annotation; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSParticle.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSParticle.cs index a4146fca0..adc340feb 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSParticle.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSParticle.cs @@ -19,7 +19,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ФрагментXS", "XSParticle")] - public class XSParticle : AutoContext, IXSComponent + public sealed class XSParticle : AutoContext, IXSComponent { private IXSFragment _term; private IValue _minOccurs; diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs index eb61ed102..87641c293 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs @@ -20,7 +20,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.XMLSchema.Objects { [ContextClass("ОпределениеПростогоТипаXS", "XSSimpleTypeDefinition")] - public class XSSimpleTypeDefinition : AutoContext, IXSType, IXSNamedComponent + public sealed class XSSimpleTypeDefinition : AutoContext, IXSType, IXSNamedComponent { private readonly XmlSchemaSimpleType _type; private XSAnnotation _annotation; From 65131a59ed52035552f0b145e5feff190793ae1c Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Thu, 28 Sep 2023 20:33:31 +0200 Subject: [PATCH 112/126] =?UTF-8?q?=D0=A3=D0=BD=D0=B8=D1=84=D0=B8=D1=86?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=BE=D0=B1=D1=8A?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D1=8B=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../XMLSchema/Interfaces/IXSType.cs | 2 + .../Objects/XSComplexTypeDefinition.cs | 2 +- .../Objects/XSSimpleTypeDefinition.cs | 243 ++++++++++-------- 3 files changed, 142 insertions(+), 105 deletions(-) diff --git a/src/OneScript.StandardLibrary/XMLSchema/Interfaces/IXSType.cs b/src/OneScript.StandardLibrary/XMLSchema/Interfaces/IXSType.cs index b374ee757..8929e2d14 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Interfaces/IXSType.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Interfaces/IXSType.cs @@ -9,5 +9,7 @@ namespace OneScript.StandardLibrary.XMLSchema.Interfaces { public interface IXSType : IXSAnnotated { + string NamespaceURI { get; } + string Name { get; set; } } } diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs index 10fef35f7..616f09d09 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSComplexTypeDefinition.cs @@ -318,7 +318,7 @@ public XSAnnotation Annotation public IValue DOMElement => ValueFactory.Create(); [ContextProperty("URIПространстваИмен", "NamespaceURI")] - public string URIПространстваИмен => _type.SourceUri; + public string NamespaceURI => _type.SourceUri; [ContextProperty("Имя", "Name")] public string Name diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs index 87641c293..c54b708ea 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs @@ -6,10 +6,10 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Diagnostics.Contracts; using System.Xml; using System.Xml.Schema; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.StandardLibrary.Xml; using OneScript.StandardLibrary.XMLSchema.Collections; using OneScript.StandardLibrary.XMLSchema.Enumerations; @@ -23,28 +23,18 @@ namespace OneScript.StandardLibrary.XMLSchema.Objects public sealed class XSSimpleTypeDefinition : AutoContext, IXSType, IXSNamedComponent { private readonly XmlSchemaSimpleType _type; + private readonly XSComponentFixedList _components = new XSComponentFixedList(); + private readonly XSComponentList _typeDefinitions = new XSComponentList(); + private readonly XSComponentList _facets = new XSComponentList(); + private XSAnnotation _annotation; private XMLExpandedName _baseTypeName; private XMLExpandedName _itemTypeName; private XSSimpleTypeVariety _variety; - private XSSimpleTypeDefinition() - { - _type = new XmlSchemaSimpleType(); - Facets = new XSComponentList(); - Facets.Inserted += Facets_Inserted; - Facets.Cleared += Facets_Cleared; - - MemberTypeDefinitions = new XSComponentList(); - MemberTypeDefinitions.Inserted += MemberTypeDefinitions_Inserted; - MemberTypeDefinitions.Cleared += MemberTypeDefinitions_Cleared; - - Components = new XSComponentFixedList(); - Variety = XSSimpleTypeVariety.Atomic; - } + private XSSimpleTypeDefinition() : this(new XmlSchemaSimpleType()) { } internal XSSimpleTypeDefinition(XmlSchemaSimpleType simpleType) - : this() { _type = simpleType; @@ -54,47 +44,122 @@ internal XSSimpleTypeDefinition(XmlSchemaSimpleType simpleType) _annotation.BindToContainer(RootContainer, this); } + InitContentTypeVariety(); + + _facets.Inserted += Facets_Inserted; + _facets.Cleared += Facets_Cleared; + + _typeDefinitions.Inserted += MemberTypeDefinitions_Inserted; + _typeDefinitions.Cleared += MemberTypeDefinitions_Cleared; + } + + private void InitContentTypeVariety() + { if (_type.Content is XmlSchemaSimpleTypeList typeList) + InitListVariety(typeList); + + else if (_type.Content is XmlSchemaSimpleTypeUnion typeUnion) + InitUnionVariety(typeUnion); + + else if (_type.Content is XmlSchemaSimpleTypeRestriction typeRestriction) + InitAtomicVariety(typeRestriction); + + else + _variety = XSSimpleTypeVariety.Atomic; + } + + private void InitListVariety(XmlSchemaSimpleTypeList typeList) + { + _variety = XSSimpleTypeVariety.List; + InitItemTypeName(typeList.ItemTypeName); + } + + private void InitUnionVariety(XmlSchemaSimpleTypeUnion typeUnion) + { + _variety = XSSimpleTypeVariety.Union; + foreach (var item in typeUnion.BaseTypes) { - _variety = XSSimpleTypeVariety.List; + var component = XMLSchemaSerializer.CreateInstance(item); + component.BindToContainer(RootContainer, this); + _typeDefinitions.Add(component); + _components.Add(component); + } + } - if (typeList.ItemTypeName is XmlQualifiedName qualifiedName) - _itemTypeName = new XMLExpandedName(qualifiedName); + private void InitAtomicVariety(XmlSchemaSimpleTypeRestriction typeRestriction) + { + _variety = XSSimpleTypeVariety.Atomic; + InitBaseTypeName(typeRestriction.BaseTypeName); - } - else if (_type.Content is XmlSchemaSimpleTypeUnion typeUnion) + foreach (var item in typeRestriction.Facets) { - _variety = XSSimpleTypeVariety.Union; - - MemberTypeDefinitions.Inserted -= MemberTypeDefinitions_Inserted; - foreach (XmlSchemaObject item in typeUnion.BaseTypes) - { - IXSComponent component = XMLSchemaSerializer.CreateInstance(item); - component.BindToContainer(RootContainer, this); - MemberTypeDefinitions.Add(component); - Components.Add(component); - } - MemberTypeDefinitions.Inserted += MemberTypeDefinitions_Inserted; + var component = XMLSchemaSerializer.CreateInstance(item); + component.BindToContainer(RootContainer, this); + _facets.Add(component); + _components.Add(component); } - else if (_type.Content is XmlSchemaSimpleTypeRestriction typeRestriction) + } + + private void InitItemTypeName(XmlQualifiedName xmlQualifiedName) + { + if (xmlQualifiedName is XmlQualifiedName qualifiedName) + _itemTypeName = new XMLExpandedName(qualifiedName); + } + + private void InitBaseTypeName(XmlQualifiedName xmlQualifiedName) + { + if (xmlQualifiedName is XmlQualifiedName qualifiedName) + _baseTypeName = new XMLExpandedName(qualifiedName); + } + + private void SetContentTypeVariety(XSSimpleTypeVariety value) + { + if (_variety == value) return; + _variety = value; + + switch (_variety) { - _variety = XSSimpleTypeVariety.Atomic; + case XSSimpleTypeVariety.List: + _type.Content = new XmlSchemaSimpleTypeList(); + _itemTypeName = default; + break; + + case XSSimpleTypeVariety.Union: + _type.Content = new XmlSchemaSimpleTypeUnion(); + _typeDefinitions.Clear(); + break; + + case XSSimpleTypeVariety.Atomic: + _type.Content = new XmlSchemaSimpleTypeRestriction(); + _baseTypeName = default; + _facets.Clear(); + break; - if (typeRestriction.BaseTypeName is XmlQualifiedName qualifiedName) - _baseTypeName = new XMLExpandedName(qualifiedName); - - Facets.Inserted -= Facets_Inserted; - foreach (XmlSchemaObject item in typeRestriction.Facets) - { - IXSComponent component = XMLSchemaSerializer.CreateInstance(item); - component.BindToContainer(RootContainer, this); - Facets.Add(component); - Components.Add(component); - } - Facets.Inserted += Facets_Inserted; + default: + break; } } + private void SetBaseTypeName(XMLExpandedName value) + { + if (_baseTypeName == value) return; + Contract.Requires(Variety == XSSimpleTypeVariety.Atomic); + _baseTypeName = value; + + var content = _type.Content as XmlSchemaSimpleTypeRestriction; + content.BaseTypeName = _baseTypeName?.NativeValue; + } + + private void SetItemTypeName(XMLExpandedName value) + { + if (_itemTypeName == value) return; + Contract.Requires(Variety == XSSimpleTypeVariety.List); + _itemTypeName = value; + + var content = _type.Content as XmlSchemaSimpleTypeList; + content.ItemTypeName = _itemTypeName?.NativeValue; + } + #region OneScript #region Properties @@ -112,7 +177,7 @@ public XSAnnotation Annotation } [ContextProperty("Компоненты", "Components")] - public XSComponentFixedList Components { get; } + public XSComponentFixedList Components => _components; [ContextProperty("Контейнер", "Container")] public IXSComponent Container { get; private set; } @@ -130,7 +195,7 @@ public XSAnnotation Annotation public IValue DOMElement => ValueFactory.Create(); [ContextProperty("URIПространстваИмен", "NamespaceURI")] - public string URIПространстваИмен => _type.SourceUri; + public string NamespaceURI => _type.SourceUri; [ContextProperty("Имя", "Name")] public string Name @@ -152,19 +217,7 @@ public string Name public XSSimpleTypeVariety Variety { get => _variety; - set - { - _variety = value; - - if (_variety == XSSimpleTypeVariety.List) - _type.Content = new XmlSchemaSimpleTypeList(); - - else if (_variety == XSSimpleTypeVariety.Union) - _type.Content = new XmlSchemaSimpleTypeUnion(); - - else - _type.Content = new XmlSchemaSimpleTypeRestriction(); - } + set => SetContentTypeVariety(value); } [ContextProperty("Завершенность", "Final")] @@ -177,32 +230,14 @@ public XSSimpleTypeVariety Variety public XMLExpandedName BaseTypeName { get => _baseTypeName; - set - { - _baseTypeName = value; - if (Variety == XSSimpleTypeVariety.Atomic) - { - XmlSchemaSimpleTypeRestriction content = _type.Content as XmlSchemaSimpleTypeRestriction; - content.BaseTypeName = _baseTypeName.NativeValue; - } - else - throw RuntimeException.InvalidArgumentValue(); - } + set => SetBaseTypeName(value); } [ContextProperty("ИмяТипаЭлемента", "ItemTypeName")] public XMLExpandedName ItemTypeName { get => _itemTypeName; - set - { - _itemTypeName = value; - if (Variety == XSSimpleTypeVariety.List) - { - XmlSchemaSimpleTypeList content = (XmlSchemaSimpleTypeList)_type.Content; - content.ItemTypeName = _itemTypeName.NativeValue; - } - } + set => SetItemTypeName(value); } [ContextProperty("ОпределениеБазовогоТипа", "BaseTypeDefinition")] @@ -215,17 +250,17 @@ public XMLExpandedName ItemTypeName public XSSimpleTypeDefinition ItemTypeDefinition { get; set; } [ContextProperty("ОпределенияТиповОбъединения", "MemberTypeDefinitions")] - public XSComponentList MemberTypeDefinitions { get; } + public XSComponentList MemberTypeDefinitions => _typeDefinitions; [ContextProperty("Фасеты", "Facets")] - public XSComponentList Facets { get; } + public XSComponentList Facets => _facets; #endregion #region Methods [ContextMethod("КлонироватьКомпоненту", "CloneComponent")] - public IXSComponent CloneComponent(bool recursive = true) => throw new NotImplementedException(); + public IXSComponent CloneComponent(bool recursive) => throw new NotImplementedException(); [ContextMethod("ОбновитьЭлементDOM", "UpdateDOMElement")] public void UpdateDOMElement() => throw new NotImplementedException(); @@ -264,46 +299,46 @@ public void BindToContainer(IXSComponent rootContainer, IXSComponent container) private void Facets_Inserted(object sender, XSComponentListEventArgs e) { - IXSComponent component = e.Component; - - if (!(component is IXSFacet)) - throw RuntimeException.InvalidArgumentType(); + var component = e.Component; + Contract.Requires(_variety == XSSimpleTypeVariety.Atomic); + Contract.Requires(component is IXSFacet); component.BindToContainer(RootContainer, this); - Components.Add(component); + _components.Add(component); - if (_type.Content is XmlSchemaSimpleTypeRestriction content) - content.Facets.Add(component.SchemaObject); + var content = _type.Content as XmlSchemaSimpleTypeRestriction; + content.Facets.Add(component.SchemaObject); } private void Facets_Cleared(object sender, EventArgs e) { - Components.Clear(); + Contract.Requires(_variety == XSSimpleTypeVariety.Atomic); + _components.Clear(); - if (_type.Content is XmlSchemaSimpleTypeRestriction content) - content.Facets.Clear(); + var content = _type.Content as XmlSchemaSimpleTypeRestriction; + content.Facets.Clear(); } private void MemberTypeDefinitions_Inserted(object sender, XSComponentListEventArgs e) { - IXSComponent component = e.Component; - - if (!(component is XSSimpleTypeDefinition)) - throw RuntimeException.InvalidArgumentType(); + var component = e.Component; + Contract.Requires(_variety == XSSimpleTypeVariety.Union); + Contract.Requires(component is XSSimpleTypeDefinition); component.BindToContainer(RootContainer, this); - Components.Add(component); + _components.Add(component); - if (_type.Content is XmlSchemaSimpleTypeUnion content) - content.BaseTypes.Add(component.SchemaObject); + var content = _type.Content as XmlSchemaSimpleTypeUnion; + content.BaseTypes.Add(component.SchemaObject); } private void MemberTypeDefinitions_Cleared(object sender, EventArgs e) { - Components.Clear(); + Contract.Requires(_variety == XSSimpleTypeVariety.Union); + _components.Clear(); - if (_type.Content is XmlSchemaSimpleTypeUnion content) - content.BaseTypes.Clear(); + var content = _type.Content as XmlSchemaSimpleTypeUnion; + content.BaseTypes.Clear(); } #endregion From f704ddc3e8d2fc151805f7b9c8c1ea48cd76ef00 Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Thu, 28 Sep 2023 22:37:37 +0200 Subject: [PATCH 113/126] =?UTF-8?q?fix:=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B3=D0=BE=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../XMLSchema/Objects/XSSimpleTypeDefinition.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs index c54b708ea..bbafd61c4 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSSimpleTypeDefinition.cs @@ -64,8 +64,12 @@ private void InitContentTypeVariety() else if (_type.Content is XmlSchemaSimpleTypeRestriction typeRestriction) InitAtomicVariety(typeRestriction); - else - _variety = XSSimpleTypeVariety.Atomic; + else + { + var newRestriction = new XmlSchemaSimpleTypeRestriction(); + _type.Content = newRestriction; + InitAtomicVariety(newRestriction); + } } private void InitListVariety(XmlSchemaSimpleTypeList typeList) From dbe9f5cc6274db9d99331b88ab280559cf0affce Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Thu, 28 Sep 2023 22:40:01 +0200 Subject: [PATCH 114/126] =?UTF-8?q?build:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BF=D1=80=D0=B8=D0=BD=D1=83=D0=B4?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D0=B8=D1=81?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20UTF-8=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=B1=D0=BE=D1=80?= =?UTF-8?q?=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Build_Core.csproj | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Build_Core.csproj b/Build_Core.csproj index f889c371d..28ff0e46d 100644 --- a/Build_Core.csproj +++ b/Build_Core.csproj @@ -69,7 +69,7 @@ ItemName="BuildVariant"/> - + $(MSBuildProjectDirectory)/src/ScriptEngine.NativeApi/bin/$(Configuration) @@ -105,9 +105,9 @@ - + - + $(MSBuildProjectDirectory)/src/ScriptEngine.NativeApi/bin/$(Configuration) @@ -183,8 +183,8 @@ - - + + @@ -206,7 +206,8 @@ + Condition="'$(SkipLibraryDownload)' == ''" + UseUtf8Encoding="Always"/> @@ -258,6 +259,7 @@ WorkingDirectory="$(TestsRoot)/%(TestAssemblies.Identity)" Command="dotnet test --logger:"junit;LogFilePath=$(MSBuildProjectDirectory)/tests/%(TestAssemblies.Identity).xml"" IgnoreExitCode="true" + UseUtf8Encoding="Always" /> @@ -278,7 +280,8 @@ WorkingDirectory="$(MSBuildProjectDirectory)\tests" Command="dotnet "$(Runner)" "$(MSBuildProjectDirectory)\tests\testrunner.os" -runall . xddReportPath ." IgnoreExitCode="true" - ContinueOnError="true"> + ContinueOnError="true" + UseUtf8Encoding="Always"> @@ -309,7 +312,7 @@ - + @@ -348,7 +351,7 @@ + Command="dotnet nuget push %(NugetAbleProject.Identity).$(ReleaseNumber).nupkg -k $(NugetToken) -s https://api.nuget.org/v3/index.json" UseUtf8Encoding="Always"/> From 3d2a15c76b5c6c150598959f2e951a4daca511af Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Fri, 29 Sep 2023 17:55:06 +0300 Subject: [PATCH 115/126] =?UTF-8?q?#1327:=20=D0=B2=D0=BE=20=D1=81=D0=BB?= =?UTF-8?q?=D0=B0=D0=B2=D1=83=20=D1=81=D0=BE=D0=BD=D0=B0=D1=80=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TypeDescriptions/TypeDescription.cs | 59 +++++++++---------- .../TypeDescriptionBuilder.cs | 2 +- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs index c85daecc0..0f9c3b164 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs @@ -23,8 +23,6 @@ public class TypeDescription : AutoContext { private readonly List _types = new List(); - private const string TYPE_BINARYDATA_NAME = "ДвоичныеДанные"; - public TypeDescription(IEnumerable types = null) { if (types != null) @@ -196,39 +194,36 @@ public static TypeDescription Constructor( var qualifiers = new[] { null, p2, p3, p4, p5, p6, p7 }; var rawSource = source?.GetRawValue(); - if (rawSource == null || rawSource.SystemType == BasicTypes.Undefined) + if (rawSource != null && rawSource.SystemType != BasicTypes.Undefined) { - // пустой первый параметр - нет объекта-основания - // добавляемые/вычитаемые типы не допускаются, квалификаторы игнорируются + if (rawSource is TypeDescription typeDesc) + { + // Если 1 парарметр - ОписаниеТипов, то 2 - добавляемые типы, 3 - убираемые типы, + builder.SourceDescription(typeDesc); - // квалификакторы передаются только для контроля типов - } - else - if (rawSource is TypeDescription typeDesc) - { - // Если 1 парарметр - ОписаниеТипов, то 2 - добавляемые типы, 3 - убираемые типы, - builder.SourceDescription(typeDesc); - - var typesToAdd = CheckAndParseTypeList(context.TypeManager, p2, 2); - var typesToRemove = CheckAndParseTypeList(context.TypeManager, p3, 3); - - builder.RemoveTypes(typesToRemove); - builder.AddTypes(typesToAdd); - - qualifiers[1] = null; // эти параметры не квалификаторы - qualifiers[2] = null; // эти параметры не квалификаторы + var typesToAdd = CheckAndParseTypeList(context.TypeManager, p2, 2); + var typesToRemove = CheckAndParseTypeList(context.TypeManager, p3, 3); - } - else - if (rawSource.SystemType == BasicTypes.String || rawSource is ArrayImpl) - { - // Если 1 парарметр - Массив или строка, то это набор конкретных типов - // остальные параметры (2 и далее) - клвалификаторы в произвольном порядке - var typesList = CheckAndParseTypeList(context.TypeManager, rawSource, 1); - builder.AddTypes(typesList); - } else - throw RuntimeException.InvalidArgumentValue(); - + builder.RemoveTypes(typesToRemove); + builder.AddTypes(typesToAdd); + + qualifiers[1] = null; // эти параметры не квалификаторы + qualifiers[2] = null; // эти параметры не квалификаторы + } + else if (rawSource.SystemType == BasicTypes.String || rawSource is ArrayImpl) + { + // Если 1 парарметр - Массив или строка, то это набор конкретных типов + // остальные параметры (2 и далее) - клвалификаторы в произвольном порядке + var typesList = CheckAndParseTypeList(context.TypeManager, rawSource, 1); + builder.AddTypes(typesList); + } + else + throw RuntimeException.InvalidArgumentValue(); + } /* else + пустой первый параметр - нет объекта-основания + добавляемые/вычитаемые типы не допускаются, квалификаторы игнорируются + квалификакторы передаются только для контроля типов + */ CheckAndAddQualifiers(builder, qualifiers); return builder.Build(); } diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs index 0b87a3186..551d8e7d0 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs @@ -12,7 +12,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.StandardLibrary.TypeDescriptions { - internal partial class TypeDescriptionBuilder + internal class TypeDescriptionBuilder { private NumberQualifiers _numberQualifiers; private StringQualifiers _stringQualifiers; From ed95c67c2692cc324c0afa00143855c7ea616b0a Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Mon, 2 Oct 2023 14:25:43 +0400 Subject: [PATCH 116/126] =?UTF-8?q?=D0=98=D1=81=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BD?= =?UTF-8?q?=D1=83=D1=8E=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8E=20(=D0=BA=20#1351)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs index fe5d82420..1a6ea7214 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs @@ -29,6 +29,9 @@ private static readonly Dictionary _allowedEnums private XmlGlobalFunctions(IGlobalsManager mgr) { + if (_allowedEnums.Count > 0) + return; + foreach (var e in new[] { (typeof(ClrEnumValueWrapper), typeof(AllowedSignEnum)), (typeof(ClrEnumValueWrapper), typeof(AllowedLengthEnum)), From a84577bffbd27561eebb80cac129e489027cf01a Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 4 Oct 2023 11:23:03 +0300 Subject: [PATCH 117/126] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BD=D0=BE=D0=B9=20=D0=B8?= =?UTF-8?q?=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B2=20=D0=BF=D0=B5=D1=80=D0=B5=D1=87=D0=B8=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Xml/XmlGlobalFunctions.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs index fe5d82420..9d75a67ed 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs @@ -29,13 +29,17 @@ private static readonly Dictionary _allowedEnums private XmlGlobalFunctions(IGlobalsManager mgr) { - foreach (var e in new[] { - (typeof(ClrEnumValueWrapper), typeof(AllowedSignEnum)), - (typeof(ClrEnumValueWrapper), typeof(AllowedLengthEnum)), - (typeof(ClrEnumValueWrapper), typeof(DateFractionsEnum)) - }) + lock (_allowedEnums) { - _allowedEnums.Add(e.Item1, (EnumerationContext)mgr.GetInstance(e.Item2)); + _allowedEnums.Clear(); + foreach (var e in new[] { + (typeof(ClrEnumValueWrapper), typeof(AllowedSignEnum)), + (typeof(ClrEnumValueWrapper), typeof(AllowedLengthEnum)), + (typeof(ClrEnumValueWrapper), typeof(DateFractionsEnum)) + }) + { + _allowedEnums.Add(e.Item1, (EnumerationContext)mgr.GetInstance(e.Item2)); + } } } From 8fd9f43ec1b1a4372d2a57728e90e975cec438dc Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 4 Oct 2023 11:23:32 +0300 Subject: [PATCH 118/126] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=B5=20=D1=87=D1=82?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=20fixes=20#1358?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SystemConfigAccessor.cs | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/ScriptEngine.HostedScript/SystemConfigAccessor.cs b/src/ScriptEngine.HostedScript/SystemConfigAccessor.cs index 64e34c67c..619e6f6f6 100644 --- a/src/ScriptEngine.HostedScript/SystemConfigAccessor.cs +++ b/src/ScriptEngine.HostedScript/SystemConfigAccessor.cs @@ -16,27 +16,21 @@ namespace ScriptEngine.HostedScript.Library public class SystemConfigAccessor : GlobalContextBase { private KeyValueConfig _config; + private readonly ConfigurationProviders _providers; - internal ConfigurationProviders Provider { get; set; } - - public SystemConfigAccessor() + public SystemConfigAccessor(ConfigurationProviders providers) { + _providers = providers; Refresh(); } - internal KeyValueConfig GetConfig() - { - return _config; - } - /// /// Метод обновляет текущие настройки значениями из файла oscript.cfg /// [ContextMethod("ОбновитьНастройкиСистемы", "RefreshSystemConfig")] public void Refresh() { - if (Provider != null) - _config = Provider.CreateConfig(); + _config = _providers.CreateConfig(); } /// @@ -61,10 +55,7 @@ public IValue GetSystemOptionValue(string optionKey) public static IAttachableContext CreateInstance(ConfigurationProviders providers) { - return new SystemConfigAccessor - { - Provider = providers - }; + return new SystemConfigAccessor(providers); } } } From 7fd9b715852240237187a737aec22bc06f0c4c0b Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 6 Oct 2023 12:13:58 +0300 Subject: [PATCH 119/126] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B2=20Tri?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Language/IdentifiersTrie.cs | 62 ++++++++++++++----- .../OneScript.Language.Tests/TrieTests.cs | 23 +++++++ 2 files changed, 69 insertions(+), 16 deletions(-) diff --git a/src/OneScript.Language/IdentifiersTrie.cs b/src/OneScript.Language/IdentifiersTrie.cs index 6eb3bc0e0..cacf088fb 100644 --- a/src/OneScript.Language/IdentifiersTrie.cs +++ b/src/OneScript.Language/IdentifiersTrie.cs @@ -5,6 +5,7 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +using System; using System.Collections; using System.Collections.Generic; @@ -12,14 +13,29 @@ namespace OneScript.Language { public class IdentifiersTrie : IDictionary { + private readonly TrieNode _root = new TrieNode(); + private class TrieNode { public char charL; public char charU; - public T value; public TrieNode sibl; public TrieNode next; + private T _value; + + public T Value + { + get => _value; + set + { + HasValue = true; + _value = value; + } + } + + public bool HasValue { get; private set; } + public TrieNode Find(char ch) { var node = sibl; @@ -31,13 +47,7 @@ public TrieNode Find(char ch) } return null; } - } - private readonly TrieNode _root; - - public IdentifiersTrie() - { - _root = new TrieNode(); } public void Add(string str, T val) @@ -52,7 +62,7 @@ public void Add(string str, T val) { charL = char.ToLower(ch), charU = char.ToUpper(ch), - value = default(T), + Value = default(T), sibl = node.sibl }; node.sibl = key; @@ -61,12 +71,23 @@ public void Add(string str, T val) node = key.next; } - node.value = val; + node.Value = val; } - public bool ContainsKey(string key) + public bool ContainsKey(string str) { - throw new System.NotImplementedException(); + var node = _root; + foreach (char ch in str) + { + var key = node.Find(ch); + if (key == null) + { + return false; + } + node = key.next; + } + + return node.next == null && node.HasValue; } public bool Remove(string key) @@ -85,8 +106,11 @@ public T Get(string str) node = key.next; } + + if (!node.HasValue) + throw new KeyNotFoundException(); - return node.value; + return node.Value; } public T this[string index] @@ -95,8 +119,8 @@ public T this[string index] set => Add(index, value); } - public ICollection Keys { get; } - public ICollection Values { get; } + public ICollection Keys => throw new NotSupportedException(); + public ICollection Values => throw new NotSupportedException(); public bool TryGetValue(string str, out T value) { @@ -106,14 +130,20 @@ public bool TryGetValue(string str, out T value) var key = node.Find(ch); if (key == null) { - value = default(T); + value = default; return false; } node = key.next; } - value = node.value; + if (!node.HasValue) + { + value = default; + return false; + } + + value = node.Value; return true; } diff --git a/src/Tests/OneScript.Language.Tests/TrieTests.cs b/src/Tests/OneScript.Language.Tests/TrieTests.cs index af81bc852..f6c137daa 100644 --- a/src/Tests/OneScript.Language.Tests/TrieTests.cs +++ b/src/Tests/OneScript.Language.Tests/TrieTests.cs @@ -35,5 +35,28 @@ public void Tokens() Assert.Equal(2, t.Get("ИначеЕсли")); Assert.Equal(1, t.Get("Иначе")); } + + [Fact] + public void IdentifiersTrie_Inclusive_Test_ContainsKey() + { + var t = new IdentifiersTrie(); + + t.Add("ЕслиИначе", true); + Assert.False(t.ContainsKey("Если")); + Assert.True(t.ContainsKey("ЕслиИначе")); + } + + [Fact] + public void IdentifiersTrie_Inclusive_Test_TryGetValue() + { + var t = new IdentifiersTrie(); + + t.Add("МетодОдин", 1); + t.Add("МетодОдинИДва", 2); + + var exist = t.TryGetValue("Метод", out _); + + Assert.False(exist); + } } } \ No newline at end of file From 06291a2b6b2793e9ddf1fb18712a3fb4ec6d58ab Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 6 Oct 2023 12:27:03 +0300 Subject: [PATCH 120/126] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=87=D1=82?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3?= =?UTF-8?q?=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D1=82=D0=BE=D1=87=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B2=D1=85=D0=BE=D0=B4=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ранее конфигурация читалась по относительному пути, что ломало ряд сценариев, когда рабочий каталог менялся в процессе работы --- .../CfgFileConfigProvider.cs | 21 ++++++++++++++--- .../Extensions/EngineBuilderExtensions.cs | 23 ++++++++++--------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/ScriptEngine.HostedScript/CfgFileConfigProvider.cs b/src/ScriptEngine.HostedScript/CfgFileConfigProvider.cs index f4ad3259b..68e14bf92 100644 --- a/src/ScriptEngine.HostedScript/CfgFileConfigProvider.cs +++ b/src/ScriptEngine.HostedScript/CfgFileConfigProvider.cs @@ -17,17 +17,32 @@ public class CfgFileConfigProvider : IConfigProvider public const string CONFIG_FILE_NAME = "oscript.cfg"; public string FilePath { get; set; } - + + public bool Required { get; set; } + public Func> GetProvider() { var localCopy = FilePath; return () => ReadConfigFile(localCopy); } - private static IDictionary ReadConfigFile(string configPath) + private IDictionary ReadConfigFile(string configPath) { var conf = new Dictionary(); - using (var reader = new StreamReader(configPath, true)) + StreamReader reader; + try + { + reader = new StreamReader(configPath, true); + } + catch (IOException) + { + if (!Required) + return conf; + + throw; + } + + using (reader) { while (!reader.EndOfStream) { diff --git a/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs b/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs index 05d2d1146..7ffcb1f17 100644 --- a/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs +++ b/src/ScriptEngine.HostedScript/Extensions/EngineBuilderExtensions.cs @@ -16,13 +16,14 @@ namespace ScriptEngine.HostedScript.Extensions { public static class EngineBuilderExtensions { - public static ConfigurationProviders UseConfigFile(this ConfigurationProviders providers, string configFile) + public static ConfigurationProviders UseConfigFile(this ConfigurationProviders providers, string configFile, bool required = true) { - if (System.IO.File.Exists(configFile)) + if (File.Exists(configFile)) { var reader = new CfgFileConfigProvider { - FilePath = configFile + FilePath = configFile, + Required = required }; providers.Add(reader.GetProvider()); } @@ -36,22 +37,22 @@ public static ConfigurationProviders UseSystemConfigFile(this ConfigurationProvi if (string.IsNullOrEmpty(asmLocation)) asmLocation = System.Reflection.Assembly.GetEntryAssembly()?.Location; - var pathPrefix = !string.IsNullOrWhiteSpace(asmLocation) ? - System.IO.Path.GetDirectoryName(asmLocation) : - System.Environment.CurrentDirectory; + var pathPrefix = (!string.IsNullOrWhiteSpace(asmLocation) ? + Path.GetDirectoryName(asmLocation) : + System.Environment.CurrentDirectory) ?? ""; - var configFile = System.IO.Path.Combine(pathPrefix, CfgFileConfigProvider.CONFIG_FILE_NAME); + var configFile = Path.Combine(pathPrefix, CfgFileConfigProvider.CONFIG_FILE_NAME); return providers.UseConfigFile(configFile); } public static ConfigurationProviders UseEntrypointConfigFile(this ConfigurationProviders providers, string entryPoint) { - var dir = System.IO.Path.GetDirectoryName(entryPoint); - var cfgPath = System.IO.Path.Combine(dir, CfgFileConfigProvider.CONFIG_FILE_NAME); - if (System.IO.File.Exists(cfgPath)) + var dir = Path.GetDirectoryName(entryPoint) ?? ""; + var cfgPath = Path.GetFullPath(Path.Combine(dir, CfgFileConfigProvider.CONFIG_FILE_NAME)); + if (File.Exists(cfgPath)) { - return providers.UseConfigFile(cfgPath); + return providers.UseConfigFile(cfgPath, false); } return providers; From d0e55e0a94ef0cbc67f73041466af5f7b2f05dfa Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 6 Oct 2023 20:19:54 +0300 Subject: [PATCH 121/126] =?UTF-8?q?-=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=20sh.=20=D0=A3=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=BB=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20-=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=88=D0=B5=D0=BB=D0=BB-=D1=81=D1=82=D0=B0=D1=80=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D1=8B=20=D0=B8=D0=B7=20SCD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Build_Core.csproj | 24 +++++++++++------------- install/{opm.sh => opm} | 0 install/{oscript.sh => oscript} | 0 3 files changed, 11 insertions(+), 13 deletions(-) rename install/{opm.sh => opm} (100%) mode change 100755 => 100644 rename install/{oscript.sh => oscript} (100%) mode change 100755 => 100644 diff --git a/Build_Core.csproj b/Build_Core.csproj index f889c371d..b9ecbae63 100644 --- a/Build_Core.csproj +++ b/Build_Core.csproj @@ -84,14 +84,14 @@ - - - - + + + + - - + + @@ -120,15 +120,13 @@ - - - - + + - - - + + + diff --git a/install/opm.sh b/install/opm old mode 100755 new mode 100644 similarity index 100% rename from install/opm.sh rename to install/opm diff --git a/install/oscript.sh b/install/oscript old mode 100755 new mode 100644 similarity index 100% rename from install/oscript.sh rename to install/oscript From 5a924996bfbe24d9b97d242098938f4877afa409 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 6 Oct 2023 21:19:36 +0300 Subject: [PATCH 122/126] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BF=D0=B0=D0=B4=D0=B0=D1=8E=D1=89?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Core/Exceptions/IExceptionInfoFactory.cs | 3 ++- src/OneScript.Native/Compiler/MethodCompiler.cs | 2 +- src/OneScript.Native/Runtime/DynamicOperations.cs | 2 +- src/ScriptEngine/Machine/ExceptionInfoFactory.cs | 2 +- src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs | 10 +++++++--- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/OneScript.Core/Exceptions/IExceptionInfoFactory.cs b/src/OneScript.Core/Exceptions/IExceptionInfoFactory.cs index 42e716317..c623b4c0a 100644 --- a/src/OneScript.Core/Exceptions/IExceptionInfoFactory.cs +++ b/src/OneScript.Core/Exceptions/IExceptionInfoFactory.cs @@ -7,6 +7,7 @@ This Source Code Form is subject to the terms of the using System; using OneScript.Contexts; +using OneScript.Values; namespace OneScript.Exceptions { @@ -15,7 +16,7 @@ namespace OneScript.Exceptions /// public interface IExceptionInfoFactory { - IRuntimeContextInstance GetExceptionInfo(Exception exception); + BslObjectValue GetExceptionInfo(Exception exception); string GetExceptionDescription(IRuntimeContextInstance exceptionInfo); diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index bec54d0fa..522bdeb3a 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -1039,7 +1039,7 @@ protected override void VisitRaiseNode(BslSyntaxNode node) else { VisitExpression(node.Children[0]); - var raiseArgExpression = _statementBuildParts.Pop(); + var raiseArgExpression = ExpressionHelpers.ToString(_statementBuildParts.Pop()); var exceptionExpression = ExpressionHelpers.CallOfInstanceMethod( Expression.Constant(ExceptionInfoFactory), diff --git a/src/OneScript.Native/Runtime/DynamicOperations.cs b/src/OneScript.Native/Runtime/DynamicOperations.cs index 9458afffd..246c350a6 100644 --- a/src/OneScript.Native/Runtime/DynamicOperations.cs +++ b/src/OneScript.Native/Runtime/DynamicOperations.cs @@ -163,7 +163,7 @@ public static T StrictConstructorCall(ITypeManager typeManager, IServiceConta return (T) ConstructorCall(typeManager, services, typeName, args); } - public static IRuntimeContextInstance GetExceptionInfo(IExceptionInfoFactory factory, Exception e) + public static BslObjectValue GetExceptionInfo(IExceptionInfoFactory factory, Exception e) { return factory.GetExceptionInfo(e); } diff --git a/src/ScriptEngine/Machine/ExceptionInfoFactory.cs b/src/ScriptEngine/Machine/ExceptionInfoFactory.cs index d6da3c696..1afa05c39 100644 --- a/src/ScriptEngine/Machine/ExceptionInfoFactory.cs +++ b/src/ScriptEngine/Machine/ExceptionInfoFactory.cs @@ -19,7 +19,7 @@ namespace ScriptEngine.Machine /// public class ExceptionInfoFactory : IExceptionInfoFactory { - public IRuntimeContextInstance GetExceptionInfo(Exception exception) + public BslObjectValue GetExceptionInfo(Exception exception) { if (exception == null) { diff --git a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs index a96782310..caa492b65 100644 --- a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs +++ b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs @@ -12,6 +12,7 @@ This Source Code Form is subject to the terms of the using FluentAssertions; using OneScript.Compilation.Binding; using OneScript.DependencyInjection; +using OneScript.Exceptions; using OneScript.Native.Runtime; using OneScript.StandardLibrary; using OneScript.StandardLibrary.Collections; @@ -46,6 +47,7 @@ private CompiledBlock GetCompiler(ITypeManager tm) { var services = new TinyIocImplementation(); services.Register(tm); + services.Register(); return new CompiledBlock(services.CreateContainer()); } @@ -662,7 +664,9 @@ public void Can_Do_ForEachLoop() [Fact] public void Can_Do_TryExcept() { - var block = new CompiledBlock(default); + var services = new TinyIocImplementation(); + services.Register(); + var block = new CompiledBlock(services); block.Parameters.Insert("Ф", new BslTypeValue(BasicTypes.Number)); block.CodeBlock = "Попытка Если Ф = 1 Тогда Возврат 1; КонецЕсли;" + @@ -1012,7 +1016,7 @@ public void ExceptionInfo_ReturnsUndefined_OutsideOfCatch() block.CodeBlock = "А = ИнформацияОбОшибке();"; var lambda = block.MakeExpression(); - lambda.Body.As().Expressions[0].Type.Should().Be(typeof(BslValue)); + lambda.Body.As().Expressions[0].Type.Should().BeAssignableTo(); } [Fact] @@ -1030,7 +1034,7 @@ public void ExceptionInfo_ReturnsClass_InCatch() tryBlock.Handlers.First().Body.As().Expressions[0].Type .Should() - .Be(typeof(ExceptionInfoContext)); + .Be(typeof(BslObjectValue)); } [Fact] From c030fd402ddcd2e54846799b55bc0638edc4ed73 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 6 Oct 2023 21:32:09 +0300 Subject: [PATCH 123/126] =?UTF-8?q?=D0=9D=D0=B5=D0=BA=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D1=8B=D0=B5=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=A1=D0=BE=D0=BD=D0=B0=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commons/IndexedNameValueCollection.cs | 2 +- src/OneScript.Language/IdentifiersTrie.cs | 10 +++++----- .../Xml/XmlGlobalFunctions.cs | 14 ++++---------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/OneScript.Core/Commons/IndexedNameValueCollection.cs b/src/OneScript.Core/Commons/IndexedNameValueCollection.cs index 059764382..94e2631ff 100644 --- a/src/OneScript.Core/Commons/IndexedNameValueCollection.cs +++ b/src/OneScript.Core/Commons/IndexedNameValueCollection.cs @@ -58,7 +58,7 @@ public T this[string name] public void AddName(int index, string name) { if (index < 0 || index >= _values.Count) - throw new ArgumentOutOfRangeException(); + throw new ArgumentOutOfRangeException(nameof(index)); _nameIndex[name] = index; } diff --git a/src/OneScript.Language/IdentifiersTrie.cs b/src/OneScript.Language/IdentifiersTrie.cs index cacf088fb..df4b68a19 100644 --- a/src/OneScript.Language/IdentifiersTrie.cs +++ b/src/OneScript.Language/IdentifiersTrie.cs @@ -74,17 +74,17 @@ public void Add(string str, T val) node.Value = val; } - public bool ContainsKey(string str) + public bool ContainsKey(string key) { var node = _root; - foreach (char ch in str) + foreach (char ch in key) { - var key = node.Find(ch); - if (key == null) + var keyNode = node.Find(ch); + if (keyNode == null) { return false; } - node = key.next; + node = keyNode.next; } return node.next == null && node.HasValue; diff --git a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs index 9d75a67ed..48acbc43b 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlGlobalFunctions.cs @@ -138,21 +138,15 @@ public IValue XMLValue(IValue givenType, string presentation) { if (presentation.Trim() == "") return ValueFactory.Create(); - else - { - throw RuntimeException.InvalidNthArgumentValue(2); - } - return ValueFactory.Create(); + + throw RuntimeException.InvalidNthArgumentValue(2); } else if (typeValue.Equals(BasicTypes.Null)) { if (presentation.Trim() == "") return ValueFactory.CreateNullValue(); - else - { - throw RuntimeException.InvalidNthArgumentValue(2); - } - return ValueFactory.Create(); + + throw RuntimeException.InvalidNthArgumentValue(2); } else if (typeValue.ImplementingClass == typeof(GuidWrapper)) { From 2760b64bd0cdd62cd475e048f9fa9a5e06a2d850 Mon Sep 17 00:00:00 2001 From: sfaqer Date: Sat, 7 Oct 2023 22:31:23 +1000 Subject: [PATCH 124/126] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BE=D0=BA=D0=BE=D0=BD=D1=87=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=20=D0=B2=20?= =?UTF-8?q?=D0=B1=D0=B0=D1=88=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=B0?= =?UTF-8?q?=D1=85=20crlf=20->=20cr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 065265706..bad6b35de 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,4 @@ -*.sh text eol=lf \ No newline at end of file +*.sh text eol=lf + +install/opm text eol=lf +install/oscript text eol=lf From 36de8cd8094848196405e64050bfee416d9e118a Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Tue, 10 Oct 2023 21:16:22 +0400 Subject: [PATCH 125/126] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D0=B0=20=D0=B2=20=D0=B4=D0=B5=D0=BB=D0=B5=D0=B3=D0=B0?= =?UTF-8?q?=D1=82=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.StandardLibrary/DelegateAction.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OneScript.StandardLibrary/DelegateAction.cs b/src/OneScript.StandardLibrary/DelegateAction.cs index cad964779..017b7844f 100644 --- a/src/OneScript.StandardLibrary/DelegateAction.cs +++ b/src/OneScript.StandardLibrary/DelegateAction.cs @@ -42,7 +42,8 @@ public DelegateAction(Func action) public DelegateAction(Func action) { - _action = parameters => (IValue)action(parameters.Cast().ToArray()); + _action = parameters => action( parameters.Select(x=>x.GetRawValue()) + .Cast().ToArray() ); } public override bool DynamicMethodSignatures => true; From 2d2de40f0472edb2dba2fd0792bf347f2ba6e892 Mon Sep 17 00:00:00 2001 From: Andrei Ovsiankin Date: Thu, 12 Oct 2023 12:07:52 +0300 Subject: [PATCH 126/126] =?UTF-8?q?=D0=A1=D0=B1=D0=BE=D1=80=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B8=20=D1=84=D0=BE?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=BC=D0=B8=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HostedScriptEngine.cs | 14 -- .../Machine/CodeStat/CodeStatProcessor.cs | 184 ++++++++------- src/ScriptEngine/Machine/MachineInstance.cs | 8 +- src/ScriptEngine/ScriptingEngine.cs | 9 +- src/oscript/ExecuteScriptBehavior.cs | 216 +++++++++--------- 5 files changed, 208 insertions(+), 223 deletions(-) diff --git a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs index 23aaa81da..f41496ce5 100644 --- a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs +++ b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs @@ -27,8 +27,6 @@ public class HostedScriptEngine : IDisposable private bool _isInitialized; private readonly OneScriptLibraryOptions _workingConfig; - - private CodeStatProcessor _codeStat; public HostedScriptEngine(ScriptingEngine engine) { @@ -143,22 +141,10 @@ private Process InitProcess(IHostApplication host, IExecutableModule module) var process = new Process(host, module, _engine); return process; } - - public void EnableCodeStatistics() - { - _codeStat = new CodeStatProcessor(); - _engine.SetCodeStatisticsCollector(_codeStat); - } - - public CodeStatDataCollection GetCodeStatData() - { - return _codeStat.GetStatData(); - } public void Dispose() { _engine?.Dispose(); - _codeStat?.EndCodeStat(); } } } diff --git a/src/ScriptEngine/Machine/CodeStat/CodeStatProcessor.cs b/src/ScriptEngine/Machine/CodeStat/CodeStatProcessor.cs index cee7b1f86..15be6508f 100644 --- a/src/ScriptEngine/Machine/CodeStat/CodeStatProcessor.cs +++ b/src/ScriptEngine/Machine/CodeStat/CodeStatProcessor.cs @@ -1,94 +1,90 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ - -using System.Diagnostics; -using System.Collections.Generic; - -namespace ScriptEngine.Machine -{ - public class CodeStatProcessor : ICodeStatCollector - { - private Dictionary _codeStat = new Dictionary(); - private Dictionary _watchers = new Dictionary(); - private Stopwatch _activeStopwatch = null; - private HashSet _preparedScripts = new HashSet(); - - public CodeStatProcessor() - { - } - - public bool IsPrepared(string ScriptFileName) - { - return _preparedScripts.Contains(ScriptFileName); - } - - public void MarkEntryReached(CodeStatEntry entry, int count = 1) - { - int oldValue = 0; - _codeStat.TryGetValue(entry, out oldValue); - _codeStat[entry] = oldValue + count; - - if (count == 0) - { - if (!_watchers.ContainsKey(entry)) - { - _watchers.Add(entry, new Stopwatch()); - } - } - else - { - _activeStopwatch?.Stop(); - _activeStopwatch = _watchers[entry]; - _activeStopwatch.Start(); - } - } - - public void MarkPrepared(string scriptFileName) - { - _preparedScripts.Add(scriptFileName); - } - - public CodeStatDataCollection GetStatData() - { - CodeStatDataCollection data = new CodeStatDataCollection(); - foreach (var item in _codeStat) - { - if (!IsPrepared(item.Key.ScriptFileName)) - { - continue; - } - data.Add(new CodeStatData(item.Key, _watchers[item.Key].ElapsedMilliseconds, item.Value)); - } - - return data; - } - - public void EndCodeStat() - { - _activeStopwatch?.Stop(); - } - - public void StopWatch(CodeStatEntry entry) - { - if (_watchers.ContainsKey(entry)) - { - _watchers[entry].Stop(); - } - } - - public void ResumeWatch(CodeStatEntry entry) - { - _activeStopwatch?.Stop(); - - if (_watchers.ContainsKey(entry)) - { - _activeStopwatch = _watchers[entry]; - _activeStopwatch.Start(); - } - } - } -} +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System.Diagnostics; +using System.Collections.Generic; + +namespace ScriptEngine.Machine +{ + public class CodeStatProcessor : ICodeStatCollector + { + private Dictionary _codeStat = new Dictionary(); + private Dictionary _watchers = new Dictionary(); + private Stopwatch _activeStopwatch = null; + private HashSet _preparedScripts = new HashSet(); + + public bool IsPrepared(string ScriptFileName) + { + return _preparedScripts.Contains(ScriptFileName); + } + + public void MarkEntryReached(CodeStatEntry entry, int count = 1) + { + int oldValue = 0; + _codeStat.TryGetValue(entry, out oldValue); + _codeStat[entry] = oldValue + count; + + if (count == 0) + { + if (!_watchers.ContainsKey(entry)) + { + _watchers.Add(entry, new Stopwatch()); + } + } + else + { + _activeStopwatch?.Stop(); + _activeStopwatch = _watchers[entry]; + _activeStopwatch.Start(); + } + } + + public void MarkPrepared(string scriptFileName) + { + _preparedScripts.Add(scriptFileName); + } + + public CodeStatDataCollection GetStatData() + { + CodeStatDataCollection data = new CodeStatDataCollection(); + foreach (var item in _codeStat) + { + if (!IsPrepared(item.Key.ScriptFileName)) + { + continue; + } + data.Add(new CodeStatData(item.Key, _watchers[item.Key].ElapsedMilliseconds, item.Value)); + } + + return data; + } + + public void EndCodeStat() + { + _activeStopwatch?.Stop(); + } + + public void StopWatch(CodeStatEntry entry) + { + if (_watchers.ContainsKey(entry)) + { + _watchers[entry].Stop(); + } + } + + public void ResumeWatch(CodeStatEntry entry) + { + _activeStopwatch?.Stop(); + + if (_watchers.ContainsKey(entry)) + { + _activeStopwatch = _watchers[entry]; + _activeStopwatch.Start(); + } + } + } +} diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index 4759269da..966b8d9be 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -96,6 +96,7 @@ public void SetMemory(ExecutionContext memory) ContextsAttached(); _mem = memory; + _codeStatCollector = _mem.Services.TryResolve(); } internal MachineStoredState SaveState() @@ -107,7 +108,6 @@ internal MachineStoredState SaveState() CallStack = _callStack, OperationStack = _operationStack, StopManager = _stopManager, - CodeStatCollector = _codeStatCollector, Memory = _mem }; } @@ -120,7 +120,6 @@ internal void RestoreState(MachineStoredState state) _callStack = state.CallStack; _exceptionsStack = state.ExceptionsStack; _stopManager = state.StopManager; - _codeStatCollector = state.CodeStatCollector; _mem = state.Memory; SetFrame(_callStack.Peek()); @@ -571,11 +570,6 @@ private bool ShouldRethrowException(ScriptException exc) return false; } - public void SetCodeStatisticsCollector(ICodeStatCollector collector) - { - _codeStatCollector = collector; - } - private CodeStatEntry CurrentCodeEntry() { return new CodeStatEntry(CurrentScript?.Source, _currentFrame.MethodName, _currentFrame.LineNumber); diff --git a/src/ScriptEngine/ScriptingEngine.cs b/src/ScriptEngine/ScriptingEngine.cs index 8a5bc73bb..3388bdf0a 100644 --- a/src/ScriptEngine/ScriptingEngine.cs +++ b/src/ScriptEngine/ScriptingEngine.cs @@ -83,7 +83,7 @@ public void AttachExternalAssembly(System.Reflection.Assembly asm) public void Initialize() { SetDefaultEnvironmentIfNeeded(); - + EnableCodeStatistics(); UpdateContexts(); _attachedScriptsFactory = new AttachedScriptsFactory(this); @@ -186,10 +186,13 @@ private set } } - public void SetCodeStatisticsCollector(ICodeStatCollector collector) + private void EnableCodeStatistics() { + var collector = Services.TryResolve(); + if (collector == default) + return; + ProduceExtraCode |= CodeGenerationFlags.CodeStatistics; - MachineInstance.Current.SetCodeStatisticsCollector(collector); } #region IDisposable Members diff --git a/src/oscript/ExecuteScriptBehavior.cs b/src/oscript/ExecuteScriptBehavior.cs index 12ee05a04..9e6069be2 100644 --- a/src/oscript/ExecuteScriptBehavior.cs +++ b/src/oscript/ExecuteScriptBehavior.cs @@ -1,105 +1,111 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ -using System; -using OneScript.StandardLibrary; -using ScriptEngine; -using ScriptEngine.HostedScript; -using ScriptEngine.Hosting; -using ScriptEngine.Machine; - -namespace oscript -{ - class ExecuteScriptBehavior : AppBehavior, IHostApplication, ISystemLogWriter - { - protected string[] _scriptArgs; - protected string _path; - - public ExecuteScriptBehavior(string path, string[] args) - { - _scriptArgs = args; - _path = path; - } - - public IDebugController DebugController { get; set; } - - public string CodeStatFile { get; set; } - - public bool CodeStatisticsEnabled => CodeStatFile != null; - - public override int Execute() - { - if (!System.IO.File.Exists(_path)) - { - Echo($"Script file is not found '{_path}'"); - return 2; - } - - SystemLogger.SetWriter(this); - - var builder = ConsoleHostBuilder.Create(_path); - builder.WithDebugger(DebugController); - - var hostedScript = ConsoleHostBuilder.Build(builder); - - if (CodeStatisticsEnabled) - hostedScript.EnableCodeStatistics(); - - var source = hostedScript.Loader.FromFile(_path); - Process process; - try - { - process = hostedScript.CreateProcess(this, source); - } - catch (Exception e) - { - ShowExceptionInfo(e); - return 1; - } - - var result = process.Start(); - hostedScript.Dispose(); - - if (CodeStatisticsEnabled) - { - var codeStat = hostedScript.GetCodeStatData(); - var statsWriter = new CodeStatWriter(CodeStatFile, CodeStatWriterType.JSON); - statsWriter.Write(codeStat); - } - - return result; - } - - #region IHostApplication Members - - public void Echo(string text, MessageStatusEnum status = MessageStatusEnum.Ordinary) - { - ConsoleHostImpl.Echo(text, status); - } - - public void ShowExceptionInfo(Exception exc) - { - ConsoleHostImpl.ShowExceptionInfo(exc); - } - - public bool InputString(out string result, string prompt, int maxLen, bool multiline) - { - return ConsoleHostImpl.InputString(out result, prompt, maxLen, multiline); - } - - public string[] GetCommandLineArguments() - { - return _scriptArgs; - } - - #endregion - - public void Write(string text) - { - Console.Error.WriteLine(text); - } - } -} +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ +using System; +using OneScript.StandardLibrary; +using ScriptEngine; +using ScriptEngine.HostedScript; +using ScriptEngine.Hosting; +using ScriptEngine.Machine; + +namespace oscript +{ + class ExecuteScriptBehavior : AppBehavior, IHostApplication, ISystemLogWriter + { + protected string[] _scriptArgs; + protected string _path; + + public ExecuteScriptBehavior(string path, string[] args) + { + _scriptArgs = args; + _path = path; + } + + public IDebugController DebugController { get; set; } + + public string CodeStatFile { get; set; } + + public bool CodeStatisticsEnabled => CodeStatFile != null; + + public override int Execute() + { + if (!System.IO.File.Exists(_path)) + { + Echo($"Script file is not found '{_path}'"); + return 2; + } + + SystemLogger.SetWriter(this); + + var builder = ConsoleHostBuilder.Create(_path); + builder.WithDebugger(DebugController); + CodeStatProcessor codeStatProcessor = null; + if (CodeStatisticsEnabled) + { + codeStatProcessor = new CodeStatProcessor(); + builder.Services.RegisterSingleton(codeStatProcessor); + } + + var hostedScript = ConsoleHostBuilder.Build(builder); + + + + var source = hostedScript.Loader.FromFile(_path); + Process process; + try + { + process = hostedScript.CreateProcess(this, source); + } + catch (Exception e) + { + ShowExceptionInfo(e); + return 1; + } + + var result = process.Start(); + hostedScript.Dispose(); + + if (codeStatProcessor != null) + { + codeStatProcessor.EndCodeStat(); + var codeStat = codeStatProcessor.GetStatData(); + var statsWriter = new CodeStatWriter(CodeStatFile, CodeStatWriterType.JSON); + statsWriter.Write(codeStat); + } + + return result; + } + + #region IHostApplication Members + + public void Echo(string text, MessageStatusEnum status = MessageStatusEnum.Ordinary) + { + ConsoleHostImpl.Echo(text, status); + } + + public void ShowExceptionInfo(Exception exc) + { + ConsoleHostImpl.ShowExceptionInfo(exc); + } + + public bool InputString(out string result, string prompt, int maxLen, bool multiline) + { + return ConsoleHostImpl.InputString(out result, prompt, maxLen, multiline); + } + + public string[] GetCommandLineArguments() + { + return _scriptArgs; + } + + #endregion + + public void Write(string text) + { + Console.Error.WriteLine(text); + } + } +}

L7St*84BMbz)_R-akchMN6;{4mVGFS~OsFIvi|= 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ⅇHVHVp`$rv|`c7`v% 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 delta 409897 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