diff --git a/.cursor/rules/langversion.mdc b/.cursor/rules/langversion.mdc new file mode 100644 index 000000000..d91672a00 --- /dev/null +++ b/.cursor/rules/langversion.mdc @@ -0,0 +1,5 @@ +--- +alwaysApply: true +--- + +Проект использует .net 8.0 и LangVersion 8, поэтому при генерации кода не используй языковые фичи C#, которые отсутствуют в C# 8. diff --git a/.cursor/rules/runbsltests.mdc b/.cursor/rules/runbsltests.mdc new file mode 100644 index 000000000..37287eab7 --- /dev/null +++ b/.cursor/rules/runbsltests.mdc @@ -0,0 +1,34 @@ +--- +description: When you need to run main tests +alwaysApply: false +--- + +Когда тебе потребуется запустить приемочные тесты всего проекта, убедиться что ничего не сломано, тебе потребуется запустить bsl тесты. Для этого используются готовые скрипты: + +1. **ОБЯЗАТЕЛЬНО** собери консольное приложение oscript из исходников с последними изменениями: + + ``` + dotnet build src/oscript/oscript.csproj + ``` + + После сборки движок будет находиться здесь: + - Windows: `src\oscript\bin\Debug\net8.0\oscript.exe` + - Linux/macOS: `src/oscript/bin/Debug/net8.0/oscript` + + **КРИТИЧЕСКИ ВАЖНО**: Тесты должны запускаться только на свежесобранном oscript, а не на версии из системы! Это гарантирует, что тесты валидируют актуальный код после внесённых изменений. + +2. Запусти нужный скрипт, **ЯВНО** передав путь к свежесобранному движку: + - Windows: `tests\run-bsl-tests.cmd src\oscript\bin\Debug\net8.0\oscript.exe` + - Linux/macOS: `tests/run-bsl-tests.sh src/oscript/bin/Debug/net8.0/oscript` + + **ВАЖНО**: Не полагайся на автоматический поиск oscript в PATH — всегда указывай путь к свежесобранному бинарнику первым параметром! + + Оба скрипта автоматически: + - Устанавливают путь к библиотекам OVM через переменную `OVM_LIB_PATH` (по умолчанию `%USERPROFILE%\AppData\Local\ovm\current\lib` для Windows и `$HOME/.local/share/ovm/current/lib` для Linux/macOS) + - Настраивают `OSCRIPT_CONFIG=lib.system=`, если эта переменная не была задана заранее + - Переходят в каталог `tests` и выполняют `testrunner.os -runAll .` + +3. Для запуска одного теста также используй свежесобранный oscript.exe: `<путь\к\собранному\oscript.exe> testrunner.os -run <имя файла теста.os>`. +4. Всегда используй для запуска тестов новую консоль, не переиспользуй консоль от предыдущих запусков. +5. Если ошибка запуска тестов связана с Component.dll или NativeApi (эти dll упоминаются в ошибках тестов), то такие тесты следует игнорировать и смотреть только на другие ошибки тестов. +6. Ошибки теста http.os и "Тест_ДолженПроверитьЧтоПеремещениеФайлаРаботаетПоHTTP" следует игнорировать. \ No newline at end of file diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index e1f8b7bb1..a53c8d0ab 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -17,13 +17,13 @@ jobs: # Setup steps for OneScript development environment steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - run: git config --global core.quotepath false - - uses: actions/setup-dotnet@v4 + - uses: actions/setup-dotnet@v5 with: - dotnet-version: '6.0.x' + dotnet-version: '8.0.x' - name: Установка OneScript uses: otymko/setup-onescript@v1.5 diff --git a/.github/workflows/rebase.yml b/.github/workflows/rebase.yml index c06a1bcdf..2902fe38c 100644 --- a/.github/workflows/rebase.yml +++ b/.github/workflows/rebase.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the latest code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: token: ${{ secrets.GITHUB_TOKEN }} fetch-depth: 0 # otherwise, you will fail to push refs to dest repo diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 6dbadf7b4..3599cd7cb 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -11,11 +11,11 @@ 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@v4 + uses: actions/setup-java@v5 with: java-version: 17 distribution: temurin - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Cache SonarQube packages diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..1c5256771 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "dotnet.defaultSolution": "src/1Script.sln" +} \ No newline at end of file diff --git a/Build.csproj b/Build.csproj index d50f3f220..76f6f506b 100644 --- a/Build.csproj +++ b/Build.csproj @@ -14,6 +14,8 @@ Release $(MSBuildProjectDirectory)/src/1Script.sln + net8.0 + @@ -30,11 +32,11 @@ oscript.csproj - net6.0 + $(ActiveFramework) TestApp.csproj - net6.0-windows + $(ActiveFramework)-windows @@ -106,7 +108,7 @@ - + $(MSBuildProjectDirectory)/src/ScriptEngine.NativeApi/bin/$(Configuration) @@ -162,11 +164,9 @@ - - @@ -225,7 +225,7 @@ - + @@ -261,7 +261,7 @@ - + @@ -373,5 +373,35 @@ Command="dotnet nuget push %(NugetAbleProject.Identity) -k $(NugetToken) -s https://api.nuget.org/v3/index.json" UseUtf8Encoding="Always"/> + + + + + + + + $(ArtifactsRoot)/win-x64/bin + $(ArtifactsRoot)/docs + $(ArtifactsRoot)/tools/documenter + + + + + + + + + + + + + + + + + + + + diff --git a/Jenkinsfile b/Jenkinsfile index 949a5e493..813b91da3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,7 +5,7 @@ pipeline { environment { VersionPrefix = '2.0.0' - VersionSuffix = 'rc.8' + VersionSuffix = 'rc.9' outputEnc = '65001' } @@ -199,8 +199,9 @@ pipeline { } stage ('Publishing night-build') { - when { anyOf { - branch 'develop'; + when { + anyOf { + branch 'develop'; } } agent { label 'master' } @@ -217,8 +218,9 @@ pipeline { } stage ('Publishing preview') { - when { anyOf { - branch 'release/preview'; + when { + anyOf { + branch 'release/preview'; } } agent { label 'master' } @@ -257,6 +259,46 @@ pipeline { } } } + + stage ('Publishing docker-images') { + parallel { + stage('Build v1') { + agent { label 'linux' } + when { + anyOf { + branch 'release/latest' + expression { + return env.TAG_NAME && env.TAG_NAME.startsWith('v1.') + } + } + } + steps { + script { + def codename = env.TAG_NAME ? env.TAG_NAME : 'latest' + publishDockerImage('v1', codename) + } + } + } + + stage('Build v2') { + agent { label 'linux' } + when { + anyOf { + branch 'develop' + expression { + return env.TAG_NAME && env.TAG_NAME.startsWith('v2.') + } + } + } + steps { + script { + def codename = env.TAG_NAME ? env.TAG_NAME : 'dev' + publishDockerImage('v2', codename) + } + } + } + } + } } } @@ -300,3 +342,12 @@ def publishReleaseNotes(codename) { } } +def publishDockerImage(flavour, codename) { + def imageName = "evilbeaver/onescript:${codename}" + + docker.build( + imageName, + "--load -f install/builders/base-image/Dockerfile_${flavour} ." + ).push() +} + diff --git a/README-EN.md b/README-EN.md index aee550534..5b1dac8a4 100644 --- a/README-EN.md +++ b/README-EN.md @@ -1,23 +1,111 @@ -# README # +# OneScript # -### The project is an independent cross-platform open-source implementation of a virtual machine that executes scripts written in BSL (1C:Enterprise scripting language). +[![Join telegram chat](https://img.shields.io/badge/chat-telegram-blue?style=flat&logo=telegram)](https://t.me/oscript_library) [![DEV Build Status](https://build.oscript.io/buildStatus/icon?job=1Script%2Fdevelop&style=flat-square&subject=dev)](https://build.oscript.io/job/1Script/job/develop/) [![STABLE Build Status](https://build.oscript.io/buildStatus/icon?job=1Script%2Fmaster&style=flat-square&subject=stable)](https://build.oscript.io/job/1Script/job/master/) -![Logo](.github/logo-small.png) +## The project is an independent cross-platform implementation of a virtual machine that executes scripts written in the 1C:Enterprise language ## -Script execution doesn't use any 1C:Enterprise system libraries and doesn't require installation of 1C:Enterprise system on the target machine. +![Logo](.github/logo-small-2.png) ![Logo](.github/logo-small.png) -In other words, this is a possibility to write programs in the 1C (BSL) language without using the 1C:Enterprise platform. +The 1C:Enterprise system libraries are not used and installation of the 1C:Enterprise system on the target machine is not required. -## Name and pronunciation +In other words, this is a tool for writing and executing programs in the 1C language without using the 1C:Enterprise platform. -The project is called OneScript, can be abbreviated to the title 1Script on writing. +## Name and pronunciation ## -## Project site +The project is called OneScript, can be abbreviated to the title 1Script when writing. Pronounced as `[uanskript]`. -Basic information about the project, releases and technical documentation are located on the official website. +OneScript allows you to create and execute text scripts written in a language familiar to any specialist working with the 1C:Enterprise system. Using a familiar language for script automation significantly increases a specialist's productivity by simplifying the automation of manual operations. -http://oscript.io +## Project site ## -## Library of useful scripts +Main information about the project, releases and technical documentation are located on the official website -The OneScript package already includes a set of commonly used packages. +[https://oscript.io](https://oscript.io) + +## Library of useful scripts ## + +The OneScript distribution already includes a set of the most commonly used packages. These, as well as other packages, are located in the [oscript-library](https://github.com/oscript-library) repository and are available to everyone. There is a package manager [opm](https://github.com/oscript-library/opm). + +## Installation ## + +### Windows ### + +- (interactively) download from the [official website](https://oscript.io) or installer from the [Releases](https://github.com/EvilBeaver/OneScript/releases) section and run it. Then, Next, Done. + +### Linux ### + +- (interactively) download the required package from the [official website](https://oscript.io) or installer from the [Releases](https://github.com/EvilBeaver/OneScript/releases) section and install it. + +### MacOS ### + +There is no interactive installer, but the engine can be installed from the command line: + +- install [homebrew](https://brew.sh/index_ru) +- install mono with the command `brew install mono` +- download [ovm](https://github.com/oscript-library/ovm/releases). Download the `ovm.exe` file (despite the .exe extension it will work on MacOS) +- run the command `mono path/to/ovm.exe install stable` + + *Tip: To correctly specify the path to `ovm.exe`, drag the `ovm.exe` file into the terminal. Example of a full command: `mono Users/username/Downloads/ovm.exe install stable`* +- run the command `mono path/to/ovm.exe use stable` +- restart the terminal + +#### Additional configuration for Self-Contained distribution (does not require dotnet installation) + +``` +chmod +x ./oscript +xattr -d com.apple.quarantine *.dylib oscript +codesign -s - ./oscript +``` + + +# Manual local build + +## Preparation + +Links to distributions are provided below, however, please note that links may change over time and their relevance is not guaranteed. You need dotnet SDK and C++ compiler, which can be downloaded from anywhere you can find. + +* Install [MS BuildTools](https://visualstudio.microsoft.com/ru/thank-you-downloading-visual-studio/?sku=buildtools&rel=16), when installing enable targeting for .net6, .net4.8, install C++ compiler. + +## Build + +Launch Developer Command Prompt (will appear in the Start menu after installing MSBuildTools or Visual Studio). Navigate to the OneScript repository directory. The following are commands in the Developer Command Prompt console. +Build is performed using msbuild. Targets: + +* CleanAll - clean previous build results +* BuildAll - prepare files for distribution +* MakeCPP;MakeFDD;MakeSCD;BuildDebugger - separate build targets for preparing different types of distributions +* PrepareDistributionFiles - build full distribution packages (including libraries) +* PackDistributions - prepare ZIP archives for distribution +* CreateNuget - create packages for publishing to NuGet + +**Build parameters** + +* VersionPrefix - release number prefix, its main part, for example, 2.0.0 +* VersionSuffix - version suffix, which usually acts as an arbitrary versioning suffix according to semver, for example, beta-786 (optional) +* NoCppCompiler - if True - C++ compiler is not installed, C++ components (NativeApi support) will not be added to the build + +All distribution files will be placed in the `built` directory at the root of the 1Script repository + +### Building distribution contents in a separate directory + +```bat +msbuild Build.csproj /t:CleanAll;PrepareDistributionFiles +``` + +### Building with manual version specification + +```bat +msbuild Build.csproj /t:CleanAll;PrepareDistributionFiles /p:VersionPrefix=2.0.0 +``` + +### Building ZIP distributions + +```bat +msbuild Build.csproj /t:CleanAll;PrepareDistributionFiles;PackDistributions /p:VersionPrefix=2.0.0 /p:VersionSuffix=preview223 +``` + +### Documentation generation + +```bat +msbuild Build.csproj /t:BuildDocumentation +``` diff --git a/README.md b/README.md index a72f14383..98fab370d 100644 --- a/README.md +++ b/README.md @@ -102,4 +102,10 @@ msbuild Build.csproj /t:CleanAll;PrepareDistributionFiles /p:VersionPrefix=2.0.0 ```bat msbuild Build.csproj /t:CleanAll;PrepareDistributionFiles;PackDistributions /p:VersionPrefix=2.0.0 /p:VersionSuffix=preview223 +``` + +### Генерация документации + +```bat +msbuild Build.csproj /t:BuildDocumentation ``` \ No newline at end of file diff --git a/docs/contexts.md b/docs/contexts.md new file mode 100644 index 000000000..69b55c98f --- /dev/null +++ b/docs/contexts.md @@ -0,0 +1,174 @@ +# BSL-контексты и глобальные методы: руководство разработчика + +Этот документ — практическая инструкция по добавлению в OneScript новых BSL‑контекстов (классов), методов и свойств, а также глобальных методов. Здесь собраны готовые сниппеты, чек‑лист и ссылки на ключевые места в исходниках. + +См. также «Архитектурный обзор»: docs/arhitecture_overview.md (карта компонентов и «куда лезть»). + +Содержание + +- Что такое BSL‑контекст +- Добавление нового BSL‑класса (контекста) +- Добавление свойства +- Добавление метода +- Создание глобального контекста и глобальных методов +- Регистрация библиотек и package‑loader.os +- i18n для API (двуязычные имена) +- Депрекейшен и предупреждения +- Тестирование (C# и BSL) +- Документация (OneScriptDocumenter) +- Безопасность +- Чек‑лист готовности + +1. Что такое BSL‑контекст + +- Контекст — это .NET‑класс, методы/свойства которого доступны из BSL. Экземпляр контекста может создаваться оператором Новый (класс‑контекст) или предоставляться глобально (глобальный контекст). +- Отражение и метаданные описываются атрибутами: + - [ContextClass("РусИмя", "EngName")] + - [ContextMethod("РусИмя", "EngName")] + - [ContextProperty("РусИмя", "EngName", CanRead = true, CanWrite = false, ...)] + - [GlobalContext(...)] для глобального контекста + - [ScriptConstructor] для создания объектов через Новый +- Двуязычные имена обязательны: все элементы публичного API должны иметь пару имен Рус/Eng. + +Где в коде смотреть + +- Атрибуты и метаданные: src/OneScript.Core/Contexts/* +- Базовые помощники контекстов: src/ScriptEngine/Machine/Contexts/* +- Глобальные контексты (база): GlobalContextBase — src/ScriptEngine/Machine/Contexts/GlobalContextBase.cs + +2. Добавление нового BSL‑класса (контекста) + +Минимальный шаблон + +```csharp +using OneScript.Core.Contexts; +using OneScript.Core.Types; +using OneScript.Core.Values; +using ScriptEngine; +using ScriptEngine.Machine.Contexts; // AutoContext +using OneScript.Core.Execution; // IBslProcess + +[ContextClass("ПримерКласс", "SampleClass")] +public class SampleClass : AutoContext +{ + // Конструктор для BSL: Новый ПримерКласс() + [ScriptConstructor(Name = "Без параметров")] + public static SampleClass Ctor(TypeActivationContext ctx) + => new SampleClass(); + + // Свойство только для чтения + [ContextProperty("Версия", "Version", CanWrite = false)] + public IValue Version => ValueFactory.Create("1.0"); + + // Процедура с доступом к bsl-процессу (возможность запускать свой код bsl из кода c#) + [ContextMethod("Сообщить", "Message")] + public void Message(IBslProcess process, IValue text) + { + // вызов bsl-метода в том же стеке вызовов, что и у переданного процесса + process.Run(/*...*/); + } + + // Функция с возвратом значения + [ContextMethod("Сложить", "Add")] + public IValue Add(IValue a, IValue b) + { + var sum = a.AsNumber() + b.AsNumber(); + return ValueFactory.Create(sum); + } +} +``` + +Комментарии к шаблону + +- Наследуемся от AutoContext — это стандартная база для классов‑контекстов. +- [ScriptConstructor] — статический фабричный метод, возможно, принимающий TypeActivationContext. Можно объявить несколько перегрузок. +- IBslProcess можно внедрять первым параметром метода, чтобы получить доступ к сервисам/окружению выполнения. +- Возвраты: + - Процедура — метод без возвращаемого значения (void). + - Функция — возвращает IValue или конвертируемый тип C# (см. ContextValuesMarshaller). + +Регистрация в движке + +- При старте ContextDiscoverer просканирует сборку и автоматически зарегистрирует в движке все классы, помеченные атрибутами ContextClass, GlobalContext, EnumerationType + +3. Добавление свойства + +Шаблон + +```csharp +[ContextProperty("Порог", "Threshold", CanRead = true, CanWrite = true)] +public IValue Threshold +{ + get => ValueFactory.Create(_threshold); + set => _threshold = value.AsNumber(); +} +private decimal _threshold = 0m; +``` + +Заметки + +- CanRead/CanWrite управляют доступностью геттера/сеттера из BSL, если не указаны, берутся наличия стандартных get/set у свойства. +- Маршаллинг значений свойства автоматический. + + +4. Добавление метода + +Шаблон процедуры и функции + +```csharp +// Процедура, изменяющая параметр по ссылке +[ContextMethod("УдвоитьЧисло", "DoubleNumber")] +public int DoubleNumber(int number) +{ + var doubled = number * 2; + return doubled; +} +``` + +Значения параметров и результат метода будут автоматически сконвертированы из типов C# в тиаы bsl. + +Заметки + +- Для передачи аргумента по ссылке: используйте тип IVariable — в него можно присвоить новое значение через .Value. +- По значению: используйте типы C# напрямую, если они поддерживаются маршаллером, или IValue. + +5. Создание глобального контекста и глобальных методов + +Глобальный контекст + +```csharp +using OneScript.Core.Contexts; +using OneScript.Core.Values; +using ScriptEngine.Machine.Contexts; + +[GlobalContext(Category = "Мои функции")] +public class MyGlobals : GlobalContextBase +{ + // Фабрика экземпляра для внедрения в глобальную область + public static IAttachableContext CreateInstance() => new MyGlobals(); + + [ContextMethod("МояФункция", "MyFunc")] + public IValue MyFunc(IValue x) + { + return ValueFactory.Create(x.ToString().Length); + } +} +``` + +Заметки + +- По умолчанию глобальные контексты регистрируются автоматически (ManualRegistration = false). Достаточно, чтобы сборка была добавлена в окружение. +- Вручную можно внедрить через HostedScriptEngine.InjectObject или IRuntimeEnvironment.InjectObject. + +Добавление метода в существующий глобальный контекст + +- Например, StandardGlobalContext: добавьте [ContextMethod] в соответствующий класс и реализуйте логику. +- Внимание: изменение публичного API стандартной библиотеки требует обсуждения с мэйнтейнерами. + +6. Регистрация библиотек и package‑loader.os + +- HostedScript ищет библиотеку и вызывает package‑loader.os (дефолтный или кастомный). +- Основные операции загрузчика (см. src/ScriptEngine.HostedScript/LibraryLoader.cs): + - ДобавитьКласс/AddClass("path", "ИмяКласса") — регистрирует новый BSL‑тип; + - ДобавитьМодуль/AddModule("path", "ИмяМодуля") — подключает модуль как глобальный; + - ДобавитьМакет/AddTemplate — регистрирует шаблон. \ No newline at end of file diff --git a/docs/developer_docs.md b/docs/developer_docs.md new file mode 100644 index 000000000..1541add6e --- /dev/null +++ b/docs/developer_docs.md @@ -0,0 +1,201 @@ +# Developer Docs — архитектура и навигация по проекту OneScript (для новых контрибьюторов) + +Этот документ помогает быстро разобраться, что лежит в репозитории, зачем это нужно, как устроено внутри и как использовать. + +## 1 Картина целиком: из чего состоит OneScript + +OneScript — реализация языка, совместимого с синтаксисом 1С/BSL. В основе - стековая виртуальная машина. Проект включает реализацию компилятора, исполняющей среды, системы типов и стандартной библиотеки BSL. Поверх этого — инструменты (CLI, раннер), отладка (DAP), веб-обёртки и API для нативных расширений. + +OneScript — открытая реализация языка 1С/BSL поверх .NET, со стековой ВМ и стандартной библиотекой. Сценарии исполняются CLI oscript либо внедряются в приложения через HostedScript. + +Слои (сверху вниз): +- Приложения и инструменты: + - src/oscript — консольный хост, основное приложение; + - src/VSCode.DebugAdapter — адаптер DAP; + - src/OneScriptDocumenter — генерация документации; + - src/TestApp, src/Component — примеры использования. +- Хостинг и сервисы: src/ScriptEngine.HostedScript, src/OneScript.DebugServices, src/OneScript.Web.Server. +- Рантайм (компиляция/исполнение, встроенные функции): + - src/ScriptEngine (стековая ВМ) + - src/OneScript.Native (нативный бэкенд). +- Ядро/язык: + - OneScript.Core (типы/контексты) — основные инфраструктурные компоненты для обоих рантаймов + - OneScript.Language (лексер/парсер/AST) +- Стандартная библиотека языка BSL: + - OneScript.StandardLibrary — реализация стандартных прикладных классов (массивы, работа с файлами, сетью и пр.) +- Интеграции: ScriptEngine.NativeApi (Мост к внешним компонентам на C++, совместимым с NativeApi 1С). +- Инструмент генерации автодокументации OneScriptDocumenter + +## 2 Быстрый старт для контрибьютора +- Где собирать: решение src/1Script.sln. +- Входной CLI: src/oscript (консольное приложение для запуска .os‑скриптов). +- Запуск тестов: проекты src/Tests/* (C#) и папка tests/* (скрипты .os). +- Если добавляете новый контекст/тип — обычно правки в OneScript.Core/ScriptEngine/StandardLibrary, плюс модульные тесты. + +Псевдонимы API приняты двуязычные: РусИмя/EngName (см. атрибуты ContextClass/Method/Property). + +Соглашение по ссылкам: указываются относительные пути репозитория. + +## 3 Обзор проектов (назначение, ключевые узлы) + +Ниже по каждому проекту — зачем он нужен, где искать основную логику и какие классы отвечают за ключевые задачи. + +### 3.1 OneScript.Language — лексер/препроцессор/парсер/AST + +Назначение: преобразует исходный BSL‑код в токены и синтаксическое дерево, обрабатывает директивы препроцессора. +Проект сделан максимально независимым и отчуждаемым, и должен иметь возможность использоваться в других решениях, не связанных с 1Script, как просто парсер BSL. + +- Где в коде: + - LexicalAnalysis/* — лексер. DefaultLexer.cs, различные состояния (String/Number/Comment/PreprocessorDirective/etc). + - SyntaxAnalysis/* — парсер и AST: DefaultBslParser.cs, BslSyntaxWalker.cs, AstNodes/* (ModuleNode, MethodNode, CallNode, TryExceptNode, *LoopNode, Binary/UnaryOperationNode и др.). + - Препроцессор: PreprocessingLexer.cs, PreprocessorHandlers.cs, RegionDirectiveHandler.cs, ImportDirectivesHandler.cs, ModuleAnnotationDirectiveHandler.cs. + - Диагностика: CodeError.cs, ErrorPositionInfo.cs, SyntaxErrorException.cs, LocalizedErrors.cs. +- Жизненный цикл: + 1) Лексер производит Lexem с типом/токеном. + 2) Препроцессор обрабатывает директивы (#Если/#Область/#Использовать). + 3) Парсер строит AST (BslSyntaxNode), восстанавливается после ошибок (IErrorRecoveryStrategy). + 4) AST передаётся компилятору (CompilerFrontend) рантайма. +- Точки расширения: + - собственные директивы препроцессора (IDirectiveHandler -> зарегистрировать в DI); + - обход AST через BslSyntaxWalker. + +На выходе вы получаете ModuleNode/AST, пригодный для компиляции рантаймом/бэкендом или обработки статическим анализатором. + +### 3.2 OneScript.Core — система типов, значения, отражение контекстов +Назначение: общий объектный каркас значений BSL, контекстов (объекты/методы/свойства), аннотаций и исключений. + +OneScript.Core — система типов и контекстная модель +- Назначение: базовые IValue/BslValue, ссылки на значения, метаданные контекстов (классов/методов/свойств), атрибуты, исключения, символы компилятора. +- Где в коде: + - Values/* — BslValue и производные: строки/числа/дата/Null/Undefined/Type/Object, сравнения/преобразования; ссылки: IValueReference/Variable/PropertyValueReference/IndexedValueReference. + - Contexts/* — атрибуты ContextClass/ContextMethod/ContextProperty, GlobalContextAttribute, ScriptConstructorAttribute; построители Bsl*Info, отражение классов, поддержка устаревания (ISupportsDeprecation, DeprecatedNameAttribute). + - Compilation/Binding/* — SymbolTable, SymbolScope, SymbolBinding, *Symbol интерфейсы. + - Exceptions/* — RuntimeException, TypeConversionException, PropertyAccessException и др. +- Жизненный цикл контекстов: + 1) ContextDiscoverer (ScriptEngine.Machine.Contexts) сканирует сборки, находит [ContextClass]/[GlobalContext]/[EnumerationType]/[SystemEnum]. + 2) Регистрирует типы/глобальные контексты в IRuntimeEnvironment/IGlobalsManager. + 3) Отражение формирует Bsl*Info для рантайма/документации. + +### 3.3 ScriptEngine — движок выполнения (стековая ВМ и бэкенд компилятора для стековой машины) + +Основная среда исполнения на базе стековой виртуальной машины. + +Назначение: организует выполнение скриптов, стек вызовов, области видимости, глобальные функции и интеграцию с отладкой. + +- Где в коде: + - Compiler/* — CompilerFrontend, BackendSelector; StackMachineCodeGenerator (байткод), EvalCompiler; CodeGenerationFlags. + - Machine/* — StackMachineExecutor, MachineInstance (командный цикл, стек/кадры/исключения/итераторы), ExecutionContext/Frame, BuiltinFunctions, ValueFactory, GlobalInstancesManager. CodeStat/* — статистика покрытия кода. + - Hosting/* — DefaultEngineBuilder, DI (TinyIoC), EngineBuilderExtensions (регистрация сервисов, предобработчики). + - ScriptingEngine.cs — фасад движка: загрузка сборок, Initialize, NewProcess, компиляция. + - ContextValuesMarhaller — маршаллер (преобразователь) типов C# в типы BSL и обратно. +- Точки расширения: + - дополнительные IExecutorProvider (альтернативные рантаймы); + - предопределённые интерфейсы/итераторы (Interfaces/Iterables handlers); + - сбор кода-статистики (ICodeStatCollector) + +### 3.4 OneScript.Native — нативный бэкенд (Expression Trees) компилятор/исполнитель, встроенные функции + +Альтернативная среда исполнения (не основная). Предоставляет компиляцию BSL в ExpressionTrees фреймворка .NET. +Данная среда исполнения имеет ряд ограничений и в целом является экспериментом. В какой именно среде будет исполнен скрипт решает директива в начале скрипта: + +* `#native` - скрипт будет скомпилировать в Native Runtime +* `#stack` или отсутствие директивы - скрипт будет использован основной средой исполнения. + +Назначение: преобразует AST+символы в исполняемую форму и предоставляет нативный бэкенд выполнения, включая встроенные функции. +- Компиляция: Compiler/ + - ModuleCompiler.cs, MethodCompiler.cs — генерация модулей/методов. + - ExpressionTreeGeneratorBase.cs, BinaryOperationCompiler.cs — выражения/операции. + - BuiltInFunctionsCache.cs, ContextMethodsCache.cs — кеширование метаданных/встроенных функций. +- Исполнение: Runtime/ + - NativeExecutorProvider.cs — провайдер исполнителя. + - BuiltInFunctions.cs — реализации встроенных функций. + - DynamicOperations.cs — динамические операции. + +- Ограничения: может не поддерживать полный паритет со стековой машиной; выбор режима делает CompilerBackendSelector по соответствующим директивам в начале файла. + +7. ScriptEngine.HostedScript — хостинг, загрузка библиотек, конфигурация +- Назначение: безопасная обвязка движка для встраивания, инициализация стандартного глобального контекста, загрузка библиотек, конфигурирование. +- Где в коде: + - HostedScriptEngine.cs — инициализация, глобальные контексты (SystemGlobalContext, DynamicLoadingFunctions), создание процессов. + - LibraryLoader.cs — package-loader.os, подключение .os модулей/классов/макетов; FileSystemDependencyResolver.cs — поиск библиотек, цикл обработки, защита от циклических зависимостей. + - Extensions/EngineBuilderExtensions.cs — UseSystemConfigFile/UseEnvironmentVariableConfig/UseEntrypointConfigFile; UseImports/UseFileSystemLibraries/UseNativeRuntime/UseEventHandlers. +- Жизненный цикл: + 1) Читает настройки из системного `oscript.cfg`, env, и файла `oscript.cfg` рядом с entrypoint. + 2) Инициализация HostedScriptEngine → глобальные объекты → процесс → компиляция/исполнение модуля. + 3) Загрузка библиотек: default или кастомный package-loader.os, последующая регистрация символов и компиляция задержанных модулей. + +### 3.6 OneScript.StandardLibrary — стандартная библиотека +Назначение: коллекции, файлы/потоки, текст и кодировки, сеть/HTTP, JSON/XML, ZIP, процессы, таймзоны и др. +- Коллекции: Collections/ + - ArrayImpl.cs, MapImpl.cs, StructureImpl.cs, ValueListImpl.cs. + - Таблицы/деревья значений: ValueTable.cs (+ ValueTableColumn/Row), ValueTree.cs. +- Файлы/потоки/текст: FileOperations.cs, FileContext.cs, Text/* (TextReadImpl.cs, TextWriteImpl.cs), CustomLineFeedStreamReader.cs. +- Сеть/HTTP: Http/* (HttpRequestContext.cs, HttpResponseContext.cs, HttpRequestBody*, InternetProxyContext.cs). +- JSON: Json/* (JSONReader.cs, JSONWriter.cs, JSONDataExtractor.cs, JSONWriterSettings.cs). +- XML/XSLT: Xml/* (XmlReaderImpl.cs, XmlWriterImpl.cs, XSLTransform.cs). +- ZIP: Zip/* (ZipReader.cs, ZipWriter.cs и перечисления параметров). +- Процессы: Processes/* (ProcessContext.cs, GlobalProcessesFunctions.cs). + - StandardGlobalContext.cs — набор полезных глобальных функций/свойств (например, Символы, Приостановить/Sleep, ЗначениеЗаполнено и т.п.). +- Разное: RandomNumberGenerator.cs, StringOperations.cs, Timezones/*. + +### 3.7 OneScript.Web.Server — веб-обёртки для BSL (ASP.NET Core) +Назначение: адаптеры поверх ASP.NET Core API, чтобы работать с HTTP/WebSocket из BSL. +- WebServer.cs — базовая обвязка. +- Http*Wrapper.cs — HttpContext/Request/Response/Cookies. +- WebSockets/* — WebSocketWrapper, WebSocketsManagerWrapper. + +### 3.8 Отладка: OneScript.DebugProtocol, OneScript.DebugServices, VSCode.DebugAdapter +- Протокол (OneScript.DebugProtocol): + - TcpServer/* (DefaultMessageServer.cs, JsonDtoChannel.cs, DispatchingServer.cs) — транспорт и сериализация. + - Модель отладки: Breakpoint.cs, StackFrame.cs, Variable.cs, DebuggerSettings.cs. +- Сервисы (OneScript.DebugServices): + - DefaultDebugService.cs, DefaultDebugController.cs — серверные сервисы отладки. + - ThreadManager.cs, TcpDebugServer.cs — управление потоками и TCP‑сервер. +- Адаптер для VS Code (VSCode.DebugAdapter): + - DebugSession.cs, OscriptDebugSession.cs — основная сессия и проксирование событий. + - ServerProcess.cs, DebugeeProcess.cs — управление процессом отлаживаемого приложения. + +### 3.9 Приложения/утилиты +- oscript (CLI): src/oscript + - Program.cs — входная точка. + - ConsoleHostBuilder.cs — сборка консольного хоста. + - Поведения (режимы): ExecuteScriptBehavior.cs, CheckSyntaxBehavior.cs, ShowVersionBehavior.cs, DebugBehavior.cs и др. +- StandaloneRunner: сборка самодостаточных пакетов/запуск + - Program.cs, StandaloneRunner.cs, ProcessLoader.cs. +- OneScriptDocumenter: генерация документации по сборкам + - На вход получает список DLL (в каталоге с ними рядом должны лежать файлы xml-docs от этих dll) и файл оглавления (в репозитории уже лежит готовый файл оглавления OneScriptDocumenter\default_toc.json) + - На выходе формирует файл с документацией формата Json и/или каталог с документацией в формате markdown. +- Примеры/демо: + - Component — простая .NET‑библиотека/компонент и примеры использования. + - TestApp — WPF‑приложение‑песочница (подсветка синтаксиса, запуск модулей). + +### 3.10 ScriptEngine.NativeApi — C++ API для нативных расширений +- Основные файлы: NativeApiProxy.cpp, NativeInterface.cpp, include/* (AddInDefBase.h, ComponentBase.h и др.). +- Задача: писать нативные аддины, видимые в BSL как объекты/контексты. + +## 4 Как компоненты связаны между собой (словесная диаграмма) +- Language → даёт AST и ошибки компиляции. +- Core → базовые типы/контексты; используется Native, ScriptEngine, StandardLibrary. +- Native → компилирует и исполняет, опирается на Language/Core. +- ScriptEngine → организует выполнение (стек‑машина), использует Native и Core. +- HostedScript → высокий уровень хостинга поверх ScriptEngine. +- StandardLibrary → реализована на Core/ScriptEngine. +- DebugProtocol/DebugServices ↔ ScriptEngine — обмен данными отладки; VSCode.DebugAdapter ↔ DebugServices. +- Web.Server ↔ ASP.NET Core API — обёртки для работы из BSL. +- oscript/StandaloneRunner/Documenter/TestApp/Component — надстройки поверх ядра/рантайма. +- NativeApi ↔ ScriptEngine/Core — нативные расширения. + +## 5 Типичные сценарии доработок (куда лезть) +- Добавить объект/контекст с методами: OneScript.Core/Contexts/* (аннотации Context*Attribute). +- Добавить функцию в стандартную библиотеку: соответствующий раздел OneScript.StandardLibrary (например, Json/ или Collections/), плюс экспорт в общий контекст (StandardGlobalContext.cs или SymbolsContext.cs, если нужно). +- Встроенная функция языка/операция: OneScript.Native/Runtime/BuiltInFunctions.cs и/или Compiler/*, при необходимости — поддержка в ScriptEngine/Machine. +- Отладка: DebugServices/DebugProtocol — добавление/изменение событий или представления переменных; VSCode.DebugAdapter — проксирование. + +## 6 Навигация по тестам +- C#-тесты: src/Tests/*: + - Язык: src/Tests/OneScript.Language.Tests/* (лексер/парсер/препроцессор). + - Ядро/типы/контексты: src/Tests/OneScript.Core.Tests/*. + - Динамика/нативный рантайм: src/Tests/OneScript.Dynamic.Tests/*. + - Стандартная библиотека: src/Tests/OneScript.StandardLibrary.Tests/*. + - Отладчик: src/Tests/VSCode.DebugAdapter.Tests/, src/Tests/OneScript.DebugProtocol.Test/. +- Скриптовые тесты: tests/*.os (поведенческие сценарии языка/библиотек). \ No newline at end of file diff --git a/install/builders/base-image/Dockerfile_v1 b/install/builders/base-image/Dockerfile_v1 index 513cc9222..a1cc0c9db 100644 --- a/install/builders/base-image/Dockerfile_v1 +++ b/install/builders/base-image/Dockerfile_v1 @@ -8,4 +8,7 @@ LABEL MAINTAINER="EvilBeaver " ARG VERSION=stable RUN curl -L https://github.com/oscript-library/ovm/releases/latest/download/ovm.exe > ovm.exe \ - && mono ovm.exe use --install $VERSION \ No newline at end of file + && mono ovm.exe use --install $VERSION + +ENV OSCRIPTBIN=/root/.local/share/ovm/current/bin +ENV PATH="$OSCRIPTBIN:$PATH" diff --git a/install/builders/base-image/Dockerfile_v2 b/install/builders/base-image/Dockerfile_v2 index 689268ba0..7412f7d47 100644 --- a/install/builders/base-image/Dockerfile_v2 +++ b/install/builders/base-image/Dockerfile_v2 @@ -11,7 +11,7 @@ ARG VERSION="dev" RUN mono /var/ovm/ovm.exe install --fdd ${VERSION} # Основной образ -FROM mcr.microsoft.com/dotnet/aspnet:6.0-jammy +FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy RUN apt-get update \ && apt-get install -y locales \ diff --git a/install/builders/deb/Dockerfile b/install/builders/deb/Dockerfile deleted file mode 100644 index c55fe0556..000000000 --- a/install/builders/deb/Dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM ubuntu:16.04 - - -RUN apt-get update && apt-get install -y \ - dpkg\ - debconf\ - debhelper\ - lintian\ - md5deep\ - fakeroot \ - locales - -# чтобы запустить тесты -RUN locale-gen --lang ru_RU.UTF-8 -ENV LANG ru_RU.UTF-8 -ENV ARTIFACTS_ROOT built/tmp - -COPY ./ /opt/deb/ -RUN mkdir /bld && cp /opt/deb/build.sh /bld/build.sh && chmod +x /bld/build.sh - - diff --git a/install/builders/deb/build.sh b/install/builders/deb/build.sh deleted file mode 100755 index 4c82249e3..000000000 --- a/install/builders/deb/build.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh - -DATAROOT=$(pwd)/${ARTIFACTS_ROOT} -SRCPATH=${DATAROOT} -BINPATH=${SRCPATH}/bin/ -DEBBUILDROOT=/tmp/deb/ -BUILDERROOT=/opt/deb/ - -if [ -d "$DEBBUILDROOT" ]; then - rm -rf $DEBBUILDROOT - mkdir -p $DEBBUILDROOT -fi - -VERSION=$(cat ${DATAROOT}/VERSION | grep -oE '([[:digit:]]+\.){2}[[:digit:]]+') -PAKNAME=onescript-engine -DSTPATH=${DEBBUILDROOT}${PAKNAME} - -mkdir -p $DSTPATH -mkdir -p $DSTPATH/DEBIAN -mkdir -p $DSTPATH/usr/bin -mkdir -p $DSTPATH/usr/share/oscript/lib -mkdir -p $DSTPATH/usr/share/oscript/bin -mkdir -p $DSTPATH/etc -mkdir -p $DSTPATH/etc/bash_completion.d - -cp ${BUILDERROOT}settings/dirs $DSTPATH/DEBIAN/ -cat ${BUILDERROOT}settings/control | sed -r "s/VERSION/$VERSION/g" > $DSTPATH/DEBIAN/control -cp ${BINPATH}*.exe $DSTPATH/usr/share/oscript/bin -cp ${BINPATH}*.dll $DSTPATH/usr/share/oscript/bin -cp ${BINPATH}*.so $DSTPATH/usr/share/oscript/bin -cp ${BUILDERROOT}oscript $DSTPATH/usr/bin -cp ${BUILDERROOT}oscript-cgi $DSTPATH/usr/bin -cp ${BUILDERROOT}oscript-opm $DSTPATH/usr/bin -cp ${BUILDERROOT}oscript-opm-completion $DSTPATH/etc/bash_completion.d -cp -r ${SRCPATH}/lib/* $DSTPATH/usr/share/oscript/lib -cp ${BINPATH}/oscript.cfg $DSTPATH/etc - -ln -s /usr/bin/oscript-opm $DSTPATH/usr/bin/opm - -# TODO: Убрать это! -cp ${BINPATH}/oscript.cfg $DSTPATH/usr/share/oscript/bin - -fakeroot dpkg-deb --build $DSTPATH - -rm -rf $DSTPATH -chmod 777 $DSTPATH.deb -dpkg-name -o $DSTPATH.deb - -#copy results -OUTPUT=out/deb -mkdir -p $OUTPUT - -cp $DEBBUILDROOT/*.deb $OUTPUT - diff --git a/install/builders/deb/oscript b/install/builders/deb/oscript deleted file mode 100755 index 3644f82d4..000000000 --- a/install/builders/deb/oscript +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -dotnet /usr/share/oscript/bin/oscript.dll "$@" - diff --git a/install/builders/deb/oscript-cgi b/install/builders/deb/oscript-cgi deleted file mode 100755 index caca00423..000000000 --- a/install/builders/deb/oscript-cgi +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -if [ -z "$SCRIPT_FILENAME" ]; then - export SCRIPT_FILENAME=$1 -fi - -oscript -cgi "$@" - diff --git a/install/builders/deb/oscript-opm b/install/builders/deb/oscript-opm deleted file mode 100755 index 1c357d9c4..000000000 --- a/install/builders/deb/oscript-opm +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -OSPATH=/usr/share/oscript -oscript $OSPATH/lib/opm/src/cmd/opm.os "$@" - diff --git a/install/builders/deb/oscript-opm-completion b/install/builders/deb/oscript-opm-completion deleted file mode 100644 index 8589d684b..000000000 --- a/install/builders/deb/oscript-opm-completion +++ /dev/null @@ -1,16 +0,0 @@ -_opm_complete() -{ - local cur opts - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - if [[ $COMP_CWORD == 1 ]] ; then - opts="build prepare install update app help config list run test version" - COMPREPLY=( $(compgen -W "$opts" -- ${cur}) ) - return 0 - fi - COMPREPLY=( $(compgen -df ${cur}) ) - return 0 -} -complete -F _opm_complete opm - -# vim: filetype=sh diff --git a/install/builders/deb/settings/control b/install/builders/deb/settings/control deleted file mode 100644 index 4c1e0ed7c..000000000 --- a/install/builders/deb/settings/control +++ /dev/null @@ -1,18 +0,0 @@ -Package: onescript-engine -Version: VERSION -Provides: onescript -Maintainer: Sergey Batanov -Architecture: all -Section: interpreters -Description: 1Script execution engine. - Cross-platform scripting engine - for DevOps who use 1C:Enterprise Platform (http://1c-dn.com/1c_enterprise) -Depends: mono-runtime, - libmono-system-core4.0-cil | libmono-system-core4.5-cil, - libmono-system4.0-cil | libmono-system4.5-cil, - libmono-system-runtime-serialization4.0-cil, - libmono-system-data4.0-cil, - libmono-corlib4.0-cil | libmono-corlib4.5-cil, - libmono-i18n4.0-all | libmono-i18n4.5-all -Recommends: mono-complete -Origin: https://github.com/EvilBeaver/OneScript/ diff --git a/install/builders/deb/settings/dirs b/install/builders/deb/settings/dirs deleted file mode 100644 index d48b6e912..000000000 --- a/install/builders/deb/settings/dirs +++ /dev/null @@ -1,6 +0,0 @@ -/usr/bin -/etc -/usr/share/oscript/bin -/usr/share/oscript/lib -/etc/bash_completion.d - diff --git a/install/builders/deb/settings/docs b/install/builders/deb/settings/docs deleted file mode 100644 index 3ad7355f4..000000000 --- a/install/builders/deb/settings/docs +++ /dev/null @@ -1,3 +0,0 @@ -README.md -LICENSE - diff --git a/install/builders/rpm/Dockerfile b/install/builders/rpm/Dockerfile deleted file mode 100644 index 2a116bcfc..000000000 --- a/install/builders/rpm/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM fedora:26 - - -# Install various packages to get compile environment -RUN dnf update -y && dnf -y group install 'Development Tools' - -# Install git command to access GitHub repository -RUN dnf -y install sudo git rpmdevtools rpm-build yum-utils dnf-plugins-core - -RUN sed -i.bak -n -e '/^Defaults.*requiretty/ { s/^/# /;};/^%wheel.*ALL$/ { s/^/# / ;} ;/^#.*wheel.*NOPASSWD/ { s/^#[ ]*//;};p' /etc/sudoers - -# This is an optimisation for caching, since using the auto generated one will -# make docker always run the builddep steps since new file -ENV RPMSOURCE /opt/rpm -COPY ./ ${RPMSOURCE} - -RUN dnf builddep -y --spec ${RPMSOURCE}/oscript.spec - -#uid 1000 is used by jenkins agent -RUN useradd -s /bin/bash -u 1000 -G adm,wheel,systemd-journal -m rpm - -ENV VERSION "" -ENV RELEASE "" -ENV ARTIFACTS_ROOT built/tmp - -RUN mkdir /bld && cp /opt/rpm/build.sh /bld/build.sh && chmod +x /bld/build.sh diff --git a/install/builders/rpm/build.sh b/install/builders/rpm/build.sh deleted file mode 100644 index 22b306863..000000000 --- a/install/builders/rpm/build.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash -# script run inside the container - -DATAROOT=$(pwd)/${ARTIFACTS_ROOT} - -VERSION=$(cat ${DATAROOT}/VERSION | grep -oE '([[:digit:]]+\.){2}[[:digit:]]+') -BLDTMP=/tmp/rpm-src -TMPDIR=${BLDTMP}/OneScript-$VERSION -DISTPATH=${DATAROOT} -mkdir -p $TMPDIR - -echo "Copying sources to tmpdir" -cp -r -v $DISTPATH/bin $TMPDIR -cp -r -v $DISTPATH/lib $TMPDIR -cp -r -v $DISTPATH/doc $TMPDIR -cp -r -v $DISTPATH/examples $TMPDIR -cp -r -v ${RPMSOURCE}/oscript $TMPDIR/oscript -cp -r -v ${RPMSOURCE}/oscript-opm $TMPDIR/oscript-opm -cp -r -v ${RPMSOURCE}/oscript-opm-completion $TMPDIR/oscript-opm-completion - -pushd ${BLDTMP} -echo "Compressing OneScript-$VERSION to tar" -tar -czvf OneScript-$VERSION.tar.gz OneScript-$VERSION/ -popd - -BUILDDIR=/tmp/rpm-out -mkdir -p ${BUILDDIR} - -rpmdev-setuptree -define="" -if [ -z $VERSION ]; then - echo "" -else - define="${define} --define '_version ${VERSION}'" -fi - -if [ -z $RELEASE ]; then - echo "" -else - define='$define --define "Release $RELEASE"' -fi - -echo $define -cp -arv $RPMSOURCE/* ~/rpmbuild/SOURCES/ -cp -arv $BLDTMP/*.tar.gz ~/rpmbuild/SOURCES/ -cp -arv $RPMSOURCE/*.spec ~/rpmbuild/SPECS/ -rpmbuild -ba \ - --define "_version ${VERSION:-1.0.13}" \ - ~/rpmbuild/SPECS/oscript.spec || exit 1 - -[[ -d $BUILDDIR ]] || exit 0 - -mkdir -p $BUILDDIR/RPMS -mkdir -p $BUILDDIR/SRPMS - -cp -ar ~/rpmbuild/RPMS/ $BUILDDIR/ -cp -ar ~/rpmbuild/SRPMS/ $BUILDDIR/ - -#copy results -OUTPUT=$(pwd)/out/rpm -mkdir -p $OUTPUT - -mv $BUILDDIR/RPMS/noarch/*.rpm $OUTPUT -mv $BUILDDIR/SRPMS/*.rpm $OUTPUT diff --git a/install/builders/rpm/oscript b/install/builders/rpm/oscript deleted file mode 100644 index 3644f82d4..000000000 --- a/install/builders/rpm/oscript +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -dotnet /usr/share/oscript/bin/oscript.dll "$@" - diff --git a/install/builders/rpm/oscript-opm b/install/builders/rpm/oscript-opm deleted file mode 100644 index 1c357d9c4..000000000 --- a/install/builders/rpm/oscript-opm +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -OSPATH=/usr/share/oscript -oscript $OSPATH/lib/opm/src/cmd/opm.os "$@" - diff --git a/install/builders/rpm/oscript-opm-completion b/install/builders/rpm/oscript-opm-completion deleted file mode 100644 index 8589d684b..000000000 --- a/install/builders/rpm/oscript-opm-completion +++ /dev/null @@ -1,16 +0,0 @@ -_opm_complete() -{ - local cur opts - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - if [[ $COMP_CWORD == 1 ]] ; then - opts="build prepare install update app help config list run test version" - COMPREPLY=( $(compgen -W "$opts" -- ${cur}) ) - return 0 - fi - COMPREPLY=( $(compgen -df ${cur}) ) - return 0 -} -complete -F _opm_complete opm - -# vim: filetype=sh diff --git a/install/builders/rpm/oscript.spec b/install/builders/rpm/oscript.spec deleted file mode 100644 index e6b35302b..000000000 --- a/install/builders/rpm/oscript.spec +++ /dev/null @@ -1,60 +0,0 @@ -%global debug_package %{nil} - -Name: onescript-engine -Version: %{_version} -Release: 1%{?dist} -Summary: 1Script execution engine. - -License: MPL 2.0 -URL: https://github.com/EvilBeaver/OneScript -Source0: OneScript-%{version}.tar.gz -BuildArch: noarch -BuildRequires: wget -Requires: mono-core -Requires: mono-locale-extras - -%define _binaries_in_noarch_packages_terminate_build 0 -%define _empty_manifest_terminate_build 0 -%define _subdir OneScript-%{version} - -%description -1Script execution engine. - Cross-platform scripting engine - for DevOps who use 1C:Enterprise Platform (http://1c-dn.com/1c_enterprise) - -%prep -pwd -%setup -c %{source0} - -%build -echo "build" -pwd - -%install -%{__rm} -rf %{buildroot} -pushd %{_subdir} -mkdir -p %{buildroot}%{_datadir}/oscript/ -mkdir -p %{buildroot}%{_bindir} -mkdir -p %{buildroot}%{_sysconfdir}/bash_completion.d -install -p oscript -m 755 %{buildroot}%{_bindir}/oscript -install -p oscript-opm -m 755 %{buildroot}%{_bindir}/oscript-opm -install -p oscript-opm -m 755 %{buildroot}%{_bindir}/opm -install -p oscript-opm-completion -m 755 %{buildroot}%{_sysconfdir}/bash_completion.d/oscript-opm-completion -rm oscript -rm oscript-opm -rm oscript-opm-completion -%{__cp} -fpr ./ %{buildroot}%{_datadir}/oscript/ -popd - -%files -%defattr(-,root,root) -%{_bindir}/* -%{_datadir}/oscript/* -%{_sysconfdir}/bash_completion.d/oscript-* -%doc - - - -%changelog -* Sat Apr 23 2016 shenja@sosna.zp.ua -- diff --git a/install/choco/onescript.nuspec b/install/choco/onescript.nuspec deleted file mode 100644 index 09c54bd4d..000000000 --- a/install/choco/onescript.nuspec +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - onescript - onescript (Install) - __REPLACE__ - __REPLACE_AUTHORS_OF_SOFTWARE_COMMA_SEPARATED__ - __REPLACE_YOUR_NAME__ - __REPLACE__ - __REPLACE__MarkDown_Okay - - - - - onescript admin SPACE_SEPARATED - - - false - - - __REPLACE_OR_REMOVE__MarkDown_Okay - - - - - - diff --git a/install/choco/tools/ReadMe.md b/install/choco/tools/ReadMe.md deleted file mode 100644 index e9d10ef2b..000000000 --- a/install/choco/tools/ReadMe.md +++ /dev/null @@ -1,91 +0,0 @@ -## Summary -How do I create packages? See https://github.com/chocolatey/choco/wiki/CreatePackages - -If you are submitting packages to the community feed (https://chocolatey.org) -always try to ensure you have read, understood and adhere to the create -packages wiki link above. - -## Automatic Packages? -Consider making this package an automatic package, for the best -maintainability over time. Read up at https://github.com/chocolatey/choco/wiki/AutomaticPackages - -## Shim Generation -Any executables you include in the package or download (but don't call -install against using the built-in functions) will be automatically shimmed. - -This means those executables will automatically be included on the path. -Shim generation runs whether the package is self-contained or uses automation -scripts. - -By default, these are considered console applications. - -If the application is a GUI, you should create an empty file next to the exe -named 'name.exe.gui' e.g. 'bob.exe' would need a file named 'bob.exe.gui'. -See https://github.com/chocolatey/choco/wiki/CreatePackages#how-do-i-set-up-batch-redirects-for-applications-that-have-a-gui - -If you want to ignore the executable, create an empty file next to the exe -named 'name.exe.ignore' e.g. 'bob.exe' would need a file named -'bob.exe.ignore'. -See https://github.com/chocolatey/choco/wiki/CreatePackages#how-do-i-exclude-executables-from-getting-batch-redirects - -## Self-Contained? -If you have a self-contained package, you can remove the automation scripts -entirely and just include the executables, they will automatically get shimmed, -which puts them on the path. Ensure you have the legal right to distribute -the application though. See https://github.com/chocolatey/choco/wiki/Legal. - -You should read up on the Shim Generation section to familiarize yourself -on what to do with GUI applications and/or ignoring shims. - -## Automation Scripts -You have a powerful use of Chocolatey, as you are using PowerShell. So you -can do just about anything you need. Choco has some very handy built-in -functions that you can use, these are sometimes called the helpers. - -### Built-In Functions -https://github.com/chocolatey/choco/wiki/HelpersReference - -A note about a couple: -* Get-BinRoot - this is a horribly named function that doesn't do what new folks think it does. It gets you the 'tools' root, which by default is set to 'c:\tools', not the chocolateyInstall bin folder. -* Install-BinFile - used for non-exe files - executables are automatically shimmed... -* Uninstall-BinFile - used for non-exe files - executables are automatically shimmed - -### Getting package specific information -Use the package parameters pattern - see https://github.com/chocolatey/choco/wiki/How-To-Parse-PackageParameters-Argument - -### Need to mount an ISO? -https://github.com/chocolatey/choco/wiki/How-To-Mount-An-Iso-In-Chocolatey-Package - - -### Environment Variables -Chocolatey makes a number of environment variables available (You can access any of these with $env:TheVariableNameBelow): - - * TEMP = Overridden to the CacheLocation, but may be the same as the original TEMP folder - * ChocolateyInstall = Top level folder where Chocolatey is installed - * chocolateyPackageName = The name of the package, equivalent to the id in the nuspec (0.9.9+) - * chocolateyPackageVersion = The version of the package, equivalent to the version in the nuspec (0.9.9+) - * chocolateyPackageFolder = The top level location of the package folder - -#### Advanced Environment Variables -The following are more advanced settings: - - * chocolateyPackageParameters = (0.9.8.22+) - * CHOCOLATEY_VERSION = The version of Choco you normally see. Use if you are 'lighting' things up based on choco version. (0.9.9+) - - Otherwise take a dependency on the specific version you need. - * chocolateyForceX86 = If available and set to 'true', then user has requested 32bit version. (0.9.9+) - - Automatically handled in built in Choco functions. - * OS_PLATFORM = Like Windows, OSX, Linux. (0.9.9+) - * OS_VERSION = The version of OS, like 6.1 something something for Windows. (0.9.9+) - * OS_NAME = The reported name of the OS. (0.9.9+) - * IS_PROCESSELEVATED = Is the process elevated? (0.9.9+) - -#### Experimental Environment Variables -The following are experimental or use not recommended: - - * OS_IS64BIT = This may not return correctly - it may depend on the process the app is running under (0.9.9+) - * CHOCOLATEY_VERSION_PRODUCT = the version of Choco that may match CHOCOLATEY_VERSION but may be different (0.9.9+) - - it's based on git describe - * IS_ADMIN = Is the user an administrator? But doesn't tell you if the process is elevated. (0.9.9+) - * chocolateyInstallOverride = Not for use in package automation scripts. (0.9.9+) - * chocolateyInstallArguments = the installer arguments meant for the native installer. You should use chocolateyPackageParameters intead. (0.9.9+) - diff --git a/install/choco/tools/chocolateyinstall.ps1 b/install/choco/tools/chocolateyinstall.ps1 deleted file mode 100644 index 0748cbf8a..000000000 --- a/install/choco/tools/chocolateyinstall.ps1 +++ /dev/null @@ -1,90 +0,0 @@ -#NOTE: Please remove any commented lines to tidy up prior to releasing the package, including this one -# REMOVE ANYTHING BELOW THAT IS NOT NEEDED - -$ErrorActionPreference = 'Stop'; # stop on all errors - - -$packageName = 'onescript' # arbitrary name for the package, used in messages -$toolsDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)" -$url = 'http://oscript.io/downloads/latest/msi' # download url -$url64 = '' # 64bit URL here or remove - if installer is both, use $url - -$packageArgs = @{ - packageName = $packageName - unzipLocation = $toolsDir - fileType = 'EXE_MSI_OR_MSU' #only one of these: exe, msi, msu - url = $url - url64bit = $url64 - - #MSI - silentArgs = "/qn /norestart /l*v '$env:TEMP\chocolatey\$packageName\install.log'" # ALLUSERS=1 DISABLEDESKTOPSHORTCUT=1 ADDDESKTOPICON=0 ADDSTARTMENU=0 - validExitCodes= @(0, 3010, 1641) - #OTHERS - #silentArgs ='/S' # "/s /S /q /Q /quiet /silent /SILENT /VERYSILENT -s" # try any of these to get the silent installer - #validExitCodes= @(0) #please insert other valid exit codes here - - # optional - registryUninstallerKey = 'onescript' #ensure this is the value in the registry - checksum = '' - checksumType = 'md5' #default is md5, can also be sha1 - checksum64 = '' - checksumType64= 'md5' #default is checksumType -} - -Install-ChocolateyPackage @packageArgs -#Install-ChocolateyZipPackage @packageArgs - -## Main helper functions - these have error handling tucked into them already -## see https://github.com/chocolatey/choco/wiki/HelpersReference - -## Install an application, will assert administrative rights -## add additional optional arguments as necessary -##Install-ChocolateyPackage $packageName $fileType $silentArgs $url [$url64 -validExitCodes $validExitCodes -checksum $checksum -checksumType $checksumType -checksum64 $checksum64 -checksumType64 $checksumType64] - -## Download and unpack a zip file -##Install-ChocolateyZipPackage $packageName $url $toolsDir [$url64 -checksum $checksum -checksumType $checksumType -checksum64 $checksum64 -checksumType64 $checksumType64] - -## Install Visual Studio Package -#Install-ChocolateyVsixPackage $packageName $url [$vsVersion] [-checksum $checksum -checksumType $checksumType] -#Install-ChocolateyVsixPackage @packageArgs - -# see the full list at https://github.com/chocolatey/choco/wiki/HelpersReference -# downloader that the main helpers use to download items -# if removing $url64, please remove from here -#Get-ChocolateyWebFile $packageName 'DOWNLOAD_TO_FILE_FULL_PATH' $url $url64 -# installer, will assert administrative rights - used by Install-ChocolateyPackage -#Install-ChocolateyInstallPackage $packageName $fileType $silentArgs '_FULLFILEPATH_' -validExitCodes $validExitCodes -# unzips a file to the specified location - auto overwrites existing content -#Get-ChocolateyUnzip "FULL_LOCATION_TO_ZIP.zip" $toolsDir -# Runs processes asserting UAC, will assert administrative rights - used by Install-ChocolateyInstallPackage -#Start-ChocolateyProcessAsAdmin 'STATEMENTS_TO_RUN' 'Optional_Application_If_Not_PowerShell' -validExitCodes $validExitCodes -# add specific folders to the path - any executables found in the chocolatey package folder will already be on the path. This is used in addition to that or for cases when a native installer doesn't add things to the path. -#Install-ChocolateyPath 'LOCATION_TO_ADD_TO_PATH' 'User_OR_Machine' # Machine will assert administrative rights -# add specific files as shortcuts to the desktop -#$target = Join-Path $toolsDir "$($packageName).exe" -# Install-ChocolateyShortcut -shortcutFilePath "" -targetPath "" [-workDirectory "C:\" -arguments "C:\test.txt" -iconLocation "C:\test.ico" -description "This is the description"] -# outputs the bitness of the OS (either "32" or "64") -#$osBitness = Get-ProcessorBits -#Install-ChocolateyEnvironmentVariable -variableName "SOMEVAR" -variableValue "value" [-variableType = 'Machine' #Defaults to 'User'] - -#Install-ChocolateyFileAssociation -#Install-BinFile ## only use this for non-exe files - chocolatey will automatically pick up the exe files and shim them automatically -## https://github.com/chocolatey/choco/wiki/CreatePackages#how-do-i-exclude-executables-from-getting-batch-redirects - -##PORTABLE EXAMPLE -#$toolsDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)" -# despite the name "Install-ChocolateyZipPackage" this also works with 7z archives -#Install-ChocolateyZipPackage $packageName $url $toolsDir $url64 -## END PORTABLE EXAMPLE - -## [DEPRECATING] PORTABLE EXAMPLE -#$binRoot = Get-BinRoot -#$installDir = Join-Path $binRoot "$packageName" -#Write-Host "Adding `'$installDir`' to the path and the current shell path" -#Install-ChocolateyPath "$installDir" -#$env:Path = "$($env:Path);$installDir" - -# if removing $url64, please remove from here -# despite the name "Install-ChocolateyZipPackage" this also works with 7z archives -#Install-ChocolateyZipPackage "$packageName" "$url" "$installDir" "$url64" -## END PORTABLE EXAMPLE diff --git a/install/choco/tools/chocolateyuninstall.ps1 b/install/choco/tools/chocolateyuninstall.ps1 deleted file mode 100644 index 0fa02081d..000000000 --- a/install/choco/tools/chocolateyuninstall.ps1 +++ /dev/null @@ -1,61 +0,0 @@ -#NOTE: Please remove any commented lines to tidy up prior to releasing the package, including this one -# REMOVE ANYTHING BELOW THAT IS NOT NEEDED -# Auto Uninstaller should be able to detect and handle registry uninstalls (if it is turned on, it is in preview for 0.9.9). - -$ErrorActionPreference = 'Stop'; # stop on all errors - -$packageName = 'onescript' -# registry uninstaller key name is the key that is found at HKLM:\Software\Windows\CurrentVersion\Uninstall\ THE NAME -$registryUninstallerKeyName = 'onescript' #ensure this is the value in the registry -$msiProductCodeGuid = '{insert it here}' -$shouldUninstall = $true - -$local_key = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\$registryUninstallerKeyName" -# local key 6432 probably never exists -$local_key6432 = "HKCU:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\$registryUninstallerKeyName" -$machine_key = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$registryUninstallerKeyName" -$machine_key6432 = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\$registryUninstallerKeyName" - -$file = @($local_key, $local_key6432, $machine_key, $machine_key6432) ` - | ?{ Test-Path $_ } ` - | Get-ItemProperty ` - | Select-Object -ExpandProperty UninstallString - -if ($file -eq $null -or $file -eq '') { - Write-Host "$packageName has already been uninstalled by other means." - $shouldUninstall = $false -} - -# The below is somewhat naive and built for EXE installers -#$installerType = 'EXE' -#$silentArgs = '/S' -#$validExitCodes = @(0) - -#if (!(Test-Path $file)) { -# Write-Host "$packageName has already been uninstalled by other means." -# $shouldUninstall = $false -#} - -# The below is somewhat naive and built for MSI installers -$installerType = 'MSI' -# The Product Code GUID is all that should be passed for MSI, and very FIRST, -# because it comes directly after /x, which is already set in the -# Uninstall-ChocolateyPackage msiargs (facepalm). -$silentArgs = "$msiProductCodeGuid /qn /norestart" -# https://msdn.microsoft.com/en-us/library/aa376931(v=vs.85).aspx -$validExitCodes = @(0, 3010, 1605, 1614, 1641) -# Don't pass anything for file, it is ignored for msi (facepalm number 2) -# Alternatively if you need to pass a path to an msi, determine that and use -# it instead of $msiProductCodeGuid in silentArgs, still very first -$file = '' - -if ($shouldUninstall) { - Uninstall-ChocolateyPackage -PackageName $packageName -FileType $installerType -SilentArgs $silentArgs -validExitCodes $validExitCodes -File $file -} - -## OTHER HELPERS -## https://github.com/chocolatey/choco/wiki/HelpersReference -#Uninstall-ChocolateyZipPackage -#Uninstall-BinFile # Only needed if you added one in the installer script, choco will remove the ones it added automatically. -#remove any shortcuts you added - diff --git a/install/dotNetFx40_Full_setup.exe b/install/dotNetFx40_Full_setup.exe deleted file mode 100644 index 384fb8343..000000000 Binary files a/install/dotNetFx40_Full_setup.exe and /dev/null differ diff --git a/install/install.iss b/install/install.iss deleted file mode 100644 index 72b789d72..000000000 --- a/install/install.iss +++ /dev/null @@ -1,208 +0,0 @@ -#include -#define AppName "OneScript engine" -#define FSFriendlyName "OneScript" -#define MainExe "TestApp.exe" -#define ArtifactRoot "..\built\tmp" - -#define VerMajor -#define VerMinor -#define VerRelease -#define Build - -#ifndef Suffix - #define Suffix "x86" -#endif - -#if Suffix == "x64" - #define Binaries="bin" -#else - #define Binaries="bin32" -#endif - -; duplicates ArtifactsRoot because ISPP can't resolve directives -#expr GetVersionComponents(ArtifactRoot + "\" + Binaries + "\ScriptEngine.dll",VerMajor,VerMinor,VerRelease,Build) - -[Setup] -AppName={#AppName} -AppVersion={#VerMajor}.{#VerMinor}.{#VerRelease} -AppPublisher=1Script Team (Open Source) -DefaultDirName="{pf}\{#FSFriendlyName}" -DefaultGroupName="{#FSFriendlyName}" -OutputBaseFilename="OneScript-{#VerMajor}.{#VerMinor}.{#VerRelease}-{#Suffix}" -DisableProgramGroupPage=yes -UninstallDisplayIcon="{app}\bin\{#MainExe}" -Compression=lzma2 -SolidCompression=yes -VersionInfoVersion={#VerMajor}.{#VerMinor}.{#VerRelease}.{#Build} -#if Suffix == "x64" - ArchitecturesInstallIn64BitMode="x64" -#endif - -[InstallDelete] -Type: files; Name: {app}\*.dll -Type: files; Name: {app}\*.json -Type: files; Name: {app}\*.exe -Type: files; Name: {app}\*.bat -Type: files; Name: {app}\*.cmd - -[Types] -Name: "normal"; Description: "Стандартная установка" -Name: "custom"; Description: "Выборочная установка"; Flags: iscustom - -[Components] -Name: "main"; Description: "Основные файлы"; Types: normal custom; Flags: fixed -Name: "stdlib"; Description: "Стандартная библиотека скриптов"; Types: normal custom; -Name: "testapp"; Description: "Тестовая консоль (TestApp)"; -Name: "docs"; Description: "Документация по свойствам и методам (синтакс-помощник)"; - -[Files] -Source: "{#ArtifactRoot}\{#Binaries}\oscript.exe"; DestDir: "{app}\bin"; Components: main -Source: "{#ArtifactRoot}\{#Binaries}\ScriptEngine.HostedScript.dll"; DestDir: "{app}\bin"; Components: main -Source: "{#ArtifactRoot}\{#Binaries}\ScriptEngine.dll"; DestDir: "{app}\bin"; Components: main -Source: "{#ArtifactRoot}\{#Binaries}\OneScript.DebugProtocol.dll"; DestDir: "{app}\bin"; Components: main -Source: "{#ArtifactRoot}\{#Binaries}\OneScript.StandardLibrary.dll"; DestDir: "{app}\bin"; Components: main -Source: "{#ArtifactRoot}\{#Binaries}\OneScript.DebugServices.dll"; DestDir: "{app}\bin"; Components: main -Source: "{#ArtifactRoot}\{#Binaries}\OneScript.Language.dll"; DestDir: "{app}\bin"; Components: main -Source: "{#ArtifactRoot}\{#Binaries}\DotNetZip.dll"; DestDir: "{app}\bin"; Components: main -Source: "{#ArtifactRoot}\{#Binaries}\Newtonsoft.Json.dll"; DestDir: "{app}\bin"; Components: main -Source: "{#ArtifactRoot}\{#Binaries}\oscript.cfg"; DestDir: "{app}\bin"; Components: main; Flags: onlyifdoesntexist - -#if Suffix == "x64" - Source: "{#ArtifactRoot}\{#Binaries}\ScriptEngine.NativeApi64.dll"; DestDir: "{app}\bin"; Components: main -#else - Source: "{#ArtifactRoot}\{#Binaries}\ScriptEngine.NativeApi32.dll"; DestDir: "{app}\bin"; Components: main -#endif - -Source: "{#ArtifactRoot}\examples\*"; DestDir: "{app}\examples"; Components: main - -; testapp -Source: "{#ArtifactRoot}\{#Binaries}\TestApp.exe"; DestDir: "{app}\bin"; Components: testapp -Source: "{#ArtifactRoot}\{#Binaries}\ICSharpCode.AvalonEdit.dll"; DestDir: "{app}\bin"; Components: testapp -Source: "{#ArtifactRoot}\{#Binaries}\System.*.dll"; DestDir: "{app}\bin"; Components: testapp - -; библиотека -Source: "{#ArtifactRoot}\lib\*"; DestDir: "{app}\lib"; Components: stdlib; Flags: recursesubdirs -Source: "{#ArtifactRoot}\{#Binaries}\*.bat"; DestDir: "{app}\bin"; Components: stdlib - -; документация -Source: "{#ArtifactRoot}\doc\*"; DestDir: "{app}\doc"; Components: docs; Flags: recursesubdirs - -Source: "dotNetFx40_Full_setup.exe"; DestDir: {tmp}; Flags: deleteafterinstall; Check: not IsRequiredDotNetDetected - -[Icons] -Name: "{group}\{#FSFriendlyName}"; Filename: "{app}\bin\{#MainExe}" - -[Registry] -Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};{app}\bin;"; Check: NeedsAddPath(ExpandConstant('{app}\bin')) - -[Run] -Filename: {tmp}\dotNetFx40_Full_setup.exe; Parameters: "/q:a /c:""install /l /q"""; Check: not IsRequiredDotNetDetected; StatusMsg: Microsoft .NET Framework 4.0 is being installed. Please wait.. -Filename: "{app}\bin\{#MainExe}"; Description: "Launch application"; Components: testapp; Flags: postinstall nowait skipifsilent unchecked - -[Code] - -#IFDEF UNICODE - #DEFINE AW "W" -#ELSE - #DEFINE AW "A" -#ENDIF -type - INSTALLSTATE = Longint; -const - INSTALLSTATE_INVALIDARG = -2; // An invalid parameter was passed to the function. - INSTALLSTATE_UNKNOWN = -1; // The product is neither advertised or installed. - INSTALLSTATE_ADVERTISED = 1; // The product is advertised but not installed. - INSTALLSTATE_ABSENT = 2; // The product is installed for a different user. - INSTALLSTATE_DEFAULT = 5; // The product is installed for the current user. - - // Microsoft Visual C++ 2012 x86 Minimum Runtime - 11.0.61030.0 (Update 4) - VC_2012_REDIST_MIN_UPD4_X86 = '{BD95A8CD-1D9F-35AD-981A-3E7925026EBB}'; - VC_2012_REDIST_MIN_UPD4_X64 = '{CF2BEA3C-26EA-32F8-AA9B-331F7E34BA97}'; - // Microsoft Visual C++ 2012 x86 Additional Runtime - 11.0.61030.0 (Update 4) - VC_2012_REDIST_ADD_UPD4_X86 = '{B175520C-86A2-35A7-8619-86DC379688B9}'; - VC_2012_REDIST_ADD_UPD4_X64 = '{37B8F9C7-03FB-3253-8781-2517C99D7C00}'; - -function NeedsAddPath(Param: string): boolean; -var - OrigPath: string; -begin - if not RegQueryStringValue(HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', OrigPath) - then begin - Result := True; - exit; - end; - // look for the path with leading and trailing semicolon - // Pos() returns 0 if not found - Result := Pos(';' + UpperCase(Param) + ';', ';' + UpperCase(OrigPath) + ';') = 0; - if Result = True then - Result := Pos(';' + UpperCase(Param) + '\;', ';' + UpperCase(OrigPath) + ';') = 0; -end; - -function IsDotNetDetected(version: string; service: cardinal): boolean; -// Indicates whether the specified version and service pack of the .NET Framework is installed. -// -// version -- Specify one of these strings for the required .NET Framework version: -// 'v1.1.4322' .NET Framework 1.1 -// 'v2.0.50727' .NET Framework 2.0 -// 'v3.0' .NET Framework 3.0 -// 'v3.5' .NET Framework 3.5 -// 'v4\Client' .NET Framework 4.0 Client Profile -// 'v4\Full' .NET Framework 4.0 Full Installation -// 'v4.5' .NET Framework 4.5 -// -// service -- Specify any non-negative integer for the required service pack level: -// 0 No service packs required -// 1, 2, etc. Service pack 1, 2, etc. required -var - key: string; - install, release, serviceCount: cardinal; - check45, success: boolean; -//var reqNetVer : string; -begin - // .NET 4.5 installs as update to .NET 4.0 Full - if version = 'v4.5' then begin - version := 'v4\Full'; - check45 := true; - end else - check45 := false; - - // installation key group for all .NET versions - key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version; - - // .NET 3.0 uses value InstallSuccess in subkey Setup - if Pos('v3.0', version) = 1 then begin - success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install); - end else begin - success := RegQueryDWordValue(HKLM, key, 'Install', install); - end; - - // .NET 4.0/4.5 uses value Servicing instead of SP - if Pos('v4', version) = 1 then begin - success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount); - end else begin - success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount); - end; - - // .NET 4.5 uses additional value Release - if check45 then begin - success := success and RegQueryDWordValue(HKLM, key, 'Release', release); - success := success and (release >= 378389); - end; - - result := success and (install = 1) and (serviceCount >= service); -end; - -function IsRequiredDotNetDetected(): Boolean; -begin - result := IsDotNetDetected('v4\Full', 0); -end; - -function InitializeSetup(): Boolean; -begin - if not IsDotNetDetected('v4\Full', 0) then begin - MsgBox('{#AppName} requires Microsoft .NET Framework 4.0 Client Profile.'#13#13 - 'The installer will attempt to install it', mbInformation, MB_OK); - end; - - result := true; -end; diff --git a/install/make-dockers.sh b/install/make-dockers.sh index 4450ad8aa..54521cb72 100755 --- a/install/make-dockers.sh +++ b/install/make-dockers.sh @@ -2,11 +2,5 @@ THISDIR=$(pwd) -cd $THISDIR/builders/deb -docker build -t oscript/onescript-builder:deb . - -cd $THISDIR/builders/rpm -docker build -t oscript/onescript-builder:rpm . - cd $THISDIR docker build -t oscript/onescript-builder:gcc -f $THISDIR/builders/nativeapi/Dockerfile .. diff --git a/install/package-loader.os b/install/package-loader.os index 915c41a15..6cad5d28e 100644 --- a/install/package-loader.os +++ b/install/package-loader.os @@ -1,4 +1,7 @@ -// Пояснения по переменным даны в конце модуля +// Стандартный загрузчик библиотек, включаемый в дистрибутив OneScript +// Данный загрузчик используется, если библиотека не предоставляет свой, альтернативный загрузчик. +// Можно сказать, это загрузчик по-умолчанию. + Перем ПоказатьСообщенияЗагрузки; Перем ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей; @@ -192,9 +195,9 @@ МажорнаяВерсия = Лев(СИ.Версия,1); Если МажорнаяВерсия = "1" Тогда - ОбработатьБиблиотекиCLR(ОбъединитьПути(Путь, "net4")); + ОбработатьБиблиотекиCLR(ОбъединитьПути(Путь, "net4"), СтандартнаяОбработка); ИначеЕсли МажорнаяВерсия = "2" Тогда - ОбработатьБиблиотекиCLR(ОбъединитьПути(Путь, "dotnet")); + ОбработатьБиблиотекиCLR(ОбъединитьПути(Путь, "dotnet"), СтандартнаяОбработка); Иначе Вывести("Неизвестная мажорная версия системы: " + МажорнаяВерсия); КонецЕсли; @@ -203,17 +206,21 @@ КонецПроцедуры -Процедура ОбработатьБиблиотекиCLR(Путь) - КандидатыВКомпоненты = НайтиФайлы(Путь, "1script_*.dll"); +Процедура ОбработатьБиблиотекиCLR(Знач Путь, СтандартнаяОбработка) + + КандидатыВКомпоненты = НайтиФайлы(Путь, "1script_*.dll"); Для Каждого Кандидат Из КандидатыВКомпоненты Цикл + Если Не Кандидат.ЭтоФайл() Тогда Продолжить; КонецЕсли; Вывести("Загружаю файл " + Кандидат.Имя); ЗагрузитьБиблиотеку(Кандидат.ПолноеИмя); + СтандартнаяОбработка = Ложь; КонецЦикла; + КонецПроцедуры Процедура ОбработатьКомпонентыNativeApi(Путь) diff --git a/install/release-notes.md b/install/release-notes.md index da03c57c8..1da6673b3 100644 --- a/install/release-notes.md +++ b/install/release-notes.md @@ -1,13 +1,36 @@ -# Новое в версии 2.0.0-rc.8 +# Версия 2.0.0-rc.9 -* Заменена библиотека DotNetZip на форк ProDotNetZip из-за незакрытой уязвимости CVE-2024-48510 -* Существенно ускорена компиляция большого числа модулей. Запуск тяжелых приложений с множеством классов стал намного быстрее. -* Доработан отладчик и сервер отладки, введен новый протокол обмена данными для отказа от BinaryFormatter в рамках перехода на net8 -* Изменен формат конфигурации для включения лога отладки. См. каталог установки расширения и файл `VSCode.DebugAdapter.exe.config` -* Изменен вывод компилятора в случае ошибки. Изменена отметка отметка позиции ошибки в строке. Более точное позиционирование ошибки +## Новые возможности -# Исправление ошибок +- [#1540](https://github.com/EvilBeaver/OneScript/issues/1540) - Добавлено предупреждение о неявных импортах при компиляции для контроля явного объявления зависимостей +- [#1585](https://github.com/EvilBeaver/OneScript/issues/1585) - Добавлен параметр `ИгнорироватьТипДокумента` при чтении XML +- [#1586](https://github.com/EvilBeaver/OneScript/issues/1586) - Добавлена поддержка пропуска пробельных символов после служебных элементов XML +- [#392](https://github.com/EvilBeaver/OneScript/issues/392) - Метод `ЗаписатьТекущий()` для XML теперь корректно копирует декларацию XML и тип документа +- [#1545](https://github.com/EvilBeaver/OneScript/issues/1545) - Разрешено использование комментариев после аннотаций модуля и в строках с директивой `Использовать` +- [#1593](https://github.com/EvilBeaver/OneScript/issues/1593) - Полностью переработан сервер отладки, возможно переподключение к серверу после завершения сессии отладки. +- Улучшена производительность компиляции большого числа модулей +- Добавлена возможность выполнять attach отладчика внутрь контейнера с 1Script. Предусмотрен маппинг локальных путей и путей внутри контейнера. -* Разрешены комментарии после аннотаций модуля -* Разрешено использование комментариев в строке с директивой Использовать -* Слово Ждать вне асинхронного метода не должно иметь специального значения +## Исправления ошибок + +- [#1573](https://github.com/EvilBeaver/OneScript/issues/1573) - Исправлена работа метода `НайтиСтроки()` для таблицы значений по индексированной колонке с указанным типом +- [#1582](https://github.com/EvilBeaver/OneScript/issues/1582),[#1577](https://github.com/EvilBeaver/OneScript/issues/1577) - Исправлена сортировка чисел и типов в таблице значений +- [#1556](https://github.com/EvilBeaver/OneScript/issues/1556), [#1611](https://github.com/EvilBeaver/OneScript/issues/1611) - Исправлен учет перехода на летнее время в функции `УниверсальноеВремя()`, добавлена поддержка временных зон восточно-европейского времени +- [#1567](https://github.com/EvilBeaver/OneScript/issues/1567) - Исправлено некорректное отображение параметров метода в отладчике +- [#1552](https://github.com/EvilBeaver/OneScript/issues/1552) - Исправлена обработка слова `Ждать` вне асинхронного метода +- [#1603](https://github.com/EvilBeaver/OneScript/issues/1603) - Исправлена работа функции `СтрЗаменить()` +- [#1602](https://github.com/EvilBeaver/OneScript/issues/1602) - Исправлено преобразование элемента списка значений в строку +- [#1542](https://github.com/EvilBeaver/OneScript/issues/1542) - Улучшено позиционирование ошибок в исходном коде +- ряд других ошибок + +## Устаревание + +- [#1544](https://github.com/EvilBeaver/OneScript/issues/1544) - Английский вариант перечисления `StreamPosition` объявлен устаревшим в пользу `PositionInStream` + +## Технические изменения + +- Выполнен переход на .NET 8. + +## Благодарности + +Большое спасибо @Mr-Rm, @dmpas, @asosnoviy, @nixel2007, @Bayselonarrend за участие в этом релизе! diff --git a/src/1Script.sln b/src/1Script.sln index 2cc56c55e..b6efc468b 100644 --- a/src/1Script.sln +++ b/src/1Script.sln @@ -24,8 +24,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution oscommon.targets = oscommon.targets EndProjectSection EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Installer", "Installer\Installer.wixproj", "{BBE794A6-B159-422F-B655-B7F03F25F223}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Component", "Component\Component.csproj", "{B6C3C000-699B-4A2F-92D1-EEAEA9CFE2AB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VSCode.DebugAdapter", "VSCode.DebugAdapter\VSCode.DebugAdapter.csproj", "{C979F151-AA29-47E4-B020-3039BA0986D9}" @@ -126,12 +124,6 @@ Global {2590E2BB-CC1F-4775-80ED-451F45C9A4F1}.Release|Any CPU.Build.0 = Release|Any CPU {2590E2BB-CC1F-4775-80ED-451F45C9A4F1}.Release|x86.ActiveCfg = Release|x86 {2590E2BB-CC1F-4775-80ED-451F45C9A4F1}.Release|x86.Build.0 = Release|x86 - {BBE794A6-B159-422F-B655-B7F03F25F223}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BBE794A6-B159-422F-B655-B7F03F25F223}.Debug|x86.ActiveCfg = Debug|x86 - {BBE794A6-B159-422F-B655-B7F03F25F223}.LinuxDebug|Any CPU.ActiveCfg = LinuxDebug|Any CPU - {BBE794A6-B159-422F-B655-B7F03F25F223}.LinuxDebug|x86.ActiveCfg = LinuxDebug|Any CPU - {BBE794A6-B159-422F-B655-B7F03F25F223}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BBE794A6-B159-422F-B655-B7F03F25F223}.Release|x86.ActiveCfg = Release|x86 {B6C3C000-699B-4A2F-92D1-EEAEA9CFE2AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B6C3C000-699B-4A2F-92D1-EEAEA9CFE2AB}.Debug|Any CPU.Build.0 = Debug|Any CPU {B6C3C000-699B-4A2F-92D1-EEAEA9CFE2AB}.Debug|x86.ActiveCfg = Debug|Any CPU diff --git a/src/ASPNETHandler/ASPNETHandler.cs b/src/ASPNETHandler/ASPNETHandler.cs deleted file mode 100644 index 4832dea67..000000000 --- a/src/ASPNETHandler/ASPNETHandler.cs +++ /dev/null @@ -1,313 +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.Web; -using System.Runtime.Caching; -using System.IO; -using ScriptEngine.Machine; -using ScriptEngine.Environment; -using ScriptEngine.HostedScript; - -using System.Runtime.CompilerServices; - -namespace OneScript.ASPNETHandler -{ - public class ASPNETHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState - { - HostedScriptEngine _hostedScript; - // Разрешает или запрещает кэширование исходников *.os В Linux должно быть false иначе после изменений исходника старая версия будет в кэше - // web.config -> -> - static bool _cachingEnabled; - // Список дополнительных сборок, которые надо приаттачить к движку. Могут быть разные расширения - // web.config -> -> Сделано так для простоты. Меньше настроек - дольше жизнь :) - static List _assembliesForAttaching; - - public bool IsReusable - { - // Разрешаем повторное использование и храним среду выполнения и контекст - get { return true; } - } - static ASPNETHandler() - { - _assembliesForAttaching = new List(); - - System.Collections.Specialized.NameValueCollection appSettings = System.Web.Configuration.WebConfigurationManager.AppSettings; - - TextWriter logWriter = OpenLog(appSettings); - - _cachingEnabled = (appSettings["cachingEnabled"] == "true"); - WriteToLog(logWriter, "Start assemblies loading."); - - foreach (string assemblyName in appSettings.AllKeys) - { - if (appSettings[assemblyName] == "attachAssembly") - { - try - { - _assembliesForAttaching.Add(System.Reflection.Assembly.Load(assemblyName)); - } - // TODO: Исправить - должно падать. Если конфиг сайта неработоспособен - сайт не должен быть работоспособен. - catch(Exception ex) - { - WriteToLog(logWriter, "Error loading assembly: " + assemblyName + " " + ex.ToString()); - if (appSettings["handlerLoadingPolicy"] == "strict") - throw; // Must fail! - } - } - } - - WriteToLog(logWriter, "Stop assemblies loading."); - CloseLog(logWriter); - } - - public ASPNETHandler() - { - System.Collections.Specialized.NameValueCollection appSettings = System.Web.Configuration.WebConfigurationManager.AppSettings; - - // Инициализируем логгирование, если надо - TextWriter logWriter = OpenLog(appSettings); - - WriteToLog(logWriter, "Start loading."); - - try - { - _hostedScript = new HostedScriptEngine(); - // метод настраивает внутренние переменные у SystemGlobalContext - if (appSettings["enableEcho"] == "true") - _hostedScript.SetGlobalEnvironment(new ASPNetApplicationHost(), new AspEntryScriptSrc(appSettings["startupScript"] ?? HttpContext.Current.Server.MapPath("~/web.config"))); - else - _hostedScript.SetGlobalEnvironment(new AspNetNullApplicationHost(), new AspNetNullEntryScriptSrc()); - - _hostedScript.Initialize(); - - - // Размещаем oscript.cfg вместе с web.config. Так наверное привычнее - _hostedScript.CustomConfig = appSettings["configFilePath"] ?? HttpContext.Current.Server.MapPath("~/oscript.cfg"); - _hostedScript.AttachAssembly(System.Reflection.Assembly.GetExecutingAssembly()); - // Аттачим доп сборки. По идее должны лежать в Bin - foreach (System.Reflection.Assembly assembly in _assembliesForAttaching) - { - try - { - _hostedScript.AttachAssembly(assembly); - } - catch (Exception ex) - { - // Возникла проблема при аттаче сборки - WriteToLog(logWriter, "Assembly attaching error: " + ex.Message); - if (appSettings["handlerLoadingPolicy"] == "strict") - throw; - } - } - - //Загружаем библиотечные скрипты aka общие модули - string libPath = appSettings["commonModulesPath"]; - - if (libPath != null) - { - libPath = HttpContext.Current.Server.MapPath(libPath); - - string[] files = System.IO.Directory.GetFiles(libPath, "*.os"); - - - foreach (string filePathName in files) - { - _hostedScript.InjectGlobalProperty(System.IO.Path.GetFileNameWithoutExtension(filePathName), ValueFactory.Create(), true); - } - - foreach (string filePathName in files) - { - try - { - ICodeSource src = _hostedScript.Loader.FromFile(filePathName); - - var compilerService = _hostedScript.GetCompilerService(); - var module = compilerService.Compile(src); - var loaded = _hostedScript.EngineInstance.LoadModuleImage(module); - var instance = (IValue)_hostedScript.EngineInstance.NewObject(loaded); - _hostedScript.EngineInstance.Environment.SetGlobalProperty(System.IO.Path.GetFileNameWithoutExtension(filePathName), instance); - } - catch (Exception ex) - { - // Возникла проблема при загрузке файла os, логгируем, если логгирование включено - WriteToLog(logWriter, "Error loading " + System.IO.Path.GetFileNameWithoutExtension(filePathName) + " : " + ex.Message); - if (appSettings["handlerLoadingPolicy"] == "strict") - throw; - } - } - } - - _hostedScript.EngineInstance.Environment.LoadMemory(MachineInstance.Current); - - } - catch (Exception ex) - { - // Возникла проблема при инициализации хэндлера - WriteToLog(logWriter, ex.Message); - - if (appSettings["handlerLoadingPolicy"] == "strict") - throw; // Must fail! - } - finally - { - WriteToLog(logWriter, "End loading."); - CloseLog(logWriter); - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - static TextWriter OpenLog(System.Collections.Specialized.NameValueCollection appSettings = null) - { - if (appSettings == null) - appSettings = System.Web.Configuration.WebConfigurationManager.AppSettings; - - string logPath = appSettings["logToPath"]; - - try - { - if (logPath != null) - { - logPath = HttpContext.Current.Server.MapPath(logPath); - string logFileName = Guid.NewGuid().ToString().Replace("-", "") + ".txt"; - return File.CreateText(Path.Combine(logPath, logFileName)); - } - else - return null; - } - catch - { - return null; - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - static void WriteToLog(TextWriter logWriter, string message) - { - if (logWriter == null) - return; - try - { - logWriter.WriteLine(message); - } - catch { /* что-то не так, ничего не делаем */ } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - static void CloseLog(TextWriter logWriter) - { - if (logWriter != null) - { - try - { - logWriter.Flush(); - logWriter.Close(); - } - catch - { /*что-то не так, ничего не делаем.*/ } - } - } - - public void ProcessRequest(HttpContext context) - { - CallScriptHandler(context); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static void ProduceResponse(HttpContext context, IRuntimeContextInstance runner) - { - int methodIndex = runner.FindMethod("ОбработкаВызоваHTTPСервиса"); - IValue result; - IValue[] args = new IValue[1]; - args[0] = new ScriptEngine.HostedScript.Library.HTTPService.HTTPServiceRequestImpl(context); - runner.CallAsFunction(methodIndex, args, out result); - - // Обрабатываем результаты - var response = (ScriptEngine.HostedScript.Library.HTTPService.HTTPServiceResponseImpl) result; - context.Response.StatusCode = response.StatusCode; - - if (response.Headers != null) - { - foreach (var ch in response.Headers) - { - context.Response.AddHeader(ch.Key.AsString(), ch.Value.AsString()); - } - } - - if (response.Reason != "") - { - context.Response.Status = response.Reason; - } - - if (response.BodyStream != null) - { - response.BodyStream.Seek(0, SeekOrigin.Begin); - response.BodyStream.CopyTo(context.Response.OutputStream); - } - - context.Response.Charset = response.ContentCharset; - context.Response.End(); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private IRuntimeContextInstance CreateServiceInstance(LoadedModule module) - { - var runner = _hostedScript.EngineInstance.NewObject(module); - return runner; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private LoadedModule LoadByteCode(string filePath) - { - var code = _hostedScript.EngineInstance.Loader.FromFile(filePath); - var compiler = _hostedScript.GetCompilerService(); - var byteCode = compiler.Compile(code); - var module = _hostedScript.EngineInstance.LoadModuleImage(byteCode); - return module; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void CallScriptHandler(HttpContext context) - { - _hostedScript.EngineInstance.Environment.LoadMemory(MachineInstance.Current); - #region Загружаем скрипт (файл .os) - // Кэшируем исходный файл, если файл изменился (изменили скрипт .os) загружаем заново - // В Linux под Mono не работает подписка на изменение файла. - LoadedModule module = null; - ObjectCache cache = MemoryCache.Default; - - if (_cachingEnabled) - { - module = cache[context.Request.PhysicalPath] as LoadedModule; - - if (module == null) - { - CacheItemPolicy policy = new CacheItemPolicy(); - - List filePaths = new List(); - filePaths.Add(context.Request.PhysicalPath); - policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths)); - - // Загружаем файл и помещаем его в кэш - module = LoadByteCode(context.Request.PhysicalPath); - cache.Set(context.Request.PhysicalPath, module, policy); - } - } - else - { - module = LoadByteCode(context.Request.PhysicalPath); - } - - #endregion - - var runner = CreateServiceInstance(module); - - ProduceResponse(context, runner); - } - } -} diff --git a/src/ASPNETHandler/ASPNetApplicationHost.cs b/src/ASPNETHandler/ASPNetApplicationHost.cs deleted file mode 100644 index 8060222f3..000000000 --- a/src/ASPNETHandler/ASPNetApplicationHost.cs +++ /dev/null @@ -1,71 +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.StandardLibrary; -using ScriptEngine.HostedScript; -using ScriptEngine.HostedScript.Library; - -namespace OneScript.ASPNETHandler -{ - class ASPNetApplicationHost : IHostApplication - { - public void Echo(string str, MessageStatusEnum status = MessageStatusEnum.Ordinary) - { - if (status == MessageStatusEnum.Ordinary) - { - Console.WriteLine(str); - } - else - { - var oldColor = Console.ForegroundColor; - ConsoleColor newColor; - - switch (status) - { - case MessageStatusEnum.Information: - newColor = ConsoleColor.Green; - break; - case MessageStatusEnum.Attention: - newColor = ConsoleColor.Yellow; - break; - case MessageStatusEnum.Important: - case MessageStatusEnum.VeryImportant: - newColor = ConsoleColor.Red; - break; - default: - newColor = oldColor; - break; - } - - try - { - Console.ForegroundColor = newColor; - Console.WriteLine(str); - } - finally - { - Console.ForegroundColor = oldColor; - } - } - } - - public void ShowExceptionInfo(Exception exc) - { - throw new NotImplementedException(); - } - - public bool InputString(out string result, string prompt, int maxLen, bool multiline) - { - throw new NotImplementedException(); - } - - public string[] GetCommandLineArguments() - { - throw new NotImplementedException(); - } - } -} diff --git a/src/ASPNETHandler/ASPNetNullApplicationHost.cs b/src/ASPNETHandler/ASPNetNullApplicationHost.cs deleted file mode 100644 index aea1c5b0c..000000000 --- a/src/ASPNETHandler/ASPNetNullApplicationHost.cs +++ /dev/null @@ -1,45 +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 ScriptEngine.HostedScript; -using ScriptEngine.HostedScript.Library; - -namespace OneScript.ASPNETHandler -{ - // Класс-заглушка для вывода Сообщить. - // Поведение как на сервере 1С - public class AspNetNullApplicationHost : IHostApplication - { - public AspNetNullApplicationHost() - { - - } - - public void Echo(string str, MessageStatusEnum status = MessageStatusEnum.Ordinary) - { - // Обработчик Сообщить, в HTTPСервисе ничего не делает, также поступаем и мы - } - - public void ShowExceptionInfo(Exception exc) - { - // Непонятно что это, наверное аналог системного диалога, на сервере нет никаких диалогов - } - - public bool InputString(out string result, string prompt, int maxLen, bool multiline) - { - // Мы не можем вводить никаких строк на сервере в 1С это недоступно - result = null; - return false; - } - - public string[] GetCommandLineArguments() - { - // У нас нет никаких аргументов командной строки - return new string[0]; // возвращаем массив из 0 аргументов т.к у нас их нет - } - } -} diff --git a/src/ASPNETHandler/AspEntryScriptSrc.cs b/src/ASPNETHandler/AspEntryScriptSrc.cs deleted file mode 100644 index 386a2def7..000000000 --- a/src/ASPNETHandler/AspEntryScriptSrc.cs +++ /dev/null @@ -1,29 +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 ScriptEngine.Environment; - -namespace OneScript.ASPNETHandler -{ - class AspEntryScriptSrc : ICodeSource - { - string _sourceDescription; - - public string Code - { - get { return ""; } - } - public AspEntryScriptSrc(string sourceDescription) - { - _sourceDescription = sourceDescription; - } - public string SourceDescription - { - get { return _sourceDescription; } - } - } -} diff --git a/src/ASPNETHandler/AspNetNullEntryScriptSrc.cs b/src/ASPNETHandler/AspNetNullEntryScriptSrc.cs deleted file mode 100644 index aacc6e140..000000000 --- a/src/ASPNETHandler/AspNetNullEntryScriptSrc.cs +++ /dev/null @@ -1,26 +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 ScriptEngine.Environment; - - -namespace OneScript.ASPNETHandler -{ - // Класс заглушка стартового скрипта. У нас нет стартового скрипта, поскольку это веб-приложение - class AspNetNullEntryScriptSrc : ICodeSource - { - public string Code - { - get { return ""; } - } - - public string SourceDescription - { - get { return ""; } - } - } -} diff --git a/src/ASPNETHandler/DemoApp/Default.os b/src/ASPNETHandler/DemoApp/Default.os deleted file mode 100644 index 4b851ab35..000000000 --- a/src/ASPNETHandler/DemoApp/Default.os +++ /dev/null @@ -1,57 +0,0 @@ - -// Это предопределенная функция - обработчик запроса HTTP-сервиса -// -Функция ОбработкаВызоваHTTPСервиса(Запрос) Экспорт - - Если Запрос.HTTPМетод = "GET" Тогда - - Возврат ПоказатьГлавнуюСтраницу(Запрос); - - Иначе - - Возврат ПоказатьИсходныйКод(Запрос); - - КонецЕсли; - -КонецФункции - -Функция ПоказатьГлавнуюСтраницу(Запрос) - - Контекст = Запрос.Контекст; - - ИмяФайлаШаблона = СтрЗаменить(Контекст.ФизическийПуть, "Default.os", "Default.ospt"); - СтрокаШаблон = ПолучитьМакетСтраницы(ИмяФайлаШаблона); - СтрокаТело = СтрЗаменить(СтрокаШаблон, "{ClientAddress}", Контекст.АдресКлиента); - - Ответ = Новый HTTPСервисОтвет(200); - Ответ.УстановитьТелоИзСтроки(СтрокаТело); - - Возврат Ответ; - -КонецФункции - -Функция ПоказатьИсходныйКод(Запрос) - - Контекст = Запрос.Контекст; - - СтрокаИсходныйКод = ПолучитьМакетСтраницы(Контекст.ФизическийПуть); - - ИмяФайлаШаблона = СтрЗаменить(Контекст.ФизическийПуть, "Default.os", "Source.ospt"); - СтрокаШаблон = ПолучитьМакетСтраницы(ИмяФайлаШаблона); - - СтрокаТело = СтрЗаменить(СтрокаШаблон, "{SourceCode}", СтрокаИсходныйКод); - - Ответ = Новый HTTPСервисОтвет(200); - Ответ.УстановитьТелоИзСтроки(СтрокаТело); - - Возврат Ответ; - -КонецФункции - -Функция ПолучитьМакетСтраницы(ПутьКФайлу) - - Документ = Новый ТекстовыйДокумент; - Документ.Прочитать(ПутьКФайлу); - Возврат Документ.ПолучитьТекст(); - -КонецФункции \ No newline at end of file diff --git a/src/ASPNETHandler/DemoApp/Default.ospt b/src/ASPNETHandler/DemoApp/Default.ospt deleted file mode 100644 index b70b1d892..000000000 --- a/src/ASPNETHandler/DemoApp/Default.ospt +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - OneScript HTTP Service Test Page - - - -
-

Привет ({ClientAddress})!

-

Эта страница создана HTTP сервисом OneScript.

-
-
-
-
- - -
-
-
- - - \ No newline at end of file diff --git a/src/ASPNETHandler/DemoApp/highlight.pack.js b/src/ASPNETHandler/DemoApp/highlight.pack.js deleted file mode 100644 index 2b63060fe..000000000 --- a/src/ASPNETHandler/DemoApp/highlight.pack.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */ -!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){s+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"
":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("1c",function(s){var x="[A-Za-zА-Яа-яёЁ_][A-Za-zА-Яа-яёЁ_0-9]+",o="далее ",m="возврат вызватьисключение выполнить для если и из или иначе иначеесли исключение каждого конецесли конецпопытки конеццикла не новый перейти перем по пока попытка прервать продолжить тогда цикл экспорт ",t=o+m,l="загрузитьизфайла ",e="вебклиент вместо внешнеесоединение клиент конецобласти мобильноеприложениеклиент мобильноеприложениесервер наклиенте наклиентенасервере наклиентенасерверебезконтекста насервере насерверебезконтекста область перед после сервер толстыйклиентобычноеприложение толстыйклиентуправляемоеприложение тонкийклиент ",n=l+e,a="разделительстраниц разделительстрок символтабуляции ",d="ansitooem oemtoansi ввестивидсубконто ввестиперечисление ввестипериод ввестиплансчетов выбранныйплансчетов датагод датамесяц датачисло заголовоксистемы значениевстроку значениеизстроки каталогиб каталогпользователя кодсимв конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лог лог10 максимальноеколичествосубконто названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найтиссылки началопериодаби началостандартногоинтервала начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода обработкаожидания основнойжурналрасчетов основнойплансчетов основнойязык очиститьокносообщений периодстр получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта префиксавтонумерации пропись пустоезначение разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо симв создатьобъект статусвозврата стрколичествострок сформироватьпозициюдокумента счетпокоду текущеевремя типзначения типзначениястр установитьтана установитьтапо фиксшаблон шаблон ",i="acos asin atan base64значение base64строка cos exp log log10 pow sin sqrt tan xmlзначение xmlстрока xmlтип xmlтипзнч активноеокно безопасныйрежим безопасныйрежимразделенияданных булево ввестидату ввестизначение ввестистроку ввестичисло возможностьчтенияxml вопрос восстановитьзначение врег выгрузитьжурналрегистрации выполнитьобработкуоповещения выполнитьпроверкуправдоступа вычислить год данныеформывзначение дата день деньгода деньнедели добавитьмесяц заблокироватьданныедляредактирования заблокироватьработупользователя завершитьработусистемы загрузитьвнешнююкомпоненту закрытьсправку записатьjson записатьxml записатьдатуjson записьжурналарегистрации заполнитьзначениясвойств запроситьразрешениепользователя запуститьприложение запуститьсистему зафиксироватьтранзакцию значениевданныеформы значениевстрокувнутр значениевфайл значениезаполнено значениеизстрокивнутр значениеизфайла изxmlтипа импортмоделиxdto имякомпьютера имяпользователя инициализироватьпредопределенныеданные информацияобошибке каталогбиблиотекимобильногоустройства каталогвременныхфайлов каталогдокументов каталогпрограммы кодироватьстроку кодлокализацииинформационнойбазы кодсимвола командасистемы конецгода конецдня конецквартала конецмесяца конецминуты конецнедели конецчаса конфигурациябазыданныхизмененадинамически конфигурацияизменена копироватьданныеформы копироватьфайл краткоепредставлениеошибки лев макс местноевремя месяц мин минута монопольныйрежим найти найтинедопустимыесимволыxml найтиокнопонавигационнойссылке найтипомеченныенаудаление найтипоссылкам найтифайлы началогода началодня началоквартала началомесяца началоминуты началонедели началочаса начатьзапросразрешенияпользователя начатьзапускприложения начатькопированиефайла начатьперемещениефайла начатьподключениевнешнейкомпоненты начатьподключениерасширенияработыскриптографией начатьподключениерасширенияработысфайлами начатьпоискфайлов начатьполучениекаталогавременныхфайлов начатьполучениекаталогадокументов начатьполучениерабочегокаталогаданныхпользователя начатьполучениефайлов начатьпомещениефайла начатьпомещениефайлов начатьсозданиедвоичныхданныхизфайла начатьсозданиекаталога начатьтранзакцию начатьудалениефайлов начатьустановкувнешнейкомпоненты начатьустановкурасширенияработыскриптографией начатьустановкурасширенияработысфайлами неделягода необходимостьзавершениясоединения номерсеансаинформационнойбазы номерсоединенияинформационнойбазы нрег нстр обновитьинтерфейс обновитьнумерациюобъектов обновитьповторноиспользуемыезначения обработкапрерыванияпользователя объединитьфайлы окр описаниеошибки оповестить оповеститьобизменении отключитьобработчикзапросанастроекклиенталицензирования отключитьобработчикожидания отключитьобработчикоповещения открытьзначение открытьиндекссправки открытьсодержаниесправки открытьсправку открытьформу открытьформумодально отменитьтранзакцию очиститьжурналрегистрации очиститьнастройкипользователя очиститьсообщения параметрыдоступа перейтипонавигационнойссылке переместитьфайл подключитьвнешнююкомпоненту подключитьобработчикзапросанастроекклиенталицензирования подключитьобработчикожидания подключитьобработчикоповещения подключитьрасширениеработыскриптографией подключитьрасширениеработысфайлами подробноепредставлениеошибки показатьвводдаты показатьвводзначения показатьвводстроки показатьвводчисла показатьвопрос показатьзначение показатьинформациюобошибке показатьнакарте показатьоповещениепользователя показатьпредупреждение полноеимяпользователя получитьcomобъект получитьxmlтип получитьадреспоместоположению получитьблокировкусеансов получитьвремязавершенияспящегосеанса получитьвремязасыпанияпассивногосеанса получитьвремяожиданияблокировкиданных получитьданныевыбора получитьдополнительныйпараметрклиенталицензирования получитьдопустимыекодылокализации получитьдопустимыечасовыепояса получитьзаголовокклиентскогоприложения получитьзаголовоксистемы получитьзначенияотборажурналарегистрации получитьидентификаторконфигурации получитьизвременногохранилища получитьимявременногофайла получитьимяклиенталицензирования получитьинформациюэкрановклиента получитьиспользованиежурналарегистрации получитьиспользованиесобытияжурналарегистрации получитькраткийзаголовокприложения получитьмакетоформления получитьмаскувсефайлы получитьмаскувсефайлыклиента получитьмаскувсефайлысервера получитьместоположениепоадресу получитьминимальнуюдлинупаролейпользователей получитьнавигационнуюссылку получитьнавигационнуюссылкуинформационнойбазы получитьобновлениеконфигурациибазыданных получитьобновлениепредопределенныхданныхинформационнойбазы получитьобщиймакет получитьобщуюформу получитьокна получитьоперативнуюотметкувремени получитьотключениебезопасногорежима получитьпараметрыфункциональныхопцийинтерфейса получитьполноеимяпредопределенногозначения получитьпредставлениянавигационныхссылок получитьпроверкусложностипаролейпользователей получитьразделительпути получитьразделительпутиклиента получитьразделительпутисервера получитьсеансыинформационнойбазы получитьскоростьклиентскогосоединения получитьсоединенияинформационнойбазы получитьсообщенияпользователю получитьсоответствиеобъектаиформы получитьсоставстандартногоинтерфейсаodata получитьструктурухранениябазыданных получитьтекущийсеансинформационнойбазы получитьфайл получитьфайлы получитьформу получитьфункциональнуюопцию получитьфункциональнуюопциюинтерфейса получитьчасовойпоясинформационнойбазы пользователиос поместитьвовременноехранилище поместитьфайл поместитьфайлы прав праводоступа предопределенноезначение представлениекодалокализации представлениепериода представлениеправа представлениеприложения представлениесобытияжурналарегистрации представлениечасовогопояса предупреждение прекратитьработусистемы привилегированныйрежим продолжитьвызов прочитатьjson прочитатьxml прочитатьдатуjson пустаястрока рабочийкаталогданныхпользователя разблокироватьданныедляредактирования разделитьфайл разорватьсоединениесвнешнимисточникомданных раскодироватьстроку рольдоступна секунда сигнал символ скопироватьжурналрегистрации смещениелетнеговремени смещениестандартноговремени соединитьбуферыдвоичныхданных создатькаталог создатьфабрикуxdto сокрл сокрлп сокрп сообщить состояние сохранитьзначение сохранитьнастройкипользователя сред стрдлина стрзаканчиваетсяна стрзаменить стрнайти стрначинаетсяс строка строкасоединенияинформационнойбазы стрполучитьстроку стрразделить стрсоединить стрсравнить стрчисловхождений стрчислострок стршаблон текущаядата текущаядатасеанса текущаяуниверсальнаядата текущаяуниверсальнаядатавмиллисекундах текущийвариантинтерфейсаклиентскогоприложения текущийвариантосновногошрифтаклиентскогоприложения текущийкодлокализации текущийрежимзапуска текущийязык текущийязыксистемы тип типзнч транзакцияактивна трег удалитьданныеинформационнойбазы удалитьизвременногохранилища удалитьобъекты удалитьфайлы универсальноевремя установитьбезопасныйрежим установитьбезопасныйрежимразделенияданных установитьблокировкусеансов установитьвнешнююкомпоненту установитьвремязавершенияспящегосеанса установитьвремязасыпанияпассивногосеанса установитьвремяожиданияблокировкиданных установитьзаголовокклиентскогоприложения установитьзаголовоксистемы установитьиспользованиежурналарегистрации установитьиспользованиесобытияжурналарегистрации установитькраткийзаголовокприложения установитьминимальнуюдлинупаролейпользователей установитьмонопольныйрежим установитьнастройкиклиенталицензирования установитьобновлениепредопределенныхданныхинформационнойбазы установитьотключениебезопасногорежима установитьпараметрыфункциональныхопцийинтерфейса установитьпривилегированныйрежим установитьпроверкусложностипаролейпользователей установитьрасширениеработыскриптографией установитьрасширениеработысфайлами установитьсоединениесвнешнимисточникомданных установитьсоответствиеобъектаиформы установитьсоставстандартногоинтерфейсаodata установитьчасовойпоясинформационнойбазы установитьчасовойпояссеанса формат цел час часовойпояс часовойпояссеанса число числопрописью этоадресвременногохранилища ",c="wsссылки библиотекакартинок библиотекамакетовоформлениякомпоновкиданных библиотекастилей бизнеспроцессы внешниеисточникиданных внешниеобработки внешниеотчеты встроенныепокупки главныйинтерфейс главныйстиль документы доставляемыеуведомления журналыдокументов задачи информацияобинтернетсоединении использованиерабочейдаты историяработыпользователя константы критерииотбора метаданные обработки отображениерекламы отправкадоставляемыхуведомлений отчеты панельзадачос параметрзапуска параметрысеанса перечисления планывидоврасчета планывидовхарактеристик планыобмена планысчетов полнотекстовыйпоиск пользователиинформационнойбазы последовательности проверкавстроенныхпокупок рабочаядата расширенияконфигурации регистрыбухгалтерии регистрынакопления регистрырасчета регистрысведений регламентныезадания сериализаторxdto справочники средствагеопозиционирования средствакриптографии средствамультимедиа средстваотображениярекламы средствапочты средствателефонии фабрикаxdto файловыепотоки фоновыезадания хранилищанастроек хранилищевариантовотчетов хранилищенастроекданныхформ хранилищеобщихнастроек хранилищепользовательскихнастроекдинамическихсписков хранилищепользовательскихнастроекотчетов хранилищесистемныхнастроек ",r=a+d+i+c,p="webцвета windowsцвета windowsшрифты библиотекакартинок рамкистиля символы цветастиля шрифтыстиля ",b="автоматическоесохранениеданныхформывнастройках автонумерациявформе автораздвижениесерий анимациядиаграммы вариантвыравниванияэлементовизаголовков вариантуправлениявысотойтаблицы вертикальнаяпрокруткаформы вертикальноеположение вертикальноеположениеэлемента видгруппыформы виддекорацииформы виддополненияэлементаформы видизмененияданных видкнопкиформы видпереключателя видподписейкдиаграмме видполяформы видфлажка влияниеразмеранапузырекдиаграммы горизонтальноеположение горизонтальноеположениеэлемента группировкаколонок группировкаподчиненныхэлементовформы группыиэлементы действиеперетаскивания дополнительныйрежимотображения допустимыедействияперетаскивания интервалмеждуэлементамиформы использованиевывода использованиеполосыпрокрутки используемоезначениеточкибиржевойдиаграммы историявыборапривводе источникзначенийоситочекдиаграммы источникзначенияразмерапузырькадиаграммы категориягруппыкоманд максимумсерий начальноеотображениедерева начальноеотображениесписка обновлениетекстаредактирования ориентациядендрограммы ориентациядиаграммы ориентацияметокдиаграммы ориентацияметоксводнойдиаграммы ориентацияэлементаформы отображениевдиаграмме отображениевлегендедиаграммы отображениегруппыкнопок отображениезаголовкашкалыдиаграммы отображениезначенийсводнойдиаграммы отображениезначенияизмерительнойдиаграммы отображениеинтерваладиаграммыганта отображениекнопки отображениекнопкивыбора отображениеобсужденийформы отображениеобычнойгруппы отображениеотрицательныхзначенийпузырьковойдиаграммы отображениепанелипоиска отображениеподсказки отображениепредупрежденияприредактировании отображениеразметкиполосырегулирования отображениестраницформы отображениетаблицы отображениетекстазначениядиаграммыганта отображениеуправленияобычнойгруппы отображениефигурыкнопки палитрацветовдиаграммы поведениеобычнойгруппы поддержкамасштабадендрограммы поддержкамасштабадиаграммыганта поддержкамасштабасводнойдиаграммы поисквтаблицепривводе положениезаголовкаэлементаформы положениекартинкикнопкиформы положениекартинкиэлементаграфическойсхемы положениекоманднойпанелиформы положениекоманднойпанелиэлементаформы положениеопорнойточкиотрисовки положениеподписейкдиаграмме положениеподписейшкалызначенийизмерительнойдиаграммы положениесостоянияпросмотра положениестрокипоиска положениетекстасоединительнойлинии положениеуправленияпоиском положениешкалывремени порядокотображенияточекгоризонтальнойгистограммы порядоксерийвлегендедиаграммы размеркартинки расположениезаголовкашкалыдиаграммы растягиваниеповертикалидиаграммыганта режимавтоотображениясостояния режимвводастроктаблицы режимвыборанезаполненного режимвыделениядаты режимвыделениястрокитаблицы режимвыделениятаблицы режимизмененияразмера режимизменениясвязанногозначения режимиспользованиядиалогапечати режимиспользованияпараметракоманды режиммасштабированияпросмотра режимосновногоокнаклиентскогоприложения режимоткрытияокнаформы режимотображениявыделения режимотображениягеографическойсхемы режимотображениязначенийсерии режимотрисовкисеткиграфическойсхемы режимполупрозрачностидиаграммы режимпробеловдиаграммы режимразмещениянастранице режимредактированияколонки режимсглаживаниядиаграммы режимсглаживанияиндикатора режимсписказадач сквозноевыравнивание сохранениеданныхформывнастройках способзаполнениятекстазаголовкашкалыдиаграммы способопределенияограничивающегозначениядиаграммы стандартнаягруппакоманд стандартноеоформление статусоповещенияпользователя стильстрелки типаппроксимациилиниитрендадиаграммы типдиаграммы типединицышкалывремени типимпортасерийслоягеографическойсхемы типлиниигеографическойсхемы типлиниидиаграммы типмаркерагеографическойсхемы типмаркерадиаграммы типобластиоформления типорганизацииисточникаданныхгеографическойсхемы типотображениясериислоягеографическойсхемы типотображенияточечногообъектагеографическойсхемы типотображенияшкалыэлементалегендыгеографическойсхемы типпоискаобъектовгеографическойсхемы типпроекциигеографическойсхемы типразмещенияизмерений типразмещенияреквизитовизмерений типрамкиэлементауправления типсводнойдиаграммы типсвязидиаграммыганта типсоединениязначенийпосериямдиаграммы типсоединенияточекдиаграммы типсоединительнойлинии типстороныэлементаграфическойсхемы типформыотчета типшкалырадарнойдиаграммы факторлиниитрендадиаграммы фигуракнопки фигурыграфическойсхемы фиксациявтаблице форматдняшкалывремени форматкартинки ширинаподчиненныхэлементовформы ",w="виддвижениябухгалтерии виддвижениянакопления видпериодарегистрарасчета видсчета видточкимаршрутабизнеспроцесса использованиеагрегатарегистранакопления использованиегруппиэлементов использованиережимапроведения использованиесреза периодичностьагрегатарегистранакопления режимавтовремя режимзаписидокумента режимпроведениядокумента ",h="авторегистрацияизменений допустимыйномерсообщения отправкаэлементаданных получениеэлементаданных ",j="использованиерасшифровкитабличногодокумента ориентациястраницы положениеитоговколоноксводнойтаблицы положениеитоговстроксводнойтаблицы положениетекстаотносительнокартинки расположениезаголовкагруппировкитабличногодокумента способчтениязначенийтабличногодокумента типдвустороннейпечати типзаполненияобластитабличногодокумента типкурсоровтабличногодокумента типлиниирисункатабличногодокумента типлинииячейкитабличногодокумента типнаправленияпереходатабличногодокумента типотображениявыделениятабличногодокумента типотображениялинийсводнойтаблицы типразмещениятекстатабличногодокумента типрисункатабличногодокумента типсмещениятабличногодокумента типузоратабличногодокумента типфайлатабличногодокумента точностьпечати чередованиерасположениястраниц ",z="отображениевремениэлементовпланировщика ",f="типфайлаформатированногодокумента ",k="обходрезультатазапроса типзаписизапроса ",u="видзаполнениярасшифровкипостроителяотчета типдобавленияпредставлений типизмеренияпостроителяотчета типразмещенияитогов ",y="доступкфайлу режимдиалогавыборафайла режимоткрытияфайла ",N="типизмеренияпостроителязапроса ",g="видданныханализа методкластеризации типединицыинтервалавременианализаданных типзаполнениятаблицырезультатаанализаданных типиспользованиячисловыхзначенийанализаданных типисточникаданныхпоискаассоциаций типколонкианализаданныхдереворешений типколонкианализаданныхкластеризация типколонкианализаданныхобщаястатистика типколонкианализаданныхпоискассоциаций типколонкианализаданныхпоискпоследовательностей типколонкимоделипрогноза типмерырасстоянияанализаданных типотсеченияправилассоциации типполяанализаданных типстандартизациианализаданных типупорядочиванияправилассоциациианализаданных типупорядочиванияшаблоновпоследовательностейанализаданных типупрощениядереварешений ",E="wsнаправлениепараметра вариантxpathxs вариантзаписидатыjson вариантпростоготипаxs видгруппымоделиxs видфасетаxdto действиепостроителяdom завершенностьпростоготипаxs завершенностьсоставноготипаxs завершенностьсхемыxs запрещенныеподстановкиxs исключениягруппподстановкиxs категорияиспользованияатрибутаxs категорияограниченияидентичностиxs категорияограниченияпространствименxs методнаследованияxs модельсодержимогоxs назначениетипаxml недопустимыеподстановкиxs обработкапробельныхсимволовxs обработкасодержимогоxs ограничениезначенияxs параметрыотбораузловdom переносстрокjson позициявдокументеdom пробельныесимволыxml типатрибутаxml типзначенияjson типканоническогоxml типкомпонентыxs типпроверкиxml типрезультатаdomxpath типузлаdom типузлаxml формаxml формапредставленияxs форматдатыjson экранированиесимволовjson ",M="видсравнениякомпоновкиданных действиеобработкирасшифровкикомпоновкиданных направлениесортировкикомпоновкиданных расположениевложенныхэлементоврезультатакомпоновкиданных расположениеитоговкомпоновкиданных расположениегруппировкикомпоновкиданных расположениеполейгруппировкикомпоновкиданных расположениеполякомпоновкиданных расположениереквизитовкомпоновкиданных расположениересурсовкомпоновкиданных типбухгалтерскогоостаткакомпоновкиданных типвыводатекстакомпоновкиданных типгруппировкикомпоновкиданных типгруппыэлементовотборакомпоновкиданных типдополненияпериодакомпоновкиданных типзаголовкаполейкомпоновкиданных типмакетагруппировкикомпоновкиданных типмакетаобластикомпоновкиданных типостаткакомпоновкиданных типпериодакомпоновкиданных типразмещениятекстакомпоновкиданных типсвязинаборовданныхкомпоновкиданных типэлементарезультатакомпоновкиданных расположениелегендыдиаграммыкомпоновкиданных типпримененияотборакомпоновкиданных режимотображенияэлементанастройкикомпоновкиданных режимотображениянастроеккомпоновкиданных состояниеэлементанастройкикомпоновкиданных способвосстановлениянастроеккомпоновкиданных режимкомпоновкирезультата использованиепараметракомпоновкиданных автопозицияресурсовкомпоновкиданных вариантиспользованиягруппировкикомпоновкиданных расположениересурсоввдиаграммекомпоновкиданных фиксациякомпоновкиданных использованиеусловногооформлениякомпоновкиданных ",_="важностьинтернетпочтовогосообщения обработкатекстаинтернетпочтовогосообщения способкодированияинтернетпочтовоговложения способкодированиянеasciiсимволовинтернетпочтовогосообщения типтекстапочтовогосообщения протоколинтернетпочты статусразборапочтовогосообщения ",v="режимтранзакциизаписижурналарегистрации статустранзакциизаписижурналарегистрации уровеньжурналарегистрации ",A="расположениехранилищасертификатовкриптографии режимвключениясертификатовкриптографии режимпроверкисертификатакриптографии типхранилищасертификатовкриптографии ",C="кодировкаименфайловвzipфайле методсжатияzip методшифрованияzip режимвосстановленияпутейфайловzip режимобработкиподкаталоговzip режимсохраненияпутейzip уровеньсжатияzip ",L="звуковоеоповещение направлениепереходакстроке позициявпотоке порядокбайтов режимблокировкиданных режимуправленияблокировкойданных сервисвстроенныхпокупок состояниефоновогозадания типподписчикадоставляемыхуведомлений уровеньиспользованиязащищенногосоединенияftp ",Z="направлениепорядкасхемызапроса типдополненияпериодамисхемызапроса типконтрольнойточкисхемызапроса типобъединениясхемызапроса типпараметрадоступнойтаблицысхемызапроса типсоединениясхемызапроса ",$="httpметод автоиспользованиеобщегореквизита автопрефиксномеразадачи вариантвстроенногоязыка видиерархии видрегистранакопления видтаблицывнешнегоисточникаданных записьдвиженийприпроведении заполнениепоследовательностей индексирование использованиебазыпланавидоврасчета использованиебыстроговыбора использованиеобщегореквизита использованиеподчинения использованиеполнотекстовогопоиска использованиеразделяемыхданныхобщегореквизита использованиереквизита назначениеиспользованияприложения назначениерасширенияконфигурации направлениепередачи обновлениепредопределенныхданных оперативноепроведение основноепредставлениевидарасчета основноепредставлениевидахарактеристики основноепредставлениезадачи основноепредставлениепланаобмена основноепредставлениесправочника основноепредставлениесчета перемещениеграницыприпроведении периодичностьномерабизнеспроцесса периодичностьномерадокумента периодичностьрегистрарасчета периодичностьрегистрасведений повторноеиспользованиевозвращаемыхзначений полнотекстовыйпоискпривводепостроке принадлежностьобъекта проведение разделениеаутентификацииобщегореквизита разделениеданныхобщегореквизита разделениерасширенийконфигурацииобщегореквизита режимавтонумерацииобъектов режимзаписирегистра режимиспользованиямодальности режимиспользованиясинхронныхвызововрасширенийплатформыивнешнихкомпонент режимповторногоиспользованиясеансов режимполученияданныхвыборапривводепостроке режимсовместимости режимсовместимостиинтерфейса режимуправленияблокировкойданныхпоумолчанию сериикодовпланавидовхарактеристик сериикодовпланасчетов сериикодовсправочника созданиепривводе способвыбора способпоискастрокипривводепостроке способредактирования типданныхтаблицывнешнегоисточникаданных типкодапланавидоврасчета типкодасправочника типмакета типномерабизнеспроцесса типномерадокумента типномеразадачи типформы удалениедвижений ",q="важностьпроблемыприменениярасширенияконфигурации вариантинтерфейсаклиентскогоприложения вариантмасштабаформклиентскогоприложения вариантосновногошрифтаклиентскогоприложения вариантстандартногопериода вариантстандартнойдатыначала видграницы видкартинки видотображенияполнотекстовогопоиска видрамки видсравнения видцвета видчисловогозначения видшрифта допустимаядлина допустимыйзнак использованиеbyteordermark использованиеметаданныхполнотекстовогопоиска источникрасширенийконфигурации клавиша кодвозвратадиалога кодировкаxbase кодировкатекста направлениепоиска направлениесортировки обновлениепредопределенныхданных обновлениеприизмененииданных отображениепанелиразделов проверказаполнения режимдиалогавопрос режимзапускаклиентскогоприложения режимокругления режимоткрытияформприложения режимполнотекстовогопоиска скоростьклиентскогосоединения состояниевнешнегоисточникаданных состояниеобновленияконфигурациибазыданных способвыборасертификатаwindows способкодированиястроки статуссообщения типвнешнейкомпоненты типплатформы типповеденияклавишиenter типэлементаинформацииовыполненииобновленияконфигурациибазыданных уровеньизоляциитранзакций хешфункция частидаты",B=p+b+w+h+j+z+f+k+u+y+N+g+E+M+_+v+A+C+L+Z+$+q,I="comобъект ftpсоединение httpзапрос httpсервисответ httpсоединение wsопределения wsпрокси xbase анализданных аннотацияxs блокировкаданных буфердвоичныхданных включениеxs выражениекомпоновкиданных генераторслучайныхчисел географическаясхема географическиекоординаты графическаясхема группамоделиxs данныерасшифровкикомпоновкиданных двоичныеданные дендрограмма диаграмма диаграммаганта диалогвыборафайла диалогвыборацвета диалогвыборашрифта диалограсписаниярегламентногозадания диалогредактированиястандартногопериода диапазон документdom документhtml документацияxs доставляемоеуведомление записьdom записьfastinfoset записьhtml записьjson записьxml записьzipфайла записьданных записьтекста записьузловdom запрос защищенноесоединениеopenssl значенияполейрасшифровкикомпоновкиданных извлечениетекста импортxs интернетпочта интернетпочтовоесообщение интернетпочтовыйпрофиль интернетпрокси интернетсоединение информациядляприложенияxs использованиеатрибутаxs использованиесобытияжурналарегистрации источникдоступныхнастроеккомпоновкиданных итераторузловdom картинка квалификаторыдаты квалификаторыдвоичныхданных квалификаторыстроки квалификаторычисла компоновщикмакетакомпоновкиданных компоновщикнастроеккомпоновкиданных конструктормакетаоформлениякомпоновкиданных конструкторнастроеккомпоновкиданных конструкторформатнойстроки линия макеткомпоновкиданных макетобластикомпоновкиданных макетоформлениякомпоновкиданных маскаxs менеджеркриптографии наборсхемxml настройкикомпоновкиданных настройкисериализацииjson обработкакартинок обработкарасшифровкикомпоновкиданных обходдереваdom объявлениеатрибутаxs объявлениенотацииxs объявлениеэлементаxs описаниеиспользованиясобытиядоступжурналарегистрации описаниеиспользованиясобытияотказвдоступежурналарегистрации описаниеобработкирасшифровкикомпоновкиданных описаниепередаваемогофайла описаниетипов определениегруппыатрибутовxs определениегруппымоделиxs определениеограниченияидентичностиxs определениепростоготипаxs определениесоставноготипаxs определениетипадокументаdom определенияxpathxs отборкомпоновкиданных пакетотображаемыхдокументов параметрвыбора параметркомпоновкиданных параметрызаписиjson параметрызаписиxml параметрычтенияxml переопределениеxs планировщик полеанализаданных полекомпоновкиданных построительdom построительзапроса построительотчета построительотчетаанализаданных построительсхемxml поток потоквпамяти почта почтовоесообщение преобразованиеxsl преобразованиекканоническомуxml процессорвыводарезультатакомпоновкиданныхвколлекциюзначений процессорвыводарезультатакомпоновкиданныхвтабличныйдокумент процессоркомпоновкиданных разыменовательпространствименdom рамка расписаниерегламентногозадания расширенноеимяxml результатчтенияданных своднаядиаграмма связьпараметравыбора связьпотипу связьпотипукомпоновкиданных сериализаторxdto сертификатклиентаwindows сертификатклиентафайл сертификаткриптографии сертификатыудостоверяющихцентровwindows сертификатыудостоверяющихцентровфайл сжатиеданных системнаяинформация сообщениепользователю сочетаниеклавиш сравнениезначений стандартнаядатаначала стандартныйпериод схемаxml схемакомпоновкиданных табличныйдокумент текстовыйдокумент тестируемоеприложение типданныхxml уникальныйидентификатор фабрикаxdto файл файловыйпоток фасетдлиныxs фасетколичестваразрядовдробнойчастиxs фасетмаксимальноговключающегозначенияxs фасетмаксимальногоисключающегозначенияxs фасетмаксимальнойдлиныxs фасетминимальноговключающегозначенияxs фасетминимальногоисключающегозначенияxs фасетминимальнойдлиныxs фасетобразцаxs фасетобщегоколичестваразрядовxs фасетперечисленияxs фасетпробельныхсимволовxs фильтрузловdom форматированнаястрока форматированныйдокумент фрагментxs хешированиеданных хранилищезначения цвет чтениеfastinfoset чтениеhtml чтениеjson чтениеxml чтениеzipфайла чтениеданных чтениетекста чтениеузловdom шрифт элементрезультатакомпоновкиданных ",P="comsafearray деревозначений массив соответствие списокзначений структура таблицазначений фиксированнаяструктура фиксированноесоответствие фиксированныймассив ",T=I+P,W="null истина ложь неопределено",D=s.inherit(s.NM),F={cN:"string",b:'"|\\|',e:'"|$',c:[{b:'""'}]},G={b:"'",e:"'",eB:!0,eE:!0,c:[{cN:"number",b:"\\d{4}([\\.\\\\/:-]?\\d{2}){0,5}"}]},H=s.inherit(s.CLCM),J={cN:"meta",l:x,b:"#|&",e:"$",k:{"meta-keyword":t+n},c:[H]},K={cN:"symbol",b:"~",e:";|:",eE:!0},O={cN:"function",l:x,v:[{b:"процедура|функция",e:"\\)",k:"процедура функция"},{b:"конецпроцедуры|конецфункции",k:"конецпроцедуры конецфункции"}],c:[{b:"\\(",e:"\\)",endsParent:!0,c:[{cN:"params",l:x,b:x,e:",",eE:!0,eW:!0,k:{keyword:"знач",literal:W},c:[D,F,G]},H]},s.inherit(s.TM,{b:x})]};return{cI:!0,l:x,k:{keyword:t,built_in:r,"class":B,type:T,literal:W},c:[J,O,H,K,D,F,G]}}); \ No newline at end of file diff --git a/src/ASPNETHandler/DemoApp/home.png b/src/ASPNETHandler/DemoApp/home.png deleted file mode 100644 index a1686704c..000000000 Binary files a/src/ASPNETHandler/DemoApp/home.png and /dev/null differ diff --git a/src/ASPNETHandler/DemoApp/source.ospt b/src/ASPNETHandler/DemoApp/source.ospt deleted file mode 100644 index 4d9ce78fb..000000000 --- a/src/ASPNETHandler/DemoApp/source.ospt +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - OneScript HTTP Service Test Page - - - - - - - - -
- - Go to W3Schools! - -
-

-            {SourceCode}
-        
- - - \ No newline at end of file diff --git a/src/ASPNETHandler/DemoApp/styles/agate.css b/src/ASPNETHandler/DemoApp/styles/agate.css deleted file mode 100644 index 8d64547c5..000000000 --- a/src/ASPNETHandler/DemoApp/styles/agate.css +++ /dev/null @@ -1,108 +0,0 @@ -/*! - * Agate by Taufik Nurrohman - * ---------------------------------------------------- - * - * #ade5fc - * #a2fca2 - * #c6b4f0 - * #d36363 - * #fcc28c - * #fc9b9b - * #ffa - * #fff - * #333 - * #62c8f3 - * #888 - * - */ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #333; - color: white; -} - -.hljs-name, -.hljs-strong { - font-weight: bold; -} - -.hljs-code, -.hljs-emphasis { - font-style: italic; -} - -.hljs-tag { - color: #62c8f3; -} - -.hljs-variable, -.hljs-template-variable, -.hljs-selector-id, -.hljs-selector-class { - color: #ade5fc; -} - -.hljs-string, -.hljs-bullet { - color: #a2fca2; -} - -.hljs-type, -.hljs-title, -.hljs-section, -.hljs-attribute, -.hljs-quote, -.hljs-built_in, -.hljs-builtin-name { - color: #ffa; -} - -.hljs-number, -.hljs-symbol, -.hljs-bullet { - color: #d36363; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal { - color: #fcc28c; -} - -.hljs-comment, -.hljs-deletion, -.hljs-code { - color: #888; -} - -.hljs-regexp, -.hljs-link { - color: #c6b4f0; -} - -.hljs-meta { - color: #fc9b9b; -} - -.hljs-deletion { - background-color: #fc9b9b; - color: #333; -} - -.hljs-addition { - background-color: #a2fca2; - color: #333; -} - -.hljs a { - color: inherit; -} - -.hljs a:focus, -.hljs a:hover { - color: inherit; - text-decoration: underline; -} diff --git a/src/ASPNETHandler/DemoApp/styles/androidstudio.css b/src/ASPNETHandler/DemoApp/styles/androidstudio.css deleted file mode 100644 index bc8e473b5..000000000 --- a/src/ASPNETHandler/DemoApp/styles/androidstudio.css +++ /dev/null @@ -1,66 +0,0 @@ -/* -Date: 24 Fev 2015 -Author: Pedro Oliveira -*/ - -.hljs { - color: #a9b7c6; - background: #282b2e; - display: block; - overflow-x: auto; - padding: 0.5em; -} - -.hljs-number, -.hljs-literal, -.hljs-symbol, -.hljs-bullet { - color: #6897BB; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-deletion { - color: #cc7832; -} - -.hljs-variable, -.hljs-template-variable, -.hljs-link { - color: #629755; -} - -.hljs-comment, -.hljs-quote { - color: #808080; -} - -.hljs-meta { - color: #bbb529; -} - -.hljs-string, -.hljs-attribute, -.hljs-addition { - color: #6A8759; -} - -.hljs-section, -.hljs-title, -.hljs-type { - color: #ffc66d; -} - -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #e8bf6a; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/arduino-light.css b/src/ASPNETHandler/DemoApp/styles/arduino-light.css deleted file mode 100644 index 4b8b7fd3c..000000000 --- a/src/ASPNETHandler/DemoApp/styles/arduino-light.css +++ /dev/null @@ -1,88 +0,0 @@ -/* - -Arduino® Light Theme - Stefania Mellai - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #FFFFFF; -} - -.hljs, -.hljs-subst { - color: #434f54; -} - -.hljs-keyword, -.hljs-attribute, -.hljs-selector-tag, -.hljs-doctag, -.hljs-name { - color: #00979D; -} - -.hljs-built_in, -.hljs-literal, -.hljs-bullet, -.hljs-code, -.hljs-addition { - color: #D35400; -} - -.hljs-regexp, -.hljs-symbol, -.hljs-variable, -.hljs-template-variable, -.hljs-link, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #00979D; -} - -.hljs-type, -.hljs-string, -.hljs-selector-id, -.hljs-selector-class, -.hljs-quote, -.hljs-template-tag, -.hljs-deletion { - color: #005C5F; -} - -.hljs-title, -.hljs-section { - color: #880000; - font-weight: bold; -} - -.hljs-comment { - color: rgba(149,165,166,.8); -} - -.hljs-meta-keyword { - color: #728E00; -} - -.hljs-meta { - color: #728E00; - color: #434f54; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-function { - color: #728E00; -} - -.hljs-number { - color: #8A7B52; -} diff --git a/src/ASPNETHandler/DemoApp/styles/arta.css b/src/ASPNETHandler/DemoApp/styles/arta.css deleted file mode 100644 index 75ef3a9e5..000000000 --- a/src/ASPNETHandler/DemoApp/styles/arta.css +++ /dev/null @@ -1,73 +0,0 @@ -/* -Date: 17.V.2011 -Author: pumbur -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #222; -} - -.hljs, -.hljs-subst { - color: #aaa; -} - -.hljs-section { - color: #fff; -} - -.hljs-comment, -.hljs-quote, -.hljs-meta { - color: #444; -} - -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-regexp { - color: #ffcc33; -} - -.hljs-number, -.hljs-addition { - color: #00cc66; -} - -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-template-variable, -.hljs-attribute, -.hljs-link { - color: #32aaee; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #6644aa; -} - -.hljs-title, -.hljs-variable, -.hljs-deletion, -.hljs-template-tag { - color: #bb1166; -} - -.hljs-section, -.hljs-doctag, -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/ascetic.css b/src/ASPNETHandler/DemoApp/styles/ascetic.css deleted file mode 100644 index 48397e889..000000000 --- a/src/ASPNETHandler/DemoApp/styles/ascetic.css +++ /dev/null @@ -1,45 +0,0 @@ -/* - -Original style from softwaremaniacs.org (c) Ivan Sagalaev - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: white; - color: black; -} - -.hljs-string, -.hljs-variable, -.hljs-template-variable, -.hljs-symbol, -.hljs-bullet, -.hljs-section, -.hljs-addition, -.hljs-attribute, -.hljs-link { - color: #888; -} - -.hljs-comment, -.hljs-quote, -.hljs-meta, -.hljs-deletion { - color: #ccc; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-section, -.hljs-name, -.hljs-type, -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-cave-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-cave-dark.css deleted file mode 100644 index 65428f3b1..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-cave-dark.css +++ /dev/null @@ -1,83 +0,0 @@ -/* Base16 Atelier Cave Dark - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Cave Comment */ -.hljs-comment, -.hljs-quote { - color: #7e7887; -} - -/* Atelier-Cave Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-regexp, -.hljs-link, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #be4678; -} - -/* Atelier-Cave Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #aa573c; -} - -/* Atelier-Cave Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #2a9292; -} - -/* Atelier-Cave Blue */ -.hljs-title, -.hljs-section { - color: #576ddb; -} - -/* Atelier-Cave Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #955ae7; -} - -.hljs-deletion, -.hljs-addition { - color: #19171c; - display: inline-block; - width: 100%; -} - -.hljs-deletion { - background-color: #be4678; -} - -.hljs-addition { - background-color: #2a9292; -} - -.hljs { - display: block; - overflow-x: auto; - background: #19171c; - color: #8b8792; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-cave-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-cave-light.css deleted file mode 100644 index b419f9fd8..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-cave-light.css +++ /dev/null @@ -1,85 +0,0 @@ -/* Base16 Atelier Cave Light - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Cave Comment */ -.hljs-comment, -.hljs-quote { - color: #655f6d; -} - -/* Atelier-Cave Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #be4678; -} - -/* Atelier-Cave Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #aa573c; -} - -/* Atelier-Cave Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #2a9292; -} - -/* Atelier-Cave Blue */ -.hljs-title, -.hljs-section { - color: #576ddb; -} - -/* Atelier-Cave Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #955ae7; -} - -.hljs-deletion, -.hljs-addition { - color: #19171c; - display: inline-block; - width: 100%; -} - -.hljs-deletion { - background-color: #be4678; -} - -.hljs-addition { - background-color: #2a9292; -} - -.hljs { - display: block; - overflow-x: auto; - background: #efecf4; - color: #585260; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-dune-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-dune-dark.css deleted file mode 100644 index 1684f5225..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-dune-dark.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Dune Dark - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Dune Comment */ -.hljs-comment, -.hljs-quote { - color: #999580; -} - -/* Atelier-Dune Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #d73737; -} - -/* Atelier-Dune Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #b65611; -} - -/* Atelier-Dune Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #60ac39; -} - -/* Atelier-Dune Blue */ -.hljs-title, -.hljs-section { - color: #6684e1; -} - -/* Atelier-Dune Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #b854d4; -} - -.hljs { - display: block; - overflow-x: auto; - background: #20201d; - color: #a6a28c; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-dune-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-dune-light.css deleted file mode 100644 index 547719de8..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-dune-light.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Dune Light - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Dune Comment */ -.hljs-comment, -.hljs-quote { - color: #7d7a68; -} - -/* Atelier-Dune Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #d73737; -} - -/* Atelier-Dune Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #b65611; -} - -/* Atelier-Dune Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #60ac39; -} - -/* Atelier-Dune Blue */ -.hljs-title, -.hljs-section { - color: #6684e1; -} - -/* Atelier-Dune Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #b854d4; -} - -.hljs { - display: block; - overflow-x: auto; - background: #fefbec; - color: #6e6b5e; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-estuary-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-estuary-dark.css deleted file mode 100644 index a5e507187..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-estuary-dark.css +++ /dev/null @@ -1,84 +0,0 @@ -/* Base16 Atelier Estuary Dark - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Estuary Comment */ -.hljs-comment, -.hljs-quote { - color: #878573; -} - -/* Atelier-Estuary Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #ba6236; -} - -/* Atelier-Estuary Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #ae7313; -} - -/* Atelier-Estuary Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #7d9726; -} - -/* Atelier-Estuary Blue */ -.hljs-title, -.hljs-section { - color: #36a166; -} - -/* Atelier-Estuary Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #5f9182; -} - -.hljs-deletion, -.hljs-addition { - color: #22221b; - display: inline-block; - width: 100%; -} - -.hljs-deletion { - background-color: #ba6236; -} - -.hljs-addition { - background-color: #7d9726; -} - -.hljs { - display: block; - overflow-x: auto; - background: #22221b; - color: #929181; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-estuary-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-estuary-light.css deleted file mode 100644 index 1daee5d98..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-estuary-light.css +++ /dev/null @@ -1,84 +0,0 @@ -/* Base16 Atelier Estuary Light - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Estuary Comment */ -.hljs-comment, -.hljs-quote { - color: #6c6b5a; -} - -/* Atelier-Estuary Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #ba6236; -} - -/* Atelier-Estuary Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #ae7313; -} - -/* Atelier-Estuary Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #7d9726; -} - -/* Atelier-Estuary Blue */ -.hljs-title, -.hljs-section { - color: #36a166; -} - -/* Atelier-Estuary Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #5f9182; -} - -.hljs-deletion, -.hljs-addition { - color: #22221b; - display: inline-block; - width: 100%; -} - -.hljs-deletion { - background-color: #ba6236; -} - -.hljs-addition { - background-color: #7d9726; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f4f3ec; - color: #5f5e4e; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-forest-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-forest-dark.css deleted file mode 100644 index 0ef4fae31..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-forest-dark.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Forest Dark - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Forest Comment */ -.hljs-comment, -.hljs-quote { - color: #9c9491; -} - -/* Atelier-Forest Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #f22c40; -} - -/* Atelier-Forest Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #df5320; -} - -/* Atelier-Forest Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #7b9726; -} - -/* Atelier-Forest Blue */ -.hljs-title, -.hljs-section { - color: #407ee7; -} - -/* Atelier-Forest Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #6666ea; -} - -.hljs { - display: block; - overflow-x: auto; - background: #1b1918; - color: #a8a19f; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-forest-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-forest-light.css deleted file mode 100644 index bbedde18a..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-forest-light.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Forest Light - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Forest Comment */ -.hljs-comment, -.hljs-quote { - color: #766e6b; -} - -/* Atelier-Forest Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #f22c40; -} - -/* Atelier-Forest Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #df5320; -} - -/* Atelier-Forest Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #7b9726; -} - -/* Atelier-Forest Blue */ -.hljs-title, -.hljs-section { - color: #407ee7; -} - -/* Atelier-Forest Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #6666ea; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f1efee; - color: #68615e; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-heath-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-heath-dark.css deleted file mode 100644 index fe01ff721..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-heath-dark.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Heath Dark - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Heath Comment */ -.hljs-comment, -.hljs-quote { - color: #9e8f9e; -} - -/* Atelier-Heath Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #ca402b; -} - -/* Atelier-Heath Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #a65926; -} - -/* Atelier-Heath Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #918b3b; -} - -/* Atelier-Heath Blue */ -.hljs-title, -.hljs-section { - color: #516aec; -} - -/* Atelier-Heath Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #7b59c0; -} - -.hljs { - display: block; - overflow-x: auto; - background: #1b181b; - color: #ab9bab; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-heath-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-heath-light.css deleted file mode 100644 index ee43786d1..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-heath-light.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Heath Light - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Heath Comment */ -.hljs-comment, -.hljs-quote { - color: #776977; -} - -/* Atelier-Heath Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #ca402b; -} - -/* Atelier-Heath Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #a65926; -} - -/* Atelier-Heath Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #918b3b; -} - -/* Atelier-Heath Blue */ -.hljs-title, -.hljs-section { - color: #516aec; -} - -/* Atelier-Heath Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #7b59c0; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f7f3f7; - color: #695d69; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-dark.css deleted file mode 100644 index a937d3bf5..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-dark.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Lakeside Dark - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Lakeside Comment */ -.hljs-comment, -.hljs-quote { - color: #7195a8; -} - -/* Atelier-Lakeside Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #d22d72; -} - -/* Atelier-Lakeside Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #935c25; -} - -/* Atelier-Lakeside Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #568c3b; -} - -/* Atelier-Lakeside Blue */ -.hljs-title, -.hljs-section { - color: #257fad; -} - -/* Atelier-Lakeside Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #6b6bb8; -} - -.hljs { - display: block; - overflow-x: auto; - background: #161b1d; - color: #7ea2b4; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-light.css deleted file mode 100644 index 6c7e8f9ef..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-light.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Lakeside Light - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Lakeside Comment */ -.hljs-comment, -.hljs-quote { - color: #5a7b8c; -} - -/* Atelier-Lakeside Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #d22d72; -} - -/* Atelier-Lakeside Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #935c25; -} - -/* Atelier-Lakeside Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #568c3b; -} - -/* Atelier-Lakeside Blue */ -.hljs-title, -.hljs-section { - color: #257fad; -} - -/* Atelier-Lakeside Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #6b6bb8; -} - -.hljs { - display: block; - overflow-x: auto; - background: #ebf8ff; - color: #516d7b; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-plateau-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-plateau-dark.css deleted file mode 100644 index 3bb052693..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-plateau-dark.css +++ /dev/null @@ -1,84 +0,0 @@ -/* Base16 Atelier Plateau Dark - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Plateau Comment */ -.hljs-comment, -.hljs-quote { - color: #7e7777; -} - -/* Atelier-Plateau Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #ca4949; -} - -/* Atelier-Plateau Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #b45a3c; -} - -/* Atelier-Plateau Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #4b8b8b; -} - -/* Atelier-Plateau Blue */ -.hljs-title, -.hljs-section { - color: #7272ca; -} - -/* Atelier-Plateau Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #8464c4; -} - -.hljs-deletion, -.hljs-addition { - color: #1b1818; - display: inline-block; - width: 100%; -} - -.hljs-deletion { - background-color: #ca4949; -} - -.hljs-addition { - background-color: #4b8b8b; -} - -.hljs { - display: block; - overflow-x: auto; - background: #1b1818; - color: #8a8585; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-plateau-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-plateau-light.css deleted file mode 100644 index 5f0222bec..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-plateau-light.css +++ /dev/null @@ -1,84 +0,0 @@ -/* Base16 Atelier Plateau Light - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Plateau Comment */ -.hljs-comment, -.hljs-quote { - color: #655d5d; -} - -/* Atelier-Plateau Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #ca4949; -} - -/* Atelier-Plateau Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #b45a3c; -} - -/* Atelier-Plateau Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #4b8b8b; -} - -/* Atelier-Plateau Blue */ -.hljs-title, -.hljs-section { - color: #7272ca; -} - -/* Atelier-Plateau Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #8464c4; -} - -.hljs-deletion, -.hljs-addition { - color: #1b1818; - display: inline-block; - width: 100%; -} - -.hljs-deletion { - background-color: #ca4949; -} - -.hljs-addition { - background-color: #4b8b8b; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f4ecec; - color: #585050; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-savanna-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-savanna-dark.css deleted file mode 100644 index 38f831431..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-savanna-dark.css +++ /dev/null @@ -1,84 +0,0 @@ -/* Base16 Atelier Savanna Dark - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Savanna Comment */ -.hljs-comment, -.hljs-quote { - color: #78877d; -} - -/* Atelier-Savanna Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #b16139; -} - -/* Atelier-Savanna Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #9f713c; -} - -/* Atelier-Savanna Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #489963; -} - -/* Atelier-Savanna Blue */ -.hljs-title, -.hljs-section { - color: #478c90; -} - -/* Atelier-Savanna Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #55859b; -} - -.hljs-deletion, -.hljs-addition { - color: #171c19; - display: inline-block; - width: 100%; -} - -.hljs-deletion { - background-color: #b16139; -} - -.hljs-addition { - background-color: #489963; -} - -.hljs { - display: block; - overflow-x: auto; - background: #171c19; - color: #87928a; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-savanna-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-savanna-light.css deleted file mode 100644 index 1ccd7c685..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-savanna-light.css +++ /dev/null @@ -1,84 +0,0 @@ -/* Base16 Atelier Savanna Light - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Savanna Comment */ -.hljs-comment, -.hljs-quote { - color: #5f6d64; -} - -/* Atelier-Savanna Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #b16139; -} - -/* Atelier-Savanna Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #9f713c; -} - -/* Atelier-Savanna Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #489963; -} - -/* Atelier-Savanna Blue */ -.hljs-title, -.hljs-section { - color: #478c90; -} - -/* Atelier-Savanna Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #55859b; -} - -.hljs-deletion, -.hljs-addition { - color: #171c19; - display: inline-block; - width: 100%; -} - -.hljs-deletion { - background-color: #b16139; -} - -.hljs-addition { - background-color: #489963; -} - -.hljs { - display: block; - overflow-x: auto; - background: #ecf4ee; - color: #526057; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-seaside-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-seaside-dark.css deleted file mode 100644 index df29949c6..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-seaside-dark.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Seaside Dark - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Seaside Comment */ -.hljs-comment, -.hljs-quote { - color: #809980; -} - -/* Atelier-Seaside Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #e6193c; -} - -/* Atelier-Seaside Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #87711d; -} - -/* Atelier-Seaside Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #29a329; -} - -/* Atelier-Seaside Blue */ -.hljs-title, -.hljs-section { - color: #3d62f5; -} - -/* Atelier-Seaside Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #ad2bee; -} - -.hljs { - display: block; - overflow-x: auto; - background: #131513; - color: #8ca68c; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-seaside-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-seaside-light.css deleted file mode 100644 index 9d960f29f..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-seaside-light.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Seaside Light - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Seaside Comment */ -.hljs-comment, -.hljs-quote { - color: #687d68; -} - -/* Atelier-Seaside Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #e6193c; -} - -/* Atelier-Seaside Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #87711d; -} - -/* Atelier-Seaside Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #29a329; -} - -/* Atelier-Seaside Blue */ -.hljs-title, -.hljs-section { - color: #3d62f5; -} - -/* Atelier-Seaside Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #ad2bee; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f4fbf4; - color: #5e6e5e; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-dark.css deleted file mode 100644 index c2ab7938d..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-dark.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Sulphurpool Dark - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Sulphurpool Comment */ -.hljs-comment, -.hljs-quote { - color: #898ea4; -} - -/* Atelier-Sulphurpool Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #c94922; -} - -/* Atelier-Sulphurpool Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #c76b29; -} - -/* Atelier-Sulphurpool Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #ac9739; -} - -/* Atelier-Sulphurpool Blue */ -.hljs-title, -.hljs-section { - color: #3d8fd1; -} - -/* Atelier-Sulphurpool Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #6679cc; -} - -.hljs { - display: block; - overflow-x: auto; - background: #202746; - color: #979db4; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-light.css deleted file mode 100644 index 96c47d086..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-light.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Sulphurpool Light - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Sulphurpool Comment */ -.hljs-comment, -.hljs-quote { - color: #6b7394; -} - -/* Atelier-Sulphurpool Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #c94922; -} - -/* Atelier-Sulphurpool Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #c76b29; -} - -/* Atelier-Sulphurpool Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #ac9739; -} - -/* Atelier-Sulphurpool Blue */ -.hljs-title, -.hljs-section { - color: #3d8fd1; -} - -/* Atelier-Sulphurpool Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #6679cc; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f5f7ff; - color: #5e6687; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atom-one-dark.css b/src/ASPNETHandler/DemoApp/styles/atom-one-dark.css deleted file mode 100644 index 1616aafe3..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atom-one-dark.css +++ /dev/null @@ -1,96 +0,0 @@ -/* - -Atom One Dark by Daniel Gamage -Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax - -base: #282c34 -mono-1: #abb2bf -mono-2: #818896 -mono-3: #5c6370 -hue-1: #56b6c2 -hue-2: #61aeee -hue-3: #c678dd -hue-4: #98c379 -hue-5: #e06c75 -hue-5-2: #be5046 -hue-6: #d19a66 -hue-6-2: #e6c07b - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #abb2bf; - background: #282c34; -} - -.hljs-comment, -.hljs-quote { - color: #5c6370; - font-style: italic; -} - -.hljs-doctag, -.hljs-keyword, -.hljs-formula { - color: #c678dd; -} - -.hljs-section, -.hljs-name, -.hljs-selector-tag, -.hljs-deletion, -.hljs-subst { - color: #e06c75; -} - -.hljs-literal { - color: #56b6c2; -} - -.hljs-string, -.hljs-regexp, -.hljs-addition, -.hljs-attribute, -.hljs-meta-string { - color: #98c379; -} - -.hljs-built_in, -.hljs-class .hljs-title { - color: #e6c07b; -} - -.hljs-attr, -.hljs-variable, -.hljs-template-variable, -.hljs-type, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-number { - color: #d19a66; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-link, -.hljs-meta, -.hljs-selector-id, -.hljs-title { - color: #61aeee; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-link { - text-decoration: underline; -} diff --git a/src/ASPNETHandler/DemoApp/styles/atom-one-light.css b/src/ASPNETHandler/DemoApp/styles/atom-one-light.css deleted file mode 100644 index d5bd1d2a9..000000000 --- a/src/ASPNETHandler/DemoApp/styles/atom-one-light.css +++ /dev/null @@ -1,96 +0,0 @@ -/* - -Atom One Light by Daniel Gamage -Original One Light Syntax theme from https://github.com/atom/one-light-syntax - -base: #fafafa -mono-1: #383a42 -mono-2: #686b77 -mono-3: #a0a1a7 -hue-1: #0184bb -hue-2: #4078f2 -hue-3: #a626a4 -hue-4: #50a14f -hue-5: #e45649 -hue-5-2: #c91243 -hue-6: #986801 -hue-6-2: #c18401 - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #383a42; - background: #fafafa; -} - -.hljs-comment, -.hljs-quote { - color: #a0a1a7; - font-style: italic; -} - -.hljs-doctag, -.hljs-keyword, -.hljs-formula { - color: #a626a4; -} - -.hljs-section, -.hljs-name, -.hljs-selector-tag, -.hljs-deletion, -.hljs-subst { - color: #e45649; -} - -.hljs-literal { - color: #0184bb; -} - -.hljs-string, -.hljs-regexp, -.hljs-addition, -.hljs-attribute, -.hljs-meta-string { - color: #50a14f; -} - -.hljs-built_in, -.hljs-class .hljs-title { - color: #c18401; -} - -.hljs-attr, -.hljs-variable, -.hljs-template-variable, -.hljs-type, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-number { - color: #986801; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-link, -.hljs-meta, -.hljs-selector-id, -.hljs-title { - color: #4078f2; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-link { - text-decoration: underline; -} diff --git a/src/ASPNETHandler/DemoApp/styles/brown-paper.css b/src/ASPNETHandler/DemoApp/styles/brown-paper.css deleted file mode 100644 index f0197b924..000000000 --- a/src/ASPNETHandler/DemoApp/styles/brown-paper.css +++ /dev/null @@ -1,64 +0,0 @@ -/* - -Brown Paper style from goldblog.com.ua (c) Zaripov Yura - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background:#b7a68e url(./brown-papersq.png); -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal { - color:#005599; - font-weight:bold; -} - -.hljs, -.hljs-subst { - color: #363c69; -} - -.hljs-string, -.hljs-title, -.hljs-section, -.hljs-type, -.hljs-attribute, -.hljs-symbol, -.hljs-bullet, -.hljs-built_in, -.hljs-addition, -.hljs-variable, -.hljs-template-tag, -.hljs-template-variable, -.hljs-link, -.hljs-name { - color: #2c009f; -} - -.hljs-comment, -.hljs-quote, -.hljs-meta, -.hljs-deletion { - color: #802022; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-doctag, -.hljs-title, -.hljs-section, -.hljs-type, -.hljs-name, -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/brown-papersq.png b/src/ASPNETHandler/DemoApp/styles/brown-papersq.png deleted file mode 100644 index 3813903db..000000000 Binary files a/src/ASPNETHandler/DemoApp/styles/brown-papersq.png and /dev/null differ diff --git a/src/ASPNETHandler/DemoApp/styles/codepen-embed.css b/src/ASPNETHandler/DemoApp/styles/codepen-embed.css deleted file mode 100644 index 195c4a078..000000000 --- a/src/ASPNETHandler/DemoApp/styles/codepen-embed.css +++ /dev/null @@ -1,60 +0,0 @@ -/* - codepen.io Embed Theme - Author: Justin Perry - Original theme - https://github.com/chriskempson/tomorrow-theme -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #222; - color: #fff; -} - -.hljs-comment, -.hljs-quote { - color: #777; -} - -.hljs-variable, -.hljs-template-variable, -.hljs-tag, -.hljs-regexp, -.hljs-meta, -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-params, -.hljs-symbol, -.hljs-bullet, -.hljs-link, -.hljs-deletion { - color: #ab875d; -} - -.hljs-section, -.hljs-title, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-type, -.hljs-attribute { - color: #9b869b; -} - -.hljs-string, -.hljs-keyword, -.hljs-selector-tag, -.hljs-addition { - color: #8f9c6c; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/color-brewer.css b/src/ASPNETHandler/DemoApp/styles/color-brewer.css deleted file mode 100644 index 7934d986a..000000000 --- a/src/ASPNETHandler/DemoApp/styles/color-brewer.css +++ /dev/null @@ -1,71 +0,0 @@ -/* - -Colorbrewer theme -Original: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock -Ported by Fabrício Tavares de Oliveira - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #fff; -} - -.hljs, -.hljs-subst { - color: #000; -} - -.hljs-string, -.hljs-meta, -.hljs-symbol, -.hljs-template-tag, -.hljs-template-variable, -.hljs-addition { - color: #756bb1; -} - -.hljs-comment, -.hljs-quote { - color: #636363; -} - -.hljs-number, -.hljs-regexp, -.hljs-literal, -.hljs-bullet, -.hljs-link { - color: #31a354; -} - -.hljs-deletion, -.hljs-variable { - color: #88f; -} - - - -.hljs-keyword, -.hljs-selector-tag, -.hljs-title, -.hljs-section, -.hljs-built_in, -.hljs-doctag, -.hljs-type, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-strong { - color: #3182bd; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-attribute { - color: #e6550d; -} diff --git a/src/ASPNETHandler/DemoApp/styles/darcula.css b/src/ASPNETHandler/DemoApp/styles/darcula.css deleted file mode 100644 index be182d0b5..000000000 --- a/src/ASPNETHandler/DemoApp/styles/darcula.css +++ /dev/null @@ -1,77 +0,0 @@ -/* - -Darcula color scheme from the JetBrains family of IDEs - -*/ - - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #2b2b2b; -} - -.hljs { - color: #bababa; -} - -.hljs-strong, -.hljs-emphasis { - color: #a8a8a2; -} - -.hljs-bullet, -.hljs-quote, -.hljs-link, -.hljs-number, -.hljs-regexp, -.hljs-literal { - color: #6896ba; -} - -.hljs-code, -.hljs-selector-class { - color: #a6e22e; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-section, -.hljs-attribute, -.hljs-name, -.hljs-variable { - color: #cb7832; -} - -.hljs-params { - color: #b9b9b9; -} - -.hljs-string { - color: #6a8759; -} - -.hljs-subst, -.hljs-type, -.hljs-built_in, -.hljs-builtin-name, -.hljs-symbol, -.hljs-selector-id, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-template-tag, -.hljs-template-variable, -.hljs-addition { - color: #e0c46c; -} - -.hljs-comment, -.hljs-deletion, -.hljs-meta { - color: #7f7f7f; -} diff --git a/src/ASPNETHandler/DemoApp/styles/dark.css b/src/ASPNETHandler/DemoApp/styles/dark.css deleted file mode 100644 index b4724f5f5..000000000 --- a/src/ASPNETHandler/DemoApp/styles/dark.css +++ /dev/null @@ -1,63 +0,0 @@ -/* - -Dark style from softwaremaniacs.org (c) Ivan Sagalaev - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #444; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-section, -.hljs-link { - color: white; -} - -.hljs, -.hljs-subst { - color: #ddd; -} - -.hljs-string, -.hljs-title, -.hljs-name, -.hljs-type, -.hljs-attribute, -.hljs-symbol, -.hljs-bullet, -.hljs-built_in, -.hljs-addition, -.hljs-variable, -.hljs-template-tag, -.hljs-template-variable { - color: #d88; -} - -.hljs-comment, -.hljs-quote, -.hljs-deletion, -.hljs-meta { - color: #777; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-title, -.hljs-section, -.hljs-doctag, -.hljs-type, -.hljs-name, -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/darkula.css b/src/ASPNETHandler/DemoApp/styles/darkula.css deleted file mode 100644 index f4646c3c5..000000000 --- a/src/ASPNETHandler/DemoApp/styles/darkula.css +++ /dev/null @@ -1,6 +0,0 @@ -/* - Deprecated due to a typo in the name and left here for compatibility purpose only. - Please use darcula.css instead. -*/ - -@import url('darcula.css'); diff --git a/src/ASPNETHandler/DemoApp/styles/default.css b/src/ASPNETHandler/DemoApp/styles/default.css deleted file mode 100644 index f1bfade31..000000000 --- a/src/ASPNETHandler/DemoApp/styles/default.css +++ /dev/null @@ -1,99 +0,0 @@ -/* - -Original highlight.js style (c) Ivan Sagalaev - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #F0F0F0; -} - - -/* Base color: saturation 0; */ - -.hljs, -.hljs-subst { - color: #444; -} - -.hljs-comment { - color: #888888; -} - -.hljs-keyword, -.hljs-attribute, -.hljs-selector-tag, -.hljs-meta-keyword, -.hljs-doctag, -.hljs-name { - font-weight: bold; -} - - -/* User color: hue: 0 */ - -.hljs-type, -.hljs-string, -.hljs-number, -.hljs-selector-id, -.hljs-selector-class, -.hljs-quote, -.hljs-template-tag, -.hljs-deletion { - color: #880000; -} - -.hljs-title, -.hljs-section { - color: #880000; - font-weight: bold; -} - -.hljs-regexp, -.hljs-symbol, -.hljs-variable, -.hljs-template-variable, -.hljs-link, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #BC6060; -} - - -/* Language color: hue: 90; */ - -.hljs-literal { - color: #78A960; -} - -.hljs-built_in, -.hljs-bullet, -.hljs-code, -.hljs-addition { - color: #397300; -} - - -/* Meta color: hue: 200 */ - -.hljs-meta { - color: #1f7199; -} - -.hljs-meta-string { - color: #4d99bf; -} - - -/* Misc effects */ - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/docco.css b/src/ASPNETHandler/DemoApp/styles/docco.css deleted file mode 100644 index db366be37..000000000 --- a/src/ASPNETHandler/DemoApp/styles/docco.css +++ /dev/null @@ -1,97 +0,0 @@ -/* -Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars) -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #000; - background: #f8f8ff; -} - -.hljs-comment, -.hljs-quote { - color: #408080; - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-subst { - color: #954121; -} - -.hljs-number { - color: #40a070; -} - -.hljs-string, -.hljs-doctag { - color: #219161; -} - -.hljs-selector-id, -.hljs-selector-class, -.hljs-section, -.hljs-type { - color: #19469d; -} - -.hljs-params { - color: #00f; -} - -.hljs-title { - color: #458; - font-weight: bold; -} - -.hljs-tag, -.hljs-name, -.hljs-attribute { - color: #000080; - font-weight: normal; -} - -.hljs-variable, -.hljs-template-variable { - color: #008080; -} - -.hljs-regexp, -.hljs-link { - color: #b68; -} - -.hljs-symbol, -.hljs-bullet { - color: #990073; -} - -.hljs-built_in, -.hljs-builtin-name { - color: #0086b3; -} - -.hljs-meta { - color: #999; - font-weight: bold; -} - -.hljs-deletion { - background: #fdd; -} - -.hljs-addition { - background: #dfd; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/dracula.css b/src/ASPNETHandler/DemoApp/styles/dracula.css deleted file mode 100644 index d591db680..000000000 --- a/src/ASPNETHandler/DemoApp/styles/dracula.css +++ /dev/null @@ -1,76 +0,0 @@ -/* - -Dracula Theme v1.2.0 - -https://github.com/zenorocha/dracula-theme - -Copyright 2015, All rights reserved - -Code licensed under the MIT license -http://zenorocha.mit-license.org - -@author Éverton Ribeiro -@author Zeno Rocha - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #282a36; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-section, -.hljs-link { - color: #8be9fd; -} - -.hljs-function .hljs-keyword { - color: #ff79c6; -} - -.hljs, -.hljs-subst { - color: #f8f8f2; -} - -.hljs-string, -.hljs-title, -.hljs-name, -.hljs-type, -.hljs-attribute, -.hljs-symbol, -.hljs-bullet, -.hljs-addition, -.hljs-variable, -.hljs-template-tag, -.hljs-template-variable { - color: #f1fa8c; -} - -.hljs-comment, -.hljs-quote, -.hljs-deletion, -.hljs-meta { - color: #6272a4; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-title, -.hljs-section, -.hljs-doctag, -.hljs-type, -.hljs-name, -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/far.css b/src/ASPNETHandler/DemoApp/styles/far.css deleted file mode 100644 index 2b3f87b56..000000000 --- a/src/ASPNETHandler/DemoApp/styles/far.css +++ /dev/null @@ -1,71 +0,0 @@ -/* - -FAR Style (c) MajestiC - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #000080; -} - -.hljs, -.hljs-subst { - color: #0ff; -} - -.hljs-string, -.hljs-attribute, -.hljs-symbol, -.hljs-bullet, -.hljs-built_in, -.hljs-builtin-name, -.hljs-template-tag, -.hljs-template-variable, -.hljs-addition { - color: #ff0; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-section, -.hljs-type, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-variable { - color: #fff; -} - -.hljs-comment, -.hljs-quote, -.hljs-doctag, -.hljs-deletion { - color: #888; -} - -.hljs-number, -.hljs-regexp, -.hljs-literal, -.hljs-link { - color: #0f0; -} - -.hljs-meta { - color: #008080; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-title, -.hljs-section, -.hljs-name, -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/foundation.css b/src/ASPNETHandler/DemoApp/styles/foundation.css deleted file mode 100644 index f1fe64b37..000000000 --- a/src/ASPNETHandler/DemoApp/styles/foundation.css +++ /dev/null @@ -1,88 +0,0 @@ -/* -Description: Foundation 4 docs style for highlight.js -Author: Dan Allen -Website: http://foundation.zurb.com/docs/ -Version: 1.0 -Date: 2013-04-02 -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #eee; color: black; -} - -.hljs-link, -.hljs-emphasis, -.hljs-attribute, -.hljs-addition { - color: #070; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong, -.hljs-string, -.hljs-deletion { - color: #d14; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-quote, -.hljs-comment { - color: #998; - font-style: italic; -} - -.hljs-section, -.hljs-title { - color: #900; -} - -.hljs-class .hljs-title, -.hljs-type { - color: #458; -} - -.hljs-variable, -.hljs-template-variable { - color: #336699; -} - -.hljs-bullet { - color: #997700; -} - -.hljs-meta { - color: #3344bb; -} - -.hljs-code, -.hljs-number, -.hljs-literal, -.hljs-keyword, -.hljs-selector-tag { - color: #099; -} - -.hljs-regexp { - background-color: #fff0ff; - color: #880088; -} - -.hljs-symbol { - color: #990073; -} - -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #007700; -} diff --git a/src/ASPNETHandler/DemoApp/styles/github-gist.css b/src/ASPNETHandler/DemoApp/styles/github-gist.css deleted file mode 100644 index 155f0b916..000000000 --- a/src/ASPNETHandler/DemoApp/styles/github-gist.css +++ /dev/null @@ -1,71 +0,0 @@ -/** - * GitHub Gist Theme - * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro - */ - -.hljs { - display: block; - background: white; - padding: 0.5em; - color: #333333; - overflow-x: auto; -} - -.hljs-comment, -.hljs-meta { - color: #969896; -} - -.hljs-string, -.hljs-variable, -.hljs-template-variable, -.hljs-strong, -.hljs-emphasis, -.hljs-quote { - color: #df5000; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-type { - color: #a71d5d; -} - -.hljs-literal, -.hljs-symbol, -.hljs-bullet, -.hljs-attribute { - color: #0086b3; -} - -.hljs-section, -.hljs-name { - color: #63a35c; -} - -.hljs-tag { - color: #333333; -} - -.hljs-title, -.hljs-attr, -.hljs-selector-id, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #795da3; -} - -.hljs-addition { - color: #55a532; - background-color: #eaffea; -} - -.hljs-deletion { - color: #bd2c00; - background-color: #ffecec; -} - -.hljs-link { - text-decoration: underline; -} diff --git a/src/ASPNETHandler/DemoApp/styles/github.css b/src/ASPNETHandler/DemoApp/styles/github.css deleted file mode 100644 index 791932b87..000000000 --- a/src/ASPNETHandler/DemoApp/styles/github.css +++ /dev/null @@ -1,99 +0,0 @@ -/* - -github.com style (c) Vasily Polovnyov - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #333; - background: #f8f8f8; -} - -.hljs-comment, -.hljs-quote { - color: #998; - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-subst { - color: #333; - font-weight: bold; -} - -.hljs-number, -.hljs-literal, -.hljs-variable, -.hljs-template-variable, -.hljs-tag .hljs-attr { - color: #008080; -} - -.hljs-string, -.hljs-doctag { - color: #d14; -} - -.hljs-title, -.hljs-section, -.hljs-selector-id { - color: #900; - font-weight: bold; -} - -.hljs-subst { - font-weight: normal; -} - -.hljs-type, -.hljs-class .hljs-title { - color: #458; - font-weight: bold; -} - -.hljs-tag, -.hljs-name, -.hljs-attribute { - color: #000080; - font-weight: normal; -} - -.hljs-regexp, -.hljs-link { - color: #009926; -} - -.hljs-symbol, -.hljs-bullet { - color: #990073; -} - -.hljs-built_in, -.hljs-builtin-name { - color: #0086b3; -} - -.hljs-meta { - color: #999; - font-weight: bold; -} - -.hljs-deletion { - background: #fdd; -} - -.hljs-addition { - background: #dfd; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/googlecode.css b/src/ASPNETHandler/DemoApp/styles/googlecode.css deleted file mode 100644 index 884ad6353..000000000 --- a/src/ASPNETHandler/DemoApp/styles/googlecode.css +++ /dev/null @@ -1,89 +0,0 @@ -/* - -Google Code style (c) Aahan Krish - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: white; - color: black; -} - -.hljs-comment, -.hljs-quote { - color: #800; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-section, -.hljs-title, -.hljs-name { - color: #008; -} - -.hljs-variable, -.hljs-template-variable { - color: #660; -} - -.hljs-string, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-regexp { - color: #080; -} - -.hljs-literal, -.hljs-symbol, -.hljs-bullet, -.hljs-meta, -.hljs-number, -.hljs-link { - color: #066; -} - -.hljs-title, -.hljs-doctag, -.hljs-type, -.hljs-attr, -.hljs-built_in, -.hljs-builtin-name, -.hljs-params { - color: #606; -} - -.hljs-attribute, -.hljs-subst { - color: #000; -} - -.hljs-formula { - background-color: #eee; - font-style: italic; -} - -.hljs-selector-id, -.hljs-selector-class { - color: #9B703F -} - -.hljs-addition { - background-color: #baeeba; -} - -.hljs-deletion { - background-color: #ffc8bd; -} - -.hljs-doctag, -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/grayscale.css b/src/ASPNETHandler/DemoApp/styles/grayscale.css deleted file mode 100644 index 5376f3406..000000000 --- a/src/ASPNETHandler/DemoApp/styles/grayscale.css +++ /dev/null @@ -1,101 +0,0 @@ -/* - -grayscale style (c) MY Sun - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #333; - background: #fff; -} - -.hljs-comment, -.hljs-quote { - color: #777; - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-subst { - color: #333; - font-weight: bold; -} - -.hljs-number, -.hljs-literal { - color: #777; -} - -.hljs-string, -.hljs-doctag, -.hljs-formula { - color: #333; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAJ0lEQVQIW2O8e/fufwYGBgZBQUEQxcCIIfDu3Tuwivfv30NUoAsAALHpFMMLqZlPAAAAAElFTkSuQmCC) repeat; -} - -.hljs-title, -.hljs-section, -.hljs-selector-id { - color: #000; - font-weight: bold; -} - -.hljs-subst { - font-weight: normal; -} - -.hljs-class .hljs-title, -.hljs-type, -.hljs-name { - color: #333; - font-weight: bold; -} - -.hljs-tag { - color: #333; -} - -.hljs-regexp { - color: #333; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAPUlEQVQYV2NkQAN37979r6yszIgujiIAU4RNMVwhuiQ6H6wQl3XI4oy4FMHcCJPHcDS6J2A2EqUQpJhohQDexSef15DBCwAAAABJRU5ErkJggg==) repeat; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-link { - color: #000; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAKElEQVQIW2NkQAO7d+/+z4gsBhJwdXVlhAvCBECKwIIwAbhKZBUwBQA6hBpm5efZsgAAAABJRU5ErkJggg==) repeat; -} - -.hljs-built_in, -.hljs-builtin-name { - color: #000; - text-decoration: underline; -} - -.hljs-meta { - color: #999; - font-weight: bold; -} - -.hljs-deletion { - color: #fff; - background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAADCAYAAABS3WWCAAAAE0lEQVQIW2MMDQ39zzhz5kwIAQAyxweWgUHd1AAAAABJRU5ErkJggg==) repeat; -} - -.hljs-addition { - color: #000; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAALUlEQVQYV2N89+7dfwYk8P79ewZBQUFkIQZGOiu6e/cuiptQHAPl0NtNxAQBAM97Oejj3Dg7AAAAAElFTkSuQmCC) repeat; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/gruvbox-dark.css b/src/ASPNETHandler/DemoApp/styles/gruvbox-dark.css deleted file mode 100644 index f563811a8..000000000 --- a/src/ASPNETHandler/DemoApp/styles/gruvbox-dark.css +++ /dev/null @@ -1,108 +0,0 @@ -/* - -Gruvbox style (dark) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox) - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #282828; -} - -.hljs, -.hljs-subst { - color: #ebdbb2; -} - -/* Gruvbox Red */ -.hljs-deletion, -.hljs-formula, -.hljs-keyword, -.hljs-link, -.hljs-selector-tag { - color: #fb4934; -} - -/* Gruvbox Blue */ -.hljs-built_in, -.hljs-emphasis, -.hljs-name, -.hljs-quote, -.hljs-strong, -.hljs-title, -.hljs-variable { - color: #83a598; -} - -/* Gruvbox Yellow */ -.hljs-attr, -.hljs-params, -.hljs-template-tag, -.hljs-type { - color: #fabd2f; -} - -/* Gruvbox Purple */ -.hljs-builtin-name, -.hljs-doctag, -.hljs-literal, -.hljs-number { - color: #8f3f71; -} - -/* Gruvbox Orange */ -.hljs-code, -.hljs-meta, -.hljs-regexp, -.hljs-selector-id, -.hljs-template-variable { - color: #fe8019; -} - -/* Gruvbox Green */ -.hljs-addition, -.hljs-meta-string, -.hljs-section, -.hljs-selector-attr, -.hljs-selector-class, -.hljs-string, -.hljs-symbol { - color: #b8bb26; -} - -/* Gruvbox Aqua */ -.hljs-attribute, -.hljs-bullet, -.hljs-class, -.hljs-function, -.hljs-function .hljs-keyword, -.hljs-meta-keyword, -.hljs-selector-pseudo, -.hljs-tag { - color: #8ec07c; -} - -/* Gruvbox Gray */ -.hljs-comment { - color: #928374; -} - -/* Gruvbox Purple */ -.hljs-link_label, -.hljs-literal, -.hljs-number { - color: #d3869b; -} - -.hljs-comment, -.hljs-emphasis { - font-style: italic; -} - -.hljs-section, -.hljs-strong, -.hljs-tag { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/gruvbox-light.css b/src/ASPNETHandler/DemoApp/styles/gruvbox-light.css deleted file mode 100644 index ff45468eb..000000000 --- a/src/ASPNETHandler/DemoApp/styles/gruvbox-light.css +++ /dev/null @@ -1,108 +0,0 @@ -/* - -Gruvbox style (light) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox) - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #fbf1c7; -} - -.hljs, -.hljs-subst { - color: #3c3836; -} - -/* Gruvbox Red */ -.hljs-deletion, -.hljs-formula, -.hljs-keyword, -.hljs-link, -.hljs-selector-tag { - color: #9d0006; -} - -/* Gruvbox Blue */ -.hljs-built_in, -.hljs-emphasis, -.hljs-name, -.hljs-quote, -.hljs-strong, -.hljs-title, -.hljs-variable { - color: #076678; -} - -/* Gruvbox Yellow */ -.hljs-attr, -.hljs-params, -.hljs-template-tag, -.hljs-type { - color: #b57614; -} - -/* Gruvbox Purple */ -.hljs-builtin-name, -.hljs-doctag, -.hljs-literal, -.hljs-number { - color: #8f3f71; -} - -/* Gruvbox Orange */ -.hljs-code, -.hljs-meta, -.hljs-regexp, -.hljs-selector-id, -.hljs-template-variable { - color: #af3a03; -} - -/* Gruvbox Green */ -.hljs-addition, -.hljs-meta-string, -.hljs-section, -.hljs-selector-attr, -.hljs-selector-class, -.hljs-string, -.hljs-symbol { - color: #79740e; -} - -/* Gruvbox Aqua */ -.hljs-attribute, -.hljs-bullet, -.hljs-class, -.hljs-function, -.hljs-function .hljs-keyword, -.hljs-meta-keyword, -.hljs-selector-pseudo, -.hljs-tag { - color: #427b58; -} - -/* Gruvbox Gray */ -.hljs-comment { - color: #928374; -} - -/* Gruvbox Purple */ -.hljs-link_label, -.hljs-literal, -.hljs-number { - color: #8f3f71; -} - -.hljs-comment, -.hljs-emphasis { - font-style: italic; -} - -.hljs-section, -.hljs-strong, -.hljs-tag { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/hopscotch.css b/src/ASPNETHandler/DemoApp/styles/hopscotch.css deleted file mode 100644 index 32e60d230..000000000 --- a/src/ASPNETHandler/DemoApp/styles/hopscotch.css +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Hopscotch - * by Jan T. Sott - * https://github.com/idleberg/Hopscotch - * - * This work is licensed under the Creative Commons CC0 1.0 Universal License - */ - -/* Comment */ -.hljs-comment, -.hljs-quote { - color: #989498; -} - -/* Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-regexp, -.hljs-link, -.hljs-deletion { - color: #dd464c; -} - -/* Orange */ -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #fd8b19; -} - -/* Yellow */ -.hljs-class .hljs-title { - color: #fdcc59; -} - -/* Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-addition { - color: #8fc13e; -} - -/* Aqua */ -.hljs-meta { - color: #149b93; -} - -/* Blue */ -.hljs-function, -.hljs-section, -.hljs-title { - color: #1290bf; -} - -/* Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #c85e7c; -} - -.hljs { - display: block; - background: #322931; - color: #b9b5b8; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/hybrid.css b/src/ASPNETHandler/DemoApp/styles/hybrid.css deleted file mode 100644 index 29735a189..000000000 --- a/src/ASPNETHandler/DemoApp/styles/hybrid.css +++ /dev/null @@ -1,102 +0,0 @@ -/* - -vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid) - -*/ - -/*background color*/ -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #1d1f21; -} - -/*selection color*/ -.hljs::selection, -.hljs span::selection { - background: #373b41; -} - -.hljs::-moz-selection, -.hljs span::-moz-selection { - background: #373b41; -} - -/*foreground color*/ -.hljs { - color: #c5c8c6; -} - -/*color: fg_yellow*/ -.hljs-title, -.hljs-name { - color: #f0c674; -} - -/*color: fg_comment*/ -.hljs-comment, -.hljs-meta, -.hljs-meta .hljs-keyword { - color: #707880; -} - -/*color: fg_red*/ -.hljs-number, -.hljs-symbol, -.hljs-literal, -.hljs-deletion, -.hljs-link { - color: #cc6666 -} - -/*color: fg_green*/ -.hljs-string, -.hljs-doctag, -.hljs-addition, -.hljs-regexp, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #b5bd68; -} - -/*color: fg_purple*/ -.hljs-attribute, -.hljs-code, -.hljs-selector-id { - color: #b294bb; -} - -/*color: fg_blue*/ -.hljs-keyword, -.hljs-selector-tag, -.hljs-bullet, -.hljs-tag { - color: #81a2be; -} - -/*color: fg_aqua*/ -.hljs-subst, -.hljs-variable, -.hljs-template-tag, -.hljs-template-variable { - color: #8abeb7; -} - -/*color: fg_orange*/ -.hljs-type, -.hljs-built_in, -.hljs-builtin-name, -.hljs-quote, -.hljs-section, -.hljs-selector-class { - color: #de935f; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/idea.css b/src/ASPNETHandler/DemoApp/styles/idea.css deleted file mode 100644 index 3bf1892bd..000000000 --- a/src/ASPNETHandler/DemoApp/styles/idea.css +++ /dev/null @@ -1,97 +0,0 @@ -/* - -Intellij Idea-like styling (c) Vasily Polovnyov - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #000; - background: #fff; -} - -.hljs-subst, -.hljs-title { - font-weight: normal; - color: #000; -} - -.hljs-comment, -.hljs-quote { - color: #808080; - font-style: italic; -} - -.hljs-meta { - color: #808000; -} - -.hljs-tag { - background: #efefef; -} - -.hljs-section, -.hljs-name, -.hljs-literal, -.hljs-keyword, -.hljs-selector-tag, -.hljs-type, -.hljs-selector-id, -.hljs-selector-class { - font-weight: bold; - color: #000080; -} - -.hljs-attribute, -.hljs-number, -.hljs-regexp, -.hljs-link { - font-weight: bold; - color: #0000ff; -} - -.hljs-number, -.hljs-regexp, -.hljs-link { - font-weight: normal; -} - -.hljs-string { - color: #008000; - font-weight: bold; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-formula { - color: #000; - background: #d0eded; - font-style: italic; -} - -.hljs-doctag { - text-decoration: underline; -} - -.hljs-variable, -.hljs-template-variable { - color: #660e7a; -} - -.hljs-addition { - background: #baeeba; -} - -.hljs-deletion { - background: #ffc8bd; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/ir-black.css b/src/ASPNETHandler/DemoApp/styles/ir-black.css deleted file mode 100644 index bd4c755ed..000000000 --- a/src/ASPNETHandler/DemoApp/styles/ir-black.css +++ /dev/null @@ -1,73 +0,0 @@ -/* - IR_Black style (c) Vasily Mikhailitchenko -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #000; - color: #f8f8f8; -} - -.hljs-comment, -.hljs-quote, -.hljs-meta { - color: #7c7c7c; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-tag, -.hljs-name { - color: #96cbfe; -} - -.hljs-attribute, -.hljs-selector-id { - color: #ffffb6; -} - -.hljs-string, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-addition { - color: #a8ff60; -} - -.hljs-subst { - color: #daefa3; -} - -.hljs-regexp, -.hljs-link { - color: #e9c062; -} - -.hljs-title, -.hljs-section, -.hljs-type, -.hljs-doctag { - color: #ffffb6; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-variable, -.hljs-template-variable, -.hljs-literal { - color: #c6c5fe; -} - -.hljs-number, -.hljs-deletion { - color:#ff73fd; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/kimbie.dark.css b/src/ASPNETHandler/DemoApp/styles/kimbie.dark.css deleted file mode 100644 index d139cb5d0..000000000 --- a/src/ASPNETHandler/DemoApp/styles/kimbie.dark.css +++ /dev/null @@ -1,74 +0,0 @@ -/* - Name: Kimbie (dark) - Author: Jan T. Sott - License: Creative Commons Attribution-ShareAlike 4.0 Unported License - URL: https://github.com/idleberg/Kimbie-highlight.js -*/ - -/* Kimbie Comment */ -.hljs-comment, -.hljs-quote { - color: #d6baad; -} - -/* Kimbie Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-regexp, -.hljs-meta { - color: #dc3958; -} - -/* Kimbie Orange */ -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params, -.hljs-deletion, -.hljs-link { - color: #f79a32; -} - -/* Kimbie Yellow */ -.hljs-title, -.hljs-section, -.hljs-attribute { - color: #f06431; -} - -/* Kimbie Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-addition { - color: #889b4a; -} - -/* Kimbie Purple */ -.hljs-keyword, -.hljs-selector-tag, -.hljs-function { - color: #98676a; -} - -.hljs { - display: block; - overflow-x: auto; - background: #221a0f; - color: #d3af86; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/kimbie.light.css b/src/ASPNETHandler/DemoApp/styles/kimbie.light.css deleted file mode 100644 index 04ff6ed3a..000000000 --- a/src/ASPNETHandler/DemoApp/styles/kimbie.light.css +++ /dev/null @@ -1,74 +0,0 @@ -/* - Name: Kimbie (light) - Author: Jan T. Sott - License: Creative Commons Attribution-ShareAlike 4.0 Unported License - URL: https://github.com/idleberg/Kimbie-highlight.js -*/ - -/* Kimbie Comment */ -.hljs-comment, -.hljs-quote { - color: #a57a4c; -} - -/* Kimbie Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-regexp, -.hljs-meta { - color: #dc3958; -} - -/* Kimbie Orange */ -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params, -.hljs-deletion, -.hljs-link { - color: #f79a32; -} - -/* Kimbie Yellow */ -.hljs-title, -.hljs-section, -.hljs-attribute { - color: #f06431; -} - -/* Kimbie Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-addition { - color: #889b4a; -} - -/* Kimbie Purple */ -.hljs-keyword, -.hljs-selector-tag, -.hljs-function { - color: #98676a; -} - -.hljs { - display: block; - overflow-x: auto; - background: #fbebd4; - color: #84613d; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/magula.css b/src/ASPNETHandler/DemoApp/styles/magula.css deleted file mode 100644 index 44dee5e8e..000000000 --- a/src/ASPNETHandler/DemoApp/styles/magula.css +++ /dev/null @@ -1,70 +0,0 @@ -/* -Description: Magula style for highligh.js -Author: Ruslan Keba -Website: http://rukeba.com/ -Version: 1.0 -Date: 2009-01-03 -Music: Aphex Twin / Xtal -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background-color: #f4f4f4; -} - -.hljs, -.hljs-subst { - color: black; -} - -.hljs-string, -.hljs-title, -.hljs-symbol, -.hljs-bullet, -.hljs-attribute, -.hljs-addition, -.hljs-variable, -.hljs-template-tag, -.hljs-template-variable { - color: #050; -} - -.hljs-comment, -.hljs-quote { - color: #777; -} - -.hljs-number, -.hljs-regexp, -.hljs-literal, -.hljs-type, -.hljs-link { - color: #800; -} - -.hljs-deletion, -.hljs-meta { - color: #00e; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-doctag, -.hljs-title, -.hljs-section, -.hljs-built_in, -.hljs-tag, -.hljs-name { - font-weight: bold; - color: navy; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/mono-blue.css b/src/ASPNETHandler/DemoApp/styles/mono-blue.css deleted file mode 100644 index 884c97c76..000000000 --- a/src/ASPNETHandler/DemoApp/styles/mono-blue.css +++ /dev/null @@ -1,59 +0,0 @@ -/* - Five-color theme from a single blue hue. -*/ -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #eaeef3; -} - -.hljs { - color: #00193a; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-title, -.hljs-section, -.hljs-doctag, -.hljs-name, -.hljs-strong { - font-weight: bold; -} - -.hljs-comment { - color: #738191; -} - -.hljs-string, -.hljs-title, -.hljs-section, -.hljs-built_in, -.hljs-literal, -.hljs-type, -.hljs-addition, -.hljs-tag, -.hljs-quote, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #0048ab; -} - -.hljs-meta, -.hljs-subst, -.hljs-symbol, -.hljs-regexp, -.hljs-attribute, -.hljs-deletion, -.hljs-variable, -.hljs-template-variable, -.hljs-link, -.hljs-bullet { - color: #4c81c9; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/monokai-sublime.css b/src/ASPNETHandler/DemoApp/styles/monokai-sublime.css deleted file mode 100644 index 2864170da..000000000 --- a/src/ASPNETHandler/DemoApp/styles/monokai-sublime.css +++ /dev/null @@ -1,83 +0,0 @@ -/* - -Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/ - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #23241f; -} - -.hljs, -.hljs-tag, -.hljs-subst { - color: #f8f8f2; -} - -.hljs-strong, -.hljs-emphasis { - color: #a8a8a2; -} - -.hljs-bullet, -.hljs-quote, -.hljs-number, -.hljs-regexp, -.hljs-literal, -.hljs-link { - color: #ae81ff; -} - -.hljs-code, -.hljs-title, -.hljs-section, -.hljs-selector-class { - color: #a6e22e; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-name, -.hljs-attr { - color: #f92672; -} - -.hljs-symbol, -.hljs-attribute { - color: #66d9ef; -} - -.hljs-params, -.hljs-class .hljs-title { - color: #f8f8f2; -} - -.hljs-string, -.hljs-type, -.hljs-built_in, -.hljs-builtin-name, -.hljs-selector-id, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-addition, -.hljs-variable, -.hljs-template-variable { - color: #e6db74; -} - -.hljs-comment, -.hljs-deletion, -.hljs-meta { - color: #75715e; -} diff --git a/src/ASPNETHandler/DemoApp/styles/monokai.css b/src/ASPNETHandler/DemoApp/styles/monokai.css deleted file mode 100644 index 775d53f91..000000000 --- a/src/ASPNETHandler/DemoApp/styles/monokai.css +++ /dev/null @@ -1,70 +0,0 @@ -/* -Monokai style - ported by Luigi Maselli - http://grigio.org -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #272822; color: #ddd; -} - -.hljs-tag, -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-strong, -.hljs-name { - color: #f92672; -} - -.hljs-code { - color: #66d9ef; -} - -.hljs-class .hljs-title { - color: white; -} - -.hljs-attribute, -.hljs-symbol, -.hljs-regexp, -.hljs-link { - color: #bf79db; -} - -.hljs-string, -.hljs-bullet, -.hljs-subst, -.hljs-title, -.hljs-section, -.hljs-emphasis, -.hljs-type, -.hljs-built_in, -.hljs-builtin-name, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-addition, -.hljs-variable, -.hljs-template-tag, -.hljs-template-variable { - color: #a6e22e; -} - -.hljs-comment, -.hljs-quote, -.hljs-deletion, -.hljs-meta { - color: #75715e; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-doctag, -.hljs-title, -.hljs-section, -.hljs-type, -.hljs-selector-id { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/obsidian.css b/src/ASPNETHandler/DemoApp/styles/obsidian.css deleted file mode 100644 index 356630fa2..000000000 --- a/src/ASPNETHandler/DemoApp/styles/obsidian.css +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Obsidian style - * ported by Alexander Marenin (http://github.com/ioncreature) - */ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #282b2e; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-selector-id { - color: #93c763; -} - -.hljs-number { - color: #ffcd22; -} - -.hljs { - color: #e0e2e4; -} - -.hljs-attribute { - color: #668bb0; -} - -.hljs-code, -.hljs-class .hljs-title, -.hljs-section { - color: white; -} - -.hljs-regexp, -.hljs-link { - color: #d39745; -} - -.hljs-meta { - color: #557182; -} - -.hljs-tag, -.hljs-name, -.hljs-bullet, -.hljs-subst, -.hljs-emphasis, -.hljs-type, -.hljs-built_in, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-addition, -.hljs-variable, -.hljs-template-tag, -.hljs-template-variable { - color: #8cbbad; -} - -.hljs-string, -.hljs-symbol { - color: #ec7600; -} - -.hljs-comment, -.hljs-quote, -.hljs-deletion { - color: #818e96; -} - -.hljs-selector-class { - color: #A082BD -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-doctag, -.hljs-title, -.hljs-section, -.hljs-type, -.hljs-name, -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/ocean.css b/src/ASPNETHandler/DemoApp/styles/ocean.css deleted file mode 100644 index 5901581b4..000000000 --- a/src/ASPNETHandler/DemoApp/styles/ocean.css +++ /dev/null @@ -1,74 +0,0 @@ -/* Ocean Dark Theme */ -/* https://github.com/gavsiu */ -/* Original theme - https://github.com/chriskempson/base16 */ - -/* Ocean Comment */ -.hljs-comment, -.hljs-quote { - color: #65737e; -} - -/* Ocean Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-regexp, -.hljs-deletion { - color: #bf616a; -} - -/* Ocean Orange */ -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params, -.hljs-meta, -.hljs-link { - color: #d08770; -} - -/* Ocean Yellow */ -.hljs-attribute { - color: #ebcb8b; -} - -/* Ocean Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-addition { - color: #a3be8c; -} - -/* Ocean Blue */ -.hljs-title, -.hljs-section { - color: #8fa1b3; -} - -/* Ocean Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #b48ead; -} - -.hljs { - display: block; - overflow-x: auto; - background: #2b303b; - color: #c0c5ce; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/paraiso-dark.css b/src/ASPNETHandler/DemoApp/styles/paraiso-dark.css deleted file mode 100644 index e7292401c..000000000 --- a/src/ASPNETHandler/DemoApp/styles/paraiso-dark.css +++ /dev/null @@ -1,72 +0,0 @@ -/* - Paraíso (dark) - Created by Jan T. Sott (http://github.com/idleberg) - Inspired by the art of Rubens LP (http://www.rubenslp.com.br) -*/ - -/* Paraíso Comment */ -.hljs-comment, -.hljs-quote { - color: #8d8687; -} - -/* Paraíso Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-regexp, -.hljs-link, -.hljs-meta { - color: #ef6155; -} - -/* Paraíso Orange */ -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params, -.hljs-deletion { - color: #f99b15; -} - -/* Paraíso Yellow */ -.hljs-title, -.hljs-section, -.hljs-attribute { - color: #fec418; -} - -/* Paraíso Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-addition { - color: #48b685; -} - -/* Paraíso Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #815ba4; -} - -.hljs { - display: block; - overflow-x: auto; - background: #2f1e2e; - color: #a39e9b; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/paraiso-light.css b/src/ASPNETHandler/DemoApp/styles/paraiso-light.css deleted file mode 100644 index 944857cd8..000000000 --- a/src/ASPNETHandler/DemoApp/styles/paraiso-light.css +++ /dev/null @@ -1,72 +0,0 @@ -/* - Paraíso (light) - Created by Jan T. Sott (http://github.com/idleberg) - Inspired by the art of Rubens LP (http://www.rubenslp.com.br) -*/ - -/* Paraíso Comment */ -.hljs-comment, -.hljs-quote { - color: #776e71; -} - -/* Paraíso Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-regexp, -.hljs-link, -.hljs-meta { - color: #ef6155; -} - -/* Paraíso Orange */ -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params, -.hljs-deletion { - color: #f99b15; -} - -/* Paraíso Yellow */ -.hljs-title, -.hljs-section, -.hljs-attribute { - color: #fec418; -} - -/* Paraíso Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-addition { - color: #48b685; -} - -/* Paraíso Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #815ba4; -} - -.hljs { - display: block; - overflow-x: auto; - background: #e7e9db; - color: #4f424c; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/pojoaque.css b/src/ASPNETHandler/DemoApp/styles/pojoaque.css deleted file mode 100644 index 2e07847b2..000000000 --- a/src/ASPNETHandler/DemoApp/styles/pojoaque.css +++ /dev/null @@ -1,83 +0,0 @@ -/* - -Pojoaque Style by Jason Tate -http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html -Based on Solarized Style from http://ethanschoonover.com/solarized - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #dccf8f; - background: url(./pojoaque.jpg) repeat scroll left top #181914; -} - -.hljs-comment, -.hljs-quote { - color: #586e75; - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-addition { - color: #b64926; -} - -.hljs-number, -.hljs-string, -.hljs-doctag, -.hljs-regexp { - color: #468966; -} - -.hljs-title, -.hljs-section, -.hljs-built_in, -.hljs-name { - color: #ffb03b; -} - -.hljs-variable, -.hljs-template-variable, -.hljs-class .hljs-title, -.hljs-type, -.hljs-tag { - color: #b58900; -} - -.hljs-attribute { - color: #b89859; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-link, -.hljs-subst, -.hljs-meta { - color: #cb4b16; -} - -.hljs-deletion { - color: #dc322f; -} - -.hljs-selector-id, -.hljs-selector-class { - color: #d3a60c; -} - -.hljs-formula { - background: #073642; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/pojoaque.jpg b/src/ASPNETHandler/DemoApp/styles/pojoaque.jpg deleted file mode 100644 index 9c07d4ab4..000000000 Binary files a/src/ASPNETHandler/DemoApp/styles/pojoaque.jpg and /dev/null differ diff --git a/src/ASPNETHandler/DemoApp/styles/purebasic.css b/src/ASPNETHandler/DemoApp/styles/purebasic.css deleted file mode 100644 index 5ce9b9e07..000000000 --- a/src/ASPNETHandler/DemoApp/styles/purebasic.css +++ /dev/null @@ -1,96 +0,0 @@ -/* - -PureBASIC native IDE style ( version 1.0 - April 2016 ) - -by Tristano Ajmone - -Public Domain - -NOTE_1: PureBASIC code syntax highlighting only applies the following classes: - .hljs-comment - .hljs-function - .hljs-keywords - .hljs-string - .hljs-symbol - - Other classes are added here for the benefit of styling other languages with the look and feel of PureBASIC native IDE style. - If you need to customize a stylesheet for PureBASIC only, remove all non-relevant classes -- PureBASIC-related classes are followed by - a "--- used for PureBASIC ... ---" comment on same line. - -NOTE_2: Color names provided in comments were derived using "Name that Color" online tool: - http://chir.ag/projects/name-that-color -*/ - -.hljs { /* Common set of rules required by highlight.js (don'r remove!) */ - display: block; - overflow-x: auto; - padding: 0.5em; - background: #FFFFDF; /* Half and Half (approx.) */ -/* --- Uncomment to add PureBASIC native IDE styled font! - font-family: Consolas; -*/ -} - -.hljs, /* --- used for PureBASIC base color --- */ -.hljs-type, /* --- used for PureBASIC Procedures return type --- */ -.hljs-function, /* --- used for wrapping PureBASIC Procedures definitions --- */ -.hljs-name, -.hljs-number, -.hljs-attr, -.hljs-params, -.hljs-subst { - color: #000000; /* Black */ -} - -.hljs-comment, /* --- used for PureBASIC Comments --- */ -.hljs-regexp, -.hljs-section, -.hljs-selector-pseudo, -.hljs-addition { - color: #00AAAA; /* Persian Green (approx.) */ -} - -.hljs-title, /* --- used for PureBASIC Procedures Names --- */ -.hljs-tag, -.hljs-variable, -.hljs-code { - color: #006666; /* Blue Stone (approx.) */ -} - -.hljs-keyword, /* --- used for PureBASIC Keywords --- */ -.hljs-class, -.hljs-meta-keyword, -.hljs-selector-class, -.hljs-built_in, -.hljs-builtin-name { - color: #006666; /* Blue Stone (approx.) */ - font-weight: bold; -} - -.hljs-string, /* --- used for PureBASIC Strings --- */ -.hljs-selector-attr { - color: #0080FF; /* Azure Radiance (approx.) */ -} - -.hljs-symbol, /* --- used for PureBASIC Constants --- */ -.hljs-link, -.hljs-deletion, -.hljs-attribute { - color: #924B72; /* Cannon Pink (approx.) */ -} - -.hljs-meta, -.hljs-literal, -.hljs-selector-id { - color: #924B72; /* Cannon Pink (approx.) */ - font-weight: bold; -} - -.hljs-strong, -.hljs-name { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/qtcreator_dark.css b/src/ASPNETHandler/DemoApp/styles/qtcreator_dark.css deleted file mode 100644 index 7aa56a365..000000000 --- a/src/ASPNETHandler/DemoApp/styles/qtcreator_dark.css +++ /dev/null @@ -1,83 +0,0 @@ -/* - -Qt Creator dark color scheme - -*/ - - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #000000; -} - -.hljs, -.hljs-subst, -.hljs-tag, -.hljs-title { - color: #aaaaaa; -} - -.hljs-strong, -.hljs-emphasis { - color: #a8a8a2; -} - -.hljs-bullet, -.hljs-quote, -.hljs-number, -.hljs-regexp, -.hljs-literal { - color: #ff55ff; -} - -.hljs-code -.hljs-selector-class { - color: #aaaaff; -} - -.hljs-emphasis, -.hljs-stronge, -.hljs-type { - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-function, -.hljs-section, -.hljs-symbol, -.hljs-name { - color: #ffff55; -} - -.hljs-attribute { - color: #ff5555; -} - -.hljs-variable, -.hljs-params, -.hljs-class .hljs-title { - color: #8888ff; -} - -.hljs-string, -.hljs-selector-id, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-type, -.hljs-built_in, -.hljs-builtin-name, -.hljs-template-tag, -.hljs-template-variable, -.hljs-addition, -.hljs-link { - color: #ff55ff; -} - -.hljs-comment, -.hljs-meta, -.hljs-deletion { - color: #55ffff; -} diff --git a/src/ASPNETHandler/DemoApp/styles/qtcreator_light.css b/src/ASPNETHandler/DemoApp/styles/qtcreator_light.css deleted file mode 100644 index 1efa2c660..000000000 --- a/src/ASPNETHandler/DemoApp/styles/qtcreator_light.css +++ /dev/null @@ -1,83 +0,0 @@ -/* - -Qt Creator light color scheme - -*/ - - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #ffffff; -} - -.hljs, -.hljs-subst, -.hljs-tag, -.hljs-title { - color: #000000; -} - -.hljs-strong, -.hljs-emphasis { - color: #000000; -} - -.hljs-bullet, -.hljs-quote, -.hljs-number, -.hljs-regexp, -.hljs-literal { - color: #000080; -} - -.hljs-code -.hljs-selector-class { - color: #800080; -} - -.hljs-emphasis, -.hljs-stronge, -.hljs-type { - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-function, -.hljs-section, -.hljs-symbol, -.hljs-name { - color: #808000; -} - -.hljs-attribute { - color: #800000; -} - -.hljs-variable, -.hljs-params, -.hljs-class .hljs-title { - color: #0055AF; -} - -.hljs-string, -.hljs-selector-id, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-type, -.hljs-built_in, -.hljs-builtin-name, -.hljs-template-tag, -.hljs-template-variable, -.hljs-addition, -.hljs-link { - color: #008000; -} - -.hljs-comment, -.hljs-meta, -.hljs-deletion { - color: #008000; -} diff --git a/src/ASPNETHandler/DemoApp/styles/railscasts.css b/src/ASPNETHandler/DemoApp/styles/railscasts.css deleted file mode 100644 index 008cdc5bf..000000000 --- a/src/ASPNETHandler/DemoApp/styles/railscasts.css +++ /dev/null @@ -1,106 +0,0 @@ -/* - -Railscasts-like style (c) Visoft, Inc. (Damien White) - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #232323; - color: #e6e1dc; -} - -.hljs-comment, -.hljs-quote { - color: #bc9458; - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag { - color: #c26230; -} - -.hljs-string, -.hljs-number, -.hljs-regexp, -.hljs-variable, -.hljs-template-variable { - color: #a5c261; -} - -.hljs-subst { - color: #519f50; -} - -.hljs-tag, -.hljs-name { - color: #e8bf6a; -} - -.hljs-type { - color: #da4939; -} - - -.hljs-symbol, -.hljs-bullet, -.hljs-built_in, -.hljs-builtin-name, -.hljs-attr, -.hljs-link { - color: #6d9cbe; -} - -.hljs-params { - color: #d0d0ff; -} - -.hljs-attribute { - color: #cda869; -} - -.hljs-meta { - color: #9b859d; -} - -.hljs-title, -.hljs-section { - color: #ffc66d; -} - -.hljs-addition { - background-color: #144212; - color: #e6e1dc; - display: inline-block; - width: 100%; -} - -.hljs-deletion { - background-color: #600; - color: #e6e1dc; - display: inline-block; - width: 100%; -} - -.hljs-selector-class { - color: #9b703f; -} - -.hljs-selector-id { - color: #8b98ab; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-link { - text-decoration: underline; -} diff --git a/src/ASPNETHandler/DemoApp/styles/rainbow.css b/src/ASPNETHandler/DemoApp/styles/rainbow.css deleted file mode 100644 index 905eb8ef1..000000000 --- a/src/ASPNETHandler/DemoApp/styles/rainbow.css +++ /dev/null @@ -1,85 +0,0 @@ -/* - -Style with support for rainbow parens - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #474949; - color: #d1d9e1; -} - - -.hljs-comment, -.hljs-quote { - color: #969896; - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-type, -.hljs-addition { - color: #cc99cc; -} - -.hljs-number, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #f99157; -} - -.hljs-string, -.hljs-doctag, -.hljs-regexp { - color: #8abeb7; -} - -.hljs-title, -.hljs-name, -.hljs-section, -.hljs-built_in { - color: #b5bd68; -} - -.hljs-variable, -.hljs-template-variable, -.hljs-selector-id, -.hljs-class .hljs-title { - color: #ffcc66; -} - -.hljs-section, -.hljs-name, -.hljs-strong { - font-weight: bold; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-subst, -.hljs-meta, -.hljs-link { - color: #f99157; -} - -.hljs-deletion { - color: #dc322f; -} - -.hljs-formula { - background: #eee8d5; -} - -.hljs-attr, -.hljs-attribute { - color: #81a2be; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/routeros.css b/src/ASPNETHandler/DemoApp/styles/routeros.css deleted file mode 100644 index ebe23990d..000000000 --- a/src/ASPNETHandler/DemoApp/styles/routeros.css +++ /dev/null @@ -1,108 +0,0 @@ -/* - - highlight.js style for Microtik RouterOS script - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #F0F0F0; -} - -/* Base color: saturation 0; */ - -.hljs, -.hljs-subst { - color: #444; -} - -.hljs-comment { - color: #888888; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-meta-keyword, -.hljs-doctag, -.hljs-name { - font-weight: bold; -} - -.hljs-attribute { - color: #0E9A00; -} - -.hljs-function { - color: #99069A; -} - -.hljs-builtin-name { - color: #99069A; -} - -/* User color: hue: 0 */ - -.hljs-type, -.hljs-string, -.hljs-number, -.hljs-selector-id, -.hljs-selector-class, -.hljs-quote, -.hljs-template-tag, -.hljs-deletion { - color: #880000; -} - -.hljs-title, -.hljs-section { - color: #880000; - font-weight: bold; -} - -.hljs-regexp, -.hljs-symbol, -.hljs-variable, -.hljs-template-variable, -.hljs-link, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #BC6060; -} - - -/* Language color: hue: 90; */ - -.hljs-literal { - color: #78A960; -} - -.hljs-built_in, -.hljs-bullet, -.hljs-code, -.hljs-addition { - color: #0C9A9A; -} - - -/* Meta color: hue: 200 */ - -.hljs-meta { - color: #1f7199; -} - -.hljs-meta-string { - color: #4d99bf; -} - - -/* Misc effects */ - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/school-book.css b/src/ASPNETHandler/DemoApp/styles/school-book.css deleted file mode 100644 index 964b51d84..000000000 --- a/src/ASPNETHandler/DemoApp/styles/school-book.css +++ /dev/null @@ -1,72 +0,0 @@ -/* - -School Book style from goldblog.com.ua (c) Zaripov Yura - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 15px 0.5em 0.5em 30px; - font-size: 11px; - line-height:16px; -} - -pre{ - background:#f6f6ae url(./school-book.png); - border-top: solid 2px #d2e8b9; - border-bottom: solid 1px #d2e8b9; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal { - color:#005599; - font-weight:bold; -} - -.hljs, -.hljs-subst { - color: #3e5915; -} - -.hljs-string, -.hljs-title, -.hljs-section, -.hljs-type, -.hljs-symbol, -.hljs-bullet, -.hljs-attribute, -.hljs-built_in, -.hljs-builtin-name, -.hljs-addition, -.hljs-variable, -.hljs-template-tag, -.hljs-template-variable, -.hljs-link { - color: #2c009f; -} - -.hljs-comment, -.hljs-quote, -.hljs-deletion, -.hljs-meta { - color: #e60415; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-doctag, -.hljs-title, -.hljs-section, -.hljs-type, -.hljs-name, -.hljs-selector-id, -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/school-book.png b/src/ASPNETHandler/DemoApp/styles/school-book.png deleted file mode 100644 index 956e9790a..000000000 Binary files a/src/ASPNETHandler/DemoApp/styles/school-book.png and /dev/null differ diff --git a/src/ASPNETHandler/DemoApp/styles/solarized-dark.css b/src/ASPNETHandler/DemoApp/styles/solarized-dark.css deleted file mode 100644 index b4c0da1f7..000000000 --- a/src/ASPNETHandler/DemoApp/styles/solarized-dark.css +++ /dev/null @@ -1,84 +0,0 @@ -/* - -Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #002b36; - color: #839496; -} - -.hljs-comment, -.hljs-quote { - color: #586e75; -} - -/* Solarized Green */ -.hljs-keyword, -.hljs-selector-tag, -.hljs-addition { - color: #859900; -} - -/* Solarized Cyan */ -.hljs-number, -.hljs-string, -.hljs-meta .hljs-meta-string, -.hljs-literal, -.hljs-doctag, -.hljs-regexp { - color: #2aa198; -} - -/* Solarized Blue */ -.hljs-title, -.hljs-section, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #268bd2; -} - -/* Solarized Yellow */ -.hljs-attribute, -.hljs-attr, -.hljs-variable, -.hljs-template-variable, -.hljs-class .hljs-title, -.hljs-type { - color: #b58900; -} - -/* Solarized Orange */ -.hljs-symbol, -.hljs-bullet, -.hljs-subst, -.hljs-meta, -.hljs-meta .hljs-keyword, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-link { - color: #cb4b16; -} - -/* Solarized Red */ -.hljs-built_in, -.hljs-deletion { - color: #dc322f; -} - -.hljs-formula { - background: #073642; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/solarized-light.css b/src/ASPNETHandler/DemoApp/styles/solarized-light.css deleted file mode 100644 index fdcfcc72c..000000000 --- a/src/ASPNETHandler/DemoApp/styles/solarized-light.css +++ /dev/null @@ -1,84 +0,0 @@ -/* - -Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #fdf6e3; - color: #657b83; -} - -.hljs-comment, -.hljs-quote { - color: #93a1a1; -} - -/* Solarized Green */ -.hljs-keyword, -.hljs-selector-tag, -.hljs-addition { - color: #859900; -} - -/* Solarized Cyan */ -.hljs-number, -.hljs-string, -.hljs-meta .hljs-meta-string, -.hljs-literal, -.hljs-doctag, -.hljs-regexp { - color: #2aa198; -} - -/* Solarized Blue */ -.hljs-title, -.hljs-section, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #268bd2; -} - -/* Solarized Yellow */ -.hljs-attribute, -.hljs-attr, -.hljs-variable, -.hljs-template-variable, -.hljs-class .hljs-title, -.hljs-type { - color: #b58900; -} - -/* Solarized Orange */ -.hljs-symbol, -.hljs-bullet, -.hljs-subst, -.hljs-meta, -.hljs-meta .hljs-keyword, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-link { - color: #cb4b16; -} - -/* Solarized Red */ -.hljs-built_in, -.hljs-deletion { - color: #dc322f; -} - -.hljs-formula { - background: #eee8d5; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/sunburst.css b/src/ASPNETHandler/DemoApp/styles/sunburst.css deleted file mode 100644 index f56dd5e9b..000000000 --- a/src/ASPNETHandler/DemoApp/styles/sunburst.css +++ /dev/null @@ -1,102 +0,0 @@ -/* - -Sunburst-like style (c) Vasily Polovnyov - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #000; - color: #f8f8f8; -} - -.hljs-comment, -.hljs-quote { - color: #aeaeae; - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-type { - color: #e28964; -} - -.hljs-string { - color: #65b042; -} - -.hljs-subst { - color: #daefa3; -} - -.hljs-regexp, -.hljs-link { - color: #e9c062; -} - -.hljs-title, -.hljs-section, -.hljs-tag, -.hljs-name { - color: #89bdff; -} - -.hljs-class .hljs-title, -.hljs-doctag { - text-decoration: underline; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-number { - color: #3387cc; -} - -.hljs-params, -.hljs-variable, -.hljs-template-variable { - color: #3e87e3; -} - -.hljs-attribute { - color: #cda869; -} - -.hljs-meta { - color: #8996a8; -} - -.hljs-formula { - background-color: #0e2231; - color: #f8f8f8; - font-style: italic; -} - -.hljs-addition { - background-color: #253b22; - color: #f8f8f8; -} - -.hljs-deletion { - background-color: #420e09; - color: #f8f8f8; -} - -.hljs-selector-class { - color: #9b703f; -} - -.hljs-selector-id { - color: #8b98ab; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/tomorrow-night-blue.css b/src/ASPNETHandler/DemoApp/styles/tomorrow-night-blue.css deleted file mode 100644 index 78e59cc8c..000000000 --- a/src/ASPNETHandler/DemoApp/styles/tomorrow-night-blue.css +++ /dev/null @@ -1,75 +0,0 @@ -/* Tomorrow Night Blue Theme */ -/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ - -/* Tomorrow Comment */ -.hljs-comment, -.hljs-quote { - color: #7285b7; -} - -/* Tomorrow Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-regexp, -.hljs-deletion { - color: #ff9da4; -} - -/* Tomorrow Orange */ -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params, -.hljs-meta, -.hljs-link { - color: #ffc58f; -} - -/* Tomorrow Yellow */ -.hljs-attribute { - color: #ffeead; -} - -/* Tomorrow Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-addition { - color: #d1f1a9; -} - -/* Tomorrow Blue */ -.hljs-title, -.hljs-section { - color: #bbdaff; -} - -/* Tomorrow Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #ebbbff; -} - -.hljs { - display: block; - overflow-x: auto; - background: #002451; - color: white; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/tomorrow-night-bright.css b/src/ASPNETHandler/DemoApp/styles/tomorrow-night-bright.css deleted file mode 100644 index e05af8ae2..000000000 --- a/src/ASPNETHandler/DemoApp/styles/tomorrow-night-bright.css +++ /dev/null @@ -1,74 +0,0 @@ -/* Tomorrow Night Bright Theme */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ - -/* Tomorrow Comment */ -.hljs-comment, -.hljs-quote { - color: #969896; -} - -/* Tomorrow Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-regexp, -.hljs-deletion { - color: #d54e53; -} - -/* Tomorrow Orange */ -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params, -.hljs-meta, -.hljs-link { - color: #e78c45; -} - -/* Tomorrow Yellow */ -.hljs-attribute { - color: #e7c547; -} - -/* Tomorrow Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-addition { - color: #b9ca4a; -} - -/* Tomorrow Blue */ -.hljs-title, -.hljs-section { - color: #7aa6da; -} - -/* Tomorrow Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #c397d8; -} - -.hljs { - display: block; - overflow-x: auto; - background: black; - color: #eaeaea; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/tomorrow-night-eighties.css b/src/ASPNETHandler/DemoApp/styles/tomorrow-night-eighties.css deleted file mode 100644 index 08fd51c74..000000000 --- a/src/ASPNETHandler/DemoApp/styles/tomorrow-night-eighties.css +++ /dev/null @@ -1,74 +0,0 @@ -/* Tomorrow Night Eighties Theme */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ - -/* Tomorrow Comment */ -.hljs-comment, -.hljs-quote { - color: #999999; -} - -/* Tomorrow Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-regexp, -.hljs-deletion { - color: #f2777a; -} - -/* Tomorrow Orange */ -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params, -.hljs-meta, -.hljs-link { - color: #f99157; -} - -/* Tomorrow Yellow */ -.hljs-attribute { - color: #ffcc66; -} - -/* Tomorrow Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-addition { - color: #99cc99; -} - -/* Tomorrow Blue */ -.hljs-title, -.hljs-section { - color: #6699cc; -} - -/* Tomorrow Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #cc99cc; -} - -.hljs { - display: block; - overflow-x: auto; - background: #2d2d2d; - color: #cccccc; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/tomorrow-night.css b/src/ASPNETHandler/DemoApp/styles/tomorrow-night.css deleted file mode 100644 index ddd270a4e..000000000 --- a/src/ASPNETHandler/DemoApp/styles/tomorrow-night.css +++ /dev/null @@ -1,75 +0,0 @@ -/* Tomorrow Night Theme */ -/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ - -/* Tomorrow Comment */ -.hljs-comment, -.hljs-quote { - color: #969896; -} - -/* Tomorrow Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-regexp, -.hljs-deletion { - color: #cc6666; -} - -/* Tomorrow Orange */ -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params, -.hljs-meta, -.hljs-link { - color: #de935f; -} - -/* Tomorrow Yellow */ -.hljs-attribute { - color: #f0c674; -} - -/* Tomorrow Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-addition { - color: #b5bd68; -} - -/* Tomorrow Blue */ -.hljs-title, -.hljs-section { - color: #81a2be; -} - -/* Tomorrow Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #b294bb; -} - -.hljs { - display: block; - overflow-x: auto; - background: #1d1f21; - color: #c5c8c6; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/tomorrow.css b/src/ASPNETHandler/DemoApp/styles/tomorrow.css deleted file mode 100644 index 026a62fe3..000000000 --- a/src/ASPNETHandler/DemoApp/styles/tomorrow.css +++ /dev/null @@ -1,72 +0,0 @@ -/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ - -/* Tomorrow Comment */ -.hljs-comment, -.hljs-quote { - color: #8e908c; -} - -/* Tomorrow Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-regexp, -.hljs-deletion { - color: #c82829; -} - -/* Tomorrow Orange */ -.hljs-number, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params, -.hljs-meta, -.hljs-link { - color: #f5871f; -} - -/* Tomorrow Yellow */ -.hljs-attribute { - color: #eab700; -} - -/* Tomorrow Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet, -.hljs-addition { - color: #718c00; -} - -/* Tomorrow Blue */ -.hljs-title, -.hljs-section { - color: #4271ae; -} - -/* Tomorrow Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #8959a8; -} - -.hljs { - display: block; - overflow-x: auto; - background: white; - color: #4d4d4c; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/vs.css b/src/ASPNETHandler/DemoApp/styles/vs.css deleted file mode 100644 index c5d07d311..000000000 --- a/src/ASPNETHandler/DemoApp/styles/vs.css +++ /dev/null @@ -1,68 +0,0 @@ -/* - -Visual Studio-like style based on original C# coloring by Jason Diamond - -*/ -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: white; - color: black; -} - -.hljs-comment, -.hljs-quote, -.hljs-variable { - color: #008000; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-built_in, -.hljs-name, -.hljs-tag { - color: #00f; -} - -.hljs-string, -.hljs-title, -.hljs-section, -.hljs-attribute, -.hljs-literal, -.hljs-template-tag, -.hljs-template-variable, -.hljs-type, -.hljs-addition { - color: #a31515; -} - -.hljs-deletion, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-meta { - color: #2b91af; -} - -.hljs-doctag { - color: #808080; -} - -.hljs-attr { - color: #f00; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-link { - color: #00b0e8; -} - - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/styles/vs2015.css b/src/ASPNETHandler/DemoApp/styles/vs2015.css deleted file mode 100644 index d1d9be3ca..000000000 --- a/src/ASPNETHandler/DemoApp/styles/vs2015.css +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Visual Studio 2015 dark style - * Author: Nicolas LLOBERA - */ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #1E1E1E; - color: #DCDCDC; -} - -.hljs-keyword, -.hljs-literal, -.hljs-symbol, -.hljs-name { - color: #569CD6; -} -.hljs-link { - color: #569CD6; - text-decoration: underline; -} - -.hljs-built_in, -.hljs-type { - color: #4EC9B0; -} - -.hljs-number, -.hljs-class { - color: #B8D7A3; -} - -.hljs-string, -.hljs-meta-string { - color: #D69D85; -} - -.hljs-regexp, -.hljs-template-tag { - color: #9A5334; -} - -.hljs-subst, -.hljs-function, -.hljs-title, -.hljs-params, -.hljs-formula { - color: #DCDCDC; -} - -.hljs-comment, -.hljs-quote { - color: #57A64A; - font-style: italic; -} - -.hljs-doctag { - color: #608B4E; -} - -.hljs-meta, -.hljs-meta-keyword, -.hljs-tag { - color: #9B9B9B; -} - -.hljs-variable, -.hljs-template-variable { - color: #BD63C5; -} - -.hljs-attr, -.hljs-attribute, -.hljs-builtin-name { - color: #9CDCFE; -} - -.hljs-section { - color: gold; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -/*.hljs-code { - font-family:'Monospace'; -}*/ - -.hljs-bullet, -.hljs-selector-tag, -.hljs-selector-id, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #D7BA7D; -} - -.hljs-addition { - background-color: #144212; - display: inline-block; - width: 100%; -} - -.hljs-deletion { - background-color: #600; - display: inline-block; - width: 100%; -} diff --git a/src/ASPNETHandler/DemoApp/styles/xcode.css b/src/ASPNETHandler/DemoApp/styles/xcode.css deleted file mode 100644 index 43dddad84..000000000 --- a/src/ASPNETHandler/DemoApp/styles/xcode.css +++ /dev/null @@ -1,93 +0,0 @@ -/* - -XCode style (c) Angel Garcia - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #fff; - color: black; -} - -.hljs-comment, -.hljs-quote { - color: #006a00; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal { - color: #aa0d91; -} - -.hljs-name { - color: #008; -} - -.hljs-variable, -.hljs-template-variable { - color: #660; -} - -.hljs-string { - color: #c41a16; -} - -.hljs-regexp, -.hljs-link { - color: #080; -} - -.hljs-title, -.hljs-tag, -.hljs-symbol, -.hljs-bullet, -.hljs-number, -.hljs-meta { - color: #1c00cf; -} - -.hljs-section, -.hljs-class .hljs-title, -.hljs-type, -.hljs-attr, -.hljs-built_in, -.hljs-builtin-name, -.hljs-params { - color: #5c2699; -} - -.hljs-attribute, -.hljs-subst { - color: #000; -} - -.hljs-formula { - background-color: #eee; - font-style: italic; -} - -.hljs-addition { - background-color: #baeeba; -} - -.hljs-deletion { - background-color: #ffc8bd; -} - -.hljs-selector-id, -.hljs-selector-class { - color: #9b703f; -} - -.hljs-doctag, -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} diff --git a/src/ASPNETHandler/DemoApp/styles/xt256.css b/src/ASPNETHandler/DemoApp/styles/xt256.css deleted file mode 100644 index 58df82cb7..000000000 --- a/src/ASPNETHandler/DemoApp/styles/xt256.css +++ /dev/null @@ -1,92 +0,0 @@ - -/* - xt256.css - - Contact: initbar [at] protonmail [dot] ch - : github.com/initbar -*/ - -.hljs { - display: block; - overflow-x: auto; - color: #eaeaea; - background: #000; - padding: 0.5; -} - -.hljs-subst { - color: #eaeaea; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-builtin-name, -.hljs-type { - color: #eaeaea; -} - -.hljs-params { - color: #da0000; -} - -.hljs-literal, -.hljs-number, -.hljs-name { - color: #ff0000; - font-weight: bolder; -} - -.hljs-comment { - color: #969896; -} - -.hljs-selector-id, -.hljs-quote { - color: #00ffff; -} - -.hljs-template-variable, -.hljs-variable, -.hljs-title { - color: #00ffff; - font-weight: bold; -} - -.hljs-selector-class, -.hljs-keyword, -.hljs-symbol { - color: #fff000; -} - -.hljs-string, -.hljs-bullet { - color: #00ff00; -} - -.hljs-tag, -.hljs-section { - color: #000fff; -} - -.hljs-selector-tag { - color: #000fff; - font-weight: bold; -} - -.hljs-attribute, -.hljs-built_in, -.hljs-regexp, -.hljs-link { - color: #ff00ff; -} - -.hljs-meta { - color: #fff; - font-weight: bolder; -} diff --git a/src/ASPNETHandler/DemoApp/styles/zenburn.css b/src/ASPNETHandler/DemoApp/styles/zenburn.css deleted file mode 100644 index 07be50201..000000000 --- a/src/ASPNETHandler/DemoApp/styles/zenburn.css +++ /dev/null @@ -1,80 +0,0 @@ -/* - -Zenburn style from voldmar.ru (c) Vladimir Epifanov -based on dark.css by Ivan Sagalaev - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #3f3f3f; - color: #dcdcdc; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-tag { - color: #e3ceab; -} - -.hljs-template-tag { - color: #dcdcdc; -} - -.hljs-number { - color: #8cd0d3; -} - -.hljs-variable, -.hljs-template-variable, -.hljs-attribute { - color: #efdcbc; -} - -.hljs-literal { - color: #efefaf; -} - -.hljs-subst { - color: #8f8f8f; -} - -.hljs-title, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-section, -.hljs-type { - color: #efef8f; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-link { - color: #dca3a3; -} - -.hljs-deletion, -.hljs-string, -.hljs-built_in, -.hljs-builtin-name { - color: #cc9393; -} - -.hljs-addition, -.hljs-comment, -.hljs-quote, -.hljs-meta { - color: #7f9f7f; -} - - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/ASPNETHandler/DemoApp/viewsrc.jpg b/src/ASPNETHandler/DemoApp/viewsrc.jpg deleted file mode 100644 index 98b37e43a..000000000 Binary files a/src/ASPNETHandler/DemoApp/viewsrc.jpg and /dev/null differ diff --git a/src/ASPNETHandler/DemoApp/web.config b/src/ASPNETHandler/DemoApp/web.config deleted file mode 100644 index 3afa63324..000000000 --- a/src/ASPNETHandler/DemoApp/web.config +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ASPNETHandler/Dockerfile b/src/ASPNETHandler/Dockerfile deleted file mode 100644 index 70a939ce7..000000000 --- a/src/ASPNETHandler/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM mono - -MAINTAINER oscript.io team - -RUN apt-get update \ - && apt-get update \ - && apt-get install mono-devel apache2 libapache2-mod-mono mono-apache-server4 -y --no-install-recommends \ - && a2enmod mod_mono \ - && service apache2 stop \ - && apt-get autoremove -y \ - && apt-get clean \ - && rm -rf /var/tmp/* \ - && rm -rf /var/lib/apt/lists/* \ - && mkdir -p /etc/mono/registry /etc/mono/registry/LocalMachine \ - && sed -ri ' \ - s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \ - s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \ - ' /etc/apache2/apache2.conf - -ADD ./nixconfig/apache2-site.conf /etc/apache2/sites-available/default - -RUN mkdir -p /srv/www/mono.localhost - -COPY ./bin/Debug/ /srv/www/mono.localhost -COPY ./nixconfig/Web.config /srv/www/mono.localhost - -RUN ls /srv/www/mono.localhost - -RUN /usr/bin/mod-mono-server4 --version - -WORKDIR /var/www -EXPOSE 80 -CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] \ No newline at end of file diff --git a/src/ASPNETHandler/HTTPServiceContext.cs b/src/ASPNETHandler/HTTPServiceContext.cs deleted file mode 100644 index 0c6af79e6..000000000 --- a/src/ASPNETHandler/HTTPServiceContext.cs +++ /dev/null @@ -1,53 +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 ScriptEngine.Machine; -using ScriptEngine.Machine.Contexts; - -namespace ScriptEngine.HostedScript.Library.HTTPService -{ - [ContextClass("HTTPСервисКонтекст", "HTTPServiceContext")] - public class HTTPServiceContextImpl : AutoContext - { - System.Web.HttpContext _context; - SessionStateImpl _sessionState; - - public HTTPServiceContextImpl(System.Web.HttpContext context) - { - _context = context; - _sessionState = new SessionStateImpl(_context); - } - - [ContextProperty("ФизическийПуть", "PhysicalPath")] - public IValue PhysicalPath - { - get - { - return ValueFactory.Create(_context.Request.PhysicalPath); - } - } - - [ContextProperty("АдресКлиента", "UserHostAddress")] - public IValue UserHostAddress - { - get - { - return ValueFactory.Create(_context.Request.UserHostAddress); - } - } - - [ContextProperty("Сессия", "Session")] - public SessionStateImpl Session - { - get - { - return _sessionState; - } - } - - } -} diff --git a/src/ASPNETHandler/HTTPServiceRequest.cs b/src/ASPNETHandler/HTTPServiceRequest.cs deleted file mode 100644 index 1cd00220a..000000000 --- a/src/ASPNETHandler/HTTPServiceRequest.cs +++ /dev/null @@ -1,208 +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 ScriptEngine.Machine; -using ScriptEngine.Machine.Contexts; - -/// -/// -/// - -namespace ScriptEngine.HostedScript.Library.HTTPService -{ - /* HTTPСервисЗапрос - * Свойства: - - +HTTPМетод (HTTPMethod) - +БазовыйURL (BaseURL) - +Заголовки (Headers) - +ОтносительныйURL (RelativeURL) - +ПараметрыURL (URLParameters) - +ПараметрыЗапроса (QueryOptions) - - Методы: - - +ПолучитьТелоКакДвоичныеДанные (GetBodyAsBinaryData) - ПолучитьТелоКакПоток (GetBodyAsStream) - +ПолучитьТелоКакСтроку (GetBodyAsString) - - */ - [ContextClass("HTTPСервисЗапрос", "HTTPServiceRequest")] - public class HTTPServiceRequestImpl : AutoContext - { - System.Web.HttpContext _httpContext; - - FixedMapImpl _headers; - FixedMapImpl _urlParams; - FixedMapImpl _queryOptions; - HTTPServiceContextImpl _context; - - #region Свойства 1C - [ContextProperty("Контекст", "Context")] - public HTTPServiceContextImpl Context - { - get - { - return _context; - } - } - - - [ContextProperty("HTTPМетод", "HTTPMethod")] - public string HTTPMethod - { - get - { - return _httpContext.Request.HttpMethod.ToUpper(); - } - } - - [ContextProperty("БазовыйURL", "BaseURL")] - public string BaseURL - { - get - { - return _httpContext.Request.Url.Host; - } - } - - [ContextProperty("Заголовки", "Headers")] - public FixedMapImpl Headers - { - get - { - return _headers; - } - } - - [ContextProperty("ОтносительныйURL", "RelativeURL")] - public string RelativeURL - { - get - { - return _httpContext.Request.FilePath; - } - } - - [ContextProperty("ПараметрыURL", "URLParameters")] - public FixedMapImpl URLParameters - { - get - { - return _urlParams; - } - } - - [ContextProperty("ПараметрыЗапроса", "QueryOptions")] - public FixedMapImpl QueryOptions - { - get - { - return _queryOptions; - } - } - #endregion - - #region Методы1С - - [ContextMethod("ПолучитьТелоКакДвоичныеДанные", "GetBodyAsBinaryData")] - public BinaryDataContext GetBodyAsBinaryData() - { - System.IO.Stream str = _httpContext.Request.InputStream; - int bytes_count = Convert.ToInt32(str.Length); - byte[] buffer = new byte[bytes_count]; - str.Seek(0, System.IO.SeekOrigin.Begin); - str.Read(buffer, 0, bytes_count); - - return new BinaryDataContext(buffer); - } - - [ContextMethod("ПолучитьТелоКакСтроку", "GetBodyAsString")] - public string GetBodyAsString(IValue encoding = null) - { - // Формируем кодировку как в 1С. Если не указана, смотрим Content-Type. Если там не указана - используем UTF8 - System.Text.Encoding enc = System.Text.Encoding.UTF8; - - if (encoding != null) - enc = TextEncodingEnum.GetEncoding(encoding); - else - { - System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("charset=([^\\\"']+)", System.Text.RegularExpressions.RegexOptions.IgnoreCase); - string charsetString = regex.Match(_httpContext.Request.ContentType).Value; - - if (charsetString != "") - { - // Что-то нашли - try - { - //charsetString.Substring(8) делает "charset=Кодировка" -> "Кодировка" - enc = TextEncodingEnum.GetEncodingByName(charsetString.Substring(8)); - } - catch - { - // что то не так, осталась UTF8 - } - } - } - - System.IO.Stream str = _httpContext.Request.InputStream; - int bytes_count = Convert.ToInt32(str.Length); - byte[] buffer = new byte[bytes_count]; - - str.Seek(0, System.IO.SeekOrigin.Begin); - str.Read(buffer, 0, bytes_count); - - return enc.GetString(buffer); - } - - //ПолучитьТелоКакПоток(GetBodyAsStream) - [ContextMethod("ПолучитьТелоКакПоток", "GetBodyAsStream")] - public GenericStream GetBodyAsStream() - { - return new GenericStream(_httpContext.Request.InputStream); - } - - #endregion - - public HTTPServiceRequestImpl(System.Web.HttpContext ctx) - { - _httpContext = ctx; - // Инициализируем объект для 1С - // Заголовки - MapImpl headers = new MapImpl(); - - for (int i = 0; i < _httpContext.Request.Headers.Count; i++) - headers.Insert(ValueFactory.Create(_httpContext.Request.Headers.GetKey(i)) - , ValueFactory.Create(_httpContext.Request.Headers.Get(i)) - ); - - this._headers = new FixedMapImpl(headers); - - // ПараметрыURL будут пустыми - _urlParams = new FixedMapImpl(new MapImpl()); - - // Параметры запроса - MapImpl queryOptions = new MapImpl(); - - // Изменено для совместимости. в 1С только параметры командной строки - // Надо перенести в Контекст - //for (int i = 0; i < _httpContext.Request.Params.Count; i++) - // queryOptions.Insert(ValueFactory.Create(_httpContext.Request.Params.GetKey(i)) - // , ValueFactory.Create(_httpContext.Request.Params.Get(i)) - // ); - for (int i = 0; i < _httpContext.Request.QueryString.Count; i++) - queryOptions.Insert(ValueFactory.Create(_httpContext.Request.QueryString.GetKey(i)) - , ValueFactory.Create(_httpContext.Request.QueryString.Get(i)) - ); - - _queryOptions = new FixedMapImpl(queryOptions); - - _context = new HTTPServiceContextImpl(_httpContext); - } - } -} \ No newline at end of file diff --git a/src/ASPNETHandler/HTTPServiceResponse.cs b/src/ASPNETHandler/HTTPServiceResponse.cs deleted file mode 100644 index dcc73f02c..000000000 --- a/src/ASPNETHandler/HTTPServiceResponse.cs +++ /dev/null @@ -1,210 +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.IO; -using System.Text; -using OneScript.StandardLibrary; -using OneScript.StandardLibrary.Binary; -using OneScript.StandardLibrary.Collections; -using OneScript.StandardLibrary.Text; -using ScriptEngine.Machine; -using ScriptEngine.Machine.Contexts; - -/// -/// -/// - -namespace ScriptEngine.HostedScript.Library.HTTPService -{ - /* - 8.3.10.2650 - - HTTPСервисОтвет (HTTPServiceResponseImpl) - - Свойства: - - +Заголовки (Headers) - Соответствие - +КодСостояния (StatusCode) - Целое - +Причина (Reason) - Строка - - Методы: - - +ПолучитьИмяФайлаТела (GetBodyFileName) - +ПолучитьТелоКакДвоичныеДанные (GetBodyAsBinaryData) - +ПолучитьТелоКакСтроку (GetBodyAsString) - +ПолучитьТелоКакПоток (GetBodyAsStream) - +УстановитьИмяФайлаТела (SetBodyFileName) - +УстановитьТелоИзДвоичныхДанных (SetBodyFromBinaryData) - +УстановитьТелоИзСтроки (SetBodyFromString) - - Конструкторы: - - +По коду состояния, причине и заголовкам - - ОТЛИЧИЯ: - При возврате потоков в несколько переменных, в 1С не обновляется текущее положение потока, - в настоящей реализации обновляется - */ - - [ContextClass("HTTPСервисОтвет", "HTTPServiceResponse")] - public class HTTPServiceResponseImpl : AutoContext - { - MapImpl _headers = new MapImpl(); - string _reason = ""; - int _statusCode = 200; - string _contentCharset = Encoding.UTF8.WebName; - - Stream _bodyStream = new MemoryStream(); - - public Stream BodyStream => _bodyStream; - public string ContentCharset => _contentCharset; - - public HTTPServiceResponseImpl() - { - } - - #region Свойства 1C - - [ContextProperty("Заголовки", "Headers")] - public MapImpl Headers - { - get - { - return _headers; - } - set - { - _headers = value; - } - } - - [ContextProperty("Причина", "Reason")] - public string Reason - { - get - { - return _reason; - } - set - { - _reason = value; - } - } - - [ContextProperty("КодСостояния", "StatusCode")] - public int StatusCode - { - get - { - return _statusCode; - } - set - { - _statusCode = value; - } - } - - #endregion - - #region Функции 1С - - [ContextMethod("ПолучитьИмяФайлаТела", "GetBodyFileName")] - public IValue GetBodyFileName() - { - if ((_bodyStream as FileStream) == null) - return ValueFactory.Create(); - else - return ValueFactory.Create(((FileStream)_bodyStream).Name); - } - - [ContextMethod("ПолучитьТелоКакДвоичныеДанные", "GetBodyAsBinaryData")] - public BinaryDataContext ПолучитьТелоКакДвоичныеДанные() - { - if ((_bodyStream as MemoryStream) == null) - return null; - else - return new BinaryDataContext(((MemoryStream)_bodyStream).GetBuffer()); - } - - [ContextMethod("ПолучитьТелоКакПоток", "GetBodyAsStream")] - public GenericStream GetBodyAsStream() - { - return new GenericStream(_bodyStream); - } - - [ContextMethod("ПолучитьТелоКакСтроку", "GetBodyAsString")] - public IValue GetBodyAsString() - { - var body = _bodyStream as MemoryStream; - if (body == null) - return ValueFactory.Create(); - else - { - // Выяснено экспериментальным путем, используется UTF8 (8.3.10.2650) - return ValueFactory.Create(Encoding.UTF8.GetString(body.GetBuffer(), 0, (int)body.Length)); - } - } - - [ContextMethod("УстановитьИмяФайлаТела", "SetBodyFileName")] - public void SetBodyFileName(IValue fileName) - { - _contentCharset = Encoding.UTF8.WebName; - _bodyStream = new FileStream(fileName.AsString(), FileMode.Open, FileAccess.Read); - } - - [ContextMethod("УстановитьТелоИзДвоичныхДанных", "SetBodyFromBinaryData")] - public void SetBodyFromBinaryData(BinaryDataContext binaryData) - { - _contentCharset = Encoding.UTF8.WebName; - _bodyStream = new MemoryStream(); - _bodyStream.Write(binaryData.Buffer, 0, binaryData.Buffer.Length); - _bodyStream.Seek(0, SeekOrigin.Begin); - _bodyStream = new MemoryStream(); - binaryData.CopyTo(_bodyStream); - _bodyStream.Seek(0, SeekOrigin.Begin); - } - - [ContextMethod("УстановитьТелоИзСтроки", "SetBodyFromString")] - public void SetBodyFromString(string str, IValue encoding = null, IValue useBOM = null) - { - // Получаем кодировку - // useBOM должен иметь тип ИспользованиеByteOrderMark он не реализован. Его не используем - // Из синтаксис-помощника в режиме совместимости Использовать - // Из синтаксис помощника если кодировка не задана используем UTF8 - - Encoding enc = Encoding.UTF8; - if (encoding != null) - enc = TextEncodingEnum.GetEncoding(encoding); - - _contentCharset = enc.WebName; - - _bodyStream = new MemoryStream(); - byte[] buffer = enc.GetBytes(str); - _bodyStream.Write(buffer, 0, buffer.Length); - _bodyStream.Seek(0, SeekOrigin.Begin); - } - - [ScriptConstructor(Name = "По коду состояния, причине и заголовкам")] - public static HTTPServiceResponseImpl Constructor(IValue statusCode, IValue reason = null, MapImpl headers = null) - { - var response = new HTTPServiceResponseImpl(); - - response._statusCode = Convert.ToInt16(statusCode.AsNumber()); - - if (reason != null) - response._reason = reason.AsString(); - - if (headers != null) - response._headers = headers; - - return response; - } - - #endregion - } -} \ No newline at end of file diff --git a/src/ASPNETHandler/HTTPServices.csproj b/src/ASPNETHandler/HTTPServices.csproj deleted file mode 100644 index 5c2718918..000000000 --- a/src/ASPNETHandler/HTTPServices.csproj +++ /dev/null @@ -1,27 +0,0 @@ - - - - - ASPNETHandler - HTTP services for 1Script - ASPNETHandler - $(TargetFrameworkId) - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ASPNETHandler/HttpMeans.cs b/src/ASPNETHandler/HttpMeans.cs deleted file mode 100644 index bc747bd66..000000000 --- a/src/ASPNETHandler/HttpMeans.cs +++ /dev/null @@ -1,36 +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 ScriptEngine.Machine.Contexts; -using System.Web; - -/// -/// -/// - -namespace ScriptEngine.HostedScript.Library.HTTPService -{ - [ContextClass("СредстваHTTP", "HTTPMeans")] - public class HttpMeansImpl : AutoContext - { - [ContextMethod("ПолучитьФизическийПутьИзВиртуального", "MapPath")] - public string MapPath(string virtualPath) - { - return HttpContext.Current.Server.MapPath(virtualPath); ; - } - - [ScriptConstructor(Name = "Без параметров")] - public static HttpMeansImpl Constructor() - { - return new HttpMeansImpl(); - } - - public HttpMeansImpl() - { - } - } -} diff --git a/src/ASPNETHandler/SessionState.cs b/src/ASPNETHandler/SessionState.cs deleted file mode 100644 index 37660b1f4..000000000 --- a/src/ASPNETHandler/SessionState.cs +++ /dev/null @@ -1,36 +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 ScriptEngine.Machine; -using ScriptEngine.Machine.Contexts; - -/// -/// -/// - -namespace ScriptEngine.HostedScript.Library.HTTPService -{ - [ContextClass("HTTPСервисПараметрыСессии", "HTTPServiceRequestSessionState")] - public class SessionStateImpl : AutoContext - { - System.Web.HttpContext _context; - - public SessionStateImpl(System.Web.HttpContext context) - { - _context = context; - } - - [ContextProperty("Количество", "Count")] - public IValue Count - { - get - { - return ValueFactory.Create(_context.Session.Count); - } - } - } -} diff --git a/src/ASPNETHandler/check-docker.sh b/src/ASPNETHandler/check-docker.sh deleted file mode 100755 index 1a9439ae2..000000000 --- a/src/ASPNETHandler/check-docker.sh +++ /dev/null @@ -1,3 +0,0 @@ -docker build -t oscript/http-service . - -docker run --rm -it -p 8080:80 oscript/http-service diff --git a/src/ASPNETHandler/nixconfig/Web.config b/src/ASPNETHandler/nixconfig/Web.config deleted file mode 100644 index 6f9b6ae07..000000000 --- a/src/ASPNETHandler/nixconfig/Web.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ASPNETHandler/nixconfig/apache2-site.conf b/src/ASPNETHandler/nixconfig/apache2-site.conf deleted file mode 100644 index 3a131d082..000000000 --- a/src/ASPNETHandler/nixconfig/apache2-site.conf +++ /dev/null @@ -1,46 +0,0 @@ - - ServerName mono.localhost - ServerAdmin web-admin@mono.localhost - DocumentRoot /srv/www/mono.localhost - # MonoServerPath can be changed to specify which version of ASP.NET is hosted - # mod-mono-server1 = ASP.NET 1.1 / mod-mono-server2 = ASP.NET 2.0 - # For SUSE Linux Enterprise Mono Extension, uncomment the line below: - # MonoServerPath mono.localhost "/opt/novell/mono/bin/mod-mono-server2" - # For Mono on openSUSE, uncomment the line below instead: - MonoServerPath mono.localhost "/usr/bin/mod-mono-server4" - - # To obtain line numbers in stack traces you need to do two things: - # 1) Enable Debug code generation in your page by using the Debug="true" - # page directive, or by setting in the - # application's Web.config - # 2) Uncomment the MonoDebug true directive below to enable mod_mono debugging - MonoDebug mono.localhost true - - # The MONO_IOMAP environment variable can be configured to provide platform abstraction - # for file access in Linux. Valid values for MONO_IOMAP are: - # case - # drive - # all - # Uncomment the line below to alter file access behavior for the configured application - MonoSetEnv mono.localhost MONO_IOMAP=all - # - # Additional environtment variables can be set for this server instance using - # the MonoSetEnv directive. MonoSetEnv takes a string of 'name=value' pairs - # separated by semicolons. For instance, to enable platform abstraction *and* - # use Mono's old regular expression interpreter (which is slower, but has a - # shorter setup time), uncomment the line below instead: - # MonoSetEnv mono.localhost MONO_IOMAP=all;MONO_OLD_RX=1 - - MonoApplications mono.localhost "/mono:/srv/www/mono.localhost" - - Allow from all - Order allow,deny - MonoSetServerAlias mono.localhost - SetHandler mono - SetOutputFilter DEFLATE - SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary - - - AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript - - \ No newline at end of file diff --git a/src/Installer/BinaryContent.wxs b/src/Installer/BinaryContent.wxs deleted file mode 100644 index a5791c50f..000000000 --- a/src/Installer/BinaryContent.wxs +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Installer/DocumentsContent.wxs b/src/Installer/DocumentsContent.wxs deleted file mode 100644 index 5a9e577ac..000000000 --- a/src/Installer/DocumentsContent.wxs +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/Installer/ExamplesContent.wxs b/src/Installer/ExamplesContent.wxs deleted file mode 100644 index 9b738987e..000000000 --- a/src/Installer/ExamplesContent.wxs +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/Installer/Features.wxs b/src/Installer/Features.wxs deleted file mode 100644 index 9bf4cc664..000000000 --- a/src/Installer/Features.wxs +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Installer/Installer.wixproj b/src/Installer/Installer.wixproj deleted file mode 100644 index 009bfbcd0..000000000 --- a/src/Installer/Installer.wixproj +++ /dev/null @@ -1,105 +0,0 @@ - - - - Debug - x86 - 1.0.0 - $(SolutionDir)..\install\build\ - 3.9 - bbe794a6-b159-422f-b655-b7f03f25f223 - 2.0 - OneScript-$(Version) - Package - $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets - $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets - Installer - - - bin\$(Configuration)\ - obj\$(Configuration)\ - Debug;ProductVersion=$(Version);OutputPathForBuild=$(OutputPathForBuild);LibraryContentPath=$(OutputPathForBuild)lib;DocContentPath=$(OutputPathForBuild)doc - - - -cultures:ru-RU - False - False - True - - - - - bin\$(Configuration)\ - obj\$(Configuration)\ - ProductVersion=$(Version);OutputPathForBuild=$(OutputPathForBuild);LibraryContentPath=$(OutputPathForBuild)lib;DocContentPath=$(OutputPathForBuild)doc - -cultures:ru-RU - True - - - - - - - - - - - - $(WixExtDir)\WixNetFxExtension.dll - WixNetFxExtension - - - $(WixExtDir)\WixUIExtension.dll - WixUIExtension - - - - - - - - - "%25WIX%25\bin\heat.exe" dir "$(OutputPathForBuild)lib" -o "$(ProjectDir)LibraryContent.wxs" -dr LibFolder -cg Library.Content -sfrag -gg -srd -var var.LibraryContentPath -"%25WIX%25\bin\heat.exe" dir "$(OutputPathForBuild)doc" -o "$(ProjectDir)DocumentsContent.wxs" -dr DocFolder -cg Docs.Content -sfrag -gg -srd -var var.DocContentPath - - - obj\$(Configuration)\ - Debug;ProductVersion=$(Version);OutputPathForBuild=$(OutputPathForBuild);LibraryContentPath=$(OutputPathForBuild)lib;DocContentPath=$(OutputPathForBuild)doc - - - -cultures:ru-RU - False - False - True - - - bin\Debug\ - - - obj\$(Configuration)\ - ProductVersion=$(Version);OutputPathForBuild=$(OutputPathForBuild);LibraryContentPath=$(OutputPathForBuild)lib;DocContentPath=$(OutputPathForBuild)doc - -cultures:ru-RU - True - bin\Release\ - - - obj\$(Configuration)\ - Debug;ProductVersion=$(Version);OutputPathForBuild=$(OutputPathForBuild);LibraryContentPath=$(OutputPathForBuild)lib;DocContentPath=$(OutputPathForBuild)doc - - - -cultures:ru-RU - False - False - True - - - bin\LinuxDebug\ - - - \ No newline at end of file diff --git a/src/Installer/LibraryContent.wxs b/src/Installer/LibraryContent.wxs deleted file mode 100644 index d03be78d7..000000000 --- a/src/Installer/LibraryContent.wxs +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/Installer/Product.wxs b/src/Installer/Product.wxs deleted file mode 100644 index d0106c97d..000000000 --- a/src/Installer/Product.wxs +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Installer/installer_left.bmp b/src/Installer/installer_left.bmp deleted file mode 100644 index d6d64fae8..000000000 Binary files a/src/Installer/installer_left.bmp and /dev/null differ diff --git a/src/Installer/mpl2_license.rtf b/src/Installer/mpl2_license.rtf deleted file mode 100644 index 6ab9027fd..000000000 --- a/src/Installer/mpl2_license.rtf +++ /dev/null @@ -1,550 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1251\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang1049\deflangfe1049\themelang1049\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\f2\fbidi \fmodern\fcharset204\fprq1{\*\panose 02070309020205020404}Courier New;}{\f34\fbidi \froman\fcharset204\fprq2{\*\panose 02040503050406030204}Cambria Math;} -{\flomajor\f31500\fbidi \froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbmajor\f31501\fbidi \froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fhimajor\f31502\fbidi \fswiss\fcharset204\fprq2{\*\panose 020f0302020204030204}Calibri Light;}{\fbimajor\f31503\fbidi \froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\flominor\f31504\fbidi \froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbminor\f31505\fbidi \froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fhiminor\f31506\fbidi \fswiss\fcharset204\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset0\fprq2 Times New Roman;} -{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f61\fbidi \fmodern\fcharset0\fprq1 Courier New;} -{\f59\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f62\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f63\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f64\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);} -{\f65\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f66\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f67\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f381\fbidi \froman\fcharset0\fprq2 Cambria Math;} -{\f379\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f382\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f383\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f386\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;} -{\f387\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\flomajor\f31510\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fdbmajor\f31520\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31530\fbidi \fswiss\fcharset0\fprq2 Calibri Light;} -{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;}{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;} -{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}{\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);}{\fbimajor\f31540\fbidi \froman\fcharset0\fprq2 Times New Roman;} -{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31550\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fdbminor\f31560\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31570\fbidi \fswiss\fcharset0\fprq2 Calibri;} -{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} -{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31580\fbidi \froman\fcharset0\fprq2 Times New Roman;} -{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; -\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp -\f31506\fs22\lang1049\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa160\sl259\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1049\langfe1033\cgrid\langnp1049\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive -\ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* -\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa160\sl259\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1049\langfe1033\cgrid\langnp1049\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{ -\s15\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 -\f2\fs20\lang1049\langfe1049\cgrid\langnp1049\langfenp1049 \sbasedon0 \snext15 \slink16 \ssemihidden \sunhideused \styrsid4543286 HTML Preformatted;}{\*\cs16 \additive \rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\lang0\langfe1049\langnp0\langfenp1049 -\sbasedon10 \slink15 \slocked \ssemihidden \styrsid4543286 \'d1\'f2\'e0\'ed\'e4\'e0\'f0\'f2\'ed\'fb\'e9 HTML \'c7\'ed\'e0\'ea;}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid4543286\rsid6367065 -\rsid6900295}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info -{\author \'ce\'e2\'f1\'ff\'ed\'ea\'e8\'ed \'c0\'ed\'e4\'f0\'e5\'e9 \'c0\'eb\'e5\'ea\'f1\'e0\'ed\'e4\'f0\'ee\'e2\'e8\'f7}{\operator \'ce\'e2\'f1\'ff\'ed\'ea\'e8\'ed \'c0\'ed\'e4\'f0\'e5\'e9 \'c0\'eb\'e5\'ea\'f1\'e0\'ed\'e4\'f0\'ee\'e2\'e8\'f7} -{\creatim\yr2016\mo4\dy8\hr19\min4}{\revtim\yr2016\mo4\dy19\hr13\min56}{\version2}{\edmins11}{\nofpages6}{\nofwords2303}{\nofchars13128}{\*\company Svyaznoy Logistics}{\nofcharsws15401}{\vern57441}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office -/word/2003/wordml}}\paperw11906\paperh16838\margl1701\margr850\margt1134\margb1134\gutter0\ltrsect -\deftab708\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 -\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1701\dgvorigin1134\dghshow1\dgvshow1 -\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct -\asianbrkrule\rsidroot4543286\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 -{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\widctlpar -\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4543286 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang1049\langfe1033\cgrid\langnp1049\langfenp1033 {\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \b\f2\fs20\cf1\lang1033\langfe1049\langnp1033\langfenp1049\insrsid4543286\charrsid4543286 Mozilla Public License, version 2.0 -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf1\lang1033\langfe1049\langnp1033\langfenp1049\insrsid4543286\charrsid4543286 -\par 1. Definitions -\par -\par 1.1. "Contributor" -\par -\par means each individual or legal entity that creates, contributes to the -\par creation of, or owns Covered Software. -\par -\par 1.2. "Contributor Version" -\par -\par means the combination of the Contributions of others (if any) used by a -\par Contributor and that particular Contributor's Contribution. -\par -\par 1.3. "Contribution" -\par -\par means Covered Software of a particular Contributor. -\par -\par 1.4. "Covered Software" -\par -\par means Source Code Form to which the initial Contributor has attached the -\par notice in Exhibit A, the Executable Form of such Source Code Form, and -\par Modifications of such Source Code Form, in each case including portions -\par thereof. -\par -\par 1.5. "Incompatible With Secondary Licenses" -\par means -\par -\par a. that the initial Contributor has attached the notice described in -\par Exhibit B to the Covered Software; or -\par -\par b. that the Covered Software was made available under the terms of -\par version 1.1 or earlier of the License, but not also under the terms of -\par a Secondary License. -\par -\par 1.6. "Executable Form" -\par -\par means any form of the work other than Source Code Form. -\par -\par 1.7. "Larger Work" -\par -\par means a work that combines Covered Software with other material, in a -\par separate file or files, that is not Covered Software. -\par -\par 1.8. "License" -\par -\par means this document. -\par -\par 1.9. "Licensable" -\par -\par means having the right to grant, to the maximum extent possible, whether -\par at the time of the initial grant or subsequently, any and all of the -\par rights conveyed by this License. -\par -\par 1.10. "Modifications" -\par -\par means any of the following: -\par -\par a. any file in Source Code Form that results from an addition to, -\par deletion from, or modification of the contents of Covered Software; or -\par -\par b. any new file in Source Code Form that contains any Covered Software. -\par -\par 1.11. "Patent Claims" of a Contributor -\par -\par means any patent claim(s), including without limitation, method, -\par process, and apparatus claims, in any patent Licensable by such -\par Contributor that would be infringed, but for the grant of the License, -\par by the making, using, selling, offering for sale, having made, import, -\par or transfer of either its Contributions or its Contributor Version. -\par -\par 1.12. "Secondary License" -\par -\par means either the GNU General Public License, Version 2.0, the GNU Lesser -\par General Public License, Version 2.1, the GNU Affero General Public -\par License, Version 3.0, or any later versions of those licenses. -\par -\par 1.13. "Source Code Form" -\par -\par means the form of the work preferred for making modifications. -\par -\par 1.14. "You" (or "Your") -\par -\par means an individual or a legal entity exercising rights under this -\par License. For legal entities, "You" includes any entity that controls, is -\par controlled by, or is under common control with You. For purposes of this -\par definition, "control" means (a) the power, direct or indirect, to cause -\par the direction or management of such entity, whether by contract or -\par otherwise, or (b) ownership of more than fifty percent (50%) of the -\par outstanding shares or beneficial ownership of such entity. -\par -\par -\par 2. License Grants and Conditions -\par -\par 2.1. Grants -\par -\par Each Contributor hereby grants You a world-wide, royalty-free, -\par non-exclusive license: -\par -\par a. under intellectual property rights (other than patent or trademark) -\par Licensable by such Contributor to use, reproduce, make available, -\par modify, display, perform, distribute, and otherwise exploit its -\par Contributions, either on an unmodified basis, with Modifications, or -\par as part of a Larger Work; and -\par -\par b. under Patent Claims of such Contributor to make, use, sell, offer for -\par sale, have made, import, and otherwise transfer either its -\par Contributions or its Contributor Version. -\par -\par 2.2. Effective Date -\par -\par The licenses granted in Section 2.1 with respect to any Contribution -\par become effective for each Contribution on the date the Contributor first -\par distributes such Contribution. -\par -\par 2.3. Limitations on Grant Scope -\par -\par The licenses granted in this Section 2 are the only rights granted under -\par this License. No additional rights or licenses will be implied from the -\par distribution or licensing of Covered Software under this License. -\par Notwithstanding Section 2.1(b) above, no patent license is granted by a -\par Contributor: -\par -\par a. for any code that a Contributor has removed from Covered Software; or -\par -\par b. for infringements caused by: (i) Your and any other third party's -\par modifications of Covered Software, or (ii) the combination of its -\par Contributions with other software (except as part of its Contributor -\par Version); or -\par -\par c. under Patent Claims infringed by Covered Software in the absence of -\par its Contributions. -\par -\par This License does not grant any rights in the trademarks, service marks, -\par or logos of any Contributor (except as may be necessary to comply with -\par the notice requirements in Section 3.4). -\par -\par 2.4. Subsequent Licenses -\par -\par No Contributor makes additional grants as a result of Your choice to -\par distribute the Covered Software under a subsequent version of this -\par License (see Section 10.2) or under the terms of a Secondary License (if -\par permitted under the terms of Section 3.3). -\par -\par 2.5. Representation -\par -\par Each Contributor represents that the Contributor believes its -\par Contributions are its original creation(s) or it has sufficient rights to -\par grant the rights to its Contributions conveyed by this License. -\par -\par 2.6. Fair Use -\par -\par This License is not intended to limit any rights You have under -\par applicable copyright doctrines of fair use, fair dealing, or other -\par equivalents. -\par -\par 2.7. Conditions -\par -\par Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in -\par Section 2.1. -\par -\par -\par 3. Responsibilities -\par -\par 3.1. Distribution of Source Form -\par -\par All distribution of Covered Software in Source Code Form, including any -\par Modifications that You create or to which You contribute, must be under -\par the terms of this License. You must inform recipients that the Source -\par Code Form of the Covered Software is governed by the terms of this -\par License, and how they can obtain a copy of this License. You may not -\par attempt to alter or restrict the recipients' rights in the Source Code -\par Form. -\par -\par 3.2. Distribution of Executable Form -\par -\par If You distribute Covered Software in Executable Form then: -\par -\par a. such Covered Software must also be made available in Source Code Form, -\par as described in Section 3.1, and You must inform recipients of the -\par Executable Form how they can obtain a copy of such Source Code Form by -\par reasonable means in a timely manner, at a charge no more than the cost -\par of distribution to the recipient; and -\par -\par b. You may distribute such Executable Form under the terms of this -\par License, or sublicense it under different terms, provided that the -\par license for the Executable Form does not attempt to limit or alter the -\par recipients' rights in the Source Code Form under this License. -\par -\par 3.3. Distribution of a Larger Work -\par -\par You may create and distribute a Larger Work under terms of Your choice, -\par provided that You also comply with the requirements of this License for -\par the Covered Software. If the Larger Work is a combination of Covered -\par Software with a work governed by one or more Secondary Licenses, and the -\par Covered Software is not Incompatible With Secondary Licenses, this -\par License permits You to additionally distribute such Covered Software -\par under the terms of such Secondary License(s), so that the recipient of -\par the Larger Work may, at their option, further distribute the Covered -\par Software under the terms of either this License or such Secondary -\par License(s). -\par -\par 3.4. Notices -\par -\par You may not remove or alter the substance of any license notices -\par (including copyright notices, patent notices, disclaimers of warranty, or -\par limitations of liability) contained within the Source Code Form of the -\par Covered Software, except that You may alter any license notices to the -\par extent required to remedy known factual inaccuracies. -\par -\par 3.5. Application of Additional Terms -\par -\par You may choose to offer, and to charge a fee for, warranty, support, -\par indemnity or liability obligations to one or more recipients of Covered -\par Software. However, You may do so only on Your own behalf, and not on -\par behalf of any Contributor. You must make it absolutely clear that any -\par such warranty, support, indemnity, or liability obligation is offered by -\par You alone, and You hereby agree to indemnify every Contributor for any -\par liability incurred by such Contributor as a result of warranty, support, -\par indemnity or liability terms You offer. You may include additional -\par disclaimers of warranty and limitations of liability specific to any -\par jurisdiction. -\par -\par 4. Inability to Comply Due to Statute or Regulation -\par -\par If it is impossible for You to comply with any of the terms of this License -\par with respect to some or all of the Covered Software due to statute, -\par judicial order, or regulation then You must: (a) comply with the terms of -\par this License to the maximum extent possible; and (b) describe the -\par limitations and the code they affect. Such description must be placed in a -\par text file included with all distributions of the Covered Software under -\par this License. Except to the extent prohibited by statute or regulation, -\par such description must be sufficiently detailed for a recipient of ordinary -\par skill to be able to understand it. -\par -\par 5. Termination -\par -\par 5.1. The rights granted under this License will terminate automatically if You -\par fail to comply with any of its terms. However, if You become compliant, -\par then the rights granted under this License from a particular Contributor -\par are reinstated (a) provisionally, unless and until such Contributor -\par explicitly and finally terminates Your grants, and (b) on an ongoing -\par basis, if such Contributor fails to notify You of the non-compliance by -\par some reasonable means prior to 60 days after You have come back into -\par compliance. Moreover, Your grants from a particular Contributor are -\par reinstated on an ongoing basis if such Contributor notifies You of the -\par non-compliance by some reasonable means, this is the first time You have -\par received notice of non-compliance with this License from such -\par Contributor, and You become compliant prior to 30 days after Your receipt -\par of the notice. -\par -\par 5.2. If You initiate litigation against any entity by asserting a patent -\par infringement claim (excluding declaratory judgment actions, -\par counter-claims, and cross-claims) alleging that a Contributor Version -\par directly or indirectly infringes any patent, then the rights granted to -\par You by any and all Contributors for the Covered Software under Section -\par 2.1 of this License shall terminate. -\par -\par 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user -\par license agreements (excluding distributors and resellers) which have been -\par validly granted by You or Your distributors under this License prior to -\par termination shall survive termination. -\par -\par 6. Disclaimer of Warranty -\par -\par Covered Software is provided under this License on an "as is" basis, -\par without warranty of any kind, either expressed, implied, or statutory, -\par including, without limitation, warranties that the Covered Software is free -\par of defects, merchantable, fit for a particular purpose or non-infringing. -\par The entire risk as to the quality and performance of the Covered Software -\par is with You. Should any Covered Software prove defective in any respect, -\par You (not any Contributor) assume the cost of any necessary servicing, -\par repair, or correction. This disclaimer of warranty constitutes an essential -\par part of this License. No use of any Covered Software is authorized under -\par this License except under this disclaimer. -\par -\par 7. Limitation of Liability -\par -\par Under no circumstances and under no legal theory, whether tort (including -\par negligence), contract, or otherwise, shall any Contributor, or anyone who -\par distributes Covered Software as permitted above, be liable to You for any -\par direct, indirect, special, incidental, or consequential damages of any -\par character including, without limitation, damages for lost profits, loss of -\par goodwill, work stoppage, computer failure or malfunction, or any and all -\par other commercial damages or losses, even if such party shall have been -\par informed of the possibility of such damages. This limitation of liability -\par shall not apply to liability for death or personal injury resulting from -\par such party's negligence to the extent applicable law prohibits such -\par limitation. Some jurisdictions do not allow the exclusion or limitation of -\par incidental or consequential damages, so this exclusion and limitation may -\par not apply to You. -\par -\par 8. Litigation -\par -\par Any litigation relating to this License may be brought only in the courts -\par of a jurisdiction where the defendant maintains its principal place of -\par business and such litigation shall be governed by laws of that -\par jurisdiction, without reference to its conflict-of-law provisions. Nothing -\par in this Section shall prevent a party's ability to bring cross-claims or -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf1\lang1033\langfe1049\langnp1033\langfenp1049\insrsid4543286\charrsid6367065 counter-claims. -\par -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf1\lang1033\langfe1049\langnp1033\langfenp1049\insrsid4543286\charrsid4543286 9. Miscellaneous -\par -\par This License represents the complete agreement concerning the subject -\par matter hereof. If any provision of this License is held to be -\par unenforceable, such provision shall be reformed only to the extent -\par necessary to make it enforceable. Any law or regulation which provides that -\par the language of a contract shall be construed against the drafter shall not -\par be used to construe this License against a Contributor. -\par -\par -\par 10. Versions of the License -\par -\par 10.1. New Versions -\par -\par Mozilla Foundation is the license steward. Except as provided in Section -\par 10.3, no one other than the license steward has the right to modify or -\par publish new versions of this License. Each version will be given a -\par distinguishing version number. -\par -\par 10.2. Effect of New Versions -\par -\par You may distribute the Covered Software under the terms of the version -\par of the License under which You originally received the Covered Software, -\par or under the terms of any subsequent version published by the license -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf1\lang1033\langfe1049\langnp1033\langfenp1049\insrsid4543286\charrsid6367065 steward. -\par -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf1\lang1033\langfe1049\langnp1033\langfenp1049\insrsid4543286\charrsid4543286 10.3. Modified Versions -\par -\par If you create software not governed by this License, and you want to -\par create a new license for such software, you may create and use a -\par modified version of this License if you rename the license and remove -\par any references to the name of the license steward (except to note that -\par such modified license differs from this License). -\par -\par 10.4. Distributing Source Code Form that is Incompatible With Secondary -\par Licenses If You choose to distribute Source Code Form that is -\par Incompatible With Secondary Licenses under the terms of this version of -\par the License, the notice described in Exhibit B of this License must be -\par attached. -\par -\par Exhibit A - Source Code Form License Notice -\par -\par This Source Code Form is subject to the -\par terms of the Mozilla Public License, v. -\par 2.0. If a copy of the MPL was not -\par distributed with this file, You can -\par obtain one at -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6367065 {\rtlch\fcs1 -\af2\afs20 \ltrch\fcs0 \f2\fs20\cf1\lang1033\langfe1049\langnp1033\langfenp1049\insrsid4543286\charrsid4543286 }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf1\lang1033\langfe1049\langnp1033\langfenp1049\insrsid6367065 http://mozilla.org/MPL/2.0/.} -{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf1\lang1033\langfe1049\langnp1033\langfenp1049\insrsid6900295\charrsid6367065 -\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a -9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad -5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 -b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 -0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 -a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f -c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 -0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 -a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 -6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b -4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b -4757e8d3f729e245eb2b260a0238fd010000ffff0300504b030414000600080000002100863ae0a7f0060000be1a0000160000007468656d652f7468656d652f -7468656d65312e786d6cec59dd6e134714beafd47758edbdf1dfae7f221c64af6d682180b0a1e272628fbd436677ac9d71828590105c566a559556bd2852db9b -5e546d2341d51b7887f00c69a95a2af10a3d336baf67ec49091195a28a444ad6e3ef9cf9e69cb3df99dd397bee76449d5d9c70c2e2865b3c53701d1c0fd890c4 -e3867bbddfcdd55c870b140f1165316eb833ccdd739befbf77166d881047d801fb986fa0861b0a31d9c8e7f90086113fc3263886ef462c8990808fc9383f4cd0 -1ef88d68be542854f21122b1ebc42802b707df1dfc72f0f460dfb9321a9101763717fe3b142689059703039af4a477bc30faf6f9fd83fd8367074f0ef69fdf83 -eb67f0ff53653bdc294a0b3ee3014d9c5d441b2e4c3d647b7d7c5bb80e455cc0170db7a07edcfce6d93cda981b517184ad66d7553f73bbb9c170a7a4e64cc6db -d9a49ee77b9566e65f01a858c775aa9d4aa792f953003418c0ca532eba4fbf556fb5fd395603a59716dfed6abb5c34f09afff21ae7a62f7f0dbc02a5febd357c -b71b40140dbc02a5787f0def79d552e01978054af195357cb5d06c7b5503af402125f1ce1abae057cac162b51964c4e8052bbcee7bdd6a69ee7c89826ac8aa4d -4e3162b1386eed45e8164bba60200d29122476c46c82476800851e204ab613e25c22e3100a718262c661b8502a740b65f82b7f3d75a522843630d2ac254f60c6 -d786243f870f1232110df743f0ea6a90574f7f7cf5f4b17378ffc9e1fd5f0f1f3c38bcff73eac8b0ba80e2b16ef5f2fbcffe7e74cff9ebf1372f1f7e61c7731d -fffb4f1ffff6ec733b1056ba0cc18b2ff7ff78b2ffe2ab4ffefce1a105de4cd0b60eef930873e732de73aeb10816a6426032c7dbc99b59f44344748b663ce628 -4672168bff8e080df4e519a2c8826b6133823712901c1bf0fcf49641b8172653412c1e2f869101dc628cb658628dc245399716e6fe341edb274fa63aee1a42bb -b6b903141bf9ed4c27a0bdc4e63208b141f32a45b140631c63e1c8efd80ec696d5dd24c488eb1619248cb391706e12a7858835247db26d54d3d2e80289202f33 -1b41c8b7119bad1b4e8b51dbaadb78d744c25d81a8857c1f53238ce7d154a0c8e6b28f22aa07fc1212a18d646f960c745c870bc8f41853e6748698739bcd9504 -d6ab25fd22c88b3ded5b741699c844901d9bcf4b88311dd9663b4188a2890ddb2371a8633fe03b50a2c8b9ca840dbec5cc3b447e863ca0f8c874df20d848f7eb -d5e03a28ab4e695920f29b6962c9e579cc8cfaedcde808612535d0080c3d8f48fc5a715f9175ffbf957510d2175f3fb2aceab40a7a3321d63beac28a8c1f855b -15ef80254372fab5bb8da6f1550cb7cb7a037b27ddefa4dbfddf4bf751f7f3db17eca546837ccbad62ba75571bf9e8d8fbf811a1b42766145fe26a2bcfa1530d -bb3028fda8c75c9c3de74d42b89477364c68e0c60952364ec2c4474484bd104d60bf5f74a593319fbb1e7367c2383c06a861ab6f89a7d3688b0dd3c7d962513e -baa662c291588e17fc6c1c1e3d448aae54978f68997bc576ac1ead1704a4ed9b90d0263349942d24aa8b411924f5200f41b390502b7b2b2cea161635e97e91aa -3516402dcb0a6ca51cd880355cdf03133082272c44f150e6294df522bb2a996f33d34705d3a800d8572c2a6099e9bae47ae4f2e4ead2523b46a60d125ab99924 -5464544fe3211ae27975cad1e3d078d35cd7972935e8c950a8f9a0b49634aab57f6371d25c83ddaa36d058570a1a3b7b0db752f6a1640668d27047f01a002ea3 -09d40e975b6044c7f0ba6d2092f4863f89b24c122eda888769c095e8a46a101181138792a8e1cae56769a0b1d210c5ad58024138b5e4ea202ba78d1c24dd4c32 -1e8df040e869d74664a4d38fa0f0a95658bf55e627074b4b368574f7c2e19eb34da7c9350425e6578b328043c2e16d50318de690c0ebce4cc896f5b7d298e6b2 -abbf6f5435948e233a09d1bca3e8629ec295946774d4a72c06daa7f99a21a05a48e68d707b2c1bac1e54a39b665d23e57064d77dbd918c9c269acb9e69a88aec -9a7615336658b48195589eacc96bac1621064dd33b7c2addab925b5f68ddca3e21eb1210f02c7e96ae7b8c86a0515b4e6650938cd765586af67cd4ec1d8b05be -86da719a84a6fa9585db95b8653dc23a1d0c9ea8f383dd6ad5c2d068b1cf5491564725fa5106dbbe05e2d18697c2532ab84a251c4c240836443db5274965036e -91db627e6bc095334d48c3bd53f09b5e50f2835ca1e677725ed92be46a7eb39c6bfa7eb9d8f18b8576ab74171a8b08a3a29f1ed374e1d5149dcd0f6bd4f8da81 -4db478fb7666c0a23c53e73079455c1dd8144bc6814d7a4ee3f4e5718ceb10109d3b9552b75eaeb72ab97ab9d9cd79ed562d570f2aad5cbb1254dbdd76e0d7ea -ddbbaeb3abc05eb31c78954e2d57290641ceab1424fd5a3d57f54aa5a6576dd63a5ef3ee7c1b032b4fe5631e0b08afe2b5f90f000000ffff0300504b03041400 -06000800000021000dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c7384 -8f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16d -b8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017c -c524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d001400060008 -0000002100e9de0fbfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600 -080000002100a5d6a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b -799616830000008a0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d0014 -000600080000002100863ae0a7f0060000be1a00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01 -022d00140006000800000021000dd1909fb60000001b0100002700000000000000000000000000fa0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000f50a00000000} -{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d -617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 -6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 -656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} -{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong; -\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid; -\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; -\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; -\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; -\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; -\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; -\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; -\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; -\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; -\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; -\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; -\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; -\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; -\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; -\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; -\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; -\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; -\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4; -\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4; -\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1; -\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1; -\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2; -\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2; -\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3; -\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4; -\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4; -\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5; -\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5; -\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6; -\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6; -\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark; -\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1; -\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1; -\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2; -\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3; -\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3; -\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4; -\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4; -\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5; -\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5; -\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6; -\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000 -4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000705e -62142a9ad101feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/src/OneScript.Core/Compilation/Binding/BindingExtensions.cs b/src/OneScript.Core/Compilation/Binding/BindingExtensions.cs index 02be956c3..8d062edd9 100644 --- a/src/OneScript.Core/Compilation/Binding/BindingExtensions.cs +++ b/src/OneScript.Core/Compilation/Binding/BindingExtensions.cs @@ -4,6 +4,7 @@ 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; using OneScript.Contexts; using OneScript.Runtime.Binding; using OneScript.Values; @@ -12,17 +13,31 @@ namespace OneScript.Compilation.Binding { public static class BindingExtensions { - public static SymbolScope PushObject(this SymbolTable table, BslObjectValue target) + /// + /// Добавляет в таблицу символов область видимости объекта, который может быть присоединён к рантайму. + /// + /// Таблица символов, в которую нужно добавить область. + /// Объект, чьи методы/свойства требуется отобразить в символы. + /// + /// Пользовательский дескриптор привязки. Если не указан, область считается статической и привязанной к самому объекту. + /// + /// Выбрасывается, если объект не реализует . + public static SymbolScope PushObject(this SymbolTable table, BslObjectValue target, + ScopeBindingDescriptor? descriptor = null) { + if (!(target is IAttachableContext attachable)) + throw new ArgumentException("Target must implement IAttachableContext", nameof(target)); + var scope = SymbolScope.FromObject(target); - table.PushScope(scope, (IAttachableContext)target); + table.PushScope(scope, descriptor ?? ScopeBindingDescriptor.Static(attachable)); return scope; } - public static SymbolScope PushContext(this SymbolTable table, IAttachableContext target) + public static SymbolScope PushContext(this SymbolTable table, IAttachableContext target, + ScopeBindingDescriptor? descriptor = null) { var scope = SymbolScope.FromContext(target); - table.PushScope(scope, target); + table.PushScope(scope, descriptor ?? ScopeBindingDescriptor.Static(target)); return scope; } diff --git a/src/OneScript.DebugProtocol/TcpServer/StopServiceException.cs b/src/OneScript.Core/Compilation/Binding/IPackageSymbol.cs similarity index 56% rename from src/OneScript.DebugProtocol/TcpServer/StopServiceException.cs rename to src/OneScript.Core/Compilation/Binding/IPackageSymbol.cs index 359e4427f..cbc6bdd19 100644 --- a/src/OneScript.DebugProtocol/TcpServer/StopServiceException.cs +++ b/src/OneScript.Core/Compilation/Binding/IPackageSymbol.cs @@ -5,14 +5,13 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System; - -namespace OneScript.DebugProtocol.TcpServer +namespace OneScript.Compilation.Binding { /// - /// Прерывание сервера со стороны прикладного интерфейса. Кнопка "Выход" из диспетчера + /// Символ, который импортирован из внешнего пакета /// - public class StopServiceException : ApplicationException + public interface IPackageSymbol { + PackageInfo GetPackageInfo(); } -} \ No newline at end of file +} diff --git a/src/OneScript.Core/Compilation/Binding/ScopeBindingDescriptor.cs b/src/OneScript.Core/Compilation/Binding/ScopeBindingDescriptor.cs new file mode 100644 index 000000000..c8127c84d --- /dev/null +++ b/src/OneScript.Core/Compilation/Binding/ScopeBindingDescriptor.cs @@ -0,0 +1,51 @@ +/*---------------------------------------------------------- +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.Compilation.Binding +{ + public enum ScopeBindingKind + { + Static, + ThisScope, + FrameScope + } + + public readonly struct ScopeBindingDescriptor + { + private ScopeBindingDescriptor(ScopeBindingKind kind, IAttachableContext target, int scopeIndex) + { + if (kind == ScopeBindingKind.FrameScope && scopeIndex < 0) + throw new ArgumentOutOfRangeException(nameof(scopeIndex)); + + Kind = kind; + Target = target; + ScopeIndex = scopeIndex; + } + + public ScopeBindingKind Kind { get; } + + public IAttachableContext Target { get; } + + /// + /// Индекс области видимости в списке ExecutionFrame.Scopes. Используется для ScopeBindingKind.FrameScope. + /// + public int ScopeIndex { get; } + + public static ScopeBindingDescriptor Static(IAttachableContext target) + => new ScopeBindingDescriptor(ScopeBindingKind.Static, target, -1); + + public static ScopeBindingDescriptor ThisScope() + => new ScopeBindingDescriptor(ScopeBindingKind.ThisScope, null, -1); + + public static ScopeBindingDescriptor FrameScope(int index) + => new ScopeBindingDescriptor(ScopeBindingKind.FrameScope, null, index); + } +} + diff --git a/src/OneScript.Core/Compilation/Binding/SymbolTable.cs b/src/OneScript.Core/Compilation/Binding/SymbolTable.cs index a3dcfb757..855879886 100644 --- a/src/OneScript.Core/Compilation/Binding/SymbolTable.cs +++ b/src/OneScript.Core/Compilation/Binding/SymbolTable.cs @@ -5,34 +5,34 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +using System.Collections; using System.Collections.Generic; -using OneScript.Contexts; namespace OneScript.Compilation.Binding { - public class SymbolTable + public class SymbolTable : IEnumerable { private class BindingRecord { - public SymbolScope scope; - public IAttachableContext target; + public SymbolScope Scope; + public ScopeBindingDescriptor Descriptor; } private readonly List _bindings = new List(); - public SymbolScope GetScope(int index) => _bindings[index].scope; + public SymbolScope GetScope(int index) => _bindings[index].Scope; - public IAttachableContext GetBinding(int scopeIndex) => _bindings[scopeIndex].target; + public ScopeBindingDescriptor GetBinding(int scopeIndex) => _bindings[scopeIndex].Descriptor; public int ScopeCount => _bindings.Count; - public int PushScope(SymbolScope scope, IAttachableContext target) + public int PushScope(SymbolScope scope, ScopeBindingDescriptor descriptor) { var idx = _bindings.Count; _bindings.Add(new BindingRecord { - scope = scope, - target = target + Scope = scope, + Descriptor = descriptor }); return idx; @@ -47,7 +47,7 @@ public bool FindVariable(string name, out SymbolBinding binding) { for (int i = _bindings.Count - 1; i >= 0; i--) { - var scope = _bindings[i].scope; + var scope = _bindings[i].Scope; var idx = scope.Variables.IndexOf(name); if (idx >= 0) { @@ -68,7 +68,7 @@ public bool TryFindMethodBinding(string name, out SymbolBinding binding) { for (int i = _bindings.Count - 1; i >= 0; i--) { - var scope = _bindings[i].scope; + var scope = _bindings[i].Scope; var idx = scope.Methods.IndexOf(name); if (idx >= 0) { @@ -99,7 +99,7 @@ public bool TryFindMethod(string name, out IMethodSymbol method) public SymbolBinding DefineMethod(IMethodSymbol symbol) { - var index = _bindings[ScopeCount - 1].scope.DefineMethod(symbol); + var index = _bindings[ScopeCount - 1].Scope.DefineMethod(symbol); return new SymbolBinding { ScopeNumber = ScopeCount - 1, @@ -109,7 +109,7 @@ public SymbolBinding DefineMethod(IMethodSymbol symbol) public SymbolBinding DefineVariable(IVariableSymbol symbol) { - var index = _bindings[ScopeCount - 1].scope.DefineVariable(symbol); + var index = _bindings[ScopeCount - 1].Scope.DefineVariable(symbol); return new SymbolBinding { ScopeNumber = ScopeCount - 1, @@ -126,5 +126,16 @@ public IMethodSymbol GetMethod(SymbolBinding binding) { return GetScope(binding.ScopeNumber).Methods[binding.MemberNumber]; } + + public IEnumerator GetEnumerator() + { + for (int i = 0; i < ScopeCount; i++) + yield return _bindings[i].Scope; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } } } diff --git a/src/OneScript.Core/Compilation/CompilerFrontendBase.cs b/src/OneScript.Core/Compilation/CompilerFrontendBase.cs index 145a3d657..a3272ebe0 100644 --- a/src/OneScript.Core/Compilation/CompilerFrontendBase.cs +++ b/src/OneScript.Core/Compilation/CompilerFrontendBase.cs @@ -98,12 +98,13 @@ private SymbolTable PrepareSymbols() { for (int i = 0; i < SharedSymbols.ScopeCount; i++) { - actualTable.PushScope(SharedSymbols.GetScope(i), SharedSymbols.GetBinding(i)); + var descriptor = SharedSymbols.GetBinding(i); + actualTable.PushScope(SharedSymbols.GetScope(i), descriptor); } } ModuleSymbols ??= new SymbolScope(); - actualTable.PushScope(ModuleSymbols, null); + actualTable.PushScope(ModuleSymbols, ScopeBindingDescriptor.ThisScope()); return actualTable; } diff --git a/src/OneScript.Core/Compilation/ICompileTimeDependencyResolver.cs b/src/OneScript.Core/Compilation/ICompileTimeDependencyResolver.cs index 47d61ede8..292eb4754 100644 --- a/src/OneScript.Core/Compilation/ICompileTimeDependencyResolver.cs +++ b/src/OneScript.Core/Compilation/ICompileTimeDependencyResolver.cs @@ -5,6 +5,8 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +#nullable enable + using OneScript.Execution; using OneScript.Sources; @@ -18,6 +20,7 @@ public interface ICompileTimeDependencyResolver /// Модуль в котором объявлен импорт /// имя библиотеки /// - void Resolve(SourceCode module, string libraryName, IBslProcess process); + /// Информация о загруженном пакете или null + PackageInfo? Resolve(SourceCode module, string libraryName, IBslProcess process); } -} \ No newline at end of file +} diff --git a/src/OneScript.Core/Compilation/PackageInfo.cs b/src/OneScript.Core/Compilation/PackageInfo.cs new file mode 100644 index 000000000..24e95fa52 --- /dev/null +++ b/src/OneScript.Core/Compilation/PackageInfo.cs @@ -0,0 +1,31 @@ +/*---------------------------------------------------------- +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.Compilation +{ + /// + /// Информация о внешнем пакете (библиотеке). + /// + public sealed class PackageInfo + { + public PackageInfo(string id, string shortName) + { + Id = id; + ShortName = shortName; + } + + /// + /// Уникальный идентификатор пакета (обычно путь к каталогу) + /// + public string Id { get; } + + /// + /// Короткое имя для отображения в сообщениях + /// + public string ShortName { get; } + } +} diff --git a/src/OneScript.Core/Contexts/AttachedContext.cs b/src/OneScript.Core/Contexts/AttachedContext.cs deleted file mode 100644 index 0b5c4fc97..000000000 --- a/src/OneScript.Core/Contexts/AttachedContext.cs +++ /dev/null @@ -1,45 +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; - -namespace OneScript.Contexts -{ - /// - /// Класс контекста, который подключен в память машины. - /// - public sealed class AttachedContext - { - private IVariable[] _variables; - private BslMethodInfo[] _methods; - - public AttachedContext(IAttachableContext source) - { - Instance = source; - Attach(); - } - - public void Attach() - { - Instance.OnAttach(out _variables, out _methods); - } - - public AttachedContext(IAttachableContext target, IVariable[] vars) - { - Instance = target; - _variables = vars; - _methods = Array.Empty(); - } - - public IReadOnlyList Variables => _variables; - - public IReadOnlyList Methods => _methods; - - public IAttachableContext Instance { get; } - } -} \ No newline at end of file diff --git a/src/OneScript.Core/Contexts/ContextMethodAttribute.cs b/src/OneScript.Core/Contexts/ContextMethodAttribute.cs index 78c4c5626..498c53e2d 100644 --- a/src/OneScript.Core/Contexts/ContextMethodAttribute.cs +++ b/src/OneScript.Core/Contexts/ContextMethodAttribute.cs @@ -11,7 +11,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.Contexts { - [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + [AttributeUsage(AttributeTargets.Method)] public class ContextMethodAttribute : Attribute, INameAndAliasProvider { private readonly string _name; diff --git a/src/OneScript.Core/Contexts/ContextMethodInfo.cs b/src/OneScript.Core/Contexts/ContextMethodInfo.cs index 362a2e209..c656f2fd0 100644 --- a/src/OneScript.Core/Contexts/ContextMethodInfo.cs +++ b/src/OneScript.Core/Contexts/ContextMethodInfo.cs @@ -17,39 +17,33 @@ namespace OneScript.Contexts /// /// Информация о методе, объявленном в классе .NET и помеченном атрибутом ContextMethod /// - public sealed class ContextMethodInfo : BslMethodInfo, IObjectWrapper + public sealed class ContextMethodInfo : BslMethodInfo, IObjectWrapper, ISupportsDeprecation { private readonly MethodInfo _realMethod; - private readonly ContextMethodAttribute _scriptMark; public ContextMethodInfo(MethodInfo realMethod) + : this(realMethod, realMethod.GetCustomAttribute(false) + ?? throw new ArgumentException("Method is not marked with ContextMethodAttribute")) { - _realMethod = realMethod; - try - { - _scriptMark = - (ContextMethodAttribute) GetCustomAttributes(typeof(ContextMethodAttribute), false).First(); - } - catch (InvalidOperationException e) - { - throw new ArgumentException("Method is not marked with ContextMethodAttribute", e); - } } public ContextMethodInfo(MethodInfo realMethod, ContextMethodAttribute binding) { _realMethod = realMethod; - _scriptMark = binding; InjectsProcess = _realMethod.GetParameters().FirstOrDefault()?.ParameterType == typeof(IBslProcess); + IsDeprecated = binding.IsDeprecated; + IsForbiddenToUse = binding.ThrowOnUse; + Name = binding.Name; + Alias = binding.Alias; } public override Type ReturnType => _realMethod.ReturnType; public override ParameterInfo ReturnParameter => _realMethod.ReturnParameter; - public bool IsDeprecated => _scriptMark.IsDeprecated; + public bool IsDeprecated { get; } - public bool IsForbiddenToUse => _scriptMark.ThrowOnUse; + public bool IsForbiddenToUse { get; } public override object[] GetCustomAttributes(bool inherit) { @@ -88,9 +82,9 @@ public override MethodInfo GetBaseDefinition() public override ICustomAttributeProvider ReturnTypeCustomAttributes => _realMethod.ReturnTypeCustomAttributes; - public override string Name => _scriptMark.Name; - - public override string Alias => _scriptMark.Alias; + public override string Name { get; } + + public override string Alias { get; } public override Type DeclaringType => _realMethod.DeclaringType; diff --git a/src/OneScript.Core/Contexts/ContextPropertyAttribute.cs b/src/OneScript.Core/Contexts/ContextPropertyAttribute.cs index 35350670a..32f34e2e9 100644 --- a/src/OneScript.Core/Contexts/ContextPropertyAttribute.cs +++ b/src/OneScript.Core/Contexts/ContextPropertyAttribute.cs @@ -40,5 +40,9 @@ public ContextPropertyAttribute(string name, string alias = "") public string Name => _name; public string Alias => _alias; + + public bool IsDeprecated { get; set; } + + public bool ThrowOnUse { get; set; } } } \ No newline at end of file diff --git a/src/OneScript.Core/Contexts/ContextPropertyInfo.cs b/src/OneScript.Core/Contexts/ContextPropertyInfo.cs index 5b7d9b2db..72ce6d4d4 100644 --- a/src/OneScript.Core/Contexts/ContextPropertyInfo.cs +++ b/src/OneScript.Core/Contexts/ContextPropertyInfo.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System; using System.Globalization; -using System.Linq; using System.Reflection; using OneScript.Commons; @@ -16,15 +15,20 @@ namespace OneScript.Contexts /// /// Свойство, объявленое в CLR-классе через атрибут ContextProperty /// - public class ContextPropertyInfo : BslPropertyInfo, IObjectWrapper + public class ContextPropertyInfo : BslPropertyInfo, IObjectWrapper, ISupportsDeprecation { private readonly PropertyInfo _realProperty; private readonly ContextPropertyAttribute _scriptMark; - + public ContextPropertyInfo(PropertyInfo wrappedInfo) + : this(wrappedInfo, wrappedInfo.GetCustomAttribute(false)) + { + } + + public ContextPropertyInfo(PropertyInfo wrappedInfo, ContextPropertyAttribute binding) { _realProperty = wrappedInfo; - _scriptMark = (ContextPropertyAttribute)_realProperty.GetCustomAttributes(typeof(ContextPropertyAttribute), false).First(); + _scriptMark = binding; } public override object[] GetCustomAttributes(bool inherit) @@ -69,7 +73,7 @@ public override MethodInfo[] GetAccessors(bool nonPublic) public override MethodInfo GetGetMethod(bool nonPublic) { - return _scriptMark.CanRead ? _realProperty.GetGetMethod(nonPublic) : null; + return CanRead ? _realProperty.GetGetMethod(nonPublic) : null; } public override ParameterInfo[] GetIndexParameters() @@ -79,7 +83,7 @@ public override ParameterInfo[] GetIndexParameters() public override MethodInfo GetSetMethod(bool nonPublic) { - return _scriptMark.CanWrite ? _realProperty.GetSetMethod(nonPublic) : null; + return CanWrite ? _realProperty.GetSetMethod(nonPublic) : null; } public override object GetValue(object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) @@ -97,5 +101,7 @@ public override void SetValue(object obj, object value, BindingFlags invokeAttr, public override bool CanWrite => _scriptMark.CanWrite; public override Type PropertyType => _realProperty.PropertyType; public object UnderlyingObject => _realProperty; + public bool IsDeprecated => _scriptMark.IsDeprecated; + public bool IsForbiddenToUse => _scriptMark.ThrowOnUse; } } \ No newline at end of file diff --git a/src/OneScript.Core/Contexts/DeprecatedNameAttribute.cs b/src/OneScript.Core/Contexts/DeprecatedNameAttribute.cs new file mode 100644 index 000000000..0a8c413d0 --- /dev/null +++ b/src/OneScript.Core/Contexts/DeprecatedNameAttribute.cs @@ -0,0 +1,28 @@ +/*---------------------------------------------------------- +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.Contexts +{ + /// + /// Позволяет объявить терм (имя или алиас), как устаревший. + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Enum, + AllowMultiple = true)] + public class DeprecatedNameAttribute : Attribute + { + public DeprecatedNameAttribute(string name, bool throwOnUse = false) + { + Name = name; + ThrowOnUse = throwOnUse; + } + + public string Name { get; } + public bool ThrowOnUse { get; } + } +} \ No newline at end of file diff --git a/src/OneScript.Core/Contexts/IAttachableContext.cs b/src/OneScript.Core/Contexts/IAttachableContext.cs index a8ed173ef..86ce3e70e 100644 --- a/src/OneScript.Core/Contexts/IAttachableContext.cs +++ b/src/OneScript.Core/Contexts/IAttachableContext.cs @@ -11,12 +11,15 @@ namespace OneScript.Contexts { /// /// Присоединяемый контекст. Методы и свойства этого контекста становятся глобальными методами и свойствами. - /// Каждый модуль также является присоединяемым, за счет чего его методы и свойства доступны в модуле, как глобальные. + /// Каждый скрипт также является присоединяемым, за счет чего его методы и свойства доступны в модуле, как глобальные. /// public interface IAttachableContext : IRuntimeContextInstance { - void OnAttach(out IVariable[] variables, - out BslMethodInfo[] methods); + IVariable GetVariable(int index); + BslMethodInfo GetMethod(int index); + + int VariablesCount { get; } + int MethodsCount { get; } } /// diff --git a/src/OneScript.Core/Contexts/IRuntimeEnvironment.cs b/src/OneScript.Core/Contexts/IRuntimeEnvironment.cs index 0c19921f8..33fd05208 100644 --- a/src/OneScript.Core/Contexts/IRuntimeEnvironment.cs +++ b/src/OneScript.Core/Contexts/IRuntimeEnvironment.cs @@ -6,6 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Collections.Generic; +using OneScript.Compilation; using OneScript.Compilation.Binding; using ScriptEngine.Machine; @@ -40,6 +41,21 @@ public interface IRuntimeEnvironment /// Флаг доступности свойства только для чтения void InjectGlobalProperty(IValue value, string identifier, bool readOnly); + /// + /// Инжект глобального свойства + /// + /// Значение свойства + /// Идентификатор + /// Пакет, предоставивший это свойство + void InjectGlobalProperty(IValue value, string identifier, PackageInfo ownerPackage); + + /// + /// Инжект глобального свойства с помощью описания свойства. + /// + /// Значение свойства + /// Определение свойства + void InjectGlobalProperty(IValue value, BslPropertyInfo definition); + /// /// Установить новое значение глобального свойства /// @@ -62,6 +78,6 @@ public interface IRuntimeEnvironment /// /// Список подключенных внешних контекстов (слоев), доступных всегда в рамках данного окружения /// - IReadOnlyCollection AttachedContexts { get; } + IReadOnlyList AttachedContexts { get; } } -} \ No newline at end of file +} diff --git a/src/OneScript.Core/Contexts/ISupportsDeprecation.cs b/src/OneScript.Core/Contexts/ISupportsDeprecation.cs new file mode 100644 index 000000000..0631834cc --- /dev/null +++ b/src/OneScript.Core/Contexts/ISupportsDeprecation.cs @@ -0,0 +1,14 @@ +/*---------------------------------------------------------- +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.Contexts +{ + public interface ISupportsDeprecation + { + bool IsDeprecated { get; } + } +} \ No newline at end of file diff --git a/src/OneScript.Core/Contexts/Variable.cs b/src/OneScript.Core/Contexts/Variable.cs index fa1914d9a..0b071ce4a 100644 --- a/src/OneScript.Core/Contexts/Variable.cs +++ b/src/OneScript.Core/Contexts/Variable.cs @@ -146,6 +146,11 @@ public bool Equals(IValueReference other) { return _reference.Equals(other); } + + public override string ToString() + { + return Value.ToString(); + } } #endregion diff --git a/src/OneScript.Core/Exceptions/ComparisonException.cs b/src/OneScript.Core/Exceptions/ComparisonException.cs new file mode 100644 index 000000000..ad47c325e --- /dev/null +++ b/src/OneScript.Core/Exceptions/ComparisonException.cs @@ -0,0 +1,39 @@ +/*---------------------------------------------------------- +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.Localization; + +namespace OneScript.Exceptions +{ + public class ComparisonException : RuntimeException + { + public ComparisonException(BilingualString message) : base(message) + { + } + + public static ComparisonException NotSupported() + { + return new ComparisonException(new BilingualString( + $"Сравнение на больше/меньше для данного типа не поддерживается", + $"Greater-than/Less-than comparison operations are not supported")); + } + + public static ComparisonException NotSupported(string type) + { + return new ComparisonException(new BilingualString( + $"Сравнение на больше/меньше для типа '{type}' не поддерживается", + $"Greater-than/Less-than comparison operations are not supported for '{type}'")); + } + + public static ComparisonException NotSupported(string type1, string type2) + { + return new ComparisonException(new BilingualString( + $"Сравнение на больше/меньше типов '{type1}' и '{type2}' не поддерживается", + $"Greater-than/Less-than comparison operations are not supported for '{type1}' and '{type2}'")); + } + } +} \ No newline at end of file diff --git a/src/OneScript.Core/Exceptions/RuntimeException.cs b/src/OneScript.Core/Exceptions/RuntimeException.cs index c47be307b..acd645c59 100644 --- a/src/OneScript.Core/Exceptions/RuntimeException.cs +++ b/src/OneScript.Core/Exceptions/RuntimeException.cs @@ -33,6 +33,13 @@ public static RuntimeException DeprecatedMethodCall(string name) $"Вызов безнадёжно устаревшего метода {name}", $"Call to deprecated method {name}"); } + + public static RuntimeException DeprecatedPropertyAccess(string name) + { + return new RuntimeException( + $"Обращение к безнадёжно устаревшему свойству {name}", + $"Access to deprecated property {name}"); + } public static RuntimeException MethodNotFoundException(string methodName) { @@ -118,20 +125,6 @@ public static RuntimeException InvalidNthArgumentValue(int argNum) $"Invalid value for argument number {argNum}"); } - public static RuntimeException ComparisonNotSupportedException() - { - return new RuntimeException( - "Сравнение на больше/меньше для данного типа не поддерживается", - "Greater-than/Less-than comparison operations are not supported"); - } - - public static RuntimeException ComparisonNotSupportedException(string type1, string type2) - { - return new RuntimeException( - $"Сравнение на больше/меньше для данного типа не поддерживается {type1} <-> {type2}", - $"Greater-than/Less-than comparison operations are not supported for {type1} <-> {type2}"); - } - public static RuntimeException IndexedAccessIsNotSupportedException() { return new RuntimeException( diff --git a/src/OneScript.Core/Sources/FileCodeSource.cs b/src/OneScript.Core/Sources/FileCodeSource.cs index 02a6a6ec6..64abaa918 100644 --- a/src/OneScript.Core/Sources/FileCodeSource.cs +++ b/src/OneScript.Core/Sources/FileCodeSource.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using System.Text; using OneScript.Commons; using System; +using OneScript.Language.Sources; namespace OneScript.Sources { diff --git a/src/OneScript.Core/Sources/StringCodeSource.cs b/src/OneScript.Core/Sources/StringCodeSource.cs index 90a471fca..c274a5464 100644 --- a/src/OneScript.Core/Sources/StringCodeSource.cs +++ b/src/OneScript.Core/Sources/StringCodeSource.cs @@ -5,6 +5,8 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +using OneScript.Language.Sources; + namespace OneScript.Sources { public class StringCodeSource : ICodeSource diff --git a/src/OneScript.Core/Values/BslBooleanValue.cs b/src/OneScript.Core/Values/BslBooleanValue.cs index 4963cd83f..c87ccd889 100644 --- a/src/OneScript.Core/Values/BslBooleanValue.cs +++ b/src/OneScript.Core/Values/BslBooleanValue.cs @@ -12,7 +12,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.Values { - public sealed class BslBooleanValue : BslPrimitiveValue + public sealed class BslBooleanValue : BslPrimitiveValue, IBslComparable { public static readonly BslBooleanValue True = new BslBooleanValue(true); public static readonly BslBooleanValue False = new BslBooleanValue(false); @@ -57,7 +57,6 @@ public override string ToString() public override bool Equals(BslValue other) { - if (other is null) return false; if (ReferenceEquals(this, other)) return true; return other switch diff --git a/src/OneScript.Core/Values/BslDateValue.cs b/src/OneScript.Core/Values/BslDateValue.cs index 205dedd4a..91ac459a0 100644 --- a/src/OneScript.Core/Values/BslDateValue.cs +++ b/src/OneScript.Core/Values/BslDateValue.cs @@ -12,7 +12,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.Values { - public sealed class BslDateValue : BslPrimitiveValue + public sealed class BslDateValue : BslPrimitiveValue, IBslComparable { private readonly DateTime _value; @@ -25,9 +25,6 @@ private BslDateValue(DateTime value) public override int CompareTo(BslValue other) { - if (ReferenceEquals(null, other)) - return -1; - if(other is BslDateValue d) return _value.CompareTo(d._value); @@ -44,7 +41,17 @@ public override bool Equals(BslValue other) return base.Equals(other); } - + + public override int GetHashCode() => _value.GetHashCode(); + + public override bool Equals(object obj) + { + if (obj is BslValue bsl) + return Equals(bsl); + + return false; + } + public override TypeDescriptor SystemType => BasicTypes.Date; #region Conversions diff --git a/src/OneScript.Core/Values/BslNumericValue.cs b/src/OneScript.Core/Values/BslNumericValue.cs index 2bfb57a55..8d3464fd0 100644 --- a/src/OneScript.Core/Values/BslNumericValue.cs +++ b/src/OneScript.Core/Values/BslNumericValue.cs @@ -14,7 +14,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.Values { - public sealed class BslNumericValue : BslPrimitiveValue, IEquatable + public sealed class BslNumericValue : BslPrimitiveValue, IEquatable, IBslComparable { private static readonly BslNumericValue[] _popularValues = new BslNumericValue[10]; static BslNumericValue() @@ -84,7 +84,6 @@ public bool Equals(BslNumericValue other) public override bool Equals(BslValue other) { - if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return other switch diff --git a/src/OneScript.Core/Values/BslObjectValue.cs b/src/OneScript.Core/Values/BslObjectValue.cs index 10226630d..e94171f09 100644 --- a/src/OneScript.Core/Values/BslObjectValue.cs +++ b/src/OneScript.Core/Values/BslObjectValue.cs @@ -5,21 +5,10 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using OneScript.Exceptions; -using OneScript.Localization; - namespace OneScript.Values { public abstract class BslObjectValue : BslValue { - public override int CompareTo(BslValue other) - { - var msg = new BilingualString("Сравнение на больше/меньше для данного типа не поддерживается", - "Comparison for less/greater is not supported for this type"); - - throw new RuntimeException(msg); - } - public override bool Equals(BslValue other) { return ReferenceEquals(this, other); diff --git a/src/OneScript.Core/Values/BslPrimitiveValue.cs b/src/OneScript.Core/Values/BslPrimitiveValue.cs index 24bc8000d..33a990ade 100644 --- a/src/OneScript.Core/Values/BslPrimitiveValue.cs +++ b/src/OneScript.Core/Values/BslPrimitiveValue.cs @@ -5,35 +5,10 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System; -using OneScript.Exceptions; - namespace OneScript.Values { public abstract class BslPrimitiveValue : BslValue { - public override int CompareTo(BslValue other) - { - if (other == null) - return -1; - - string typeOfThis = null; - string typeOfOther = null; - - try - { - typeOfThis = this.SystemType.Name; - typeOfOther = other.SystemType.Name; - } - catch (InvalidOperationException) // если тип не зарегистрирован - { - typeOfThis ??= GetType().ToString(); - typeOfOther ??= GetType().ToString(); - } - - throw RuntimeException.ComparisonNotSupportedException(typeOfThis, typeOfOther); - } - public override bool Equals(BslValue other) => false; } } \ No newline at end of file diff --git a/src/OneScript.Core/Values/BslStringValue.cs b/src/OneScript.Core/Values/BslStringValue.cs index b759c7c97..6dbbd86e0 100644 --- a/src/OneScript.Core/Values/BslStringValue.cs +++ b/src/OneScript.Core/Values/BslStringValue.cs @@ -10,7 +10,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.Values { - public sealed class BslStringValue : BslPrimitiveValue + public sealed class BslStringValue : BslPrimitiveValue, IBslComparable { private readonly string _value; @@ -45,13 +45,23 @@ public override bool Equals(BslValue other) return other is BslStringValue sv ? _value.Equals(sv._value) : base.Equals(other); } + public override int GetHashCode() => _value.GetHashCode(); + + public override bool Equals(object obj) + { + if (obj is BslValue bsl) + return Equals(bsl); + + return false; + } + public override int CompareTo(BslValue other) { - if (ReferenceEquals(null, other)) - return -1; + if (ReferenceEquals(this, other)) + return 0; if (other is BslStringValue s) - return String.Compare(_value, s._value, StringComparison.CurrentCulture); + return String.Compare(_value, s._value, StringComparison.InvariantCulture); return base.CompareTo(other); } diff --git a/src/OneScript.Core/Values/BslValue.cs b/src/OneScript.Core/Values/BslValue.cs index 092cfdf24..14d1596b9 100644 --- a/src/OneScript.Core/Values/BslValue.cs +++ b/src/OneScript.Core/Values/BslValue.cs @@ -27,7 +27,30 @@ public virtual string ToString(IBslProcess process) return ToString(); } - public abstract int CompareTo(BslValue other); + public virtual int CompareTo(BslValue other) + { + if (other is null) + return -1; + + string typeOfThis = null; + string typeOfOther = null; + + try + { + typeOfThis = this.SystemType.Name; + typeOfOther = other.SystemType.Name; + } + catch (InvalidOperationException) // если тип не зарегистрирован + { + typeOfThis ??= this.GetType().ToString(); + typeOfOther ??= other.GetType().ToString(); + } + + if (typeOfThis == typeOfOther) + throw ComparisonException.NotSupported(typeOfThis); + else + throw ComparisonException.NotSupported(typeOfThis, typeOfOther); + } public abstract bool Equals(BslValue other); @@ -76,7 +99,7 @@ public static explicit operator DateTime(BslValue target) => public virtual IValue GetRawValue() => this; - private BslValue UnwrapReference(IValue v) + private static BslValue UnwrapReference(IValue v) { if (v is IValueReference r) return r.BslValue; diff --git a/src/OneScript.Core/Values/EnumerationValue.cs b/src/OneScript.Core/Values/EnumerationValue.cs index 4d91d31bb..5a3f324e0 100644 --- a/src/OneScript.Core/Values/EnumerationValue.cs +++ b/src/OneScript.Core/Values/EnumerationValue.cs @@ -6,7 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using OneScript.Commons; -using OneScript.Exceptions; using OneScript.Localization; using OneScript.Types; using System; @@ -16,41 +15,32 @@ namespace OneScript.Values { public abstract class EnumerationValue : BslValue { - readonly TypeDescriptor _systemType; - readonly string _name, _alias; - - public EnumerationValue(TypeDescriptor systemType, string name, string alias) + protected EnumerationValue(TypeDescriptor systemType, string name, string alias) { if (!Utils.IsValidIdentifier(name)) - throw new ArgumentException("Name must be a valid identifier", "name"); + throw new ArgumentException("Name must be a valid identifier", nameof(name)); if(alias != null && !Utils.IsValidIdentifier(alias)) - throw new ArgumentException("Name must be a valid identifier", "alias"); + throw new ArgumentException("Name must be a valid identifier", nameof(alias)); - _systemType = systemType; - _name = name; - _alias = alias; + SystemType = systemType; + Name = name; + Alias = alias; } - public string Name => _name; - public string Alias => _alias; + public string Name { get; } - public bool IsFilled() => true; + public string Alias { get; } - public override TypeDescriptor SystemType => _systemType; + public override TypeDescriptor SystemType { get; } public override string ToString() { - return BilingualString.Localize(_name, _alias); + return BilingualString.Localize(Name, Alias); } public override IValue GetRawValue() => this; - public override int CompareTo(BslValue other) - { - throw RuntimeException.ComparisonNotSupportedException(); - } - public override bool Equals(BslValue other) { return ReferenceEquals(other?.GetRawValue(), this); diff --git a/src/OneScript.Core/Values/IBslComparable.cs b/src/OneScript.Core/Values/IBslComparable.cs new file mode 100644 index 000000000..4075a214b --- /dev/null +++ b/src/OneScript.Core/Values/IBslComparable.cs @@ -0,0 +1,17 @@ +/*---------------------------------------------------------- +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.Values +{ + /// + /// Интерфейс-маркер для примитивных типов, допускающих сравнение на больше/меньше. + /// Используется GenericIValueComparer для определения возможности сравнения. + /// + public interface IBslComparable + { + } +} \ No newline at end of file diff --git a/src/OneScript.DebugProtocol/Abstractions/CommunicationEventArgs.cs b/src/OneScript.DebugProtocol/Abstractions/CommunicationEventArgs.cs index 76874469e..c62fb169b 100644 --- a/src/OneScript.DebugProtocol/Abstractions/CommunicationEventArgs.cs +++ b/src/OneScript.DebugProtocol/Abstractions/CommunicationEventArgs.cs @@ -11,7 +11,7 @@ namespace OneScript.DebugProtocol.Abstractions { public class CommunicationEventArgs : EventArgs { - public ICommunicationChannel Channel { get; set; } + public IMessageChannel Channel { get; set; } public object Data { get; set; } diff --git a/src/OneScript.DebugProtocol/Abstractions/IDebuggerClient.cs b/src/OneScript.DebugProtocol/Abstractions/IDebuggerClient.cs new file mode 100644 index 000000000..8e54657eb --- /dev/null +++ b/src/OneScript.DebugProtocol/Abstractions/IDebuggerClient.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 System; +using System.IO; + +namespace OneScript.DebugProtocol.Abstractions +{ + public interface IDebuggerClient : IDisposable + { + bool Connected { get; } + + Stream GetDataStream(); + } +} \ No newline at end of file diff --git a/src/OneScript.DebugProtocol/Abstractions/ICommunicationChannel.cs b/src/OneScript.DebugProtocol/Abstractions/IMessageChannel.cs similarity index 90% rename from src/OneScript.DebugProtocol/Abstractions/ICommunicationChannel.cs rename to src/OneScript.DebugProtocol/Abstractions/IMessageChannel.cs index c1927397d..6d8c2c816 100644 --- a/src/OneScript.DebugProtocol/Abstractions/ICommunicationChannel.cs +++ b/src/OneScript.DebugProtocol/Abstractions/IMessageChannel.cs @@ -9,7 +9,7 @@ This Source Code Form is subject to the terms of the namespace OneScript.DebugProtocol.Abstractions { - public interface ICommunicationChannel : IDisposable + public interface IMessageChannel : IDisposable { void Write(object data); diff --git a/src/OneScript.DebugProtocol/Internal/BinaryFormatWriter.cs b/src/OneScript.DebugProtocol/Internal/BinaryFormatWriter.cs index 1539526e4..3159210da 100644 --- a/src/OneScript.DebugProtocol/Internal/BinaryFormatWriter.cs +++ b/src/OneScript.DebugProtocol/Internal/BinaryFormatWriter.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System; using System.IO; -using System.Linq; using System.Reflection; using System.Text; diff --git a/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs b/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs index 5d3c3a3af..5b910121a 100644 --- a/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs +++ b/src/OneScript.DebugProtocol/TcpServer/BinaryChannel.cs @@ -8,16 +8,19 @@ This Source Code Form is subject to the terms of the using System; using System.Net.Sockets; using System.Runtime.Serialization; +#if NET48 using System.Runtime.Serialization.Formatters.Binary; +#endif using OneScript.DebugProtocol.Abstractions; +// ReSharper disable once CheckNamespace namespace OneScript.DebugProtocol { /// /// TCP-канал, использующий стандартную Binary-сериализацию .NET /// [Obsolete("Используется только со стороны адаптера, для работы со старыми версиями 1Script")] - public sealed class BinaryChannel : ICommunicationChannel + public sealed class BinaryChannel : IMessageChannel { private readonly TcpClient _client; private readonly NetworkStream _clientStream; diff --git a/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs b/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs index 473a9f3d3..f52ec7419 100644 --- a/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs +++ b/src/OneScript.DebugProtocol/TcpServer/DefaultMessageServer.cs @@ -11,13 +11,20 @@ This Source Code Form is subject to the terms of the namespace OneScript.DebugProtocol.TcpServer { + /// + /// Читает сообщения из канала и вызывает обработчики сообщений. + /// Управляет жизненным циклом канала и освобождает его ресурсы при завершении работы сервера. + /// + /// public class DefaultMessageServer : ICommunicationServer { - private readonly ICommunicationChannel _protocolChannel; + private readonly IMessageChannel _protocolChannel; + private readonly object _disposeLock = new object(); private Thread _messageThread; private volatile bool _serverStopped; + private bool _channelDisposed; - public DefaultMessageServer(ICommunicationChannel protocolChannel) + public DefaultMessageServer(IMessageChannel protocolChannel) { _protocolChannel = protocolChannel; } @@ -92,18 +99,24 @@ private void RunCommandsLoop() } catch (Exception e) { + if (OnError == null) + { + _serverStopped = true; + break; + } + var eventData = new CommunicationEventArgs { Data = null, Channel = _protocolChannel, Exception = new ChannelException("Unhandled error in message handler", true, e) }; - + OnError?.Invoke(this, eventData); } } - _protocolChannel.Dispose(); + DisposeChannel(); }); _messageThread.IsBackground = true; @@ -115,6 +128,18 @@ private void RunCommandsLoop() _messageThread.Start(); } + private void DisposeChannel() + { + lock (_disposeLock) + { + if (_channelDisposed) + return; + + _channelDisposed = true; + _protocolChannel.Dispose(); + } + } + public void Stop() { if (_serverStopped) diff --git a/src/OneScript.DebugProtocol/TcpServer/DispatchingServer.cs b/src/OneScript.DebugProtocol/TcpServer/DispatchingServer.cs index 5d0ec7cd0..6069d72f0 100644 --- a/src/OneScript.DebugProtocol/TcpServer/DispatchingServer.cs +++ b/src/OneScript.DebugProtocol/TcpServer/DispatchingServer.cs @@ -10,6 +10,10 @@ This Source Code Form is subject to the terms of the namespace OneScript.DebugProtocol.TcpServer { + /// + /// Диспетчер обработки сообщений. Получает сообщения от сервера и передает их в обработчик. + /// + /// public class DispatchingService { private readonly ICommunicationServer _server; @@ -50,7 +54,7 @@ private void OnDataReceived(object sender, CommunicationEventArgs e) } } - private void ProcessSuccess(RpcCall message, ICommunicationChannel responseChannel) + private void ProcessSuccess(RpcCall message, IMessageChannel responseChannel) { RpcCallResult callResult = null; try @@ -59,11 +63,6 @@ private void ProcessSuccess(RpcCall message, ICommunicationChannel responseChann 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/FormatReconcileUtils.cs b/src/OneScript.DebugProtocol/TcpServer/FormatReconcileUtils.cs index a84f42c42..99fa26ef3 100644 --- a/src/OneScript.DebugProtocol/TcpServer/FormatReconcileUtils.cs +++ b/src/OneScript.DebugProtocol/TcpServer/FormatReconcileUtils.cs @@ -63,7 +63,7 @@ public static bool CheckReconcileRequest(Stream stream) { var magic = GetReconcileMagic(); var buffer = new byte[magic.Length]; - ReadStream(stream, buffer, buffer.Length); + StreamUtils.ReadStream(stream, buffer, buffer.Length); for (int i = 0; i < magic.Length; i++) { if (buffer[i] != magic[i]) @@ -80,6 +80,7 @@ public static void WriteReconcileResponse(Stream target, short transport, short using var binaryWriter = new BinaryWriter(target, Encoding.UTF8, true); binaryWriter.Write(FORMAT_RECONCILE_RESPONSE_PREFIX); binaryWriter.Write(formatInfo); + binaryWriter.Flush(); } public static int EncodeFormatMarker(short transport, short dataVersion) @@ -95,20 +96,5 @@ public static (int, int) DecodeFormatMarker(int marker) return (transport, dataVersion); } - - private static void ReadStream(Stream stream, byte[] buffer, int length) - { - int readPosition = 0; - int bytesReceived = 0; - - while (bytesReceived < length) - { - bytesReceived = stream.Read(buffer, readPosition, length - bytesReceived); - if (bytesReceived == 0) - throw new IOException("Unexpected end of stream"); - - readPosition += bytesReceived; - } - } } } diff --git a/src/OneScript.DebugProtocol/TcpServer/JsonDtoChannel.cs b/src/OneScript.DebugProtocol/TcpServer/JsonDtoChannel.cs index 5fcb17724..2b0b98d73 100644 --- a/src/OneScript.DebugProtocol/TcpServer/JsonDtoChannel.cs +++ b/src/OneScript.DebugProtocol/TcpServer/JsonDtoChannel.cs @@ -7,36 +7,35 @@ This Source Code Form is subject to the terms of the using System; using System.IO; -using System.Net.Sockets; using System.Text; using Newtonsoft.Json; using OneScript.DebugProtocol.Abstractions; namespace OneScript.DebugProtocol.TcpServer { - public class JsonDtoChannel : ICommunicationChannel + public sealed class JsonDtoChannel : IMessageChannel { - private readonly TcpClient _tcpClient; + private readonly IDebuggerClient _client; private readonly Stream _dataStream; private bool _enabled = true; - public JsonDtoChannel(TcpClient tcpClient) + public JsonDtoChannel(IDebuggerClient client) { - _tcpClient = tcpClient; - _dataStream = tcpClient.GetStream(); + _client = client; + _dataStream = client.GetDataStream(); } public JsonDtoChannel(Stream dataStream) { - _tcpClient = null; + _client = null; _dataStream = dataStream; } public void Dispose() { _dataStream.Dispose(); - _tcpClient?.Close(); + _client?.Dispose(); _enabled = false; } @@ -71,35 +70,27 @@ public object Read() if (!_enabled) throw new ObjectDisposedException(nameof(JsonDtoChannel)); - using (var socketReader = new BinaryReader(_dataStream, Encoding.UTF8, true)) + try { - var contentLength = socketReader.ReadInt32(); - var contentBuffer = new byte[contentLength]; - ReadStream(socketReader, contentBuffer, contentLength); - - using (var textReader = new StreamReader(new MemoryStream(contentBuffer), Encoding.UTF8, false)) + using (var socketReader = new BinaryReader(_dataStream, Encoding.UTF8, true)) { - using var reader = new JsonTextReader(textReader); - return JsonSerializer.CreateDefault().Deserialize(reader); + var contentLength = socketReader.ReadInt32(); + var contentBuffer = new byte[contentLength]; + StreamUtils.ReadStream(socketReader.BaseStream, contentBuffer, contentLength); + + using (var textReader = new StreamReader(new MemoryStream(contentBuffer), Encoding.UTF8, false)) + { + using var reader = new JsonTextReader(textReader); + return JsonSerializer.CreateDefault().Deserialize(reader); + } } } - } - - private void ReadStream(BinaryReader reader, byte[] buffer, int length) - { - int readPosition = 0; - int bytesReceived = 0; - - while (bytesReceived < length) + catch (Exception ex) { - bytesReceived = reader.Read(buffer, readPosition, length - bytesReceived); - if (bytesReceived == 0) - throw new IOException("Unexpected end of stream"); - - readPosition += bytesReceived; + throw new ChannelException("Channel read exception", ex); } } - public bool Connected => _enabled && (_tcpClient?.Connected ?? true); + public bool Connected => _enabled && (_client?.Connected ?? true); } } \ No newline at end of file diff --git a/src/OneScript.DebugProtocol/TcpServer/JsonDtoConverter.cs b/src/OneScript.DebugProtocol/TcpServer/JsonDtoConverter.cs index 91762997c..7a6aa34de 100644 --- a/src/OneScript.DebugProtocol/TcpServer/JsonDtoConverter.cs +++ b/src/OneScript.DebugProtocol/TcpServer/JsonDtoConverter.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; -using System.Diagnostics; using System.Runtime.CompilerServices; using Newtonsoft.Json; namespace OneScript.DebugProtocol.TcpServer diff --git a/src/OneScript.DebugProtocol/TcpServer/StreamUtils.cs b/src/OneScript.DebugProtocol/TcpServer/StreamUtils.cs new file mode 100644 index 000000000..e2dc7b088 --- /dev/null +++ b/src/OneScript.DebugProtocol/TcpServer/StreamUtils.cs @@ -0,0 +1,30 @@ +/*---------------------------------------------------------- +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.IO; + +namespace OneScript.DebugProtocol.TcpServer +{ + public static class StreamUtils + { + public static void ReadStream(Stream stream, byte[] buffer, int length) + { + int readPosition = 0; + int bytesReceived = 0; + + while (bytesReceived < length) + { + var portionSize = stream.Read(buffer, readPosition, length - bytesReceived); + if (portionSize == 0) + throw new IOException("Unexpected end of stream"); + + readPosition += portionSize; + bytesReceived += portionSize; + } + } + } +} \ No newline at end of file diff --git a/src/OneScript.DebugServices/DefaultBreakpointManager.cs b/src/OneScript.DebugServices/DefaultBreakpointManager.cs index 09441a8f1..e9661a655 100644 --- a/src/OneScript.DebugServices/DefaultBreakpointManager.cs +++ b/src/OneScript.DebugServices/DefaultBreakpointManager.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; using System.Collections.Generic; using System.Linq; using OneScript.Commons; diff --git a/src/OneScript.DebugServices/DefaultDebugController.cs b/src/OneScript.DebugServices/DefaultDebugController.cs deleted file mode 100644 index d441c2292..000000000 --- a/src/OneScript.DebugServices/DefaultDebugController.cs +++ /dev/null @@ -1,95 +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.DebugProtocol; -using OneScript.DebugProtocol.Abstractions; -using OneScript.DebugProtocol.TcpServer; -using ScriptEngine.Machine; - -namespace OneScript.DebugServices -{ - /// - /// Простой односессионный контроллер отладки. Поддерживает только один сеанс отладки на процесс. - /// Также поддерживает только один BSL-процесс на приложение. При получении NotifyProcessExited отключает отладчик - /// и к нему нельзя подключиться еще раз. - /// - public class DefaultDebugController : IDebugController - { - private readonly ICommunicationServer _server; - private readonly DefaultDebugService _debugger; - private readonly IDebugEventListener _callbackService; - private readonly ThreadManager _threadManager; - - public DefaultDebugController(ICommunicationServer ipcServer, - DefaultDebugService debugger, - IDebugEventListener callbackService, - ThreadManager threadManager, - IBreakpointManager breakpointManager) - { - _server = ipcServer; - _debugger = debugger; - _callbackService = callbackService; - _threadManager = threadManager; - BreakpointManager = breakpointManager; - } - - public void Dispose() - { - _server.Stop(); - _threadManager.Dispose(); - } - - public void Init() - { - _threadManager.ThreadStopped += ThreadManagerOnThreadStopped; - var dispatcher = new DispatchingService(_server, _debugger); - dispatcher.Start(); - } - - private void ThreadManagerOnThreadStopped(object sender, ThreadStoppedEventArgs e) - { - MachineWaitToken token; - try - { - token = _threadManager.GetTokenForThread(e.ThreadId); - } - catch (ArgumentOutOfRangeException) - { - return; - } - - token.Reset(); - - _callbackService.ThreadStoppedEx(e.ThreadId, ConvertStopReason(e.StopReason), e.ErrorMessage); - token.Wait(); - } - - public void Wait() => _debugger.WaitForExecution(); - - public void NotifyProcessExit(int exitCode) - { - _threadManager.ReleaseAllThreads(); - _callbackService.ProcessExited(exitCode); - _server.Stop(); - - } - - public IBreakpointManager BreakpointManager { get; } - - public IThreadManager ThreadManager => _threadManager; - - private static ThreadStopReason ConvertStopReason(MachineStopReason reason) => reason switch - { - MachineStopReason.Breakpoint => ThreadStopReason.Breakpoint, - MachineStopReason.BreakpointConditionError => ThreadStopReason.Breakpoint, - MachineStopReason.Step => ThreadStopReason.Step, - MachineStopReason.Exception => ThreadStopReason.Exception, - _ => throw new NotImplementedException(), - }; - } -} \ No newline at end of file diff --git a/src/OneScript.DebugServices/DefaultDebugger.cs b/src/OneScript.DebugServices/DefaultDebugger.cs new file mode 100644 index 000000000..4a39fc72a --- /dev/null +++ b/src/OneScript.DebugServices/DefaultDebugger.cs @@ -0,0 +1,116 @@ +/*---------------------------------------------------------- +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.DebugProtocol.Abstractions; +using OneScript.DebugProtocol.TcpServer; +using OneScript.DebugServices.Internal; +using ScriptEngine.Machine.Debugger; + +namespace OneScript.DebugServices +{ + /// + /// Простой отладчик, поддерживающий одновременно только одну сессию отладки. + /// + public class DefaultDebugger : IDebugger + { + // NB! должен быть согласован с перечислением TransportProtocols в адаптере + private const short JSON_FORMAT_MARKER = 2; + // NB! должен быть согласован с файлом ProtocolVersions в адаптере + private const short SUPPORTED_FORMAT_VERSION = 3; + + private readonly IDebugServer _transport; + private IDebugSession _session; + + private readonly object _sessionRecycleLock = new object(); + + public DefaultDebugger(IDebugServer transport) + { + _transport = transport; + } + + public bool IsEnabled => true; + public bool AttachMode { get; set; } + + public void Start() + { + _transport.OnClientConnected += TransportOnOnClientConnected; + _transport.OnListenException += ListenerException; + _transport.Listen(); + } + + private void ListenerException(object sender, ListenerErrorEventArgs e) + { + e.StopServer = true; + } + + private void TransportOnOnClientConnected(object sender, IDebuggerClient debuggerClient) + { + lock (_sessionRecycleLock) + { + if (_session?.IsActive == true) + { + // Если есть активная сессия, то не начинаем новую + debuggerClient.Dispose(); + return; + } + } + + var dataStream = debuggerClient.GetDataStream(); + if (FormatReconcileUtils.CheckReconcileRequest(dataStream)) + { + // Да, это наш фейковый заголовок + FormatReconcileUtils.WriteReconcileResponse(dataStream, JSON_FORMAT_MARKER, SUPPORTED_FORMAT_VERSION); + } + else + { + // Не поддерживаем старый формат протокола отладки + debuggerClient.Dispose(); + return; + } + + lock (_sessionRecycleLock) + { + var session = new DebugSession(debuggerClient, AttachMode); + session.OnClose += OnSessionClose; + + if (_session is ConnectableSessionProxy proxy) + { + proxy.Connect(session); + } + else + { + _session = session; + } + } + } + + private void OnSessionClose(DebugSession session) + { + lock (_sessionRecycleLock) + { + session.OnClose -= OnSessionClose; + _session = null; + } + } + + public IDebugSession GetSession() + { + lock (_sessionRecycleLock) + { + return _session ??= new ConnectableSessionProxy(AttachMode); + } + } + + public void NotifyProcessExit(int exitCode) + { + _transport.OnClientConnected-=TransportOnOnClientConnected; + _transport.Stop(); + + _session?.Dispose(); + } + } +} \ No newline at end of file diff --git a/src/OneScript.DebugServices/DefaultVariableVisualizer.cs b/src/OneScript.DebugServices/DefaultVariableVisualizer.cs index 9e47c96f7..03cb5f2cc 100644 --- a/src/OneScript.DebugServices/DefaultVariableVisualizer.cs +++ b/src/OneScript.DebugServices/DefaultVariableVisualizer.cs @@ -12,7 +12,6 @@ This Source Code Form is subject to the terms of the using OneScript.Execution; using ScriptEngine.Machine; using Variable = OneScript.DebugProtocol.Variable; -using MachineVariable = OneScript.Contexts.Variable; namespace OneScript.DebugServices { diff --git a/src/OneScript.DebugServices/IDebugServer.cs b/src/OneScript.DebugServices/IDebugServer.cs new file mode 100644 index 000000000..bc35feaec --- /dev/null +++ b/src/OneScript.DebugServices/IDebugServer.cs @@ -0,0 +1,25 @@ +/*---------------------------------------------------------- +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.DebugProtocol.Abstractions; + +namespace OneScript.DebugServices +{ + /// + /// Сервер отладки, слушающий соединения от IDE и уведомляющий о подключении нового клиента. + /// + public interface IDebugServer + { + void Listen(); + void Stop(); + + event EventHandler OnClientConnected; + + event EventHandler OnListenException; + } +} \ No newline at end of file diff --git a/src/OneScript.DebugServices/Internal/ConnectableSessionProxy.cs b/src/OneScript.DebugServices/Internal/ConnectableSessionProxy.cs new file mode 100644 index 000000000..8af1bc24d --- /dev/null +++ b/src/OneScript.DebugServices/Internal/ConnectableSessionProxy.cs @@ -0,0 +1,60 @@ +/*---------------------------------------------------------- +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.Threading; +using ScriptEngine.Machine; +using ScriptEngine.Machine.Debugger; + +namespace OneScript.DebugServices.Internal +{ + internal class ConnectableSessionProxy : IDebugSession + { + private IDebugSession _session = new DisabledDebugSession(); + private bool _isConnected; + private readonly ManualResetEventSlim _connectionEvent = new ManualResetEventSlim(); + + public ConnectableSessionProxy(bool attachMode) + { + _isConnected = attachMode; + } + + public void Dispose() + { + var activeSession = _session; + + _connectionEvent.Reset(); + _isConnected = false; + _session = new DisabledDebugSession(); + + activeSession.Dispose(); + } + + public void Connect(IDebugSession session) + { + _session = session; + _isConnected = true; + _connectionEvent.Set(); + } + + public IBreakpointManager BreakpointManager => _session.BreakpointManager; + + public IThreadEventsListener ThreadManager => _session.ThreadManager; + + public void WaitReadyToRun() + { + if (_isConnected) + { + _session.WaitReadyToRun(); // просто делегируем + return; + } + + _connectionEvent.Wait(); + } + + public bool IsActive => _session.IsActive; + } +} \ No newline at end of file diff --git a/src/OneScript.DebugServices/Internal/DebugSession.cs b/src/OneScript.DebugServices/Internal/DebugSession.cs new file mode 100644 index 000000000..53e093397 --- /dev/null +++ b/src/OneScript.DebugServices/Internal/DebugSession.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.Threading; +using OneScript.DebugProtocol; +using OneScript.DebugProtocol.Abstractions; +using OneScript.DebugProtocol.TcpServer; +using ScriptEngine.Machine; +using ScriptEngine.Machine.Debugger; + +namespace OneScript.DebugServices.Internal +{ + internal class DebugSession : IDebugSession + { + private bool _isStarted; + private readonly ThreadManager _threadManager; + private readonly TcpEventCallbackChannel _callbackChannel; + private readonly DispatchingService _messageServer; + + private readonly ManualResetEventSlim _startEvent = new ManualResetEventSlim(); + + public bool IsActive { get; private set; } + + public DebugSession(IDebuggerClient connectedClient, bool attachMode) + { + // Если это режим Attach, то не ждем готовности к запуску + // т.к. IDE не пришлет команду Execute и мы сразу считаем себя готовой сессией. + _isStarted = attachMode; + + var channel = new JsonDtoChannel(connectedClient); + var ipcServer = new DefaultMessageServer(channel) + { + ServerThreadName = "debug-server" + }; + + ipcServer.OnError += CommunicationError; + + BreakpointManager = new DefaultBreakpointManager(); + _threadManager = new ThreadManager(); + _callbackChannel = new TcpEventCallbackChannel(channel); + + var commandsHandler = new DebuggerServiceImpl(this, new DefaultVariableVisualizer()); + + _messageServer = new DispatchingService(ipcServer, commandsHandler); + _messageServer.Start(); + + _threadManager.ThreadStopped += ThreadManagerOnThreadStopped; + IsActive = true; + } + + private void CommunicationError(object sender, CommunicationEventArgs e) + { + // Unexpected error in message loop + Dispose(); + } + + private void ThreadManagerOnThreadStopped(object sender, ThreadStoppedEventArgs e) + { + MachineWaitToken token; + try + { + token = _threadManager.GetTokenForThread(e.ThreadId); + } + catch (ArgumentOutOfRangeException) + { + return; + } + + token.Reset(); + + _callbackChannel.ThreadStoppedEx(e.ThreadId, ConvertStopReason(e.StopReason), e.ErrorMessage); + token.Wait(); + } + + public void Dispose() + { + _threadManager.ThreadStopped -= ThreadManagerOnThreadStopped; + _threadManager.Dispose(); + _messageServer.Stop(); + IsActive = false; + + OnClose?.Invoke(this); + } + + public IBreakpointManager BreakpointManager { get; } + public IThreadEventsListener ThreadManager => _threadManager; + + public void WaitReadyToRun() + { + if (_isStarted) + return; + + _startEvent.Wait(); + _isStarted = true; + } + + internal void SetReadyToRun() + { + if (_isStarted) + return; + + _startEvent.Set(); + } + + public event Action OnClose; + + private static ThreadStopReason ConvertStopReason(MachineStopReason reason) => reason switch + { + MachineStopReason.Breakpoint => ThreadStopReason.Breakpoint, + MachineStopReason.BreakpointConditionError => ThreadStopReason.Breakpoint, + MachineStopReason.Step => ThreadStopReason.Step, + MachineStopReason.Exception => ThreadStopReason.Exception, + _ => throw new NotImplementedException(), + }; + } +} \ No newline at end of file diff --git a/src/OneScript.DebugServices/DefaultDebugService.cs b/src/OneScript.DebugServices/Internal/DebuggerServiceImpl.cs similarity index 91% rename from src/OneScript.DebugServices/DefaultDebugService.cs rename to src/OneScript.DebugServices/Internal/DebuggerServiceImpl.cs index bd302f89b..7547ea4cd 100644 --- a/src/OneScript.DebugServices/DefaultDebugService.cs +++ b/src/OneScript.DebugServices/Internal/DebuggerServiceImpl.cs @@ -8,44 +8,34 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; using System.Linq; -using System.Threading; using OneScript.Contexts; using OneScript.DebugProtocol; -using OneScript.DebugProtocol.TcpServer; using OneScript.Language; using ScriptEngine.Machine; using StackFrame = OneScript.DebugProtocol.StackFrame; using Variable = OneScript.DebugProtocol.Variable; using MachineVariable = OneScript.Contexts.Variable; -namespace OneScript.DebugServices +namespace OneScript.DebugServices.Internal { - public class DefaultDebugService : IDebuggerService + internal class DebuggerServiceImpl : IDebuggerService { + private readonly DebugSession _debugSession; private readonly IBreakpointManager _breakpointManager; private readonly IVariableVisualizer _visualizer; private readonly ThreadManager _threadManager; - private ManualResetEventSlim _awaiter = new ManualResetEventSlim(); - - public DefaultDebugService(IBreakpointManager breakpointManager, ThreadManager threads, IVariableVisualizer visualizer) + public DebuggerServiceImpl(DebugSession debugSession, IVariableVisualizer visualizer) { - _breakpointManager = breakpointManager; + _debugSession = debugSession; + _breakpointManager = _debugSession.BreakpointManager; + _threadManager = (ThreadManager)_debugSession.ThreadManager; _visualizer = visualizer; - _threadManager = threads; - } - - public void WaitForExecution() - { - _awaiter.Wait(); } public void Execute(int threadId) { - if (!_awaiter.IsSet) - { - _awaiter.Set(); - } + _debugSession.SetReadyToRun(); if (threadId > 0) { @@ -215,8 +205,7 @@ public void Disconnect(bool terminate) { _breakpointManager.Clear(); _threadManager.ReleaseAllThreads(); - - throw new StopServiceException(); + _debugSession.Dispose(); } public int[] GetThreads() diff --git a/src/OneScript.DebugServices/Internal/DelayedConnectionChannel.cs b/src/OneScript.DebugServices/Internal/DelayedConnectionChannel.cs deleted file mode 100644 index 8905c594e..000000000 --- a/src/OneScript.DebugServices/Internal/DelayedConnectionChannel.cs +++ /dev/null @@ -1,85 +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.IO; -using System.Net.Sockets; -using System.Text; -using OneScript.DebugProtocol; -using OneScript.DebugProtocol.Abstractions; -using OneScript.DebugProtocol.TcpServer; - -namespace OneScript.DebugServices.Internal -{ - internal class DelayedConnectionChannel : ICommunicationChannel - { - private TcpListener _listener; - private ICommunicationChannel _connectedChannel; - - // NB! должен быть согласован с перечислением TransportProtocols в адаптере - private const short JSON_FORMAT_MARKER = 2; - // NB! должен быть согласован с файлом ProtocolVersions в адаптере - private const short SUPPORTED_FORMAT_VERSION = 3; - - private bool _reconciled; - - public DelayedConnectionChannel(TcpListener listener) - { - _listener = listener; - } - - public void Dispose() - { - _listener?.Stop(); - _listener = null; - _connectedChannel?.Dispose(); - } - - public void Write(object data) - { - if(_connectedChannel == null) - throw new InvalidOperationException("No client connected"); - - _connectedChannel.Write(data); - } - - public T Read() - { - ReconcileFormat(); - return _connectedChannel.Read(); - } - - public object Read() - { - ReconcileFormat(); - return _connectedChannel.Read(); - } - - private void ReconcileFormat() - { - if (_reconciled) - return; - - _listener.Start(); - var tcpClient = _listener.AcceptTcpClient(); - _listener.Stop(); - _listener = null; - - var tcpStream = tcpClient.GetStream(); - - if (FormatReconcileUtils.CheckReconcileRequest(tcpStream)) - { - // Да, это наш фейковый заголовок - FormatReconcileUtils.WriteReconcileResponse(tcpStream, JSON_FORMAT_MARKER, SUPPORTED_FORMAT_VERSION); - } - _reconciled = true; - _connectedChannel = new JsonDtoChannel(tcpClient); - } - - public bool Connected => _connectedChannel?.Connected ?? false; - } -} \ No newline at end of file diff --git a/src/OneScript.DebugServices/TcpEventCallbackChannel.cs b/src/OneScript.DebugServices/Internal/TcpEventCallbackChannel.cs similarity index 81% rename from src/OneScript.DebugServices/TcpEventCallbackChannel.cs rename to src/OneScript.DebugServices/Internal/TcpEventCallbackChannel.cs index 3faacb25a..e1aafea2e 100644 --- a/src/OneScript.DebugServices/TcpEventCallbackChannel.cs +++ b/src/OneScript.DebugServices/Internal/TcpEventCallbackChannel.cs @@ -5,19 +5,18 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System; using System.IO; using OneScript.DebugProtocol; using OneScript.DebugProtocol.Abstractions; using OneScript.DebugProtocol.TcpServer; -namespace OneScript.DebugServices +namespace OneScript.DebugServices.Internal { - public class TcpEventCallbackChannel : IDebugEventListener, IDisposable + internal class TcpEventCallbackChannel : IDebugEventListener { - private readonly ICommunicationChannel _channel; + private readonly IMessageChannel _channel; - public TcpEventCallbackChannel(ICommunicationChannel channel) + public TcpEventCallbackChannel(IMessageChannel channel) { _channel = channel; } @@ -54,10 +53,5 @@ private void Write(RpcCall dto) // Ignore } } - - public void Dispose() - { - _channel.Dispose(); - } } } \ No newline at end of file diff --git a/src/OneScript.DebugServices/ListenerErrorEventArgs.cs b/src/OneScript.DebugServices/ListenerErrorEventArgs.cs new file mode 100644 index 000000000..142733c2d --- /dev/null +++ b/src/OneScript.DebugServices/ListenerErrorEventArgs.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; + +namespace OneScript.DebugServices +{ + public class ListenerErrorEventArgs : EventArgs + { + public ListenerErrorEventArgs(Exception exception) + { + this.Exception = exception; + StopServer = true; + } + + public Exception Exception { get; } + + public bool StopServer { get; set; } + } +} \ No newline at end of file diff --git a/src/OneScript.DebugServices/TcpDebugServer.cs b/src/OneScript.DebugServices/TcpDebugServer.cs index 767d3c721..9bd585ab0 100644 --- a/src/OneScript.DebugServices/TcpDebugServer.cs +++ b/src/OneScript.DebugServices/TcpDebugServer.cs @@ -5,37 +5,156 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +using System; +using System.IO; +using System.Net; using System.Net.Sockets; -using OneScript.DebugProtocol.TcpServer; -using OneScript.DebugServices.Internal; -using ScriptEngine.Machine; +using System.Threading; +using OneScript.DebugProtocol.Abstractions; namespace OneScript.DebugServices { - public class TcpDebugServer + public class TcpDebugServer : IDebugServer { private readonly int _port; + private volatile bool _isListening; + private TcpListener _listener; public TcpDebugServer(int port) { _port = port; } - public IDebugController CreateDebugController() + public enum LogLevel { - var listener = TcpListener.Create(_port); - var channel = new DelayedConnectionChannel(listener); - var ipcServer = new DefaultMessageServer(channel) - { - ServerThreadName = "debug-server" - }; - var callback = new TcpEventCallbackChannel(channel); - var threadManager = new ThreadManager(); - var breakpoints = new DefaultBreakpointManager(); - var debuggerService = new DefaultDebugService(breakpoints, threadManager, new DefaultVariableVisualizer()); - var controller = new DefaultDebugController(ipcServer, debuggerService, callback, threadManager, breakpoints); - - return controller; + Debug, + Info, + Error } + + public int ActualPort() => (_listener.LocalEndpoint as IPEndPoint)?.Port ?? 0; + + public delegate void LogHandler(LogLevel level, string message); + + public event LogHandler OnLogEvent; + + public void Listen() + { + if (_isListening) + return; + + _listener = TcpListener.Create(_port); + + _listener.Start(); + _isListening = true; + + StartListenerThread(); + } + + private void StartListenerThread() + { + new Thread(() => + { + OnLogEvent?.Invoke(LogLevel.Info, "Starting listener thread"); + while (_isListening) + { + try + { + var client = _listener.AcceptTcpClient(); + OnLogEvent?.Invoke(LogLevel.Debug, "Client connected"); + OnClientConnected?.Invoke(this, new TcpDebuggerClient(client)); + } + catch (ObjectDisposedException) + { + _isListening = false; + OnLogEvent?.Invoke(LogLevel.Debug, "Listener interrupted"); + break; + } + catch (SocketException e) + { + if (_isListening == false) + { + // Сервер находится в процессе остановки внешним потоком + // и ошибка сокета не является ошибкой. + break; + } + + OnLogEvent?.Invoke(LogLevel.Error, $"Socket exception: {e}"); + if (OnListenException == null) + { + Stop(); + break; + } + + var args = new ListenerErrorEventArgs(e); + try + { + OnLogEvent?.Invoke(LogLevel.Debug, $"Calling exception handler"); + OnListenException?.Invoke(this, args); + if (args.StopServer) + { + Stop(); + } + } + catch (Exception handlerException) + { + OnLogEvent?.Invoke(LogLevel.Error, $"Exception handler raised exception {handlerException}"); + Stop(); + throw; + } + } + } + OnLogEvent?.Invoke(LogLevel.Info, "Listener thread stopped"); + }) + { + IsBackground = true, + Name = "debug-server-listener", + }.Start(); + } + + private class TcpDebuggerClient : IDebuggerClient + { + private TcpClient Client { get; } + + public TcpDebuggerClient(TcpClient client) + { + Client = client; + } + + public void Dispose() + { + Client.Dispose(); + } + + public Stream GetDataStream() + { + return Client.GetStream(); + } + + public bool Connected => Client.Connected; + } + + public void Stop() + { + OnLogEvent?.Invoke(LogLevel.Debug, "Stopping listener"); + _isListening = false; + try + { + _listener?.Stop(); + } + catch (Exception e) + { + // тут нечего делать + OnLogEvent?.Invoke(LogLevel.Error, $"Exception while stopping listener: {e}"); + } + finally + { + _listener = null; + } + + } + + public event EventHandler OnClientConnected; + public event EventHandler OnListenException; } } \ No newline at end of file diff --git a/src/OneScript.DebugServices/ThreadManager.cs b/src/OneScript.DebugServices/ThreadManager.cs index 03401b6ae..f93cae0c0 100644 --- a/src/OneScript.DebugServices/ThreadManager.cs +++ b/src/OneScript.DebugServices/ThreadManager.cs @@ -9,12 +9,12 @@ This Source Code Form is subject to the terms of the using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; -using System.Threading; using ScriptEngine.Machine; +using ScriptEngine.Machine.Debugger; namespace OneScript.DebugServices { - public class ThreadManager : IThreadManager + public class ThreadManager : IThreadEventsListener { private readonly IDictionary _machinesOnThreads = new ConcurrentDictionary(); @@ -85,7 +85,7 @@ public void ThreadStarted(int threadId, MachineInstance machine) }; } - void IThreadManager.ThreadStopped(int threadId, MachineStopReason reason, string errorMessage) + void IThreadEventsListener.ThreadStopped(int threadId, MachineStopReason reason, string errorMessage) { EmitThreadStopped(threadId, reason, errorMessage); } diff --git a/src/OneScript.Language/LexicalAnalysis/ExpressionBasedLexer.cs b/src/OneScript.Language/LexicalAnalysis/ExpressionBasedLexer.cs index 1a904feda..002744b9e 100644 --- a/src/OneScript.Language/LexicalAnalysis/ExpressionBasedLexer.cs +++ b/src/OneScript.Language/LexicalAnalysis/ExpressionBasedLexer.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; using OneScript.Language.SyntaxAnalysis; namespace OneScript.Language.LexicalAnalysis diff --git a/src/OneScript.Language/Sources/ICodeSource.cs b/src/OneScript.Language/Sources/ICodeSource.cs index 85daedf08..27db60fad 100644 --- a/src/OneScript.Language/Sources/ICodeSource.cs +++ b/src/OneScript.Language/Sources/ICodeSource.cs @@ -5,7 +5,7 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -namespace OneScript.Sources +namespace OneScript.Language.Sources { public interface ICodeSource { diff --git a/src/OneScript.Language/Sources/SourceCode.cs b/src/OneScript.Language/Sources/SourceCode.cs index 76ab858aa..48c10007f 100644 --- a/src/OneScript.Language/Sources/SourceCode.cs +++ b/src/OneScript.Language/Sources/SourceCode.cs @@ -6,6 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using OneScript.Language.LexicalAnalysis; +using OneScript.Language.Sources; // ReSharper disable once CheckNamespace namespace OneScript.Sources @@ -17,10 +18,11 @@ public class SourceCode : ISourceCodeIndexer private string _code = null; - internal SourceCode(string sourceName, ICodeSource source) + internal SourceCode(string sourceName, ICodeSource source, string ownerPackageId = null) { _source = source; Name = sourceName; + OwnerPackageId = ownerPackageId; } public SourceCodeIterator CreateIterator() @@ -34,6 +36,11 @@ public SourceCodeIterator CreateIterator() public string Location => _source.Location; public string Name { get; } + + /// + /// Идентификатор пакета-владельца. null если модуль не принадлежит библиотеке. + /// + public string OwnerPackageId { get; } public string GetSourceCode() { @@ -49,4 +56,4 @@ public string GetCodeLine(int lineNumber) public override string ToString() => Name ?? Location; } -} \ No newline at end of file +} diff --git a/src/OneScript.Language/Sources/SourceCodeBuilder.cs b/src/OneScript.Language/Sources/SourceCodeBuilder.cs index 547d1aa42..fa307c2d1 100644 --- a/src/OneScript.Language/Sources/SourceCodeBuilder.cs +++ b/src/OneScript.Language/Sources/SourceCodeBuilder.cs @@ -6,6 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using OneScript.Language.Sources; // ReSharper disable once CheckNamespace namespace OneScript.Sources @@ -14,6 +15,7 @@ public class SourceCodeBuilder { private ICodeSource _source; private string _moduleName; + private string _ownerPackageId; private SourceCodeBuilder() { @@ -30,6 +32,15 @@ public SourceCodeBuilder WithName(string name) _moduleName = name; return this; } + + /// + /// Устанавливает идентификатор пакета-владельца для исходного кода. + /// + public SourceCodeBuilder WithOwnerPackage(string packageId) + { + _ownerPackageId = packageId; + return this; + } public SourceCode Build() { @@ -39,9 +50,9 @@ public SourceCode Build() if (_moduleName == default) _moduleName = _source.Location; - return new SourceCode(_moduleName, _source); + return new SourceCode(_moduleName, _source, _ownerPackageId); } public static SourceCodeBuilder Create() => new SourceCodeBuilder(); } -} \ No newline at end of file +} diff --git a/src/OneScript.Native/Compiler/ExpressionHelpers.cs b/src/OneScript.Native/Compiler/ExpressionHelpers.cs index 545656748..8ed0f479e 100644 --- a/src/OneScript.Native/Compiler/ExpressionHelpers.cs +++ b/src/OneScript.Native/Compiler/ExpressionHelpers.cs @@ -12,10 +12,8 @@ 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; @@ -597,13 +595,18 @@ public static Expression CallOfInstanceMethod(Expression instance, string name, public static Expression AccessModuleVariable(ParameterExpression thisArg, int variableIndex) { - var stateProperty = PropertiesCache.GetOrAdd( + var contextProperty = PropertiesCache.GetOrAdd( typeof(NativeClassInstanceWrapper), - nameof(NativeClassInstanceWrapper.State), + nameof(NativeClassInstanceWrapper.Context), BindingFlags.Instance | BindingFlags.Public); - var propertyAccess = Expression.Property(thisArg, stateProperty); - var iVariable = Expression.ArrayIndex(propertyAccess, Expression.Constant(variableIndex)); + var contextAccess = Expression.Property(thisArg, contextProperty); + var getVariableMethod = OperationsCache.GetOrAdd( + typeof(IAttachableContext), + nameof(IAttachableContext.GetVariable), + BindingFlags.Instance | BindingFlags.Public); + + var iVariable = Expression.Call(contextAccess, getVariableMethod, Expression.Constant(variableIndex)); var valueProperty = PropertiesCache.GetOrAdd( typeof(IValueReference), nameof(IValueReference.BslValue), diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index 149629455..3237a29f7 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -99,7 +99,7 @@ private void CompileFragment(BslSyntaxNode node, Action visitor) { MethodReturn = Expression.Label(typeof(BslValue)) }); - Symbols.PushScope(new SymbolScope(), null); + Symbols.PushScope(new SymbolScope(), ScopeBindingDescriptor.ThisScope()); FillParameterVariables(); try @@ -245,7 +245,8 @@ protected override void VisitVariableRead(TerminalNode node) } else if (symbol is IPropertySymbol prop) { - var expression = ReadGlobalProperty(Symbols.GetBinding(binding.ScopeNumber), prop); + var descriptor = Symbols.GetBinding(binding.ScopeNumber); + var expression = ReadGlobalProperty((IRuntimeContextInstance)descriptor.Target, prop); _statementBuildParts.Push(expression); } else if (symbol is IFieldSymbol && _method.IsInstance) @@ -279,13 +280,13 @@ private Expression ReadGlobalProperty(IRuntimeContextInstance target, IPropertyS private object GetPropertyBinding(SymbolBinding binding, IVariableSymbol symbol) { - return Symbols.GetBinding(binding.ScopeNumber) ?? + return Symbols.GetBinding(binding.ScopeNumber).Target ?? throw new InvalidOperationException($"Property {symbol.Name} is not bound to a value"); } private object GetMethodBinding(SymbolBinding binding, IMethodSymbol symbol) { - return Symbols.GetBinding(binding.ScopeNumber) ?? + return Symbols.GetBinding(binding.ScopeNumber).Target ?? throw new InvalidOperationException($"Method {symbol.Name} is not bound to a value"); } diff --git a/src/OneScript.Native/Compiler/NativeCompilerException.cs b/src/OneScript.Native/Compiler/NativeCompilerException.cs index 534fce904..a5c28e103 100644 --- a/src/OneScript.Native/Compiler/NativeCompilerException.cs +++ b/src/OneScript.Native/Compiler/NativeCompilerException.cs @@ -8,7 +8,6 @@ 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; diff --git a/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs b/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs index 8cdf4ad8c..763c36147 100644 --- a/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs +++ b/src/OneScript.Native/Compiler/NativeRuntimeAnnotationHandler.cs @@ -5,13 +5,9 @@ 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 OneScript.Language; -using OneScript.Language.LexicalAnalysis; using OneScript.Language.SyntaxAnalysis; -using OneScript.Language.SyntaxAnalysis.AstNodes; -using OneScript.Localization; namespace OneScript.Native.Compiler { diff --git a/src/OneScript.Native/Runtime/BuiltInFunctions.cs b/src/OneScript.Native/Runtime/BuiltInFunctions.cs index 1e5d68769..1bb5c2e3f 100644 --- a/src/OneScript.Native/Runtime/BuiltInFunctions.cs +++ b/src/OneScript.Native/Runtime/BuiltInFunctions.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 @@ -178,7 +178,7 @@ public static int ChrCode(string strChar, int? position = null) [MethodImpl(MethodImplOptions.AggressiveInlining)] [ContextMethod("СтрЗаменить", "StrReplace")] public static string StrReplace(string sourceString, string searchVal, string newVal) => - sourceString.Replace(searchVal, newVal); + !string.IsNullOrEmpty(searchVal) ? sourceString.Replace(searchVal, newVal):sourceString; [ContextMethod("СтрПолучитьСтроку", "StrGetLine")] public static string StrGetLine(string strArg, int lineNumber) diff --git a/src/OneScript.Native/Runtime/CallableMethod.cs b/src/OneScript.Native/Runtime/CallableMethod.cs index ce0bb1f7e..f61237aad 100644 --- a/src/OneScript.Native/Runtime/CallableMethod.cs +++ b/src/OneScript.Native/Runtime/CallableMethod.cs @@ -60,13 +60,9 @@ private NativeClassInstanceWrapper GetCallableWrapper(object obj) } else if (obj is IAttachableContext context) { - context.OnAttach(out var state, out var methods); - callableWrapper = new NativeClassInstanceWrapper { - Context = context, - State = state, - Methods = methods + Context = context }; } else diff --git a/src/OneScript.Native/Runtime/DynamicOperations.cs b/src/OneScript.Native/Runtime/DynamicOperations.cs index f4b2ca8fb..4cfc523a0 100644 --- a/src/OneScript.Native/Runtime/DynamicOperations.cs +++ b/src/OneScript.Native/Runtime/DynamicOperations.cs @@ -12,7 +12,6 @@ This Source Code Form is subject to the terms of the using OneScript.DependencyInjection; using OneScript.Exceptions; using OneScript.Execution; -using OneScript.Language; using OneScript.Localization; using OneScript.Types; using OneScript.Values; diff --git a/src/OneScript.Native/Runtime/NativeClassInstanceWrapper.cs b/src/OneScript.Native/Runtime/NativeClassInstanceWrapper.cs index ab1ad2657..4a69fef6e 100644 --- a/src/OneScript.Native/Runtime/NativeClassInstanceWrapper.cs +++ b/src/OneScript.Native/Runtime/NativeClassInstanceWrapper.cs @@ -4,16 +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; using OneScript.Contexts; namespace OneScript.Native.Runtime { + /// + /// Этот класс можно удалить, заменив все обращения к нему на IAttachableContext + /// + [Obsolete("This class can be removed, replace all usages with IAttachableContext")] internal class NativeClassInstanceWrapper { public IAttachableContext Context { get; set; } - - public IVariable[] State { get; set; } - - public BslMethodInfo[] Methods { get; set; } } } diff --git a/src/OneScript.StandardLibrary/Binary/BinaryDataContext.cs b/src/OneScript.StandardLibrary/Binary/BinaryDataContext.cs index 3b68dcd3d..e56d15ed3 100644 --- a/src/OneScript.StandardLibrary/Binary/BinaryDataContext.cs +++ b/src/OneScript.StandardLibrary/Binary/BinaryDataContext.cs @@ -11,7 +11,6 @@ This Source Code Form is subject to the terms of the using System.Text; using OneScript.Contexts; using OneScript.Exceptions; -using OneScript.Execution; using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/Binary/FileBackingStream.cs b/src/OneScript.StandardLibrary/Binary/FileBackingStream.cs index 87b3718e2..7a0502643 100644 --- a/src/OneScript.StandardLibrary/Binary/FileBackingStream.cs +++ b/src/OneScript.StandardLibrary/Binary/FileBackingStream.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System; using System.IO; -using ScriptEngine; namespace OneScript.StandardLibrary.Binary { diff --git a/src/OneScript.StandardLibrary/Binary/FileStreamContext.cs b/src/OneScript.StandardLibrary/Binary/FileStreamContext.cs index 4d5e34713..6386898a6 100644 --- a/src/OneScript.StandardLibrary/Binary/FileStreamContext.cs +++ b/src/OneScript.StandardLibrary/Binary/FileStreamContext.cs @@ -8,9 +8,7 @@ This Source Code Form is subject to the terms of the using System; using System.IO; using OneScript.Contexts; -using OneScript.Exceptions; using OneScript.Types; -using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Binary/FileStreamsManager.cs b/src/OneScript.StandardLibrary/Binary/FileStreamsManager.cs index a474c17b0..ca2729029 100644 --- a/src/OneScript.StandardLibrary/Binary/FileStreamsManager.cs +++ b/src/OneScript.StandardLibrary/Binary/FileStreamsManager.cs @@ -9,7 +9,6 @@ This Source Code Form is subject to the terms of the using System.IO; using OneScript.Contexts; using OneScript.Exceptions; -using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Binary/GlobalBinaryData.cs b/src/OneScript.StandardLibrary/Binary/GlobalBinaryData.cs index c1033cfaf..f5f34141a 100644 --- a/src/OneScript.StandardLibrary/Binary/GlobalBinaryData.cs +++ b/src/OneScript.StandardLibrary/Binary/GlobalBinaryData.cs @@ -158,7 +158,7 @@ public static IAttachableContext CreateInstance() /// /// Массив объектов типа ДвоичныеДанные. /// Тип: ДвоичныеДанные. - [ContextMethod("ConcatenateBinaryData", IsDeprecated = true)] + [DeprecatedName("ConcatenateBinaryData")] [ContextMethod("СоединитьДвоичныеДанные", "ConcatBinaryData")] public BinaryDataContext ConcatBinaryData(ArrayImpl array) { diff --git a/src/OneScript.StandardLibrary/Binary/StreamEnums.cs b/src/OneScript.StandardLibrary/Binary/StreamEnums.cs index 07bf24a5d..6af701493 100644 --- a/src/OneScript.StandardLibrary/Binary/StreamEnums.cs +++ b/src/OneScript.StandardLibrary/Binary/StreamEnums.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.Contexts.Enums; namespace OneScript.StandardLibrary.Binary @@ -37,7 +38,8 @@ public enum FileAccessEnum ReadAndWrite } - [EnumerationType("ПозицияВПотоке", "StreamPosition")] + [DeprecatedName("StreamPosition")] + [EnumerationType("ПозицияВПотоке", "PositionInStream")] public enum StreamPositionEnum { [EnumValue("Начало", "Begin")] diff --git a/src/OneScript.StandardLibrary/Collections/Exceptions/ColumnException.cs b/src/OneScript.StandardLibrary/Collections/Exceptions/ColumnException.cs new file mode 100644 index 000000000..7867f1015 --- /dev/null +++ b/src/OneScript.StandardLibrary/Collections/Exceptions/ColumnException.cs @@ -0,0 +1,54 @@ +/*---------------------------------------------------------- +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.Exceptions; +using OneScript.Localization; + +namespace OneScript.StandardLibrary.Collections.Exceptions +{ + public class ColumnException : RuntimeException + { + public ColumnException(BilingualString message, Exception innerException) : base(message, + innerException) + { + } + + public ColumnException(BilingualString message) : base(message) + { + } + + public static ColumnException WrongColumnName() + { + return new ColumnException(new BilingualString( + "Неверное имя колонки", + "Wrong column name")); + } + + public static ColumnException WrongColumnName(string columnName) + { + return new ColumnException(new BilingualString( + $"Неверное имя колонки '{columnName}'", + $"Wrong column name '{columnName}'")); + } + + public static ColumnException DuplicatedColumnName(string columnName) + { + return new ColumnException(new BilingualString( + $"Колонка '{columnName}' уже есть", + $"Column '{columnName}' already exists")); + } + + + public static ColumnException ColumnsMixed(string columnName) + { + return new ColumnException(new BilingualString( + $"Колонка '{columnName}' не может одновременно быть колонкой группировки и колонкой суммирования", + $"Column '{columnName}' cannot be both grouping column and summation column")); + } + + } +} \ No newline at end of file diff --git a/src/OneScript.StandardLibrary/Collections/Indexes/CollectionIndex.cs b/src/OneScript.StandardLibrary/Collections/Indexes/CollectionIndex.cs index 4abd8101e..7e6d7d977 100644 --- a/src/OneScript.StandardLibrary/Collections/Indexes/CollectionIndex.cs +++ b/src/OneScript.StandardLibrary/Collections/Indexes/CollectionIndex.cs @@ -5,18 +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.Text; -using OneScript.Commons; using OneScript.Contexts; using OneScript.Exceptions; -using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; -using ScriptEngine.Types; namespace OneScript.StandardLibrary.Collections.Indexes { diff --git a/src/OneScript.StandardLibrary/Collections/KeyAndValueImpl.cs b/src/OneScript.StandardLibrary/Collections/KeyAndValueImpl.cs index 3f9e0a3a7..c3390eaad 100644 --- a/src/OneScript.StandardLibrary/Collections/KeyAndValueImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/KeyAndValueImpl.cs @@ -7,11 +7,9 @@ This Source Code Form is subject to the terms of the using System.Diagnostics; using OneScript.Contexts; -using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; -using ScriptEngine.Types; namespace OneScript.StandardLibrary.Collections { diff --git a/src/OneScript.StandardLibrary/Collections/MapImpl.cs b/src/OneScript.StandardLibrary/Collections/MapImpl.cs index ea8ef9ada..0166a9f1e 100644 --- a/src/OneScript.StandardLibrary/Collections/MapImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/MapImpl.cs @@ -7,8 +7,6 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using OneScript.Contexts; -using OneScript.Exceptions; -using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/MapWrapper.cs b/src/OneScript.StandardLibrary/Collections/MapWrapper.cs index 944f091ca..814007714 100644 --- a/src/OneScript.StandardLibrary/Collections/MapWrapper.cs +++ b/src/OneScript.StandardLibrary/Collections/MapWrapper.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; using System.Collections.Generic; using System.Linq; using OneScript.Contexts; diff --git a/src/OneScript.StandardLibrary/Collections/StructureImpl.cs b/src/OneScript.StandardLibrary/Collections/StructureImpl.cs index 58f769e30..e3e8a4be4 100644 --- a/src/OneScript.StandardLibrary/Collections/StructureImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/StructureImpl.cs @@ -150,17 +150,6 @@ public override string GetPropName(int propNum) return GetPropertyName(propNum); } - public override BslPropertyInfo GetPropertyInfo(int propNum) - { - return BslPropertyBuilder.Create() - .Name(GetPropName(propNum)) - .CanRead(true) - .CanWrite(true) - .ReturnType(_values[propNum].GetType()) - .DeclaringType(GetType()) - .Build(); - } - public override BslMethodInfo GetMethodInfo(int methodNumber) { return _methods.GetRuntimeMethod(methodNumber); diff --git a/src/OneScript.StandardLibrary/Collections/ValueList/ValueListItem.cs b/src/OneScript.StandardLibrary/Collections/ValueList/ValueListItem.cs index 7053978c1..c015ee277 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueList/ValueListItem.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueList/ValueListItem.cs @@ -28,53 +28,26 @@ public ValueListItem() } [ContextProperty("Значение", "Value")] - public IValue Value - { - get; - set; - } + public IValue Value { get; set; } [ContextProperty("Представление", "Presentation")] public string Presentation { - get - { - return _presentationHolder; - } - set - { - if (value == null) - _presentationHolder = String.Empty; - else - _presentationHolder = value; - } + get => _presentationHolder; + set => _presentationHolder = value ?? String.Empty; } [ContextProperty("Пометка", "Check")] - public bool Check - { - get; - set; - } + public bool Check { get; set; } [ContextProperty("Картинка", "Picture")] public IValue Picture - { - get - { - return _pictureHolder; - } - set - { - if(value != null) - { - _pictureHolder = value; - } - else - { - _pictureHolder = ValueFactory.Create(); - } - } + { + get => _pictureHolder; + set => _pictureHolder = value ?? ValueFactory.Create(); } + + public override string ToString() + => !String.IsNullOrEmpty(_presentationHolder) ? _presentationHolder : Value.ToString(); } } diff --git a/src/OneScript.StandardLibrary/Collections/ValueTable/CollectionIndexes.cs b/src/OneScript.StandardLibrary/Collections/ValueTable/CollectionIndexes.cs index 1167a76ff..371126d77 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTable/CollectionIndexes.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTable/CollectionIndexes.cs @@ -5,17 +5,15 @@ 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.Exceptions; +using OneScript.StandardLibrary.Collections.Exceptions; using OneScript.StandardLibrary.Collections.Indexes; -using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; -using ScriptEngine.Types; namespace OneScript.StandardLibrary.Collections.ValueTable { @@ -143,7 +141,7 @@ private static IList BuildFieldList(IIndexCollectionSource source, strin var field = source.GetField(fieldName.Trim()); if (field == null) { - throw new ColumnNotFoundException(fieldName); + throw ColumnException.WrongColumnName(fieldName); } fields.Add(field); } diff --git a/src/OneScript.StandardLibrary/Collections/ValueTable/ColumnNotFoundException.cs b/src/OneScript.StandardLibrary/Collections/ValueTable/ColumnNotFoundException.cs deleted file mode 100644 index 84d11bffe..000000000 --- a/src/OneScript.StandardLibrary/Collections/ValueTable/ColumnNotFoundException.cs +++ /dev/null @@ -1,29 +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.Exceptions; -using OneScript.Localization; - -namespace OneScript.StandardLibrary.Collections.ValueTable -{ - public class ColumnNotFoundException : RuntimeException - { - public ColumnNotFoundException(BilingualString message, Exception innerException) : base(message, - innerException) - { - } - - public ColumnNotFoundException(BilingualString message) : base(message) - { - } - - public ColumnNotFoundException(string columnName) : base($"Неверное имя колонки {columnName}") - { - } - - } -} \ No newline at end of file diff --git a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs index c891bb429..5c59332c9 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs @@ -16,6 +16,7 @@ This Source Code Form is subject to the terms of the using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; +using OneScript.StandardLibrary.Collections.Exceptions; namespace OneScript.StandardLibrary.Collections.ValueTable { @@ -166,7 +167,7 @@ private List GetProcessingColumnList(string ColumnNames, bool var Column = Columns.FindColumnByName(name); if (Column == null) - throw WrongColumnNameException(name); + throw ColumnException.WrongColumnName(name); if (processing_list.Find( x=> x.Name==name ) == null) processing_list.Add(Column); @@ -271,7 +272,7 @@ private bool CheckFilterCriteria(ValueTableRow Row, StructureImpl Filter) { var Column = Columns.FindColumnByName(kv.Key.ToString()); if (Column == null) - throw WrongColumnNameException(kv.Key.ToString()); + throw ColumnException.WrongColumnName(kv.Key.ToString()); IValue current = Row.Get(Column); if (!current.StrictEquals(kv.Value)) @@ -374,7 +375,7 @@ public void GroupBy(IBslProcess process, string groupColumnNames, string aggrega } } - _rows.RemoveRange(new_idx, _rows.Count()-new_idx); + _rows.RemoveRange(new_idx, _rows.Count - new_idx); int i = 0; while (i < Columns.Count()) @@ -391,7 +392,7 @@ private static void CheckMixedColumns(List groupColumns, List< { foreach (var groupColumn in groupColumns ) if ( aggregateColumns.Find(x => x.Name==groupColumn.Name)!=null ) - throw ColumnsMixedException(groupColumn.Name); + throw ColumnException.ColumnsMixed(groupColumn.Name); } private static void CopyRowData(ValueTableRow source, ValueTableRow dest, IEnumerable columns) @@ -467,7 +468,7 @@ private int IndexByValue(BslValue item) throw RuntimeException.InvalidArgumentType(); } - if (index < 0 || index >= _rows.Count()) + if (index < 0 || index >= _rows.Count) throw new RuntimeException("Значение индекса выходит за пределы диапазона"); } @@ -489,7 +490,7 @@ public void Move(BslValue row, int offset) int index_dest = index_source + offset; - if (index_dest < 0 || index_dest >= _rows.Count()) + if (index_dest < 0 || index_dest >= _rows.Count) throw RuntimeException.InvalidNthArgumentValue(2); ValueTableRow tmp = _rows[index_source]; @@ -610,13 +611,13 @@ private List GetSortRules(string Columns) foreach (string column in a_columns) { string[] description = column.Trim().Split(' '); - if (description.Count() == 0) - throw WrongColumnNameException(); + if (description.Length == 0) + throw ColumnException.WrongColumnName(); ValueTableSortRule Desc = new ValueTableSortRule(); Desc.Column = this.Columns.FindColumnByName(description[0]); - if (description.Count() > 1) + if (description.Length > 1) { if (String.Compare(description[1], "DESC", true) == 0 || String.Compare(description[1], "УБЫВ", true) == 0) Desc.direction = -1; @@ -636,14 +637,15 @@ private class RowComparator : IComparer { readonly List Rules; - readonly GenericIValueComparer _comparer = new GenericIValueComparer(); + readonly GenericIValueComparer _comparer; - public RowComparator(List Rules) + public RowComparator(IBslProcess process, List Rules) { - if (Rules.Count() == 0) + if (Rules.Count == 0) throw RuntimeException.InvalidArgumentValue(); this.Rules = Rules; + _comparer = new GenericIValueComparer(process); } private int OneCompare(ValueTableRow x, ValueTableRow y, ValueTableSortRule Rule) @@ -661,7 +663,7 @@ public int Compare(ValueTableRow x, ValueTableRow y) int i = 0, r; while ((r = OneCompare(x, y, Rules[i])) == 0) { - if (++i >= Rules.Count()) + if (++i >= Rules.Count) return 0; } @@ -678,9 +680,9 @@ public int Compare(ValueTableRow x, ValueTableRow y) /// /// СравнениеЗначений - правила сравнения значений при наличии различных типов данных в колонке. [ContextMethod("Сортировать", "Sort")] - public void Sort(string columns, IValue comparator = null) + public void Sort(IBslProcess process, string columns, IValue comparator = null) { - _rows.Sort(new RowComparator(GetSortRules(columns))); + _rows.Sort(new RowComparator(process, GetSortRules(columns))); } /// @@ -718,22 +720,6 @@ public static ValueTable Constructor() return new ValueTable(); } - - private static RuntimeException WrongColumnNameException() - { - return new RuntimeException("Неверное имя колонки"); - } - - private static RuntimeException WrongColumnNameException(string columnName) - { - return new RuntimeException(string.Format("Неверное имя колонки '{0}'", columnName)); - } - - private static RuntimeException ColumnsMixedException(string columnName) - { - return new RuntimeException(string.Format("Колонка '{0}' не может одновременно быть колонкой группировки и колонкой суммирования", columnName)); - } - public string GetName(IValue field) { if (field is ValueTableColumn column) diff --git a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumn.cs b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumn.cs index 7af592fd2..a7b5956aa 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumn.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumn.cs @@ -7,11 +7,9 @@ This Source Code Form is subject to the terms of the using System; using OneScript.Contexts; -using OneScript.Exceptions; +using OneScript.StandardLibrary.Collections.Exceptions; using OneScript.StandardLibrary.TypeDescriptions; -using OneScript.Types; using ScriptEngine.Machine.Contexts; -using ScriptEngine.Types; namespace OneScript.StandardLibrary.Collections.ValueTable { @@ -61,7 +59,7 @@ public string Name { ValueTableColumnCollection Owner = _owner.Target as ValueTableColumnCollection; if (Owner.FindColumnByName(value) != null) - throw new RuntimeException("Неверное имя колонки!"); + throw ColumnException.WrongColumnName(); if (_title == _name) _title = value; diff --git a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumnCollection.cs b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumnCollection.cs index 8427df725..aaeb48e78 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumnCollection.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableColumnCollection.cs @@ -12,11 +12,11 @@ This Source Code Form is subject to the terms of the using OneScript.Contexts; using OneScript.Exceptions; using OneScript.Execution; +using OneScript.StandardLibrary.Collections.Exceptions; using OneScript.StandardLibrary.TypeDescriptions; using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; -using ScriptEngine.Types; namespace OneScript.StandardLibrary.Collections.ValueTable { @@ -48,7 +48,7 @@ public ValueTableColumnCollection(ValueTable owner) public ValueTableColumn Add(string name, TypeDescription type = null, string title = null, int width = 0) { if (FindColumnByName(name) != null) - throw new RuntimeException("Неверное имя колонки " + name); + throw ColumnException.DuplicatedColumnName(name); var column = new ValueTableColumn(this, ++maxColumnId, name, title, type, width); _columns.Add(column); @@ -69,7 +69,7 @@ public ValueTableColumn Add(string name, TypeDescription type = null, string tit public ValueTableColumn Insert(int index, string name, TypeDescription type = null, string title = null, int width = 0) { if (FindColumnByName(name) != null) - throw new RuntimeException("Неверное имя колонки " + name); + throw ColumnException.DuplicatedColumnName(name); ValueTableColumn column = new ValueTableColumn(this, ++maxColumnId, name, title, type, width); _columns.Insert(index, column); diff --git a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableRow.cs b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableRow.cs index f12f67a68..fdc10f6ed 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableRow.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTableRow.cs @@ -8,10 +8,8 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using OneScript.Contexts; using OneScript.Execution; -using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; -using ScriptEngine.Types; namespace OneScript.StandardLibrary.Collections.ValueTable { diff --git a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumn.cs b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumn.cs index 8e322af3d..201f5187b 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumn.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumn.cs @@ -6,11 +6,9 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using OneScript.Contexts; -using OneScript.Exceptions; +using OneScript.StandardLibrary.Collections.Exceptions; using OneScript.StandardLibrary.TypeDescriptions; -using OneScript.Types; using ScriptEngine.Machine.Contexts; -using ScriptEngine.Types; namespace OneScript.StandardLibrary.Collections.ValueTree { @@ -60,7 +58,7 @@ public string Name set { if (_owner.FindColumnByName(value) != null) - throw new RuntimeException("Неверное имя колонки!"); + throw ColumnException.WrongColumnName(); if (_title == _name) _title = value; diff --git a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumnCollection.cs b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumnCollection.cs index 6697844cf..fcb66fa3c 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumnCollection.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeColumnCollection.cs @@ -11,12 +11,12 @@ This Source Code Form is subject to the terms of the using OneScript.Contexts; using OneScript.Exceptions; using OneScript.Execution; +using OneScript.StandardLibrary.Collections.Exceptions; using OneScript.StandardLibrary.TypeDescriptions; using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; -using ScriptEngine.Types; namespace OneScript.StandardLibrary.Collections.ValueTree { @@ -40,7 +40,7 @@ public class ValueTreeColumnCollection : AutoContext, public ValueTreeColumn Add(string name, TypeDescription type = null, string title = null, int width = 0) { if (FindColumnByName(name) != null) - throw new RuntimeException("Неверное имя колонки " + name); + throw ColumnException.DuplicatedColumnName(name); ValueTreeColumn column = new ValueTreeColumn(this, name, title, type, width); _columns.Add(column); @@ -61,7 +61,7 @@ public ValueTreeColumn Add(string name, TypeDescription type = null, string titl public ValueTreeColumn Insert(int index, string name, TypeDescription type = null, string title = null, int width = 0) { if (FindColumnByName(name) != null) - throw new RuntimeException("Неверное имя колонки " + name); + throw ColumnException.DuplicatedColumnName(name); ValueTreeColumn column = new ValueTreeColumn(this, name, title, type, width); _columns.Insert(index, column); diff --git a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRow.cs b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRow.cs index 9963b6e1b..0d8eccd6a 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRow.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRow.cs @@ -9,11 +9,9 @@ This Source Code Form is subject to the terms of the using OneScript.Contexts; using OneScript.Exceptions; using OneScript.Execution; -using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; -using ScriptEngine.Types; namespace OneScript.StandardLibrary.Collections.ValueTree { diff --git a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs index a980670ba..10a1c8259 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs @@ -7,14 +7,14 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; -using System.Linq; using OneScript.Contexts; using OneScript.Exceptions; +using OneScript.Execution; +using OneScript.StandardLibrary.Collections.Exceptions; using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; -using ScriptEngine.Types; namespace OneScript.StandardLibrary.Collections.ValueTree { @@ -72,7 +72,7 @@ public ValueTree Owner() [ContextMethod("Количество", "Count")] public override int Count() { - return _rows.Count(); + return _rows.Count; } /// @@ -323,12 +323,12 @@ public void Move(BslValue row, int offset) else throw RuntimeException.InvalidArgumentType(); - if (indexSource < 0 || indexSource >= _rows.Count()) + if (indexSource < 0 || indexSource >= _rows.Count) throw RuntimeException.InvalidArgumentValue(); - int indexDestination = (indexSource + offset) % _rows.Count(); + int indexDestination = (indexSource + offset) % _rows.Count; while (indexDestination < 0) - indexDestination += _rows.Count(); + indexDestination += _rows.Count; ValueTreeRow tmp = _rows[indexSource]; @@ -361,15 +361,15 @@ private List GetSortRules(string columns) foreach (string column in aColumns) { string[] description = column.Trim().Split(' '); - if (description.Count() == 0) - throw PropertyAccessException.PropNotFoundException(""); // TODO: WrongColumnNameException + if (description.Length == 0) + throw ColumnException.WrongColumnName(); ValueTreeSortRule desc = new ValueTreeSortRule(); desc.Column = this.Columns.FindColumnByName(description[0]); if (desc.Column == null) - throw PropertyAccessException.PropNotFoundException(description[0]); + throw ColumnException.WrongColumnName(description[0]); - if (description.Count() > 1) + if (description.Length > 1) { if (String.Compare(description[1], "DESC", true) == 0 || String.Compare(description[1], "УБЫВ", true) == 0) desc.direction = -1; @@ -389,14 +389,15 @@ private class RowComparator : IComparer { readonly List _rules; - readonly GenericIValueComparer _comparer = new GenericIValueComparer(); + readonly GenericIValueComparer _comparer; - public RowComparator(List rules) + public RowComparator(IBslProcess process, List rules) { - if (rules.Count() == 0) + if (rules.Count == 0) throw RuntimeException.InvalidArgumentValue(); this._rules = rules; + _comparer = new GenericIValueComparer(process); } private int OneCompare(ValueTreeRow x, ValueTreeRow y, ValueTreeSortRule rule) @@ -414,7 +415,7 @@ public int Compare(ValueTreeRow x, ValueTreeRow y) int i = 0, r; while ((r = OneCompare(x, y, _rules[i])) == 0) { - if (++i >= _rules.Count()) + if (++i >= _rules.Count) return 0; } @@ -430,12 +431,12 @@ public int Compare(ValueTreeRow x, ValueTreeRow y) /// Булево. Если Истина, сортировка будет применена также к вложенным строкам. /// СравнениеЗначений. Не используется. [ContextMethod("Сортировать", "Sort")] - public void Sort(string columns, bool sortChildren = false, IValue comparator = null) + public void Sort(IBslProcess process, string columns, bool sortChildren = false, IValue comparator = null) { - Sort(new RowComparator(GetSortRules(columns)), sortChildren); + Sort(process, new RowComparator(process, GetSortRules(columns)), sortChildren); } - private void Sort(RowComparator comparator, bool sortChildren) + private void Sort(IBslProcess process, RowComparator comparator, bool sortChildren) { _rows.Sort(comparator); @@ -443,7 +444,7 @@ private void Sort(RowComparator comparator, bool sortChildren) { foreach (var row in _rows) { - row.Rows.Sort(comparator, sortChildren); + row.Rows.Sort(process, comparator, sortChildren); } } } @@ -486,6 +487,6 @@ public override IEnumerator GetEnumerator() public override IValue GetIndexedValue(IValue index) { return Get((int)index.AsNumber()); - } + } } } diff --git a/src/OneScript.StandardLibrary/DriveInfo/DriveTypeEnum.cs b/src/OneScript.StandardLibrary/DriveInfo/DriveTypeEnum.cs index 44d5a73e3..f8320c1e7 100644 --- a/src/OneScript.StandardLibrary/DriveInfo/DriveTypeEnum.cs +++ b/src/OneScript.StandardLibrary/DriveInfo/DriveTypeEnum.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using OneScript.Contexts.Enums; using OneScript.Types; -using OneScript.Values; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.DriveInfo diff --git a/src/OneScript.StandardLibrary/FileContext.cs b/src/OneScript.StandardLibrary/FileContext.cs index 67747f3c5..739a5da8a 100644 --- a/src/OneScript.StandardLibrary/FileContext.cs +++ b/src/OneScript.StandardLibrary/FileContext.cs @@ -8,7 +8,6 @@ This Source Code Form is subject to the terms of the using System; using System.IO; using OneScript.Contexts; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary @@ -111,7 +110,7 @@ public string Extension } } - [ContextMethod("Exist", IsDeprecated = true)] + [DeprecatedName("Exist")] [ContextMethod("Существует","Exists")] public bool Exists() { diff --git a/src/OneScript.StandardLibrary/GuidWrapper.cs b/src/OneScript.StandardLibrary/GuidWrapper.cs index 5054a0640..346e53c0d 100644 --- a/src/OneScript.StandardLibrary/GuidWrapper.cs +++ b/src/OneScript.StandardLibrary/GuidWrapper.cs @@ -12,7 +12,6 @@ This Source Code Form is subject to the terms of the using OneScript.Exceptions; using OneScript.Types; using OneScript.Values; -using ScriptEngine.Machine; using ScriptEngine.Types; namespace OneScript.StandardLibrary @@ -62,7 +61,7 @@ public override int CompareTo(BslValue other) { GuidWrapper otherUuid = other.GetRawValue() as GuidWrapper; if (otherUuid == null) - throw RuntimeException.ComparisonNotSupportedException(); + throw ComparisonException.NotSupported(); return _value.CompareTo(otherUuid._value); } diff --git a/src/OneScript.StandardLibrary/Http/HttpRequestBodyBinary.cs b/src/OneScript.StandardLibrary/Http/HttpRequestBodyBinary.cs index 4f0775050..0057e2b79 100644 --- a/src/OneScript.StandardLibrary/Http/HttpRequestBodyBinary.cs +++ b/src/OneScript.StandardLibrary/Http/HttpRequestBodyBinary.cs @@ -5,15 +5,12 @@ 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.IO; -using System.Linq; using System.Text; using OneScript.StandardLibrary.Binary; using OneScript.StandardLibrary.Text; using OneScript.Types; -using OneScript.Values; using ScriptEngine.Machine; namespace OneScript.StandardLibrary.Http diff --git a/src/OneScript.StandardLibrary/Http/HttpRequestContext.cs b/src/OneScript.StandardLibrary/Http/HttpRequestContext.cs index a18a8c6c9..d28946b1a 100644 --- a/src/OneScript.StandardLibrary/Http/HttpRequestContext.cs +++ b/src/OneScript.StandardLibrary/Http/HttpRequestContext.cs @@ -76,14 +76,14 @@ public IValue GetBodyFileName() /// Установить тело запроса из объекта ДвоичныеДанные /// /// - [ContextMethod("SetBodyFromBinary", IsDeprecated = true)] + [DeprecatedName("SetBodyFromBinary")] [ContextMethod("УстановитьТелоИзДвоичныхДанных", "SetBodyFromBinaryData")] public void SetBodyFromBinary(BinaryDataContext data) { SetBody(new HttpRequestBodyBinary(data)); } - [ContextMethod("GetBodyAsBinary", IsDeprecated = true)] + [DeprecatedName("GetBodyAsBinary")] [ContextMethod("ПолучитьТелоКакДвоичныеДанные", "GetBodyAsBinaryData")] public IValue GetBodyFromBinary() { diff --git a/src/OneScript.StandardLibrary/Http/InternetProxyContext.cs b/src/OneScript.StandardLibrary/Http/InternetProxyContext.cs index 9eb8532b3..5e3d71207 100644 --- a/src/OneScript.StandardLibrary/Http/InternetProxyContext.cs +++ b/src/OneScript.StandardLibrary/Http/InternetProxyContext.cs @@ -11,7 +11,6 @@ This Source Code Form is subject to the terms of the using System.Net; using OneScript.Contexts; using OneScript.Exceptions; -using OneScript.Execution; using OneScript.StandardLibrary.Collections; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Json/JSONReader.cs b/src/OneScript.StandardLibrary/Json/JSONReader.cs index ceb97f317..444907ee2 100644 --- a/src/OneScript.StandardLibrary/Json/JSONReader.cs +++ b/src/OneScript.StandardLibrary/Json/JSONReader.cs @@ -12,7 +12,6 @@ This Source Code Form is subject to the terms of the using OneScript.Contexts; using OneScript.Exceptions; using OneScript.StandardLibrary.Text; -using ScriptEngine; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Json/JSONWriterSettings.cs b/src/OneScript.StandardLibrary/Json/JSONWriterSettings.cs index a517b247d..ba7825f2d 100644 --- a/src/OneScript.StandardLibrary/Json/JSONWriterSettings.cs +++ b/src/OneScript.StandardLibrary/Json/JSONWriterSettings.cs @@ -6,8 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using OneScript.Contexts; -using OneScript.Values; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.Json diff --git a/src/OneScript.StandardLibrary/Net/TCPClient.cs b/src/OneScript.StandardLibrary/Net/TCPClient.cs index 772678eb8..c979b64a5 100644 --- a/src/OneScript.StandardLibrary/Net/TCPClient.cs +++ b/src/OneScript.StandardLibrary/Net/TCPClient.cs @@ -11,7 +11,6 @@ This Source Code Form is subject to the terms of the using System.Text; using OneScript.Contexts; using OneScript.StandardLibrary.Binary; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.Net diff --git a/src/OneScript.StandardLibrary/Processes/ProcessOutputWrapper.cs b/src/OneScript.StandardLibrary/Processes/ProcessOutputWrapper.cs index db67e18be..afcd9800a 100644 --- a/src/OneScript.StandardLibrary/Processes/ProcessOutputWrapper.cs +++ b/src/OneScript.StandardLibrary/Processes/ProcessOutputWrapper.cs @@ -8,7 +8,6 @@ This Source Code Form is subject to the terms of the using System; using System.IO; using System.Text; -using System.Threading; using sys = System.Diagnostics; namespace OneScript.StandardLibrary.Processes diff --git a/src/OneScript.StandardLibrary/StringOperations.cs b/src/OneScript.StandardLibrary/StringOperations.cs index 60d8329fb..e8ad41f5e 100644 --- a/src/OneScript.StandardLibrary/StringOperations.cs +++ b/src/OneScript.StandardLibrary/StringOperations.cs @@ -13,7 +13,6 @@ This Source Code Form is subject to the terms of the using OneScript.Exceptions; using OneScript.Execution; using OneScript.StandardLibrary.Collections; -using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Text/ConsoleColorEnum.cs b/src/OneScript.StandardLibrary/Text/ConsoleColorEnum.cs index dc0cf548d..5a6101f00 100644 --- a/src/OneScript.StandardLibrary/Text/ConsoleColorEnum.cs +++ b/src/OneScript.StandardLibrary/Text/ConsoleColorEnum.cs @@ -8,7 +8,6 @@ This Source Code Form is subject to the terms of the using System; using OneScript.Contexts.Enums; using OneScript.Types; -using OneScript.Values; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.Text diff --git a/src/OneScript.StandardLibrary/Text/ConsoleProvider.cs b/src/OneScript.StandardLibrary/Text/ConsoleProvider.cs index 4a6503f4a..7dd8ec664 100644 --- a/src/OneScript.StandardLibrary/Text/ConsoleProvider.cs +++ b/src/OneScript.StandardLibrary/Text/ConsoleProvider.cs @@ -7,8 +7,6 @@ This Source Code Form is subject to the terms of the using System; using OneScript.Contexts; -using OneScript.DependencyInjection; -using OneScript.Types; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; @@ -23,13 +21,7 @@ private ConsoleProvider(ExecutionContext executionContext) { _console = new ConsoleContext(executionContext); } - - public override void OnAttach(out IVariable[] variables, out BslMethodInfo[] methods) - { - variables = new [] {Variable.CreateContextPropertyReference(this, 0, GetPropName(0))}; - methods = Array.Empty(); - } - + [ContextProperty("Консоль", "Console")] public ConsoleContext Console => _console; diff --git a/src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs b/src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs index f2c2c524b..aa3839130 100644 --- a/src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs +++ b/src/OneScript.StandardLibrary/Text/TextEncodingEnum.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; using System.Diagnostics; using System.Text; using OneScript.Contexts.Enums; diff --git a/src/OneScript.StandardLibrary/Timezones/TimeZoneConverter.cs b/src/OneScript.StandardLibrary/Timezones/TimeZoneConverter.cs index a2e499341..f5fd0bb58 100644 --- a/src/OneScript.StandardLibrary/Timezones/TimeZoneConverter.cs +++ b/src/OneScript.StandardLibrary/Timezones/TimeZoneConverter.cs @@ -18,51 +18,33 @@ public class TimeZoneConverter public static TimeSpan GetTimespan(string timezone) { - TimeSpan span; - - if (string.IsNullOrEmpty(timezone)) - span = TimeZoneInfo.Local.BaseUtcOffset; - else if (timezone.StartsWith("GMT", StringComparison.InvariantCultureIgnoreCase)) - span = TimeSpanByGMTString(timezone); - else - span = TimeZoneById(timezone).BaseUtcOffset; - - return span; + var tz = ResolveTimeZone(timezone); + return tz.BaseUtcOffset; } public static TimeZoneInfo TimeZoneById(string id) { - return TimeZoneInfo.FindSystemTimeZoneById(id); + return ResolveTimeZone(id); } public static DateTime ToUniversalTime(DateTime dt, string timeZone = null) { - var src = GetTimespan(timeZone); - var dest = TimeZoneInfo.Utc.BaseUtcOffset; - var span = dest.Subtract(src); - return dt.Add(span); + var tz = ResolveTimeZone(timeZone); + var unspecified = DateTime.SpecifyKind(dt, DateTimeKind.Unspecified); + return TimeZoneInfo.ConvertTimeToUtc(unspecified, tz); } public static DateTime ToLocalTime(DateTime dt, string timeZone = null) { - var dest = GetTimespan(timeZone); - var src = TimeZoneInfo.Utc.BaseUtcOffset; - var span = dest.Subtract(src); - return dt.Add(span); + var tz = ResolveTimeZone(timeZone); + var utc = DateTime.SpecifyKind(dt, DateTimeKind.Utc); + return TimeZoneInfo.ConvertTimeFromUtc(utc, tz); } public static int StandardTimeOffset(string timeZone = null, DateTime? dt = null) { - var dest = GetTimespan(timeZone); - - if (dt == null) - dt = DateTime.UtcNow; - - var local = dt.Value.Add(dest); - - var offset = local - dt.Value; - - return (int)offset.TotalSeconds; + var tz = ResolveTimeZone(timeZone); + return (int)tz.BaseUtcOffset.TotalSeconds; } public static IEnumerable GetAvailableTimeZones() @@ -79,15 +61,16 @@ public static string TimeZone() public static string TimeZonePresentation(string timeZone) { TimeSpan offset; - - if(IsGmtString(timeZone)) + if (IsGmtString(timeZone)) + { offset = TimeSpanByGMTString(timeZone); + } else - offset = TimeZoneById(timeZone).BaseUtcOffset; - - var oprt = offset.Hours >= 0 ? "+" : "-"; - var result = $"GMT{oprt}{offset.ToString(@"hh\:mm")}"; - return result; + { + var tz = ResolveTimeZone(timeZone); + offset = tz.BaseUtcOffset; + } + return FormatGmtOffset(offset); } private static TimeSpan TimeSpanByGMTString(string gmtString) @@ -124,9 +107,48 @@ private static TimeSpan TimeSpanByGMTString(string gmtString) private static bool IsGmtString(string zone) { - return zone.StartsWith("GMT", StringComparison.InvariantCultureIgnoreCase); + return !string.IsNullOrEmpty(zone) && zone.StartsWith("GMT", StringComparison.InvariantCultureIgnoreCase); } + private static string FormatGmtOffset(TimeSpan offset) + { + var sign = offset >= TimeSpan.Zero ? "+" : "-"; + var d = offset.Duration(); + return $"GMT{sign}{d.ToString(@"hh\:mm")}"; + } + + private static TimeZoneInfo ResolveTimeZone(string id) + { + if (string.IsNullOrWhiteSpace(id)) + return TimeZoneInfo.Local; + + if (IsGmtString(id)) + { + var offset = TimeSpanByGMTString(id); + var display = FormatGmtOffset(offset); + return TimeZoneInfo.CreateCustomTimeZone(id, offset, display, display); + } + + // Имена таймзон в Windows отличаются от IANA и будут не совпадать + // с поведением 1С, работающей с ICU + // Надо заводить отдельную карту для коротких имен таймзон. + // Как минимум, для EET, CET, WET и может еще чего-то. + // Например, зона "E. Europe Standard Time" работает в .net только на Windows. + // База данных IANA (https://www.iana.org/time-zones) в принципе не содержит этих таймзон, но вероятно + // имеет смысл их поддержать, т.к. в 1С они используются, и GetAvailableTimeZones() их возвращает. + + // TODO: Переписать на нормальное решение + var tzFixes = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + tzFixes.Add("EET", "GMT+02:00"); + tzFixes.Add("CET", "GMT+01:00"); + + if (tzFixes.TryGetValue(id, out var gmtString)) + { + return ResolveTimeZone(gmtString); + } + + return TimeZoneInfo.FindSystemTimeZoneById(id); + } } } diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/BinaryDataQualifiers.cs b/src/OneScript.StandardLibrary/TypeDescriptions/BinaryDataQualifiers.cs index 20fee466d..a426972f2 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/BinaryDataQualifiers.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/BinaryDataQualifiers.cs @@ -8,7 +8,6 @@ This Source Code Form is subject to the terms of the using System; using OneScript.Contexts; using OneScript.Values; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.TypeDescriptions diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/BooleanTypeAdjuster.cs b/src/OneScript.StandardLibrary/TypeDescriptions/BooleanTypeAdjuster.cs index b5d11d68f..4ca274a7c 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/BooleanTypeAdjuster.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/BooleanTypeAdjuster.cs @@ -6,7 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using OneScript.Exceptions; -using OneScript.Execution; using OneScript.Types; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/DateQualifiers.cs b/src/OneScript.StandardLibrary/TypeDescriptions/DateQualifiers.cs index 83f3a68df..822915034 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/DateQualifiers.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/DateQualifiers.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System; using OneScript.Contexts; -using OneScript.Execution; using OneScript.Types; using OneScript.Values; using ScriptEngine.Machine; diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/IValueAdjuster.cs b/src/OneScript.StandardLibrary/TypeDescriptions/IValueAdjuster.cs index a9dc1866e..488eb69df 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/IValueAdjuster.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/IValueAdjuster.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.Execution; using ScriptEngine.Machine; namespace OneScript.StandardLibrary.TypeDescriptions diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/NumberQualifiers.cs b/src/OneScript.StandardLibrary/TypeDescriptions/NumberQualifiers.cs index 10f457b43..1d0dacaa1 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/NumberQualifiers.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/NumberQualifiers.cs @@ -9,7 +9,6 @@ This Source Code Form is subject to the terms of the using OneScript.Commons; using OneScript.Contexts; using OneScript.Exceptions; -using OneScript.Execution; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/StringQualifiers.cs b/src/OneScript.StandardLibrary/TypeDescriptions/StringQualifiers.cs index 32fa4ccde..d7775172a 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/StringQualifiers.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/StringQualifiers.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System; using OneScript.Contexts; -using OneScript.Execution; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs index 172cac221..154e5ee34 100644 --- a/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.cs +++ b/src/OneScript.StandardLibrary/TypeDescriptions/TypeDescription.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; using System.Collections.Generic; -using System.Linq; using OneScript.Contexts; using OneScript.Exceptions; -using OneScript.Execution; using OneScript.StandardLibrary.Collections; 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 f458c8347..6849d999f 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XMLSchemaSet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XMLSchemaSet.cs @@ -12,7 +12,6 @@ This Source Code Form is subject to the terms of the using OneScript.Exceptions; using OneScript.Values; using ScriptEngine; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.XMLSchema.Collections diff --git a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs index 0bdf447f4..7ea606648 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Collections/XSComponentList.cs @@ -11,7 +11,6 @@ This Source Code Form is subject to the terms of the using OneScript.Exceptions; using OneScript.StandardLibrary.XMLSchema.Interfaces; using OneScript.Values; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.XMLSchema.Collections diff --git a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs index a20c209c0..7cc1324af 100644 --- a/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs +++ b/src/OneScript.StandardLibrary/XMLSchema/Objects/XSMaxInclusiveFacet.cs @@ -9,7 +9,6 @@ This Source Code Form is subject to the terms of the 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; diff --git a/src/OneScript.StandardLibrary/Xml/XmlReaderImpl.cs b/src/OneScript.StandardLibrary/Xml/XmlReaderImpl.cs index d2813068d..d560c2b5c 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlReaderImpl.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlReaderImpl.cs @@ -387,6 +387,16 @@ private void V8CompatibleSkip() [ContextMethod("Прочитать", "Read")] public bool Read() + { + var readingDone = ReadInternal(); + if (readingDone && _reader.NodeType == XmlNodeType.XmlDeclaration && _settings.IgnoreXMLDeclaration) + { + readingDone = ReadInternal(); + } + return readingDone; + } + + private bool ReadInternal() { if (_reader == null) return false; @@ -396,6 +406,15 @@ public bool Read() _emptyElemReadState = EmptyElemCompabilityState.EmptyElementRead; return true; } + else if (_reader.NodeType == XmlNodeType.XmlDeclaration || _reader.NodeType == XmlNodeType.DocumentType) + { + var readingDone = _reader.Read(); + while (readingDone && _reader.NodeType == XmlNodeType.Whitespace) + { + readingDone = _reader.Read(); + } + return readingDone; + } else { bool readingDone = _ignoreWSChanged ? ReadWhenStateChanged() : _reader.Read(); diff --git a/src/OneScript.StandardLibrary/Xml/XmlReaderSettingsImpl.cs b/src/OneScript.StandardLibrary/Xml/XmlReaderSettingsImpl.cs index d34cf3f9e..67643b7c4 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlReaderSettingsImpl.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlReaderSettingsImpl.cs @@ -106,6 +106,7 @@ public static XmlReaderSettingsImpl Constructor( IgnoreComments = ignoreComments, IgnoreProcessingInstructions = ignoreDataProcessorInstructions, IgnoreWhitespace = ignoreSpaceCharacters, + DtdProcessing = ignoreDocumentType ? DtdProcessing.Ignore : DtdProcessing.Parse, }; return new XmlReaderSettingsImpl( @@ -128,6 +129,7 @@ public static XmlReaderSettingsImpl Create() IgnoreComments = true, // отличается от конструктора скрипта IgnoreProcessingInstructions = false, IgnoreWhitespace = true, + DtdProcessing = DtdProcessing.Ignore, }; return new XmlReaderSettingsImpl("1.0", context, settings); diff --git a/src/OneScript.StandardLibrary/Xml/XmlValidationTypeEnum.cs b/src/OneScript.StandardLibrary/Xml/XmlValidationTypeEnum.cs index bbe072343..9ddb0fbb9 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlValidationTypeEnum.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlValidationTypeEnum.cs @@ -5,10 +5,8 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System.Collections.Generic; using System.Xml; using OneScript.Contexts.Enums; -using OneScript.StandardLibrary.XMLSchema.Enumerations; using OneScript.Types; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs b/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs index 4a6522d4f..466cd7b16 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs @@ -183,7 +183,110 @@ public void WriteText(string text) [ContextMethod("ЗаписатьТекущий","WriteCurrent")] public void WriteCurrent(XmlReaderImpl reader) { - _writer.WriteNode(reader.GetNativeReader(), false); + var nodeType = reader.NodeType.UnderlyingValue; + switch (nodeType) + { + case XmlNodeType.Element: + CopyElementAndAttributes(reader, this); + break; + case XmlNodeType.XmlDeclaration: + WriteXMLDeclaration(); + break; + case XmlNodeType.DocumentType: + CopyDocumentType(reader, this); + break; + case XmlNodeType.Attribute: + CopyAttribute(reader.Name, reader.Value, reader, this); + break; + case XmlNodeType.EndElement: + WriteEndElement(); + break; + case XmlNodeType.CDATA: + WriteCDATASection(reader.Value); + break; + case XmlNodeType.Text: + WriteText(reader.Value); + break; + case XmlNodeType.Whitespace: + case XmlNodeType.SignificantWhitespace: + WriteText(reader.Value); + break; + case XmlNodeType.Comment: + WriteComment(reader.Value); + break; + case XmlNodeType.EntityReference: + WriteEntityReference(reader.Name); + break; + case XmlNodeType.ProcessingInstruction: + WriteProcessingInstruction(reader.Name, reader.Value); + break; + case XmlNodeType.Entity: + case XmlNodeType.EndEntity: + case XmlNodeType.Document: + case XmlNodeType.DocumentFragment: + case XmlNodeType.Notation: + throw new RuntimeException(new Localization.BilingualString($"Копирование узла {nodeType} не поддерживается")); + default: + break; + } + } + + private static void CopyDocumentType(XmlReaderImpl reader, XmlWriterImpl writer) + { + writer.WriteDocumentType(reader.Name, reader.Value); + } + + private static void CopyElementAndAttributes(XmlReaderImpl reader, XmlWriterImpl writer) + { + writer.WriteStartElement(reader.Name); + var attributeCount = reader.AttributeCount(); + if (attributeCount != 0) + { + for (var attributeIndex = 0; attributeIndex < attributeCount; attributeIndex++) + { + var attributeName = reader.AttributeName(attributeIndex); + var attributeValue = reader.GetAttribute(ValueFactory.Create(attributeIndex)).ExplicitString(); + CopyAttribute(attributeName, attributeValue, reader, writer); + } + } + } + + private static void CopyAttribute(string attributeNameIn, string attributeValue, XmlReaderImpl reader, XmlWriterImpl writer) + { + var splittedName = splitName(attributeNameIn); + if (!string.IsNullOrEmpty(splittedName.prefix)) + { + var readerNsContext = (XmlNamespaceContext)reader.NamespaceContext; + var writerNsContext = (XmlNamespaceContext)writer.NamespaceContext; + if (splittedName.prefix.Equals("xmlns", StringComparison.Ordinal)) + { + writer.WriteNamespaceMapping(splittedName.localName, attributeValue); + return; + } + else + { + var uri = readerNsContext.LookupNamespaceUri(splittedName.prefix); + if (uri is BslStringValue) + { + var value = uri.ExplicitString(); + var currentPrefix = writerNsContext.LookupPrefix(value); + if (!(currentPrefix is BslStringValue && currentPrefix.ExplicitString().Equals(splittedName.prefix, StringComparison.Ordinal))) + { + writer.WriteNamespaceMapping(splittedName.prefix, value); + } + splittedName.prefix = value; + } + } + } + writer.WriteAttribute(splittedName.localName, splittedName.prefix, attributeValue); + } + + private static (string prefix, string localName) splitName(string nameOrLocalName) + { + var parts = nameOrLocalName.Split(':'); + if (parts.Length > 1) return (parts[0], parts[1]); + if (parts[0].Equals("xmlns", StringComparison.Ordinal)) return (parts[0], ""); + return ("", parts[0]); } [ContextMethod("ЗаписатьТипДокумента","WriteDocumentType")] diff --git a/src/OneScript.StandardLibrary/Xml/XmlWriterSettingsImpl.cs b/src/OneScript.StandardLibrary/Xml/XmlWriterSettingsImpl.cs index d9ee16243..d03a76627 100644 --- a/src/OneScript.StandardLibrary/Xml/XmlWriterSettingsImpl.cs +++ b/src/OneScript.StandardLibrary/Xml/XmlWriterSettingsImpl.cs @@ -8,7 +8,6 @@ This Source Code Form is subject to the terms of the using System.Xml; using OneScript.Contexts; using OneScript.StandardLibrary.Text; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.StandardLibrary.Xml diff --git a/src/OneScript.Web.Server/EngineBuilderExtensions.cs b/src/OneScript.Web.Server/EngineBuilderExtensions.cs index adcec2c77..7c9515bb1 100644 --- a/src/OneScript.Web.Server/EngineBuilderExtensions.cs +++ b/src/OneScript.Web.Server/EngineBuilderExtensions.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.StandardLibrary.Collections; using ScriptEngine.Hosting; using ScriptEngine.Machine; diff --git a/src/OneScript.Web.Server/FormCollectionWrapper.cs b/src/OneScript.Web.Server/FormCollectionWrapper.cs index 36535b4e5..f33515468 100644 --- a/src/OneScript.Web.Server/FormCollectionWrapper.cs +++ b/src/OneScript.Web.Server/FormCollectionWrapper.cs @@ -10,7 +10,6 @@ This Source Code Form is subject to the terms of the using ScriptEngine.Machine.Contexts; using OneScript.StandardLibrary.Collections; using System.Collections.Generic; -using OneScript.StandardLibrary.Binary; using Microsoft.Extensions.Primitives; using OneScript.Exceptions; using OneScript.Types; diff --git a/src/OneScript.Web.Server/FormFileCollectionWrapper.cs b/src/OneScript.Web.Server/FormFileCollectionWrapper.cs index 9be6411e7..160d23240 100644 --- a/src/OneScript.Web.Server/FormFileCollectionWrapper.cs +++ b/src/OneScript.Web.Server/FormFileCollectionWrapper.cs @@ -11,7 +11,6 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using OneScript.Exceptions; using OneScript.Values; -using OneScript.StandardLibrary.Collections; using OneScript.Types; namespace OneScript.Web.Server diff --git a/src/OneScript.Web.Server/HeaderDictionaryWrapper.cs b/src/OneScript.Web.Server/HeaderDictionaryWrapper.cs index 566ad5d1c..95599f31a 100644 --- a/src/OneScript.Web.Server/HeaderDictionaryWrapper.cs +++ b/src/OneScript.Web.Server/HeaderDictionaryWrapper.cs @@ -6,8 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using Microsoft.AspNetCore.Http; using OneScript.Contexts; -using OneScript.Web.Server; -using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; using System.Collections.Generic; diff --git a/src/OneScript.Web.Server/IEnumerableExtensions.cs b/src/OneScript.Web.Server/IEnumerableExtensions.cs index 3b2cdd3fa..88c689ae6 100644 --- a/src/OneScript.Web.Server/IEnumerableExtensions.cs +++ b/src/OneScript.Web.Server/IEnumerableExtensions.cs @@ -7,11 +7,7 @@ This Source Code Form is subject to the terms of the using Microsoft.Extensions.Primitives; using OneScript.StandardLibrary.Collections; using OneScript.Values; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace OneScript.Web.Server { diff --git a/src/OneScript.Web.Server/RequestCookieCollectionWrapper.cs b/src/OneScript.Web.Server/RequestCookieCollectionWrapper.cs index 425102f7d..36fa6e86f 100644 --- a/src/OneScript.Web.Server/RequestCookieCollectionWrapper.cs +++ b/src/OneScript.Web.Server/RequestCookieCollectionWrapper.cs @@ -6,7 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using Microsoft.AspNetCore.Http; using OneScript.Contexts; -using OneScript.Web.Server; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; diff --git a/src/OneScript.Web.Server/ResponseCookiesWrapper.cs b/src/OneScript.Web.Server/ResponseCookiesWrapper.cs index 3233c46fa..dc5d661e7 100644 --- a/src/OneScript.Web.Server/ResponseCookiesWrapper.cs +++ b/src/OneScript.Web.Server/ResponseCookiesWrapper.cs @@ -6,7 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using Microsoft.AspNetCore.Http; using OneScript.Contexts; -using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; namespace OneScript.Web.Server diff --git a/src/OneScript.Web.Server/WebSockets/WebSocketsManagerWrapper.cs b/src/OneScript.Web.Server/WebSockets/WebSocketsManagerWrapper.cs index fc2e1cad0..674c30d18 100644 --- a/src/OneScript.Web.Server/WebSockets/WebSocketsManagerWrapper.cs +++ b/src/OneScript.Web.Server/WebSockets/WebSocketsManagerWrapper.cs @@ -5,13 +5,11 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; using OneScript.Contexts; using OneScript.StandardLibrary.Collections; using OneScript.Values; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; -using System; using System.Linq; using System.Net.WebSockets; diff --git a/src/OneScriptDocumenter/Cli/JsonGenerator.cs b/src/OneScriptDocumenter/Cli/JsonGenerator.cs index 53b6cd829..c5e3e6fee 100644 --- a/src/OneScriptDocumenter/Cli/JsonGenerator.cs +++ b/src/OneScriptDocumenter/Cli/JsonGenerator.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.Collections.Generic; using System.IO; using System.Text.Encodings.Web; using System.Text.Json; diff --git a/src/OneScriptDocumenter/Cli/MainIndexWriter.cs b/src/OneScriptDocumenter/Cli/MainIndexWriter.cs index dad1450a9..4f6eb8d29 100644 --- a/src/OneScriptDocumenter/Cli/MainIndexWriter.cs +++ b/src/OneScriptDocumenter/Cli/MainIndexWriter.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; using System.IO; using OneScriptDocumenter.Model; using OneScriptDocumenter.Secondary; diff --git a/src/OneScriptDocumenter/Cli/MarkdownWriter.cs b/src/OneScriptDocumenter/Cli/MarkdownWriter.cs index 036ec349d..a0b6f4d7b 100644 --- a/src/OneScriptDocumenter/Cli/MarkdownWriter.cs +++ b/src/OneScriptDocumenter/Cli/MarkdownWriter.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System; using System.IO; -using System.Threading.Tasks; namespace OneScriptDocumenter.Cli { diff --git a/src/OneScriptDocumenter/Cli/VitepressSidebarGenerator.cs b/src/OneScriptDocumenter/Cli/VitepressSidebarGenerator.cs index 214f7a1f8..01e6d2919 100644 --- a/src/OneScriptDocumenter/Cli/VitepressSidebarGenerator.cs +++ b/src/OneScriptDocumenter/Cli/VitepressSidebarGenerator.cs @@ -5,11 +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.IO; using System.Text.Encodings.Web; using System.Text.Json; -using System.Text.Json.Serialization; using System.Text.Unicode; using OneScriptDocumenter.Model; using OneScriptDocumenter.Secondary; diff --git a/src/OneScriptDocumenter/Model/MethodModel.cs b/src/OneScriptDocumenter/Model/MethodModel.cs index c28d29aab..6a8f93587 100644 --- a/src/OneScriptDocumenter/Model/MethodModel.cs +++ b/src/OneScriptDocumenter/Model/MethodModel.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; using System.Collections.Generic; using System.Text.Json.Serialization; using OneScript.Localization; diff --git a/src/OneScriptDocumenter/Primary/DocumentableLibraryLoadContext.cs b/src/OneScriptDocumenter/Primary/DocumentableLibraryLoadContext.cs index d18bfaef2..2b758c722 100644 --- a/src/OneScriptDocumenter/Primary/DocumentableLibraryLoadContext.cs +++ b/src/OneScriptDocumenter/Primary/DocumentableLibraryLoadContext.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Reflection; using System.Runtime.Loader; diff --git a/src/OneScriptDocumenter/Primary/PrimaryBslDocument.cs b/src/OneScriptDocumenter/Primary/PrimaryBslDocument.cs index 58d822291..5835b6e86 100644 --- a/src/OneScriptDocumenter/Primary/PrimaryBslDocument.cs +++ b/src/OneScriptDocumenter/Primary/PrimaryBslDocument.cs @@ -10,7 +10,6 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Reflection; using System.Xml.Linq; -using OneScript.Localization; namespace OneScriptDocumenter.Primary { diff --git a/src/OneScriptDocumenter/Program.cs b/src/OneScriptDocumenter/Program.cs index 661f2f7f2..794ba4e41 100644 --- a/src/OneScriptDocumenter/Program.cs +++ b/src/OneScriptDocumenter/Program.cs @@ -6,11 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using System.IO; using System.Linq; -using System.Text.Encodings.Web; -using System.Text.Json; -using System.Text.Unicode; using CommandLine; using OneScriptDocumenter.Cli; using OneScriptDocumenter.Model; diff --git a/src/OneScriptDocumenter/Secondary/MarkdownReferenceResolver.cs b/src/OneScriptDocumenter/Secondary/MarkdownReferenceResolver.cs index 18a34b648..5caf18513 100644 --- a/src/OneScriptDocumenter/Secondary/MarkdownReferenceResolver.cs +++ b/src/OneScriptDocumenter/Secondary/MarkdownReferenceResolver.cs @@ -5,10 +5,6 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System; -using System.Linq; -using System.Reflection; -using OneScript.Contexts; using OneScriptDocumenter.Primary; namespace OneScriptDocumenter.Secondary diff --git a/src/OneScriptDocumenter/Secondary/MarkupProvider.cs b/src/OneScriptDocumenter/Secondary/MarkupProvider.cs index cdc173ddc..2f4f255a6 100644 --- a/src/OneScriptDocumenter/Secondary/MarkupProvider.cs +++ b/src/OneScriptDocumenter/Secondary/MarkupProvider.cs @@ -10,7 +10,6 @@ This Source Code Form is subject to the terms of the using System.Reflection; using OneScript.Contexts; using OneScript.Contexts.Enums; -using OneScript.Localization; namespace OneScriptDocumenter.Secondary { @@ -51,16 +50,20 @@ public static INameAndAliasProvider GetEnumValueMarkup(FieldInfo target) public static ContextMethodAttribute GetMethodMarkup(MethodInfo target) { - try + var markup = target.GetCustomAttribute() + ?? throw new ArgumentException($"Method {target} is not marked with method attribute"); + + if (markup.SkipForDocumenter) { - return target - .GetCustomAttributes() - .Single(attr => !attr.IsDeprecated && !attr.SkipForDocumenter); + throw new ArgumentException($"Method {target} is skipped for documentation"); } - catch (InvalidOperationException e) + + if (markup.IsDeprecated) { - throw new ArgumentException($"Method {target} is not marked with method attribute", e); + throw new ArgumentException($"Method {target} is deprecated"); } + + return markup; } public static INameAndAliasProvider GetMemberDocumentationMarkup(MemberInfo target) diff --git a/src/OneScriptDocumenter/default_toc.json b/src/OneScriptDocumenter/default_toc.json index 54f1f6f38..a6981843c 100644 --- a/src/OneScriptDocumenter/default_toc.json +++ b/src/OneScriptDocumenter/default_toc.json @@ -7,6 +7,7 @@ {"text": "Процедуры и функции взаимодействия с системой"}, {"text": "Работа с настройками системы"}, {"text": "Операции со строками"}, + {"text": "Динамическое подключение сценариев"}, {"text": "Работа с переменными окружения"}, {"text": "Процедуры и функции работы с двоичными данными"}, {"text": "Побитовые операции с целыми числами"}, @@ -78,7 +79,10 @@ {"text": "МетодСжатияZIP"}, {"text": "РежимСохраненияПутейZIP"}, {"text": "УровеньСжатияZIP"}, - {"text": "МетодШифрованияZIP"} + {"text": "МетодШифрованияZIP"}, + {"text": "РежимВосстановленияПутейФайловZIP"}, + {"text": "РежимОбработкиПодкаталоговZIP"}, + {"text": "КодировкаИменФайловВZipФайле"} ] }, { @@ -127,7 +131,8 @@ {"text": "ПараметрыЧтенияXML"}, {"text": "ТипУзлаXML"}, {"text": "ПробельныеСимволыXML"}, - {"text": "РасширенноеИмяXML"} + {"text": "РасширенноеИмяXML"}, + {"text": "ПреобразованиеXSL"} ] }, { @@ -154,12 +159,16 @@ {"text": "СписокКомпонентXS"}, {"text": "ОбъединениеНедопустимыхПодстановкиXS"}, {"text": "КоллекцияИменованныхКомпонентXS"}, + {"text": "ЗапрещенныеПодстановкиXS"}, + {"text": "НедопустимыеПодстановкиXS"}, {"text": "ОбъединениеЗапрещенныхПодстановокXS"}, + {"text": "ИсключенияГруппПодстановкиXS"}, {"text": "ОбъединениеЗавершенностиСхемыXS"}, {"text": "ОбъединениеЗавершенностиПростогоТипаXS"}, {"text": "ОбъединениеИсключенийГруппПодстановкиXS"}, {"text": "СхемаXML"}, {"text": "АннотацияXS"}, + {"text": "ФормаПредставленияXS"}, {"text": "ИнформацияДляПриложенияXS"}, {"text": "ОбъявлениеАтрибутаXS"}, {"text": "ОпределениеГруппыАтрибутовXS"}, @@ -215,10 +224,29 @@ { "text": "Веб-сервер Kestrel", "items": [ - {"text": "ВебСервер"}, - {"text": "HTTPКонтекст"}, - {"text": "HTTPСервисЗапрос"}, - {"text": "HTTPСервисОтвет"} + {"text": "ВебСервер"}, + {"text": "HTTPКонтекст"}, + {"text": "HTTPСервисЗапрос"}, + {"text": "HTTPСервисОтвет"}, + {"text": "ВебСокет"}, + {"text": "ДелегатЗапроса"}, + {"text": "ИнформацияОСоединении"}, + {"text": "КонтекстПодключенияВебСокета"}, + {"text": "КукиЗапроса"}, + {"text": "КукиОтвета"}, + {"text": "МенеджерВебСокетов"}, + {"text": "ПараметрыCookie"}, + {"text": "РежимSameSite"}, + {"text": "РезультатВебСокетПолучения"}, + {"text": "СловарьЗаголовков"}, + {"text": "СостояниеВебСокета"}, + {"text": "СтатусЗакрытияВебСокета"}, + {"text": "СтроковыеЗначения"}, + {"text": "ТипСообщенияВебСокета"}, + {"text": "ФайлФормы"}, + {"text": "ФайлыФормы"}, + {"text": "ФлагиСообщенияВебСокета"}, + {"text": "Форма"} ] } ] diff --git a/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs b/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs index b52d69b7a..abf504ca8 100644 --- a/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs +++ b/src/ScriptEngine.HostedScript/FileSystemDependencyResolver.cs @@ -33,6 +33,7 @@ private class Library public string id; public ProcessingState state; public LibraryLoader customLoader; + public PackageInfo loadingResult; } private enum ProcessingState @@ -77,20 +78,21 @@ public void Initialize(ScriptingEngine engine) Engine = engine; } - public void Resolve(SourceCode module, string libraryName, IBslProcess process) + public PackageInfo Resolve(SourceCode module, string libraryName, IBslProcess process) { bool quoted = PrepareQuoted(ref libraryName); - bool loaded; - if (quoted) - loaded = LoadByRelativePath(module, libraryName, process); - else - loaded = LoadByName(libraryName, process); - if(!loaded) - throw new CompilerException(String.Format("Библиотека не найдена: '{0}'", libraryName)); + var lib = quoted ? + LoadByRelativePath(module, libraryName, process) : + LoadByName(libraryName, process); + + if (lib == null) + throw new CompilerException($"Библиотека не найдена: '{libraryName}'"); + + return lib; } - private bool LoadByName(string libraryName, IBslProcess process) + private PackageInfo LoadByName(string libraryName, IBslProcess process) { foreach (var path in SearchDirectories) { @@ -98,18 +100,16 @@ private bool LoadByName(string libraryName, IBslProcess process) continue; var libraryPath = Path.Combine(path, libraryName); - if (LoadByPath(libraryPath, process)) - return true; + var loadAttempt = LoadByPath(libraryPath, process); + if (loadAttempt != null) + return loadAttempt; } var rootPath = Path.Combine(LibraryRoot, libraryName); - if (LoadByPath(rootPath, process)) - return true; - - return false; + return LoadByPath(rootPath, process); } - private bool LoadByRelativePath(SourceCode module, string libraryPath, IBslProcess process) + private PackageInfo LoadByRelativePath(SourceCode module, string libraryPath, IBslProcess process) { string realPath; @@ -197,17 +197,14 @@ private bool PrepareQuoted(ref string value) return quoted; } - private bool LoadByPath(string libraryPath, IBslProcess process) + private PackageInfo LoadByPath(string libraryPath, IBslProcess process) { - if (Directory.Exists(libraryPath)) - { - return LoadLibraryInternal(libraryPath, process); - } - - return false; + return Directory.Exists(libraryPath) ? + LoadLibraryInternal(libraryPath, process) : + null; } - private bool LoadLibraryInternal(string libraryPath, IBslProcess process) + private PackageInfo LoadLibraryInternal(string libraryPath, IBslProcess process) { var id = GetLibraryId(libraryPath); var existedLib = _libs.FirstOrDefault(x => x.id == id); @@ -222,22 +219,23 @@ private bool LoadLibraryInternal(string libraryPath, IBslProcess process) $"Error loading library {id}. Circular dependencies found.\n") + libStack); } - return true; + return existedLib.loadingResult; } var newLib = new Library() { id = id, state = ProcessingState.Discovered }; - bool hasFiles; int newLibIndex = _libs.Count; var customLoaderFile = Path.Combine(libraryPath, PREDEFINED_LOADER_FILE); if (File.Exists(customLoaderFile)) newLib.customLoader = LibraryLoader.Create(Engine, customLoaderFile, process); + PackageInfo package; try { _libs.Add(newLib); - hasFiles = ProcessLibrary(newLib, process); + package = ProcessLibrary(newLib, process); newLib.state = ProcessingState.Processed; + newLib.loadingResult = package; } catch (Exception) { @@ -245,10 +243,10 @@ private bool LoadLibraryInternal(string libraryPath, IBslProcess process) throw; } - return hasFiles; + return package; } - private bool ProcessLibrary(Library lib, IBslProcess process) + private PackageInfo ProcessLibrary(Library lib, IBslProcess process) { LibraryLoader loader; if (lib.customLoader != null) @@ -256,7 +254,7 @@ private bool ProcessLibrary(Library lib, IBslProcess process) else loader = GetDefaultLoader(process); - return loader.ProcessLibrary(lib.id, process) != default; + return loader.ProcessLibrary(lib.id, process); } private static string ListToStringStack(IEnumerable libs, string stopToken) @@ -285,4 +283,4 @@ private static bool PathHasInvalidChars(string path) return (!string.IsNullOrEmpty(path) && path.IndexOfAny(Path.GetInvalidPathChars()) >= 0); } } -} \ No newline at end of file +} diff --git a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs index 1bf564859..6ed02ed64 100644 --- a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs +++ b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System; using OneScript.Sources; -using ScriptEngine.HostedScript.Library; using ScriptEngine.Machine; using OneScript.Commons; using OneScript.Compilation; @@ -94,10 +93,11 @@ public Process CreateProcess(IHostApplication host, SourceCode src) { Initialize(); SetGlobalEnvironment(host, src); - if (_engine.DebugController != null) + + if (_engine.Debugger.IsEnabled) { - _engine.DebugController.Init(); - _engine.DebugController.Wait(); + _engine.Debugger.Start(); + _engine.Debugger.GetSession().WaitReadyToRun(); } var compilerSvc = GetCompilerService(); @@ -110,7 +110,7 @@ public Process CreateProcess(IHostApplication host, SourceCode src) } catch (CompilerException) { - _engine.DebugController?.NotifyProcessExit(1); + _engine.Debugger.NotifyProcessExit(1); throw; } return InitProcess(bslProcess, host, module); diff --git a/src/ScriptEngine.HostedScript/LibraryLoader.cs b/src/ScriptEngine.HostedScript/LibraryLoader.cs index 2b6bc7491..adc76a06b 100644 --- a/src/ScriptEngine.HostedScript/LibraryLoader.cs +++ b/src/ScriptEngine.HostedScript/LibraryLoader.cs @@ -12,9 +12,11 @@ This Source Code Form is subject to the terms of the using System.IO; using System.Linq; using OneScript.Commons; +using OneScript.Compilation; using OneScript.Contexts; using OneScript.Exceptions; using OneScript.Execution; +using OneScript.Values; using ScriptEngine.Libraries; namespace ScriptEngine.HostedScript @@ -25,9 +27,8 @@ public class LibraryLoader : AutoScriptDrivenObject private readonly ILibraryManager _libManager; private readonly ScriptingEngine _engine; - readonly bool _customized; - - readonly List _delayLoadedScripts = new List(); + private readonly bool _customized; + private readonly Stack _librariesInProgress = new Stack(); private struct DelayLoadedScriptData { @@ -35,6 +36,17 @@ private struct DelayLoadedScriptData public string identifier; public bool asClass; } + + private class LibraryLoadingContext + { + public LibraryLoadingContext(ExternalLibraryInfo library) + { + this.Library = library; + } + + public readonly ExternalLibraryInfo Library; + public readonly List delayLoadedScripts = new List(); + } private LibraryLoader(IExecutableModule moduleHandle, IRuntimeEnvironment env, @@ -69,7 +81,6 @@ public static LibraryLoader Create(ScriptingEngine engine, string processingScri var module = CompileModule(compiler, code, typeof(LibraryLoader), process); return new LibraryLoader(module, engine.Environment, engine.LibraryManager, engine, process); - } public static LibraryLoader Create(ScriptingEngine engine, IBslProcess process) @@ -85,7 +96,7 @@ public void AddClass(string file, string className) if (!Utils.IsValidIdentifier(className)) throw RuntimeException.InvalidArgumentValue(); - _delayLoadedScripts.Add(new DelayLoadedScriptData() + _librariesInProgress.Peek().delayLoadedScripts.Add(new DelayLoadedScriptData() { path = file, identifier = className, @@ -99,7 +110,7 @@ public void AddModule(IBslProcess process, string file, string moduleName) if (!Utils.IsValidIdentifier(moduleName)) throw RuntimeException.InvalidArgumentValue(); - _delayLoadedScripts.Add(new DelayLoadedScriptData() + _librariesInProgress.Peek().delayLoadedScripts.Add(new DelayLoadedScriptData() { path = file, identifier = moduleName, @@ -112,8 +123,8 @@ public void AddModule(IBslProcess process, string file, string moduleName) Locale.NStr($"ru = 'Загружаю модуль ={moduleName}= в область видимости из файла {file}';"+ $"en = 'Load module ={moduleName}= in to context from file {file}'") ); - _env.InjectGlobalProperty(null, moduleName, true); - process.Services.TryResolve()?.Machine?.UpdateGlobals(); + + _env.InjectGlobalProperty(BslUndefinedValue.Instance, moduleName, _librariesInProgress.Peek().Library.Package); } catch (InvalidOperationException e) { @@ -137,38 +148,44 @@ public void AddTemplate(string file, string name, TemplateKind kind = TemplateKi manager.RegisterTemplate(file, name, kind); } - public ExternalLibraryDef ProcessLibrary(string libraryPath, IBslProcess process) + public PackageInfo ProcessLibrary(string libraryPath, IBslProcess process) { - bool success; - _delayLoadedScripts.Clear(); - - if(!_customized) + var package = new PackageInfo(libraryPath, Path.GetFileName(libraryPath)); + var library = new ExternalLibraryInfo(package); + _librariesInProgress.Push(new LibraryLoadingContext(library)); + try { - TraceLoadLibrary( - Locale.NStr($"ru = 'Использую НЕ кастомизированный загрузчик пакетов по умолчанию для библиотеки {libraryPath}';"+ - $"en = 'Use NOT customized package loader for library {libraryPath}'") - ); + bool success; + if(!_customized) + { + TraceLoadLibrary( + Locale.NStr($"ru = 'Использую НЕ кастомизированный загрузчик пакетов по умолчанию для библиотеки {libraryPath}';"+ + $"en = 'Use NOT customized package loader for library {libraryPath}'") + ); - success = DefaultProcessing(libraryPath, process); - } - else - { - TraceLoadLibrary( - Locale.NStr($"ru = 'Использую КАСТОМИЗИРОВАННЫЙ загрузчик пакетов для библиотеки {libraryPath}';"+ - $"en = 'Use CUSTOMIZED package loader for library {libraryPath}'") - ); + success = DefaultProcessing(libraryPath, process); + } + else + { + TraceLoadLibrary( + Locale.NStr($"ru = 'Использую КАСТОМИЗИРОВАННЫЙ загрузчик пакетов для библиотеки {libraryPath}';"+ + $"en = 'Use CUSTOMIZED package loader for library {libraryPath}'") + ); - success = CustomizedProcessing(libraryPath, process); - } + success = CustomizedProcessing(libraryPath, process); + } - if (!success) - return default; - + if (!success) + return default; - var library = new ExternalLibraryDef(Path.GetFileName(libraryPath)); - CompileDelayedModules(library, process); - - return library; + CompileDelayedModules(library, process); + + return package; + } + finally + { + _librariesInProgress.Pop(); + } } private bool CustomizedProcessing(string libraryPath, IBslProcess process) @@ -222,9 +239,9 @@ private bool DefaultProcessing(string libraryPath, IBslProcess process) return hasFiles; } - private void CompileDelayedModules(ExternalLibraryDef library, IBslProcess process) + private void CompileDelayedModules(ExternalLibraryInfo library, IBslProcess process) { - foreach (var scriptFile in _delayLoadedScripts) + foreach (var scriptFile in _librariesInProgress.Peek().delayLoadedScripts) { if (scriptFile.asClass) { @@ -236,27 +253,26 @@ private void CompileDelayedModules(ExternalLibraryDef library, IBslProcess proce } } - library.Modules.ForEach(moduleFile => + foreach (var moduleFile in library.Modules) { - var module = CompileFile(moduleFile.FilePath, process); - moduleFile.Module = module; - }); + moduleFile.Module = CompileFile(moduleFile.FilePath, library.Package.Id, process); + } - library.Classes.ForEach(classFile => + foreach (var classFile in library.Classes) { - var module = CompileFile(classFile.FilePath, process); + var module = CompileFile(classFile.FilePath, library.Package.Id, process); _engine.AttachedScriptsFactory.RegisterTypeModule(classFile.Symbol, module); classFile.Module = module; - }); + } _libManager.InitExternalLibrary(_engine, library, process); } - private IExecutableModule CompileFile(string path, IBslProcess process) + private IExecutableModule CompileFile(string path, string ownerPackageId, IBslProcess process) { var compiler = _engine.GetCompilerService(); - var source = _engine.Loader.FromFile(path); + var source = _engine.Loader.FromFile(path, ownerPackageId); var module = _engine.AttachedScriptsFactory.CompileModuleFromSource(compiler, source, null, process); return module; @@ -264,7 +280,7 @@ private IExecutableModule CompileFile(string path, IBslProcess process) private static Lazy TraceEnabled = new Lazy(() => System.Environment.GetEnvironmentVariable("OS_LRE_TRACE") == "1"); - + public static void TraceLoadLibrary(string message) { if (TraceEnabled.Value) { diff --git a/src/ScriptEngine.HostedScript/Process.cs b/src/ScriptEngine.HostedScript/Process.cs index 841bb4273..39a36d266 100644 --- a/src/ScriptEngine.HostedScript/Process.cs +++ b/src/ScriptEngine.HostedScript/Process.cs @@ -50,7 +50,7 @@ public int Start() } finally { - _engine.DebugController?.NotifyProcessExit(exitCode); + _engine.Debugger.NotifyProcessExit(exitCode); _engine.Dispose(); _engine = null; } diff --git a/src/ScriptEngine.HostedScript/SystemGlobalContext.cs b/src/ScriptEngine.HostedScript/SystemGlobalContext.cs index ce018cea6..192c53cf5 100644 --- a/src/ScriptEngine.HostedScript/SystemGlobalContext.cs +++ b/src/ScriptEngine.HostedScript/SystemGlobalContext.cs @@ -47,6 +47,10 @@ private void InitContextVariables() _state[i] = Variable.CreateContextPropertyReference(this, i, _properties.GetProperty(i).Name); } } + + IVariable IAttachableContext.GetVariable(int index) => _state[index]; + + BslMethodInfo IAttachableContext.GetMethod(int index) => _methods.GetRuntimeMethod(index); public IHostApplication ApplicationHost { get; set; } public SourceCode CodeSource { get; set; } @@ -160,7 +164,7 @@ public FixedArrayImpl CommandLineArguments /// Каталог исполняемых файлов OneScript /// /// - [ContextMethod("ProgramDirectory", IsDeprecated = true)] + [DeprecatedName("ProgramDirectory")] [ContextMethod("КаталогПрограммы","BinDir")] public string ProgramDirectory() { @@ -172,19 +176,9 @@ public string ProgramDirectory() #region IAttachableContext Members - public void OnAttach(out IVariable[] variables, - out BslMethodInfo[] methods) - { - if (_state == null) - InitContextVariables(); - - variables = _state; - methods = new BslMethodInfo[_methods.Count]; - for (int i = 0; i < _methods.Count; i++) - { - methods[i] = _methods.GetRuntimeMethod(i); - } - } +int IAttachableContext.VariablesCount => _properties.Count; + + int IAttachableContext.MethodsCount => _methods.Count; #endregion diff --git a/src/ScriptEngine.HostedScript/oscript.cfg b/src/ScriptEngine.HostedScript/oscript.cfg index b4616b1a9..1ddb2504f 100644 --- a/src/ScriptEngine.HostedScript/oscript.cfg +++ b/src/ScriptEngine.HostedScript/oscript.cfg @@ -3,6 +3,14 @@ # Корневой каталог системных библиотек lib.system = ../lib +# Режим проверки явных импортов библиотек через директиву #Использовать +# Возможные значения: +# on - ошибка компиляции при использовании библиотеки без явного импорта +# off - проверка отключена +# warn - предупреждение в лог при использовании библиотеки без явного импорта, компиляция будет успешной +# dev - ошибка компиляции только при включенном отладчике, иначе аналогично режиму off +#lang.explicitImports=dev + #Дополнительные каталоги поиска библиотек #lib.additional = C:\somedir;C:somedir2; diff --git a/src/ScriptEngine/Compiler/CompilerErrors.cs b/src/ScriptEngine/Compiler/CompilerErrors.cs index 1f6ea3e2d..9651e20ad 100644 --- a/src/ScriptEngine/Compiler/CompilerErrors.cs +++ b/src/ScriptEngine/Compiler/CompilerErrors.cs @@ -25,6 +25,10 @@ public static CodeError TooManyArgumentsPassed() => public static CodeError MissedArgument() => Create("Пропущен обязательный параметр", "Missed mandatory parameter"); + public static CodeError MissedImport(string symbol, string libName) => + Create($"Свойство {symbol} принадлежит пакету {libName}, который не импортирован в данном модуле", + $"Property {symbol} belongs to package {libName} which is not imported in this module"); + private static CodeError Create(string ru, string en, [CallerMemberName] string errorId = default) { return new CodeError diff --git a/src/ScriptEngine/Compiler/CompilerFrontend.cs b/src/ScriptEngine/Compiler/CompilerFrontend.cs index a21d5c925..8cd2b0489 100644 --- a/src/ScriptEngine/Compiler/CompilerFrontend.cs +++ b/src/ScriptEngine/Compiler/CompilerFrontend.cs @@ -14,6 +14,7 @@ This Source Code Form is subject to the terms of the using OneScript.Language.SyntaxAnalysis; using OneScript.Language.SyntaxAnalysis.AstNodes; using ScriptEngine.Machine.Contexts; +using ScriptEngine.Machine.Debugger; namespace ScriptEngine.Compiler { @@ -25,6 +26,7 @@ public class CompilerFrontend : CompilerFrontendBase { private readonly IDependencyResolver _dependencyResolver; private readonly PredefinedInterfaceResolver _interfaceResolver; + private readonly OneScriptCoreOptions _options; private readonly CompilerBackendSelector _backendSelector; public CompilerFrontend( @@ -32,10 +34,12 @@ public CompilerFrontend( IErrorSink errorSink, IServiceContainer services, IDependencyResolver dependencyResolver, - PredefinedInterfaceResolver interfaceResolver) : base(handlers, errorSink, services) + PredefinedInterfaceResolver interfaceResolver, + OneScriptCoreOptions options) : base(handlers, errorSink, services) { _dependencyResolver = dependencyResolver; _interfaceResolver = interfaceResolver; + _options = options; _backendSelector = services.Resolve(); @@ -45,7 +49,21 @@ public CompilerFrontend( private ICompilerBackend StackInitializer() { - var backend = new DefaultCompilerBackend(ErrorSink); + var actualBehavior = _options.ExplicitImports; + if (_options.ExplicitImports == ExplicitImportsBehavior.Development) + { + var dbg = Services.TryResolve(); + if (dbg == null || dbg.IsEnabled == false) + { + actualBehavior = ExplicitImportsBehavior.Disabled; + } + else + { + actualBehavior = ExplicitImportsBehavior.Enabled; + } + } + + var backend = new DefaultCompilerBackend(ErrorSink, actualBehavior); SetDefaultOptions(backend); backend.DependencyResolver = _dependencyResolver; diff --git a/src/ScriptEngine/Compiler/DefaultCompilerBackend.cs b/src/ScriptEngine/Compiler/DefaultCompilerBackend.cs index 5f0a61a49..b56db0805 100644 --- a/src/ScriptEngine/Compiler/DefaultCompilerBackend.cs +++ b/src/ScriptEngine/Compiler/DefaultCompilerBackend.cs @@ -17,9 +17,9 @@ public class DefaultCompilerBackend : ICompilerBackend { private readonly StackMachineCodeGenerator _codeGen; - public DefaultCompilerBackend(IErrorSink errorSink) + public DefaultCompilerBackend(IErrorSink errorSink, ExplicitImportsBehavior importsOption) { - _codeGen = new StackMachineCodeGenerator(errorSink); + _codeGen = new StackMachineCodeGenerator(errorSink, importsOption); } public IDependencyResolver DependencyResolver { get; set; } diff --git a/src/ScriptEngine/Compiler/EvalCompiler.cs b/src/ScriptEngine/Compiler/EvalCompiler.cs index 75dbdb2d0..7f30f1202 100644 --- a/src/ScriptEngine/Compiler/EvalCompiler.cs +++ b/src/ScriptEngine/Compiler/EvalCompiler.cs @@ -26,7 +26,7 @@ public EvalCompiler( IErrorSink errorSink, IServiceContainer services) : base(new PreprocessorHandlers(), errorSink, services) { - _backend = new DefaultCompilerBackend(errorSink); + _backend = new DefaultCompilerBackend(errorSink, ExplicitImportsBehavior.Disabled); } protected override IExecutableModule CompileInternal(SymbolTable symbols, ModuleNode parsedModule, Type classType, IBslProcess process) diff --git a/src/ScriptEngine/Compiler/IDirectiveResolver.cs b/src/ScriptEngine/Compiler/IDirectiveResolver.cs index e4d25617e..380a9edcb 100644 --- a/src/ScriptEngine/Compiler/IDirectiveResolver.cs +++ b/src/ScriptEngine/Compiler/IDirectiveResolver.cs @@ -6,7 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using OneScript.Sources; +using OneScript.Language.Sources; namespace ScriptEngine.Compiler { diff --git a/src/ScriptEngine/Compiler/ModuleDumpWriter.cs b/src/ScriptEngine/Compiler/ModuleDumpWriter.cs index 6a70fa167..ea402b1f2 100644 --- a/src/ScriptEngine/Compiler/ModuleDumpWriter.cs +++ b/src/ScriptEngine/Compiler/ModuleDumpWriter.cs @@ -149,12 +149,19 @@ private void WriteImage(TextWriter output, StackRuntimeModule module) output.WriteLine(module.EntryMethodIndex.ToString()); } - private void WriteSymbolMap(TextWriter output, IList map) + private void WriteSymbolMap(TextWriter output, IList map) { for (int i = 0; i < map.Count; i++) { var item = map[i]; - output.Write(string.Format("{0,-3}:({1},{2})\n", i, item.ScopeNumber, item.MemberNumber)); + var targetInfo = item.Kind switch + { + ScopeBindingKind.Static => item.Target?.GetType().Name ?? "null", + ScopeBindingKind.ThisScope => "this", + ScopeBindingKind.FrameScope => $"frame[{item.ScopeIndex}]", + _ => "unknown" + }; + output.Write(string.Format("{0,-3}:({1},{2},{3})\n", i, item.Kind, targetInfo, item.MemberNumber)); } } diff --git a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs index b9342f507..8642b9a6d 100644 --- a/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs +++ b/src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs @@ -22,6 +22,7 @@ This Source Code Form is subject to the terms of the using OneScript.Language.LexicalAnalysis; using OneScript.Language.SyntaxAnalysis; using OneScript.Language.SyntaxAnalysis.AstNodes; +using OneScript.Localization; using OneScript.Sources; using OneScript.Values; using ScriptEngine.Machine; @@ -31,19 +32,24 @@ namespace ScriptEngine.Compiler public partial class StackMachineCodeGenerator : BslSyntaxWalker { private readonly IErrorSink _errorSink; + private readonly ExplicitImportsBehavior _importsOption; private readonly StackRuntimeModule _module; private SourceCode _sourceCode; private SymbolTable _ctx; private List _constMap = new List(); + private HashSet _localImports = new HashSet(); private readonly List _forwardedMethods = new List(); private readonly Stack _nestedLoops = new Stack(); - private IBslProcess _compilerProcess; + private IBslProcess _compilerProcess; + + private HashSet _reportedOldProperties = new HashSet(); - public StackMachineCodeGenerator(IErrorSink errorSink) + public StackMachineCodeGenerator(IErrorSink errorSink, ExplicitImportsBehavior importsOption) { _errorSink = errorSink; + _importsOption = importsOption; _module = new StackRuntimeModule(typeof(IRuntimeContextInstance)); } @@ -99,10 +105,11 @@ private void HandleImportClause(AnnotationNode node) try { - DependencyResolver.Resolve(_sourceCode, libName, _compilerProcess); - // TODO: решить проблему с импортами - // if(_ctx is ModuleCompilerContext moduleContext) - // moduleContext.Update(); + var resolvedLib = DependencyResolver.Resolve(_sourceCode, libName, _compilerProcess); + if (resolvedLib != null && _importsOption != ExplicitImportsBehavior.Disabled) + { + _localImports.Add(resolvedLib.Id); + } } catch (DependencyResolveException e) { @@ -174,7 +181,15 @@ protected override void VisitModuleVariable(VariableDefinitionNode varNode) var field = fieldBuilder.Build(); _module.Fields.Add(field); var binding = _ctx.DefineVariable(field.ToSymbol()); - _module.VariableRefs.Add(binding); + var descriptor = _ctx.GetBinding(binding.ScopeNumber); + var imageBinding = new ModuleSymbolBinding + { + Target = descriptor.Target, + MemberNumber = binding.MemberNumber, + Kind = descriptor.Kind, + ScopeIndex = descriptor.ScopeIndex + }; + _module.VariableRefs.Add(imageBinding); } protected override void VisitModuleBody(BslSyntaxNode child) @@ -184,7 +199,7 @@ protected override void VisitModuleBody(BslSyntaxNode child) var entry = _module.Code.Count; var localCtx = new SymbolScope(); - _ctx.PushScope(localCtx, null); + _ctx.PushScope(localCtx, ScopeBindingDescriptor.ThisScope()); try { @@ -211,10 +226,13 @@ protected override void VisitModuleBody(BslSyntaxNode child) methodInfo.SetRuntimeParameters(entry, GetVariableNames(localCtx)); var entryRefNumber = _module.MethodRefs.Count; - var bodyBinding = new SymbolBinding + var descriptor = _ctx.GetBinding(topIdx); + var bodyBinding = new ModuleSymbolBinding { - ScopeNumber = topIdx, - MemberNumber = _module.Methods.Count + Target = descriptor.Target, + MemberNumber = _module.Methods.Count, + Kind = descriptor.Kind, + ScopeIndex = descriptor.ScopeIndex }; _module.Methods.Add(methodInfo); @@ -276,7 +294,7 @@ protected override void VisitMethod(MethodNode methodNode) methodCtx.DefineVariable(new LocalVariableSymbol(paramNode.Name)); } - _ctx.PushScope(methodCtx, null); + _ctx.PushScope(methodCtx, ScopeBindingDescriptor.ThisScope()); var entryPoint = _module.Code.Count; try { @@ -300,7 +318,15 @@ protected override void VisitMethod(MethodNode methodNode) AddError(LocalizedErrors.DuplicateMethodDefinition(signature.MethodName), signature.Location); binding = default; } - _module.MethodRefs.Add(binding); + var descriptor = _ctx.GetBinding(binding.ScopeNumber); + var imageBinding = new ModuleSymbolBinding + { + Target = descriptor.Target, + MemberNumber = binding.MemberNumber, + Kind = descriptor.Kind, + ScopeIndex = descriptor.ScopeIndex + }; + _module.MethodRefs.Add(imageBinding); _module.Methods.Add(methodInfo); } @@ -732,8 +758,24 @@ private int PushVariable(TerminalNode node) var symbol = _ctx.GetVariable(varNum); - if (symbol is IPropertySymbol) + if (symbol is IPropertySymbol propSymbol) { + if (_importsOption != ExplicitImportsBehavior.Disabled && symbol is IPackageSymbol pkgSymbol) + { + CheckExplicitImport(node, pkgSymbol, symbol); + } + + if (propSymbol.Property is ISupportsDeprecation { IsDeprecated: true } && + !_reportedOldProperties.Contains(propSymbol.Property)) + { + var message = BilingualString.Localize( + $"Использование устаревшего свойства \"{identifier}\" в файле \"{_sourceCode.Location}\" ({node.Location})", + $"Usage of deprecated property \"{identifier}\" in \"{_sourceCode.Location}\" ({node.Location})" + ); + _reportedOldProperties.Add(propSymbol.Property); + SystemLogger.Write(message); + } + return PushPropertyReference(varNum); } else @@ -742,6 +784,31 @@ private int PushVariable(TerminalNode node) } } + private void CheckExplicitImport(TerminalNode node, IPackageSymbol pkgSymbol, IVariableSymbol symbol) + { + var packageInfo = pkgSymbol.GetPackageInfo(); + var id = packageInfo.Id; + + // Если модуль принадлежит той же библиотеке - не требуем явный импорт + if (_sourceCode.OwnerPackageId != null && id == _sourceCode.OwnerPackageId) + return; + + if (!_localImports.Contains(id)) + { + var error = CompilerErrors.MissedImport(symbol.Name, packageInfo.ShortName); + error.Position = MakeCodePosition(node.Location); + switch (_importsOption) + { + case ExplicitImportsBehavior.Enabled: + AddError(error); + break; + case ExplicitImportsBehavior.Warn: + SystemLogger.Write(error.ToString()); + break; + } + } + } + private int PushSimpleVariable(SymbolBinding binding) { if (binding.ScopeNumber == _ctx.ScopeCount - 1) @@ -1250,22 +1317,40 @@ private int GetConstNumber(in ConstDefinition cDef) private int GetMethodRefNumber(in SymbolBinding methodBinding) { - var idx = _module.MethodRefs.IndexOf(methodBinding); + var descriptor = _ctx.GetBinding(methodBinding.ScopeNumber); + var imageBinding = new ModuleSymbolBinding + { + Target = descriptor.Target, + MemberNumber = methodBinding.MemberNumber, + Kind = descriptor.Kind, + ScopeIndex = descriptor.ScopeIndex + }; + + var idx = _module.MethodRefs.IndexOf(imageBinding); if (idx < 0) { idx = _module.MethodRefs.Count; - _module.MethodRefs.Add(methodBinding); + _module.MethodRefs.Add(imageBinding); } return idx; } private int GetVariableRefNumber(in SymbolBinding binding) { - var idx = _module.VariableRefs.IndexOf(binding); + var descriptor = _ctx.GetBinding(binding.ScopeNumber); + var imageBinding = new ModuleSymbolBinding + { + Target = descriptor.Target, + MemberNumber = binding.MemberNumber, + Kind = descriptor.Kind, + ScopeIndex = descriptor.ScopeIndex + }; + + var idx = _module.VariableRefs.IndexOf(imageBinding); if (idx < 0) { idx = _module.VariableRefs.Count; - _module.VariableRefs.Add(binding); + _module.VariableRefs.Add(imageBinding); } return idx; diff --git a/src/ScriptEngine/Compiler/SymbolScope.cs b/src/ScriptEngine/Compiler/SymbolScope.cs deleted file mode 100644 index 54c7caae1..000000000 --- a/src/ScriptEngine/Compiler/SymbolScope.cs +++ /dev/null @@ -1,24 +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.Compilation; -using OneScript.Localization; - -namespace ScriptEngine.Compiler -{ - class SymbolNotFoundException : CompilerException - { - public SymbolNotFoundException(string symbol) - : base(BilingualString.Localize($"Неизвестный символ: {symbol}", $"Unknown symbol {symbol}")) - { - Symbol = symbol; - } - - public string Symbol { get; } - } - -} diff --git a/src/ScriptEngine/ExplicitImportsBehavior.cs b/src/ScriptEngine/ExplicitImportsBehavior.cs new file mode 100644 index 000000000..5811a6750 --- /dev/null +++ b/src/ScriptEngine/ExplicitImportsBehavior.cs @@ -0,0 +1,36 @@ +/*---------------------------------------------------------- +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 ScriptEngine +{ + /// + /// Определяет поведение компилятора при использовании библиотек без явного импорта через директиву #Использовать. + /// + public enum ExplicitImportsBehavior + { + /// + /// Обращение к символу из внешнего пакета без явного импорта вызывает ошибку компиляции. + /// + Enabled, + + /// + /// Обращение к символу из внешнего пакета без явного импорта записывает предупреждение в лог, но компиляция продолжается. + /// + Warn, + + /// + /// В режиме разработки (при наличии включенного отладчика) обращение к символу без явного импорта вызывает ошибку компиляции. + /// Без отладчика ошибки не происходит. + /// + Development, + + /// + /// Проверка явных импортов отключена. Все библиотеки доступны без использования директивы #Использовать (режим совместимости). + /// + Disabled + } +} \ No newline at end of file diff --git a/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs b/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs index 2bb6ed92a..47a03759d 100644 --- a/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs +++ b/src/ScriptEngine/Hosting/EngineBuilderExtensions.cs @@ -16,7 +16,7 @@ This Source Code Form is subject to the terms of the using OneScript.Language.SyntaxAnalysis; using OneScript.Types; using ScriptEngine.Machine; -using ScriptEngine.Machine.Contexts; +using ScriptEngine.Machine.Debugger; using ScriptEngine.Machine.Interfaces; namespace ScriptEngine.Hosting @@ -55,6 +55,7 @@ public static IEngineBuilder SetDefaultOptions(this IEngineBuilder builder) services.RegisterSingleton(svc => new ThrowingErrorSink(CompilerException.FromCodeError)); services.RegisterSingleton(); services.RegisterSingleton(); + services.RegisterSingleton(); services.RegisterScoped(); @@ -89,7 +90,7 @@ public static IEngineBuilder UseImports(this IEngineBuilder b) return b; } - public static IEngineBuilder WithDebugger(this IEngineBuilder b, IDebugController debugger) + public static IEngineBuilder WithDebugger(this IEngineBuilder b, IDebugger debugger) { b.Services.RegisterSingleton(debugger); return b; diff --git a/src/ScriptEngine/Libraries/ExternalLibraryDef.cs b/src/ScriptEngine/Libraries/ExternalLibraryDef.cs deleted file mode 100644 index 30bc701a8..000000000 --- a/src/ScriptEngine/Libraries/ExternalLibraryDef.cs +++ /dev/null @@ -1,73 +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 OneScript.Execution; -using ScriptEngine.Machine; - -namespace ScriptEngine.Libraries -{ - public class ExternalLibraryDef - { - public ExternalLibraryDef(string name) - { - LibraryName = name; - } - - public string LibraryName { get; } - - public IList Classes { get; } = new List(); - public IList Modules { get; } = new List(); - - public UserAddedScript AddClass(string identifier, string filePath, StackRuntimeModule module = null) - { - var item = new UserAddedScript - { - Type = UserAddedScriptType.Class, - Module = module, - Symbol = identifier, - FilePath = filePath - }; - - Classes.Add(item); - - return item; - } - - public UserAddedScript AddModule(string identifier, string filePath, StackRuntimeModule module = null) - { - var item = new UserAddedScript - { - Type = UserAddedScriptType.Module, - Module = module, - Symbol = identifier, - FilePath = filePath - }; - - Modules.Add(item); - - return item; - } - } - - public class UserAddedScript - { - public UserAddedScriptType Type; - public string Symbol; - public string FilePath; - - public IExecutableModule Module; - } - - [Serializable] - public enum UserAddedScriptType - { - Module, - Class - } -} \ No newline at end of file diff --git a/src/ScriptEngine/Libraries/ExternalLibraryInfo.cs b/src/ScriptEngine/Libraries/ExternalLibraryInfo.cs new file mode 100644 index 000000000..199c229d2 --- /dev/null +++ b/src/ScriptEngine/Libraries/ExternalLibraryInfo.cs @@ -0,0 +1,39 @@ +/*---------------------------------------------------------- +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; + +namespace ScriptEngine.Libraries +{ + /// + /// Информация о внешней библиотеке и её компонентах. + /// + public class ExternalLibraryInfo + { + public ExternalLibraryInfo(PackageInfo package) + { + Package = package; + } + + public PackageInfo Package { get; } + + public List Modules { get; } = new List(); + public List Classes { get; } = new List(); + + public void AddModule(string symbol, string filePath) + { + Modules.Add(new UserAddedScript { Symbol = symbol, FilePath = filePath }); + } + + public void AddClass(string symbol, string filePath) + { + Classes.Add(new UserAddedScript { Symbol = symbol, FilePath = filePath }); + } + } +} + diff --git a/src/ScriptEngine/Libraries/ILibraryManager.cs b/src/ScriptEngine/Libraries/ILibraryManager.cs index da1ae1112..50134257c 100644 --- a/src/ScriptEngine/Libraries/ILibraryManager.cs +++ b/src/ScriptEngine/Libraries/ILibraryManager.cs @@ -1,21 +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 +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.Execution; namespace ScriptEngine.Libraries { /// - /// Временный класс для откусывания ответственностей от RuntimeEnvironment + /// Менеджер загрузки внешних библиотек /// public interface ILibraryManager { - IEnumerable GetLibraries(); - void InitExternalLibrary(ScriptingEngine runtime, ExternalLibraryDef library, IBslProcess process); + void InitExternalLibrary(ScriptingEngine runtime, ExternalLibraryInfo library, IBslProcess process); } -} \ No newline at end of file +} diff --git a/src/ScriptEngine/Libraries/LibraryManager.cs b/src/ScriptEngine/Libraries/LibraryManager.cs index c020077f1..0a11d13fc 100644 --- a/src/ScriptEngine/Libraries/LibraryManager.cs +++ b/src/ScriptEngine/Libraries/LibraryManager.cs @@ -8,18 +8,15 @@ This Source Code Form is subject to the terms of the using OneScript.Commons; using OneScript.Contexts; using ScriptEngine.Machine.Contexts; -using System.Collections.Generic; using OneScript.Execution; namespace ScriptEngine.Libraries { /// - /// Временная имплементация временного интерфейса ILibraryManager - /// Нужна для откусывания ответственностей от RuntimeEnvironment + /// Менеджер загрузки внешних библиотек /// internal class LibraryManager : ILibraryManager { - private readonly List _externalLibs = new List(); private readonly IRuntimeContextInstance _contextOfGlobalSymbols; public LibraryManager(IRuntimeContextInstance contextOfGlobalSymbols) @@ -27,12 +24,7 @@ public LibraryManager(IRuntimeContextInstance contextOfGlobalSymbols) _contextOfGlobalSymbols = contextOfGlobalSymbols; } - public IEnumerable GetLibraries() - { - return _externalLibs.ToArray(); - } - - public void InitExternalLibrary(ScriptingEngine runtime, ExternalLibraryDef library, IBslProcess process) + public void InitExternalLibrary(ScriptingEngine runtime, ExternalLibraryInfo library, IBslProcess process) { var loadedObjects = new ScriptDrivenObject[library.Modules.Count]; int i = 0; @@ -45,7 +37,6 @@ public void InitExternalLibrary(ScriptingEngine runtime, ExternalLibraryDef libr loadedObjects[i++] = instance; } - _externalLibs.Add(library); loadedObjects.ForEach(sdo => runtime.InitializeSDO(sdo, process)); } } diff --git a/src/ScriptEngine/Libraries/UserAddedScript.cs b/src/ScriptEngine/Libraries/UserAddedScript.cs new file mode 100644 index 000000000..60748566f --- /dev/null +++ b/src/ScriptEngine/Libraries/UserAddedScript.cs @@ -0,0 +1,23 @@ +/*---------------------------------------------------------- +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.Execution; + +namespace ScriptEngine.Libraries +{ + /// + /// Информация о добавленном пользовательском скрипте. + /// Используется для сериализации в ApplicationDump. + /// + public class UserAddedScript + { + public string Symbol { get; set; } + public string FilePath { get; set; } + public string FileName { get; set; } + public IExecutableModule Module { get; set; } + } +} diff --git a/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs b/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs index 8db869186..b7865000f 100644 --- a/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs +++ b/src/ScriptEngine/Machine/ComReflectionNameToIdMapper.cs @@ -9,9 +9,7 @@ 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/AttachedScriptsFactory.cs b/src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs index 225f4212a..82f7db917 100755 --- a/src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs +++ b/src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs @@ -6,7 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; using System.Collections.Generic; -using System.Linq; using System.Text; using OneScript.Sources; using System.Security.Cryptography; diff --git a/src/ScriptEngine/Machine/Contexts/AutoScriptDrivenObject.cs b/src/ScriptEngine/Machine/Contexts/AutoScriptDrivenObject.cs index 485bdb12c..cbd910a61 100644 --- a/src/ScriptEngine/Machine/Contexts/AutoScriptDrivenObject.cs +++ b/src/ScriptEngine/Machine/Contexts/AutoScriptDrivenObject.cs @@ -59,10 +59,6 @@ protected override int GetOwnMethodCount() return _ownMethods.Count; } - protected override void UpdateState() - { - } - protected override int FindOwnProperty(string name) { var baseIndex = base.FindOwnProperty(name); diff --git a/src/ScriptEngine/Machine/Contexts/ClrEnumWrapper.cs b/src/ScriptEngine/Machine/Contexts/ClrEnumWrapper.cs index ff9eff670..19143699a 100644 --- a/src/ScriptEngine/Machine/Contexts/ClrEnumWrapper.cs +++ b/src/ScriptEngine/Machine/Contexts/ClrEnumWrapper.cs @@ -7,6 +7,8 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; +using System.Reflection; +using OneScript.Contexts; using OneScript.Contexts.Enums; using OneScript.Types; using OneScript.Values; @@ -76,10 +78,30 @@ private void Autoregister(TypeDescriptor valuesType) alias = field.Name; } - var osValue = new ClrEnumValueWrapper(valuesType, (T)field.GetValue(null), + var enumValue = (T)field.GetValue(null)!; + var osValue = new ClrEnumValueWrapper(valuesType, enumValue, contextField.Name, alias); AddValue(osValue); + + // Deprecations + foreach (var deprecation in field.GetCustomAttributes()) + { + if (deprecation.Name.Equals(contextField.Name, StringComparison.InvariantCultureIgnoreCase) + || deprecation.Name.Equals(contextField.Alias, StringComparison.InvariantCultureIgnoreCase)) + { + throw new InvalidOperationException($"Enum value '{contextField.Name}' has same name in deprecations"); + } + + var deprecatedValue = new ClrEnumValueWrapper(valuesType, enumValue, deprecation.Name, null); + var propertyDef = new SystemPropertyInfo.Builder(deprecation.Name) + .SetPropertyType(deprecatedValue.UnderlyingValue.GetType()) + .SetDeprecated(true) + .SetDeclaringType(enumType) + .Build(); + + AddValue(deprecatedValue, propertyDef); + } } } } diff --git a/src/ScriptEngine/Machine/Contexts/ContextDiscoverer.cs b/src/ScriptEngine/Machine/Contexts/ContextDiscoverer.cs index f971cb5d4..446b7738e 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextDiscoverer.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextDiscoverer.cs @@ -121,8 +121,7 @@ private void RegisterSystemEnum(Type enumType, IRuntimeEnvironment environment) var enumMetadata = (SystemEnumAttribute)enumType.GetCustomAttributes(typeof(SystemEnumAttribute), false)[0]; var instance = (IValue)method.Invoke(null, new object[]{Types}); - Globals.RegisterInstance(instance); - environment.InjectGlobalProperty(instance, enumMetadata.Name, enumMetadata.Alias, true); + RegisterEnumGlobalProperty(instance, environment, enumType, enumMetadata); } private void RegisterSimpleEnum(Type enumType, IRuntimeEnvironment environment) @@ -150,9 +149,38 @@ private void RegisterSimpleEnum(Type enumType, IRuntimeEnvironment environment) var instance = (IValue)factory.Invoke(null, new object[]{enumTypeDescription, valueTypeDescription}); if (enumTypeAttribute.CreateGlobalProperty) - { - Globals.RegisterInstance(enumType, instance); - environment.InjectGlobalProperty(instance, enumTypeAttribute.Name, enumTypeAttribute.Alias, true); + { + RegisterEnumGlobalProperty(instance, environment, enumType, enumTypeAttribute); + } + } + + private void RegisterEnumGlobalProperty( + IValue instance, + IRuntimeEnvironment environment, + Type enumType, + IEnumMetadataProvider enumTypeAttribute) + { + Globals.RegisterInstance(enumType, instance); + + var mainProperty = new SystemPropertyInfo.Builder(enumTypeAttribute.Name, enumTypeAttribute.Alias) + .SetPropertyType(enumType) + .Build(); + + environment.InjectGlobalProperty(instance, mainProperty); + + // Deprecations + foreach (var deprecation in enumType.GetCustomAttributes()) + { + if (deprecation.ThrowOnUse) + throw new NotSupportedException( + $"{nameof(deprecation.ThrowOnUse)} is not supported for enums yet. ({enumType})"); + + var deprecatedProperty = new SystemPropertyInfo.Builder(deprecation.Name) + .SetPropertyType(enumType) + .SetDeprecated(true) + .Build(); + + environment.InjectGlobalProperty(instance, deprecatedProperty); } } diff --git a/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs b/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs index e3eaec6ef..e8d8d07ac 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextIValueImpl.cs @@ -58,15 +58,6 @@ public override TypeDescriptor SystemType #endregion - #region IComparable Members - - public override int CompareTo(BslValue other) - { - throw RuntimeException.ComparisonNotSupportedException(); - } - - #endregion - #region IEquatable Members public override bool Equals(BslValue other) diff --git a/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs b/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs index 9d59cabef..0cec69071 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs @@ -88,12 +88,25 @@ public int Count } } - private List MapType(Type type) + private static List MapType(Type type) { - return type.GetMethods() - .SelectMany(method => method.GetCustomAttributes(typeof(ContextMethodAttribute), false) - .Select(attr => new InternalMethInfo(method, (ContextMethodAttribute)attr)) ) - .ToList(); + var mappedMethods = new List(); + foreach (var methodInfo in type.GetMethods() + .Where(method => Attribute.IsDefined(method, typeof(ContextMethodAttribute)))) + { + var mainMarkup = methodInfo.GetCustomAttribute(); + var mainMapping = new InternalMethInfo(methodInfo, mainMarkup); + mappedMethods.Add(mainMapping); + mappedMethods.AddRange(methodInfo.GetCustomAttributes() + .Select(deprecation => new InternalMethInfo(methodInfo, new ContextMethodAttribute(deprecation.Name, default) + { + IsDeprecated = true, + ThrowOnUse = deprecation.ThrowOnUse + })) + ); + } + + return mappedMethods; } private class InternalMethInfo @@ -118,7 +131,20 @@ public InternalMethInfo(MethodInfo target, ContextMethodAttribute binding) public ContextCallableDelegate Method => _method.Value; - private static MethodSignature CreateMetadata(MethodInfo target, ContextMethodAttribute binding, bool hasProcessParam) + private static MethodSignature CreateMetadata(MethodInfo target, ContextMethodAttribute binding, + bool hasProcessParam) + { + return CreateMetadata(target, binding.Name, binding.Alias, binding.IsDeprecated, binding.ThrowOnUse, + hasProcessParam); + } + + private static MethodSignature CreateMetadata( + MethodInfo target, + string name, + string alias, + bool isDeprecated, + bool throwOnUse, + bool hasProcessParam) { var parameters = target.GetParameters(); var isFunc = target.ReturnType != typeof(void); @@ -152,17 +178,16 @@ private static MethodSignature CreateMetadata(MethodInfo target, ContextMethodAt } - var scriptMethInfo = new MethodSignature(); - scriptMethInfo.IsFunction = isFunc; - scriptMethInfo.IsExport = true; - scriptMethInfo.IsDeprecated = binding.IsDeprecated; - scriptMethInfo.ThrowOnUseDeprecated = binding.ThrowOnUse; - scriptMethInfo.Name = binding.Name; - scriptMethInfo.Alias = binding.Alias; - - scriptMethInfo.Params = paramDefs; - - return scriptMethInfo; + return new MethodSignature + { + IsFunction = isFunc, + IsExport = true, + IsDeprecated = isDeprecated, + ThrowOnUseDeprecated = throwOnUse, + Name = name, + Alias = alias, + Params = paramDefs + }; } private static ContextCallableDelegate CreateFunction(ContextMethodInfo target) diff --git a/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs b/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs index 9b97c2a38..96c975743 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs @@ -11,121 +11,15 @@ This Source Code Form is subject to the terms of the using System.Reflection; using OneScript.Contexts; using OneScript.Exceptions; +using OneScript.Language; 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 static T ConvertParam(IValue value) - { - return ContextValuesMarshaller.ConvertValueStrict(value); - } - - private static IValue ConvertReturnValue(TRet param) - { - return ContextValuesMarshaller.ConvertReturnValue(param); - } - - } - public class ContextPropertyMapper { private List> _properties; + private IdentifiersTrie _propertyNumbers; + private readonly object _locker = new object(); private void Init() @@ -137,16 +31,50 @@ private void Init() { if (_properties == null) { - _properties = FindProperties(); + var localProps = MapProperties(); + _propertyNumbers = new IdentifiersTrie(); + for (int idx = 0; idx < localProps.Count; ++idx) + { + var propInfo = localProps[idx]; + + _propertyNumbers.Add(propInfo.Name, idx); + if (propInfo.Alias != null) + _propertyNumbers.Add(propInfo.Alias, idx); + } + + _properties = localProps; } } } - private List> FindProperties() + private static List> MapProperties() { - return typeof(TInstance).GetProperties() - .Where(x => x.GetCustomAttributes(typeof(ContextPropertyAttribute), false).Any()) - .Select(x => new PropertyTarget(x)).ToList(); + var mappedProperties = new List>(); + foreach (var propertyInfo in typeof(TInstance).GetProperties() + .Where(x => Attribute.IsDefined(x, typeof(ContextPropertyAttribute)))) + { + var propertyMarkup = propertyInfo.GetCustomAttribute(); + var bslProp = new ContextPropertyInfo(propertyInfo, propertyMarkup); + var mainMapping = new PropertyTarget(bslProp); + mappedProperties.Add(mainMapping); + + foreach (var deprecation in propertyInfo.GetCustomAttributes()) + { + var deprecatedMarkup = new ContextPropertyAttribute(deprecation.Name) + { + CanRead = bslProp.CanRead, + CanWrite = bslProp.CanWrite, + IsDeprecated = true, + ThrowOnUse = deprecation.ThrowOnUse + }; + + bslProp = new ContextPropertyInfo(propertyInfo, deprecatedMarkup); + var deprecatedMapping = new PropertyTarget(bslProp); + mappedProperties.Add(deprecatedMapping); + } + } + + return mappedProperties; } public bool ContainsProperty(string name) @@ -187,8 +115,10 @@ public int 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)); + if (_propertyNumbers.TryGetValue(name, out var index)) + return index; + + return -1; } } } diff --git a/src/ScriptEngine/Machine/Contexts/DynamicPropertiesAccessor.cs b/src/ScriptEngine/Machine/Contexts/DynamicPropertiesAccessor.cs index ca4096b06..c8a7f0d20 100644 --- a/src/ScriptEngine/Machine/Contexts/DynamicPropertiesAccessor.cs +++ b/src/ScriptEngine/Machine/Contexts/DynamicPropertiesAccessor.cs @@ -6,7 +6,9 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.Collections.Generic; +using OneScript.Contexts; using OneScript.Exceptions; +using OneScript.Values; namespace ScriptEngine.Machine.Contexts { @@ -16,12 +18,33 @@ public abstract class DynamicPropertiesAccessor : PropertyNameIndexAccessor public DynamicPropertiesAccessor() { - _propHolder = new DynamicPropertiesHolder(); + _propHolder = new DynamicPropertiesHolder(InfoFactory); } - - protected int RegisterProperty(string name) + + private BslPropertyInfo InfoFactory(int index, string identifier, bool canRead, bool canWrite) + { + return OnPropertyRegistration(index, identifier, canRead, canWrite); + } + + protected virtual BslPropertyInfo OnPropertyRegistration(int index, string propertyName, bool canRead, bool canWrite) { - return _propHolder.RegisterProperty(name); + return BslPropertyBuilder.Create() + .Name(propertyName) + .CanRead(canRead) + .CanWrite(canWrite) + .SetDispatchingIndex(index) + .ReturnType(typeof(BslValue)) + .Build(); + } + + protected int RegisterProperty(string name, bool canRead = true, bool canWrite = true) + { + return _propHolder.RegisterProperty(name, canRead, canWrite); + } + + protected int RegisterProperty(BslPropertyInfo propInfo) + { + return _propHolder.RegisterProperty(propInfo); } protected void RemoveProperty(string name) @@ -44,6 +67,11 @@ protected virtual IEnumerable> GetDynamicProperties() return _propHolder.GetProperties(); } + public override BslPropertyInfo GetPropertyInfo(int index) + { + return _propHolder[index]; + } + #region IRuntimeContextInstance Members public override bool IsIndexed diff --git a/src/ScriptEngine/Machine/Contexts/DynamicPropertiesHolder.cs b/src/ScriptEngine/Machine/Contexts/DynamicPropertiesHolder.cs index 34642871a..5d444bbd8 100644 --- a/src/ScriptEngine/Machine/Contexts/DynamicPropertiesHolder.cs +++ b/src/ScriptEngine/Machine/Contexts/DynamicPropertiesHolder.cs @@ -17,18 +17,20 @@ public class DynamicPropertiesHolder private readonly IndexedNameValueCollection _propDefs = new IndexedNameValueCollection(); - private readonly Func _infoFactory = MakeProperty; + public delegate BslPropertyInfo PropertyInfoFactory(int index, string name, bool canRead, bool canWrite); + + private readonly PropertyInfoFactory _infoFactory = MakeProperty; public DynamicPropertiesHolder() { } - public DynamicPropertiesHolder(Func infoFactory) + public DynamicPropertiesHolder(PropertyInfoFactory infoFactory) { _infoFactory = infoFactory; } - public int RegisterProperty(string name) + public int RegisterProperty(string name, bool canRead = true, bool canWrite = true) { var index = _propDefs.IndexOf(name); if (index != -1) @@ -42,14 +44,27 @@ public int RegisterProperty(string name) } index = _propDefs.Count; - return _propDefs.Add(_infoFactory(index, name), name); + return _propDefs.Add(_infoFactory(index, name, canRead, canWrite), name); + } + + public int RegisterProperty(BslPropertyInfo prop) + { + var index = _propDefs.IndexOf(prop.Name); + if (index != -1) + { + throw new ArgumentException($"Property {prop.Name} already exists"); + } + + return _propDefs.Add(prop, prop.Name); } - private static BslPropertyInfo MakeProperty(int index, string name) + private static BslPropertyInfo MakeProperty(int index, string name, bool canRead, bool canWrite) { return BslPropertyBuilder.Create() .Name(name) .SetDispatchingIndex(index) + .CanRead(canRead) + .CanWrite(canWrite) .Build(); } diff --git a/src/ScriptEngine/Machine/Contexts/EnumerationContext.cs b/src/ScriptEngine/Machine/Contexts/EnumerationContext.cs index 3e4ea4ae7..b5708f5b8 100644 --- a/src/ScriptEngine/Machine/Contexts/EnumerationContext.cs +++ b/src/ScriptEngine/Machine/Contexts/EnumerationContext.cs @@ -4,7 +4,7 @@ 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; + using System.Collections; using System.Collections.Generic; using OneScript.Commons; @@ -15,41 +15,45 @@ This Source Code Form is subject to the terms of the namespace ScriptEngine.Machine.Contexts { - public class EnumerationContext : PropertyNameIndexAccessor, ICollectionContext + public abstract class EnumerationContext : PropertyNameIndexAccessor, ICollectionContext { - private readonly List _values = new List(); - - readonly IndexedNamesCollection _nameIds = new IndexedNamesCollection(); + private readonly IndexedNameValueCollection _values; + private readonly List _definitions; private readonly TypeDescriptor _valuesType; + private readonly HashSet _checkedDeprecatedProps = new HashSet(); - public EnumerationContext(TypeDescriptor typeRepresentation, TypeDescriptor valuesType) : base(typeRepresentation) + protected EnumerationContext(TypeDescriptor typeRepresentation, TypeDescriptor valuesType) : base(typeRepresentation) { _valuesType = valuesType; + _values = new IndexedNameValueCollection(); + _definitions = new List(); } public void AddValue(EnumerationValue val) { - System.Diagnostics.Debug.Assert(val != null); - - _nameIds.RegisterName(val.Name, val.Alias); - _values.Add(val); + var index = _values.Add(val, val.Name, val.Alias); + + var propertyBuilder = BslPropertyBuilder.Create() + .SetNames(val.Name, val.Alias) + .CanRead(true) + .CanWrite(false) + .SetDispatchingIndex(index); + + if (_valuesType != null) + propertyBuilder.ReturnType(_valuesType.ImplementingClass); + + _definitions.Add(propertyBuilder.Build()); } - public TypeDescriptor ValuesType => _valuesType; - - public EnumerationValue this[string name] + protected void AddValue(EnumerationValue val, BslPropertyInfo definition) { - get - { - int id = GetPropertyNumber(name); - return _values[id]; - } + _values.Add(val, definition.Name, definition.Alias); + _definitions.Add(definition); } - public int IndexOf(EnumerationValue enumVal) - { - return _values.IndexOf(enumVal); - } + public TypeDescriptor ValuesType => _valuesType; + + public EnumerationValue this[string name] => GetPropValueInternal(GetPropertyNumber(name)); public override int GetPropCount() { @@ -58,11 +62,9 @@ public override int GetPropCount() public override int GetPropertyNumber(string name) { - int id; - if (_nameIds.TryGetIdOfName(name, out id)) - return id; - else - return base.GetPropertyNumber(name); + var id = _values.IndexOf(name); + + return id == -1 ? base.GetPropertyNumber(name) : id; } public override bool IsPropReadable(int propNum) @@ -72,23 +74,40 @@ public override bool IsPropReadable(int propNum) public override IValue GetPropValue(int propNum) { + return GetPropValueInternal(propNum); + } + + private EnumerationValue GetPropValueInternal(int propNum) + { + WarnDeprecation(propNum); return _values[propNum]; } + + private void WarnDeprecation(int propNum) + { + if (_checkedDeprecatedProps.Contains(propNum)) + return; + + if (GetPropertyInfo(propNum) is SystemPropertyInfo { IsDeprecated: true }) + { + SystemLogger.Write($"Обращение к устаревшему свойству {GetPropertyInfo(propNum).Name}."); + } + + _checkedDeprecatedProps.Add(propNum); + } public override string GetPropName(int propNum) { - return _values[propNum].ToString(); + return _values.NameOf(propNum); } - - - protected IList ValuesInternal + + public override BslPropertyInfo GetPropertyInfo(int propNum) { - get - { - return _values; - } + return _definitions[propNum]; } + protected IEnumerable ValuesInternal => _values; + #region ICollectionContext Members public int Count(IBslProcess process) diff --git a/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs b/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs index 565c6568d..5dbc8c407 100644 --- a/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs +++ b/src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs @@ -12,8 +12,6 @@ This Source Code Form is subject to the terms of the using OneScript.Exceptions; using OneScript.Language; using OneScript.Localization; -using OneScript.Types; -using ScriptEngine.Types; namespace ScriptEngine.Machine.Contexts { diff --git a/src/ScriptEngine/Machine/Contexts/GlobalContextBase.cs b/src/ScriptEngine/Machine/Contexts/GlobalContextBase.cs index 5d777f868..06ae83579 100644 --- a/src/ScriptEngine/Machine/Contexts/GlobalContextBase.cs +++ b/src/ScriptEngine/Machine/Contexts/GlobalContextBase.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; -using System.Linq; using OneScript.Contexts; using OneScript.Execution; using OneScript.Values; @@ -126,17 +125,20 @@ public void CallAsFunction(int methodNumber, IValue[] arguments, out IValue retV #region IAttachableContext members - public virtual void OnAttach(out IVariable[] variables, out BslMethodInfo[] methods) + IVariable IAttachableContext.GetVariable(int index) { - variables = new IVariable[GetPropCount()]; - for (int i = 0; i < variables.Length; i++) - { - variables[i] = Variable.CreateContextPropertyReference(this, i, GetPropName(i)); - } - - methods = this.GetMethods().ToArray(); + return Variable.CreateContextPropertyReference(this, index, GetPropName(index)); } + BslMethodInfo IAttachableContext.GetMethod(int index) + { + return GetMethodInfo(index); + } + + int IAttachableContext.VariablesCount => GetPropCount(); + + int IAttachableContext.MethodsCount => GetMethodsCount(); + public virtual int GetMethodsCount() { return Methods.Count; diff --git a/src/ScriptEngine/Machine/Contexts/PropertyTarget.cs b/src/ScriptEngine/Machine/Contexts/PropertyTarget.cs new file mode 100644 index 000000000..be25b109b --- /dev/null +++ b/src/ScriptEngine/Machine/Contexts/PropertyTarget.cs @@ -0,0 +1,169 @@ +/*---------------------------------------------------------- +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.Linq; +using System.Reflection; +using OneScript.Contexts; +using OneScript.Exceptions; + +namespace ScriptEngine.Machine.Contexts +{ + public class PropertyTarget + { + private readonly ContextPropertyInfo _propertyInfo; + private volatile bool _deprecationIsWarned = false; + + internal PropertyTarget(ContextPropertyInfo propInfo) + { + _propertyInfo = 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); + + if (_propertyInfo.IsForbiddenToUse) + { + return inst => throw RuntimeException.DeprecatedPropertyAccess(Name); + } + + if (_propertyInfo.IsDeprecated) + { + return (inst) => + { + if (!_deprecationIsWarned) + { + SystemLogger.Write($"ВНИМАНИЕ! Обращение к устаревшему свойству {Name}"); + _deprecationIsWarned = true; + } + + return ConvertReturnValue(method(inst)); + }; + } + else + { + return inst => ConvertReturnValue(method(inst)); + } + } + + private Action CreateSetter(MethodInfo methInfo) + { + var method = (Action)Delegate.CreateDelegate(typeof(Action), methInfo); + + if (_propertyInfo.IsForbiddenToUse) + { + return (inst, val) => throw RuntimeException.DeprecatedPropertyAccess(Name); + } + + if (_propertyInfo.IsDeprecated) + { + return (inst, val) => + { + if (!_deprecationIsWarned) + { + SystemLogger.Write($"ВНИМАНИЕ! Обращение к устаревшему свойству {Name}"); + _deprecationIsWarned = true; + } + + method(inst, ConvertParam(val)); + }; + } + else + { + return (inst, val) => method(inst, ConvertParam(val)); + } + } + + private static T ConvertParam(IValue value) + { + return ContextValuesMarshaller.ConvertValueStrict(value); + } + + private static IValue ConvertReturnValue(TRet param) + { + return ContextValuesMarshaller.ConvertReturnValue(param); + } + + } +} \ No newline at end of file diff --git a/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs b/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs index 82e2a0e8a..49d473c3a 100644 --- a/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs +++ b/src/ScriptEngine/Machine/Contexts/ScriptDrivenObject.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using OneScript.Contexts; using OneScript.Exceptions; using OneScript.Execution; @@ -98,8 +97,7 @@ private void ClearSearchCaches() protected abstract int GetOwnVariableCount(); protected abstract int GetOwnMethodCount(); - protected abstract void UpdateState(); - + public bool MethodDefinedInScript(int index) { return index >= METHOD_COUNT; @@ -223,39 +221,20 @@ protected virtual IValue CallOwnFunction(int index, IValue[] arguments, IBslProc #region IAttachableContext Members - public void OnAttach(out IVariable[] variables, out BslMethodInfo[] methods) + IVariable IAttachableContext.GetVariable(int index) { - UpdateState(); - - variables = _state; - methods = AttachMethods(); + return _state[index]; } - private BslMethodInfo[] AttachMethods() + BslMethodInfo IAttachableContext.GetMethod(int index) { - if (_attachableMethods != null) - return _attachableMethods; - - int totalMethods = METHOD_COUNT + _module.Methods.Count; - _attachableMethods = new BslMethodInfo[totalMethods]; - - var moduleMethods = _module.Methods; - - for (int i = 0; i < totalMethods; i++) - { - if (MethodDefinedInScript(i)) - { - _attachableMethods[i] = moduleMethods[i - METHOD_COUNT]; - } - else - { - _attachableMethods[i] = GetOwnMethod(i); - } - } - - return _attachableMethods; + return GetMethodInfo(index); } + int IAttachableContext.VariablesCount => _state.Length; + + int IAttachableContext.MethodsCount => GetMethodsCount(); + #endregion #region IRuntimeContextInstance Members diff --git a/src/ScriptEngine/Machine/Contexts/ScriptedEnumeratorWrapper.cs b/src/ScriptEngine/Machine/Contexts/ScriptedEnumeratorWrapper.cs index 31bb276e2..4589b532f 100644 --- a/src/ScriptEngine/Machine/Contexts/ScriptedEnumeratorWrapper.cs +++ b/src/ScriptEngine/Machine/Contexts/ScriptedEnumeratorWrapper.cs @@ -8,7 +8,6 @@ This Source Code Form is subject to the terms of the using System; using System.Collections; using System.Collections.Generic; -using System.Linq; using OneScript.Contexts; using OneScript.Exceptions; using OneScript.Execution; diff --git a/src/ScriptEngine/Machine/Contexts/SystemPropertyInfo.cs b/src/ScriptEngine/Machine/Contexts/SystemPropertyInfo.cs new file mode 100644 index 000000000..bb5433404 --- /dev/null +++ b/src/ScriptEngine/Machine/Contexts/SystemPropertyInfo.cs @@ -0,0 +1,125 @@ +/*---------------------------------------------------------- +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.Globalization; +using System.Reflection; +using OneScript.Contexts; +using OneScript.Values; + +namespace ScriptEngine.Machine.Contexts +{ + public class SystemPropertyInfo : BslPropertyInfo, ISupportsDeprecation + { + private string _name; + private string _alias; + private Type _declaringType; + private Type _propertyType; + + internal class Builder + { + private readonly SystemPropertyInfo _info; + + public Builder(string name, string alias = null) + { + _info = new SystemPropertyInfo(); + + _info._name = name; + _info._alias = alias; + _info._declaringType = typeof(PropertyBag); + _info._propertyType = typeof(BslValue); + } + + public Builder SetDeclaringType(Type declaringType) + { + _info._declaringType = declaringType; + return this; + } + + public Builder SetPropertyType(Type propertyType) + { + _info._propertyType = propertyType; + return this; + } + + public Builder SetDeprecated(bool isDeprecated) + { + _info.IsDeprecated = isDeprecated; + return this; + } + + public SystemPropertyInfo Build() + { + return _info; + } + } + + private SystemPropertyInfo() + { + + } + + + // ReSharper disable once ConvertToAutoProperty + public override Type DeclaringType => _declaringType; + // ReSharper disable once ConvertToAutoProperty + public override string Name => _name; + // ReSharper disable once ConvertToAutoProperty + public override string Alias => _alias; + + public bool IsDeprecated { get; private set; } + + public override bool Equals(BslPropertyInfo other) + { + if (! (other is SystemPropertyInfo gcProp)) + return false; + + return gcProp._name == _name && + gcProp._alias == _alias && + gcProp._declaringType == _declaringType && + gcProp._propertyType == _propertyType; + } + + public override Type ReflectedType => _declaringType; + + public override MethodInfo[] GetAccessors(bool nonPublic) + { + throw new NotImplementedException(); + } + + public override MethodInfo GetGetMethod(bool nonPublic) + { + throw new NotImplementedException(); + } + + public override ParameterInfo[] GetIndexParameters() + { + throw new NotImplementedException(); + } + + public override MethodInfo GetSetMethod(bool nonPublic) + { + throw new NotImplementedException(); + } + + public override object GetValue(object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) + { + throw new NotImplementedException(); + } + + public override void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, + CultureInfo culture) + { + throw new NotImplementedException(); + } + + public override PropertyAttributes Attributes { get; } + public override bool CanRead => true; + public override bool CanWrite => false; + public override Type PropertyType => _propertyType; + } +} \ No newline at end of file diff --git a/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs b/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs index 69681922c..ed5171fd2 100644 --- a/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs +++ b/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs @@ -280,10 +280,6 @@ protected override int GetOwnVariableCount() return base.GetOwnVariableCount() + (_ownProperties?.Count ?? 0); } - protected override void UpdateState() - { - } - protected override bool IsOwnPropReadable(int index) { if (_ownProperties == null) diff --git a/src/ScriptEngine/Machine/Debugger/DisabledDebugSession.cs b/src/ScriptEngine/Machine/Debugger/DisabledDebugSession.cs new file mode 100644 index 000000000..89370e8dc --- /dev/null +++ b/src/ScriptEngine/Machine/Debugger/DisabledDebugSession.cs @@ -0,0 +1,61 @@ +/*---------------------------------------------------------- +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 ScriptEngine.Machine.Debugger +{ + public sealed class DisabledDebugSession : IDebugSession + { + public IBreakpointManager BreakpointManager { get; } = new NoOpBreakpointManager(); + public IThreadEventsListener ThreadManager { get; } = new NoOpThreadEventsListener(); + public bool IsActive => false; + + public void WaitReadyToRun() + { + } + public void Dispose() + { + } + + private class NoOpBreakpointManager : IBreakpointManager + { + public void SetExceptionBreakpoints((string Id, string Condition)[] filters) + { + } + + public void SetBreakpoints(string module, (int Line, string Condition)[] breakpoints) + { + } + + public bool StopOnAnyException(string message) => false; + + public bool StopOnUncaughtException(string message) => false; + + public bool FindBreakpoint(string module, int line) => false; + + public string GetCondition(string module, int line) => ""; + + public void Clear() + { + } + } + + private class NoOpThreadEventsListener : IThreadEventsListener + { + public void ThreadStarted(int threadId, MachineInstance machine) + { + } + + public void ThreadStopped(int threadId, MachineStopReason reason, string errorMessage) + { + } + + public void ThreadExited(int threadId) + { + } + } + } +} \ No newline at end of file diff --git a/src/ScriptEngine/Machine/Debugger/DisabledDebugger.cs b/src/ScriptEngine/Machine/Debugger/DisabledDebugger.cs new file mode 100644 index 000000000..bea5f62f0 --- /dev/null +++ b/src/ScriptEngine/Machine/Debugger/DisabledDebugger.cs @@ -0,0 +1,27 @@ +/*---------------------------------------------------------- +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 ScriptEngine.Machine.Debugger +{ + /// + /// Отладчик, который ничего не делает. Заглушка для выключенного отладчика. + /// + public class DisabledDebugger : IDebugger + { + public bool IsEnabled => false; + + public void Start() + { + } + + public IDebugSession GetSession() => new DisabledDebugSession(); + + public void NotifyProcessExit(int exitCode) + { + } + } +} \ No newline at end of file diff --git a/src/ScriptEngine/Machine/IBreakpointManager.cs b/src/ScriptEngine/Machine/Debugger/IBreakpointManager.cs similarity index 100% rename from src/ScriptEngine/Machine/IBreakpointManager.cs rename to src/ScriptEngine/Machine/Debugger/IBreakpointManager.cs diff --git a/src/ScriptEngine/Machine/Debugger/IDebugController.cs b/src/ScriptEngine/Machine/Debugger/IDebugController.cs new file mode 100644 index 000000000..471ab5c92 --- /dev/null +++ b/src/ScriptEngine/Machine/Debugger/IDebugController.cs @@ -0,0 +1,38 @@ +/*---------------------------------------------------------- +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 ScriptEngine.Machine.Debugger; + +namespace ScriptEngine.Machine +{ + /// + /// Управляет возможностью отладки на уровне всего хост-процесса. + /// + public interface IDebugController : IDisposable + { + /// + /// Начинает слушать входящие подключения со стороны IDE. + /// + void ListenConnections(); + + /// + /// Блокирует поток до момента подключения от IDE. + /// + void WaitForSession(); + + /// + /// Уведомляет IDE о завершении отлаживаемого процесса. + /// + /// код выхода приложения + void NotifyProcessExit(int exitCode); + + IBreakpointManager BreakpointManager { get; } + + IThreadEventsListener ThreadManager { get; } + } +} diff --git a/src/ScriptEngine/Machine/IDebugPresentationAcceptor.cs b/src/ScriptEngine/Machine/Debugger/IDebugPresentationAcceptor.cs similarity index 100% rename from src/ScriptEngine/Machine/IDebugPresentationAcceptor.cs rename to src/ScriptEngine/Machine/Debugger/IDebugPresentationAcceptor.cs diff --git a/src/ScriptEngine/Machine/Debugger/IDebugSession.cs b/src/ScriptEngine/Machine/Debugger/IDebugSession.cs new file mode 100644 index 000000000..a1ffd1197 --- /dev/null +++ b/src/ScriptEngine/Machine/Debugger/IDebugSession.cs @@ -0,0 +1,40 @@ +/*---------------------------------------------------------- +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 ScriptEngine.Machine.Debugger +{ + public interface IDebugSession : IDisposable + { + /// + /// Поставщик точек останова для машины. + /// + IBreakpointManager BreakpointManager { get; } + + /// + /// Уведомляет о создании или завершении потоков. + /// + IThreadEventsListener ThreadManager { get; } + + /// + /// Ожидает явной команды Execute от IDE. + /// В процессе запуска IDE устанавливает точки останова и присылает команду Execute, + /// запускающую поток исполнения. К моменту исполнения самой первой строчки кода + /// все точки останова уже заданы и мы можем ожидать их срабатывания. + /// + /// Метод не блокируется, если сессия отладки запущена в режиме attach. + /// Метод блокируется в т.ч. если сессия отладки не начата вообще. + /// + void WaitReadyToRun(); + + /// + /// Указывает, что сессия отладки активна (инициирована со стороны IDE). + /// + bool IsActive { get; } + } +} \ No newline at end of file diff --git a/src/ScriptEngine/Machine/IDebugValueVisitor.cs b/src/ScriptEngine/Machine/Debugger/IDebugValueVisitor.cs similarity index 100% rename from src/ScriptEngine/Machine/IDebugValueVisitor.cs rename to src/ScriptEngine/Machine/Debugger/IDebugValueVisitor.cs diff --git a/src/ScriptEngine/Machine/Debugger/IDebugger.cs b/src/ScriptEngine/Machine/Debugger/IDebugger.cs new file mode 100644 index 000000000..685c41597 --- /dev/null +++ b/src/ScriptEngine/Machine/Debugger/IDebugger.cs @@ -0,0 +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/. +----------------------------------------------------------*/ + +namespace ScriptEngine.Machine.Debugger +{ + /// + /// Основной фасад функциональности отладки. + /// Управляет стартом и остановкой отладки. + /// + public interface IDebugger + { + /// + /// Возвращает true, если отладка в процессе возможна. + /// + bool IsEnabled { get; } + + /// + /// Запускает отладчик. С этого момента к отладчику можно подключиться. + /// + void Start(); + + /// + /// Получает текущую сессию отладки. + /// + IDebugSession GetSession(); + + /// + /// Уведомляет IDE о завершении отлаживаемого процесса. + /// + /// код выхода приложения + void NotifyProcessExit(int exitCode); + } +} \ No newline at end of file diff --git a/src/ScriptEngine/Machine/IThreadManager.cs b/src/ScriptEngine/Machine/Debugger/IThreadEventsListener.cs similarity index 79% rename from src/ScriptEngine/Machine/IThreadManager.cs rename to src/ScriptEngine/Machine/Debugger/IThreadEventsListener.cs index a20c68354..fe34468a9 100644 --- a/src/ScriptEngine/Machine/IThreadManager.cs +++ b/src/ScriptEngine/Machine/Debugger/IThreadEventsListener.cs @@ -5,19 +5,15 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System; -using System.Collections.Generic; - -namespace ScriptEngine.Machine +namespace ScriptEngine.Machine.Debugger { /// /// Менеджер состояния и количества потоков для отладчика /// - public interface IThreadManager : IDisposable + public interface IThreadEventsListener { void ThreadStarted(int threadId, MachineInstance machine); void ThreadStopped(int threadId, MachineStopReason reason, string errorMessage); void ThreadExited(int threadId); - IEnumerable GetThreadIds(); } } \ No newline at end of file diff --git a/src/ScriptEngine/Machine/DefaultTypeManager.cs b/src/ScriptEngine/Machine/DefaultTypeManager.cs index 0f4c9892e..db89f2ba5 100644 --- a/src/ScriptEngine/Machine/DefaultTypeManager.cs +++ b/src/ScriptEngine/Machine/DefaultTypeManager.cs @@ -9,7 +9,6 @@ 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.Types; diff --git a/src/ScriptEngine/Machine/EvalExecLocalContext.cs b/src/ScriptEngine/Machine/EvalExecLocalContext.cs new file mode 100644 index 000000000..68a35ee7f --- /dev/null +++ b/src/ScriptEngine/Machine/EvalExecLocalContext.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.Contexts; +using ScriptEngine.Machine.Contexts; + +namespace ScriptEngine.Machine +{ + internal class EvalExecLocalContext : ContextIValueImpl, IAttachableContext + { + private readonly IVariable[] _locals; + + public EvalExecLocalContext(IVariable[] locals) + { + _locals = locals; + } + + public IVariable GetVariable(int index) => _locals[index]; + + public BslMethodInfo GetMethod(int index) + { + throw new ArgumentOutOfRangeException(); + } + + int IAttachableContext.VariablesCount => _locals.Length; + + int IAttachableContext.MethodsCount => 0; + } +} \ No newline at end of file diff --git a/src/ScriptEngine/Machine/EvalExecLocalScope.cs b/src/ScriptEngine/Machine/EvalExecLocalScope.cs deleted file mode 100644 index 7d6e70dc9..000000000 --- a/src/ScriptEngine/Machine/EvalExecLocalScope.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 System; -using OneScript.Contexts; -using OneScript.Execution; -using ScriptEngine.Machine.Contexts; - -namespace ScriptEngine.Machine -{ - internal class EvalExecLocalScope : ScriptDrivenObject, IAttachableContext - { - public EvalExecLocalScope(IExecutableModule module) : base(module, false) - { - } - - void IAttachableContext.OnAttach(out IVariable[] variables, out BslMethodInfo[] methods) - { - variables = Array.Empty(); - methods = Array.Empty(); - } - - protected override int GetOwnVariableCount() => 0; - - protected override int GetOwnMethodCount() => 0; - - protected override void UpdateState() - { - } - } -} \ No newline at end of file diff --git a/src/ScriptEngine/Machine/ExecutionFrame.cs b/src/ScriptEngine/Machine/ExecutionFrame.cs index 72f4e7f4a..7949493e7 100644 --- a/src/ScriptEngine/Machine/ExecutionFrame.cs +++ b/src/ScriptEngine/Machine/ExecutionFrame.cs @@ -24,9 +24,9 @@ internal class ExecutionFrame public readonly Stack LocalFrameStack = new Stack(); - public AttachedContext ThisScope { get; set; } + public IAttachableContext ThisScope { get; set; } - public IReadOnlyList Scopes { get; set; } + public IReadOnlyList Scopes { get; set; } public override string ToString() { diff --git a/src/ScriptEngine/Machine/GenericIValueComparer.cs b/src/ScriptEngine/Machine/GenericIValueComparer.cs index 4cb632e59..5d913a5dd 100644 --- a/src/ScriptEngine/Machine/GenericIValueComparer.cs +++ b/src/ScriptEngine/Machine/GenericIValueComparer.cs @@ -5,14 +5,36 @@ 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 OneScript.Values; using ScriptEngine.Machine.Contexts; +using OneScript.Execution; +using OneScript.Types; namespace ScriptEngine.Machine { public class GenericIValueComparer : IEqualityComparer, IComparer { + private readonly IBslProcess _process; + private readonly Func _comparer; + + static private readonly ListorderedTypes = new List + { BasicTypes.Undefined, BasicTypes.Null, BasicTypes.Boolean, + BasicTypes.Number, BasicTypes.String, BasicTypes.Date, BasicTypes.Type }; + + private const int INDEX_OF_TYPE = 6; + + public GenericIValueComparer() + { + _comparer = CompareAsStrings; + } + + public GenericIValueComparer(IBslProcess proc) + { + _process = proc; + _comparer = CompareByPresentations; + } public bool Equals(IValue x, IValue y) { @@ -37,15 +59,51 @@ public int GetHashCode(IValue obj) return CLR_obj.GetHashCode(); } + private int CompareAsStrings(IValue x, IValue y) + { + return x.ToString().CompareTo(y.ToString()); + } + + private int CompareByPresentations(IValue x, IValue y) + { + return ((BslValue)x).ToString(_process).CompareTo(((BslValue)y).ToString(_process)); + } + + /// + /// Сравнение переменных разных типов. Правила сравнения соответствуют 1С v8.3.27: + /// Переменные типа "Тип" следуют за всеми прочими; + /// Другие примитивные типы предшествуют объектным типам; + /// Между собой примитивные типы упорядочиваются в последовательности, указанной в orderedTypes; + /// Объектные типы упорядочиваются по строковому представлению. + /// + private int CompareByTypes(IValue x, IValue y) + { + var ix = orderedTypes.IndexOf(x.SystemType); + var iy = orderedTypes.IndexOf(y.SystemType); + + if (ix >= 0) + if (iy >= 0) + return ix - iy; + else + return ix == INDEX_OF_TYPE ? 1 : -1; + else if (iy >= 0) + return iy == INDEX_OF_TYPE ? -1 : 1; + + return _comparer(x,y); + } + public int Compare(IValue x, IValue y) { - if (ReferenceEquals(x, default) && ReferenceEquals(y, default)) + if (ReferenceEquals(x, y)) return 0; - - if (x.SystemType == y.SystemType) + + if (x.SystemType != y.SystemType ) + return CompareByTypes(x,y); + + if (x is IBslComparable) return x.CompareTo(y); else - return x.ToString().CompareTo(y.ToString()); + return _comparer(x,y); } } } diff --git a/src/ScriptEngine/Machine/IDebugController.cs b/src/ScriptEngine/Machine/IDebugController.cs deleted file mode 100644 index d0e6b28d9..000000000 --- a/src/ScriptEngine/Machine/IDebugController.cs +++ /dev/null @@ -1,22 +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; - -namespace ScriptEngine.Machine -{ - public interface IDebugController : IDisposable - { - void Init(); - void Wait(); - void NotifyProcessExit(int exitCode); - - IBreakpointManager BreakpointManager { get; } - - IThreadManager ThreadManager { get; } - } -} diff --git a/src/ScriptEngine/Machine/RuntimeScopes.cs b/src/ScriptEngine/Machine/JoinedScopes.cs similarity index 58% rename from src/ScriptEngine/Machine/RuntimeScopes.cs rename to src/ScriptEngine/Machine/JoinedScopes.cs index da19966ad..60fb56c5d 100644 --- a/src/ScriptEngine/Machine/RuntimeScopes.cs +++ b/src/ScriptEngine/Machine/JoinedScopes.cs @@ -1,14 +1,13 @@ /*---------------------------------------------------------- -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 +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; using System.Collections.Generic; -using System.Linq; using OneScript.Contexts; namespace ScriptEngine.Machine @@ -16,22 +15,18 @@ namespace ScriptEngine.Machine /// /// Оборачивающий контейнер. Хранит внешние области видимости и одну локальную, как единый плоский список. /// - public class RuntimeScopes : IReadOnlyList + public class JoinedScopes : IReadOnlyList { - private readonly IReadOnlyList _outerScopes; - private readonly AttachedContext _innerScope; + private readonly IReadOnlyList _outerScopes; + private readonly IAttachableContext _innerScope; - private readonly int _outerScopeLast; - - public RuntimeScopes(IReadOnlyList outerScopes, AttachedContext innerScope) + public JoinedScopes(IReadOnlyList outerScopes, IAttachableContext innerScope) { - _outerScopes = outerScopes; - _innerScope = innerScope; - - _outerScopeLast = _outerScopes.Count - 1; + _outerScopes = outerScopes ?? throw new ArgumentNullException(nameof(outerScopes)); + _innerScope = innerScope ?? throw new ArgumentNullException(nameof(innerScope)); } - public IEnumerator GetEnumerator() + public IEnumerator GetEnumerator() { foreach (var scope in _outerScopes) { @@ -48,18 +43,19 @@ IEnumerator IEnumerable.GetEnumerator() public int Count => _outerScopes.Count + 1; - public AttachedContext this[int index] + public IAttachableContext this[int index] { get { if (index < 0 || index >= Count) throw new IndexOutOfRangeException(); - if (index > _outerScopeLast) + if (index == _outerScopes.Count) return _innerScope; return _outerScopes[index]; } } } -} \ No newline at end of file +} + diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index fd34b0bfb..e9273669d 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -23,6 +23,7 @@ This Source Code Form is subject to the terms of the using OneScript.Types; using OneScript.Values; using ScriptEngine.Compiler; +using ScriptEngine.Machine.Debugger; namespace ScriptEngine.Machine { @@ -43,7 +44,7 @@ public class MachineInstance private IBslProcess _process; private ITypeManager _typeManager; - private AttachedContext[] _globalContexts; + private IRuntimeEnvironment _runtimeEnvironment; // для отладчика. // актуален в момент останова машины @@ -69,30 +70,39 @@ public void Setup(IBslProcess process) _process = process; _codeStatCollector = process.Services.TryResolve(); _typeManager = process.Services.Resolve(); - _globalContexts = process.Services.Resolve().AttachedContexts.Select(x => new AttachedContext(x)) - .ToArray(); + _runtimeEnvironment = process.Services.Resolve(); } internal IBslProcess Process => _process; - public void UpdateGlobals() + public bool IsRunning => _callStack.Count != 0; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private IReadOnlyList CreateRootFrameScopes(IAttachableContext thisScope) { - _globalContexts.ForEach(x => x.Attach()); + if (_runtimeEnvironment == null) + throw new InvalidOperationException("Runtime environment is not initialized"); + + var globals = _runtimeEnvironment.AttachedContexts; + return new JoinedScopes(globals, thisScope); } - - public bool IsRunning => _callStack.Count != 0; [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static IReadOnlyList CreateFrameScopes(IReadOnlyList outerScopes, AttachedContext thisScope) - => new RuntimeScopes(outerScopes, thisScope); + private static IReadOnlyList CreateFrameScopes(IReadOnlyList outerScopes, IAttachableContext thisScope) + { + if (outerScopes == null) + throw new ArgumentNullException(nameof(outerScopes)); + + return new JoinedScopes(outerScopes, thisScope); + } internal IValue ExecuteMethod(IRunnable sdo, MachineMethodInfo methodInfo, IValue[] arguments) { var module = sdo.Module as StackRuntimeModule; Debug.Assert(module != null); - var thisScope = new AttachedContext(sdo); - var scopes = CreateFrameScopes(_globalContexts, thisScope); + var thisScope = sdo; + var scopes = CreateRootFrameScopes(thisScope); var frame = new ExecutionFrame { @@ -176,7 +186,7 @@ private void SetExecutionFrame(ExecutionFrame frame, MachineMethodInfo methodInf #region Debug protocol methods [MethodImpl(MethodImplOptions.Synchronized)] - public void SetDebugMode(IThreadManager threadManager, IBreakpointManager breakpointManager) + public void SetDebugMode(IThreadEventsListener threadManager, IBreakpointManager breakpointManager) { if (!_debugEnabled) { @@ -219,7 +229,7 @@ public IValue Evaluate(string expression) { var code = CompileCached(expression, CompileExpressionModule); - var localScope = new AttachedContext(new EvalExecLocalScope(code), _currentFrame.Locals); + IAttachableContext localScope = new EvalExecLocalContext(_currentFrame.Locals); var frame = new ExecutionFrame { @@ -249,7 +259,7 @@ internal BslValue EvaluateInFrame(string expression, ExecutionFrame selectedFram MachineInstance runner = new MachineInstance { _process = this._process, - _globalContexts = this._globalContexts, + _runtimeEnvironment = this._runtimeEnvironment, _typeManager = this._typeManager, _debugInfo = CurrentScript }; @@ -260,7 +270,7 @@ internal BslValue EvaluateInFrame(string expression, ExecutionFrame selectedFram var code = runner.CompileExpressionModule(expression); - var localScope = new AttachedContext(new EvalExecLocalScope(code), selectedFrame.Locals); + IAttachableContext localScope = new EvalExecLocalContext(selectedFrame.Locals); frame = new ExecutionFrame { @@ -343,7 +353,7 @@ private void Reset() _currentFrame = null; _process = null; _typeManager = null; - _globalContexts = null; + _runtimeEnvironment = null; } private void PrepareCodeStatisticsData(StackRuntimeModule _module) @@ -660,8 +670,9 @@ private void InitCommands() private void PushVar(int arg) { var binding = _module.VariableRefs[arg]; - var scope = _currentFrame.Scopes[binding.ScopeNumber]; - _operationStack.Push(scope.Variables[binding.MemberNumber]); + var target = ResolveBindingTarget(binding); + _operationStack.Push(target.GetVariable(binding.MemberNumber)); + NextInstruction(); } @@ -704,8 +715,10 @@ private void PushLoc(int arg) private void PushRef(int arg) { var binding = _module.VariableRefs[arg]; - var scope = _currentFrame.Scopes[binding.ScopeNumber]; - var reference = Variable.CreateContextPropertyReference(scope.Instance, binding.MemberNumber, "$stackvar"); + + var target = ResolveBindingTarget(binding); + var reference = Variable.CreateContextPropertyReference(target, binding.MemberNumber, "$stackvar"); + _operationStack.Push(reference); NextInstruction(); } @@ -713,8 +726,9 @@ private void PushRef(int arg) private void LoadVar(int arg) { var binding = _module.VariableRefs[arg]; - var scope = _currentFrame.Scopes[binding.ScopeNumber]; - scope.Variables[binding.MemberNumber].Value = PopRawValue(); + var target = ResolveBindingTarget(binding); + target.GetVariable(binding.MemberNumber).Value = PopRawValue(); + NextInstruction(); } @@ -898,17 +912,18 @@ private IValue[] PopArguments() private bool MethodCallImpl(int arg, bool asFunc) { var methodRef = _module.MethodRefs[arg]; - var scope = _currentFrame.Scopes[methodRef.ScopeNumber]; - var methodSignature = scope.Methods[methodRef.MemberNumber]; + + var boundInstance = ResolveBindingTarget(methodRef); + var methodSignature = boundInstance.GetMethod(methodRef.MemberNumber); IValue[] argValues = PopArguments(); var definedParameters = methodSignature.GetBslParameters(); bool needsDiscarding; - if (scope == _currentFrame.ThisScope) // local call + if (ReferenceEquals(boundInstance, _currentFrame.ThisScope)) // local call { - var sdo = scope.Instance as ScriptDrivenObject; + var sdo = boundInstance as ScriptDrivenObject; System.Diagnostics.Debug.Assert(sdo != null); if (sdo.MethodDefinedInScript(methodRef.MemberNumber)) @@ -920,7 +935,7 @@ private bool MethodCallImpl(int arg, bool asFunc) var frame = new ExecutionFrame { Module = _module, - ThisScope = scope, + ThisScope = _currentFrame.ThisScope, Scopes = _currentFrame.Scopes }; SetExecutionFrame(frame, methodInfo, argValues); @@ -930,7 +945,7 @@ private bool MethodCallImpl(int arg, bool asFunc) else { needsDiscarding = _currentFrame.DiscardReturnValue; - CallContext(scope.Instance, methodRef.MemberNumber, definedParameters, argValues, asFunc); + CallContext(boundInstance, methodRef.MemberNumber, definedParameters, argValues, asFunc); } } else @@ -939,7 +954,7 @@ private bool MethodCallImpl(int arg, bool asFunc) // статус вызова текущего frames не должен изменяться. // needsDiscarding = _currentFrame.DiscardReturnValue; - CallContext(scope.Instance, methodRef.MemberNumber, definedParameters, argValues, asFunc); + CallContext(boundInstance, methodRef.MemberNumber, definedParameters, argValues, asFunc); } return needsDiscarding; @@ -1376,7 +1391,7 @@ private void Execute(int arg) return; } - var localScope = new AttachedContext(new EvalExecLocalScope(module), _currentFrame.Locals); + IAttachableContext localScope = new EvalExecLocalContext(_currentFrame.Locals); var scopes = CreateFrameScopes(_currentFrame.Scopes, localScope); var mi = (MachineMethodInfo)module.Methods[0]; @@ -1458,7 +1473,7 @@ private void PrepareHandlerOperationArgs(bool useExportMode, else { handlerMethod = PopRawBslValue().ToString(_process); - handlerTarget = _currentFrame.ThisScope.Instance; + handlerTarget = _currentFrame.ThisScope; eventName = PopRawBslValue().ToString(_process); eventSource = _operationStack.Pop().AsObject(); } @@ -1781,7 +1796,7 @@ private void StrReplace(int arg) var searchVal = PopRawBslValue().ToString(_process); var sourceString = PopRawBslValue().ToString(_process); - var result = sourceString.Replace(searchVal, newVal); + var result = !string.IsNullOrEmpty(searchVal) ? sourceString.Replace(searchVal, newVal) : sourceString; _operationStack.Push(ValueFactory.Create(result)); NextInstruction(); } @@ -2440,20 +2455,46 @@ private StackRuntimeModule CompileExecutionBatchModule(string execBatch) private SymbolTable ExtractCompilerContext() { var ctx = new SymbolTable(); - - var scopes = _currentFrame.Scopes; - foreach (var scope in scopes) + var scopes = _currentFrame.Scopes ?? Array.Empty(); + var scopeCount = scopes.Count; + var thisScope = _currentFrame.ThisScope; + + // Добавляем все контексты из scopes (глобальные + локальные из предыдущих кадров) + for (int index = 0; index < scopeCount; index++) { + var scope = scopes[index]; + var symbolScope = new SymbolScope(); - foreach (var methodInfo in scope.Methods) + + // Добавляем методы + for (int i = 0; i < scope.MethodsCount; i++) { + var methodInfo = scope.GetMethod(i); symbolScope.DefineMethod(methodInfo.ToSymbol()); } - foreach (var variable in scope.Variables) + + // Добавляем переменные + for (int i = 0; i < scope.VariablesCount; i++) { - if (variable.SystemType.Alias != null) + var variable = scope.GetVariable(i); + + string alias = null; + if (scope is IRuntimeContextInstance runtimeContext) + { + try + { + var propInfo = runtimeContext.GetPropertyInfo(i); + alias = propInfo.Alias; + } + catch + { + // Алиас остается пустым + } + } + + if (alias != null) { - symbolScope.DefineVariable(new AliasedVariableSymbol(variable.Name, variable.SystemType.Alias)); + symbolScope.DefineVariable(new AliasedVariableSymbol(variable.Name, alias)); } else { @@ -2461,19 +2502,26 @@ private SymbolTable ExtractCompilerContext() } } - ctx.PushScope(symbolScope, scope.Instance); + ctx.PushScope(symbolScope, ScopeBindingDescriptor.FrameScope(index)); } + // Локальные переменные текущего фрейма var locals = new SymbolScope(); foreach (var variable in _currentFrame.Locals) { locals.DefineVariable(new LocalVariableSymbol(variable.Name)); } - ctx.PushScope(locals, _currentFrame.ThisScope.Instance); + ctx.PushScope(locals, ScopeBindingDescriptor.ThisScope()); return ctx; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private IAttachableContext ResolveBindingTarget(ModuleSymbolBinding binding) + { + return binding.ResolveTarget(_currentFrame); + } + private void NextInstruction() { _currentFrame.InstructionPointer++; diff --git a/src/ScriptEngine/Machine/MachineStopManager.cs b/src/ScriptEngine/Machine/MachineStopManager.cs index 5462a4803..bfd2e7b88 100644 --- a/src/ScriptEngine/Machine/MachineStopManager.cs +++ b/src/ScriptEngine/Machine/MachineStopManager.cs @@ -7,6 +7,7 @@ This Source Code Form is subject to the terms of the using System; using System.Linq; +using ScriptEngine.Machine.Debugger; namespace ScriptEngine.Machine { @@ -21,19 +22,13 @@ internal enum DebugState internal class MachineStopManager { - private struct StopPoint - { - public ExecutionFrame frame; - public int line; - } - private DebugState _currentState = DebugState.Running; private readonly IBreakpointManager _breakpoints; private readonly MachineInstance _machine; - private readonly IThreadManager _threadManager; + private readonly IThreadEventsListener _threadManager; private ExecutionFrame[] _stopFrames; - public MachineStopManager(MachineInstance runner, IThreadManager threadManager, IBreakpointManager breakpoints) + public MachineStopManager(MachineInstance runner, IThreadEventsListener threadManager, IBreakpointManager breakpoints) { _machine = runner ?? throw new ArgumentNullException(nameof(runner)); _threadManager = threadManager; diff --git a/src/ScriptEngine/Machine/MachineStopReason.cs b/src/ScriptEngine/Machine/MachineStopReason.cs index 69adc712f..99284dbef 100644 --- a/src/ScriptEngine/Machine/MachineStopReason.cs +++ b/src/ScriptEngine/Machine/MachineStopReason.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.Threading; - namespace ScriptEngine.Machine { public enum MachineStopReason diff --git a/src/ScriptEngine/Machine/ModuleSymbolBinding.cs b/src/ScriptEngine/Machine/ModuleSymbolBinding.cs new file mode 100644 index 000000000..cecb8e329 --- /dev/null +++ b/src/ScriptEngine/Machine/ModuleSymbolBinding.cs @@ -0,0 +1,62 @@ +/*---------------------------------------------------------- +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.Compilation.Binding; + +namespace ScriptEngine.Machine +{ + public struct ModuleSymbolBinding : IEquatable + { + public IAttachableContext Target { get; set; } + + public int MemberNumber { get; set; } + + public ScopeBindingKind Kind { get; set; } + + public int ScopeIndex { get; set; } + + internal IAttachableContext ResolveTarget(ExecutionFrame frame) + { + return Kind switch + { + ScopeBindingKind.FrameScope => ResolveFrameScope(frame), + ScopeBindingKind.ThisScope => frame.ThisScope, + _ => Target + }; + } + + private IAttachableContext ResolveFrameScope(ExecutionFrame frame) + { + if (frame?.Scopes == null) + throw new InvalidOperationException("Frame scopes are not available"); + if (ScopeIndex < 0 || ScopeIndex >= frame.Scopes.Count) + throw new InvalidOperationException($"Invalid scope index {ScopeIndex}"); + + return frame.Scopes[ScopeIndex]; + } + + public bool Equals(ModuleSymbolBinding other) + { + return ReferenceEquals(Target, other.Target) + && MemberNumber == other.MemberNumber + && Kind == other.Kind + && ScopeIndex == other.ScopeIndex; + } + + public override bool Equals(object obj) + { + return obj is ModuleSymbolBinding other && Equals(other); + } + + public override int GetHashCode() + { + return HashCode.Combine(Target, MemberNumber, Kind, ScopeIndex); + } + } +} \ No newline at end of file diff --git a/src/ScriptEngine/Machine/ParametrizedRuntimeException.cs b/src/ScriptEngine/Machine/ParametrizedRuntimeException.cs index 097681de6..df038d0fb 100644 --- a/src/ScriptEngine/Machine/ParametrizedRuntimeException.cs +++ b/src/ScriptEngine/Machine/ParametrizedRuntimeException.cs @@ -6,7 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using OneScript.Exceptions; -using ScriptEngine.Machine.Contexts; namespace ScriptEngine.Machine { diff --git a/src/ScriptEngine/Machine/PropertyBag.cs b/src/ScriptEngine/Machine/PropertyBag.cs index c8eb8c91d..0cf2bbb4f 100644 --- a/src/ScriptEngine/Machine/PropertyBag.cs +++ b/src/ScriptEngine/Machine/PropertyBag.cs @@ -7,19 +7,15 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; using OneScript.Contexts; -using OneScript.Values; using ScriptEngine.Machine.Contexts; namespace ScriptEngine.Machine { - class PropertyBag : DynamicPropertiesAccessor, IAttachableContext + internal class PropertyBag : DynamicPropertiesAccessor, IAttachableContext { private readonly List _values = new List(); - private readonly List _definitions = new List(); - + public void Insert(IValue value, string identifier) { Insert(value, identifier, true, true); @@ -27,19 +23,11 @@ public void Insert(IValue value, string identifier) public int Insert(IValue value, string identifier, bool canRead, bool canWrite) { - var num = RegisterProperty(identifier); + var num = RegisterProperty(identifier, canRead, canWrite); if (num == _values.Count) { _values.Add(null); - _definitions.Add(BslPropertyBuilder.Create() - .Name(identifier) - .CanRead(canRead) - .CanWrite(canWrite) - .SetDispatchingIndex(num) - .ReturnType(typeof(BslValue)) - .Build() - ); } value ??= ValueFactory.Create(); @@ -49,14 +37,29 @@ public int Insert(IValue value, string identifier, bool canRead, bool canWrite) return num; } + public int Insert(IValue value, BslPropertyInfo definition) + { + var num = RegisterProperty(definition); + if (num == _values.Count) + { + _values.Add(null); + } + + value ??= ValueFactory.Create(); + + _values[num] = value; + + return num; + } + public override bool IsPropReadable(int propNum) { - return _definitions[propNum].CanRead; + return GetPropertyInfo(propNum).CanRead; } public override bool IsPropWritable(int propNum) { - return _definitions[propNum].CanWrite; + return GetPropertyInfo(propNum).CanWrite; } public override IValue GetPropValue(int propNum) @@ -68,12 +71,7 @@ public override void SetPropValue(int propNum, IValue newVal) { _values[propNum] = newVal; } - - public override BslPropertyInfo GetPropertyInfo(int propertyNumber) - { - return _definitions[propertyNumber]; - } - + public int Count => _values.Count; public override int GetMethodsCount() @@ -83,19 +81,14 @@ public override int GetMethodsCount() #region IAttachableContext Members - public void OnAttach(out IVariable[] variables, out BslMethodInfo[] methods) - { - variables = new IVariable[this.Count]; - var props = GetDynamicProperties().OrderBy(x => x.Value).Select(x=>x.Key).ToArray(); - Debug.Assert(props.Length == variables.Length); + IVariable IAttachableContext.GetVariable(int index) => + Variable.CreateContextPropertyReference(this, index, GetPropertyName(index)); + + BslMethodInfo IAttachableContext.GetMethod(int index) => throw new ArgumentOutOfRangeException(); - for (var i = 0; i < variables.Length; i++) - { - variables[i] = Variable.CreateContextPropertyReference(this, i, props[i]); - } - - methods = Array.Empty(); - } + int IAttachableContext.VariablesCount => this.Count; + + int IAttachableContext.MethodsCount => 0; #endregion } diff --git a/src/ScriptEngine/Machine/StackMachineExecutor.cs b/src/ScriptEngine/Machine/StackMachineExecutor.cs index 6934653f5..fb6aa2614 100644 --- a/src/ScriptEngine/Machine/StackMachineExecutor.cs +++ b/src/ScriptEngine/Machine/StackMachineExecutor.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using OneScript.Contexts; using OneScript.Execution; using OneScript.Values; +using ScriptEngine.Machine.Debugger; namespace ScriptEngine.Machine { @@ -28,11 +29,15 @@ public void BeforeProcessStart(IBslProcess process) _machine = new MachineInstance(); _machine.Setup(process); - var debugger = process.Services.TryResolve(); - if (debugger != default) + var debugger = process.Services.TryResolve(); + if (debugger?.IsEnabled == true) { - _machine.SetDebugMode(debugger.ThreadManager, debugger.BreakpointManager); - debugger.ThreadManager.ThreadStarted(process.VirtualThreadId, _machine); + var session = debugger.GetSession(); + if (session.IsActive) + { + _machine.SetDebugMode(session.ThreadManager, session.BreakpointManager); + session.ThreadManager.ThreadStarted(process.VirtualThreadId, _machine); + } } process.Services.Resolve().Machine = _machine; @@ -40,8 +45,15 @@ public void BeforeProcessStart(IBslProcess process) public void AfterProcessExit(IBslProcess process) { - var debugger = process.Services.TryResolve(); - debugger?.ThreadManager.ThreadExited(process.VirtualThreadId); + var debugger = process.Services.TryResolve(); + if (debugger?.IsEnabled != true) + return; + + var session = debugger.GetSession(); + if (session.IsActive) + { + session.ThreadManager.ThreadExited(process.VirtualThreadId); + } } private BslValue Executor(IBslProcess process, BslObjectValue target, IExecutableModule module, BslScriptMethodInfo method, IValue[] arguments) diff --git a/src/ScriptEngine/Machine/StackRuntimeAdoptionExtensions.cs b/src/ScriptEngine/Machine/StackRuntimeAdoptionExtensions.cs index 3afa430e7..d061c75e0 100644 --- a/src/ScriptEngine/Machine/StackRuntimeAdoptionExtensions.cs +++ b/src/ScriptEngine/Machine/StackRuntimeAdoptionExtensions.cs @@ -5,12 +5,10 @@ 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.Reflection; using OneScript.Contexts; using OneScript.Values; -using ScriptEngine.Machine.Contexts; namespace ScriptEngine.Machine { diff --git a/src/ScriptEngine/Machine/StackRuntimeModule.cs b/src/ScriptEngine/Machine/StackRuntimeModule.cs index 768478148..6f570b49d 100644 --- a/src/ScriptEngine/Machine/StackRuntimeModule.cs +++ b/src/ScriptEngine/Machine/StackRuntimeModule.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; -using OneScript.Compilation.Binding; using OneScript.Contexts; using OneScript.Execution; using OneScript.Sources; @@ -28,9 +27,9 @@ public StackRuntimeModule(Type ownerType) public List Constants { get; } = new List(); - internal IList VariableRefs { get; } = new List(); + internal IList VariableRefs { get; } = new List(); - internal IList MethodRefs { get; } = new List(); + internal IList MethodRefs { get; } = new List(); #region IExecutableModule members diff --git a/src/ScriptEngine/Machine/ValueFactory.cs b/src/ScriptEngine/Machine/ValueFactory.cs index 8ae0eb0f0..52101d3ec 100644 --- a/src/ScriptEngine/Machine/ValueFactory.cs +++ b/src/ScriptEngine/Machine/ValueFactory.cs @@ -9,7 +9,6 @@ This Source Code Form is subject to the terms of the using OneScript.Contexts; using OneScript.Exceptions; using OneScript.Execution; -using OneScript.Types; using OneScript.Values; namespace ScriptEngine.Machine diff --git a/src/ScriptEngine/NullDependencyResolver.cs b/src/ScriptEngine/NullDependencyResolver.cs index 454ccf430..763690c88 100644 --- a/src/ScriptEngine/NullDependencyResolver.cs +++ b/src/ScriptEngine/NullDependencyResolver.cs @@ -5,6 +5,8 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +#nullable enable +using OneScript.Compilation; using OneScript.Execution; using OneScript.Sources; @@ -13,12 +15,13 @@ namespace ScriptEngine // ReSharper disable once ClassNeverInstantiated.Global internal class NullDependencyResolver : IDependencyResolver { - public void Resolve(SourceCode module, string libraryName, IBslProcess process) + public PackageInfo? Resolve(SourceCode module, string libraryName, IBslProcess process) { + return null; } public void Initialize(ScriptingEngine engine) { } } -} \ No newline at end of file +} diff --git a/src/ScriptEngine/OneScriptCoreOptions.cs b/src/ScriptEngine/OneScriptCoreOptions.cs index 222ef74a2..7d90b0793 100644 --- a/src/ScriptEngine/OneScriptCoreOptions.cs +++ b/src/ScriptEngine/OneScriptCoreOptions.cs @@ -20,6 +20,7 @@ public class OneScriptCoreOptions private const string SYSTEM_LANGUAGE_KEY = "SystemLanguage"; private const string PREPROCESSOR_DEFINITIONS_KEY = "preprocessor.define"; private const string DEFAULT_RUNTIME_KEY = "runtime.default"; + private const string EXPLICIT_IMPORT = "lang.explicitImports"; public OneScriptCoreOptions(KeyValueConfig config) { @@ -27,6 +28,7 @@ public OneScriptCoreOptions(KeyValueConfig config) FileReaderEncoding = SetupEncoding(config[FILE_READER_ENCODING]); PreprocessorDefinitions = SetupDefinitions(config[PREPROCESSOR_DEFINITIONS_KEY]); UseNativeAsDefaultRuntime = SetupDefaultRuntime(config[DEFAULT_RUNTIME_KEY]); + ExplicitImports = SetupExplicitImports(config[EXPLICIT_IMPORT]); } public string SystemLanguage { get; } @@ -35,7 +37,9 @@ public OneScriptCoreOptions(KeyValueConfig config) public bool UseNativeAsDefaultRuntime { get; } - public IEnumerable PreprocessorDefinitions { get; set; } + public IEnumerable PreprocessorDefinitions { get; } + + public ExplicitImportsBehavior ExplicitImports { get; } private static IEnumerable SetupDefinitions(string s) { @@ -46,16 +50,34 @@ private static Encoding SetupEncoding(string openerEncoding) { if (string.IsNullOrWhiteSpace(openerEncoding)) return Encoding.UTF8; - - if (StringComparer.InvariantCultureIgnoreCase.Compare(openerEncoding, "default") == 0) - return FileOpener.SystemSpecificEncoding(); - else - return Encoding.GetEncoding(openerEncoding); + + return StringComparer.InvariantCultureIgnoreCase.Compare(openerEncoding, "default") == 0 ? + FileOpener.SystemSpecificEncoding() : + Encoding.GetEncoding(openerEncoding); } private static bool SetupDefaultRuntime(string runtimeId) { return runtimeId == NativeRuntimeAnnotationHandler.NativeDirectiveName; } + + private static ExplicitImportsBehavior SetupExplicitImports(string keyValue) + { + switch (keyValue) + { + case "on": + return ExplicitImportsBehavior.Enabled; + case "off": + return ExplicitImportsBehavior.Disabled; + case "warn": + return ExplicitImportsBehavior.Warn; + case "dev": + case null: + return ExplicitImportsBehavior.Development; + default: + SystemLogger.Write($"Unknown value for {EXPLICIT_IMPORT}: {keyValue}"); + return ExplicitImportsBehavior.Warn; + } + } } } \ No newline at end of file diff --git a/src/ScriptEngine/RuntimeEnvironment.cs b/src/ScriptEngine/RuntimeEnvironment.cs index 4ec4925bb..bb450db38 100644 --- a/src/ScriptEngine/RuntimeEnvironment.cs +++ b/src/ScriptEngine/RuntimeEnvironment.cs @@ -7,6 +7,7 @@ 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.Execution; @@ -53,6 +54,27 @@ public void InjectObject(IAttachableContext context) public void InjectGlobalProperty(IValue value, string identifier, string alias, bool readOnly) { + InjectPropertyInternal(value, identifier, alias, readOnly, null); + } + + public void InjectGlobalProperty(IValue value, string identifier, bool readOnly) + { + InjectGlobalProperty(value, identifier, default, readOnly); + } + + public void InjectGlobalProperty(IValue value, string identifier, PackageInfo ownerPackage) + { + InjectPropertyInternal(value, identifier, default, true, ownerPackage); + } + + private void InjectPropertyInternal( + IValue value, + string identifier, + string alias, + bool readOnly, + PackageInfo ownerPackage) + { + ArgumentNullException.ThrowIfNull(value); if(!Utils.IsValidIdentifier(identifier)) { throw new ArgumentException("Invalid identifier", nameof(identifier)); @@ -65,18 +87,40 @@ public void InjectGlobalProperty(IValue value, string identifier, string alias, CreateGlobalScopeIfNeeded(); var num = _injectedProperties.Insert(value, identifier, true, !readOnly); - var symbol = new WrappedPropertySymbol(_injectedProperties.GetPropertyInfo(num)) + var bslPropertyInfo = _injectedProperties.GetPropertyInfo(num); + IVariableSymbol registeredSymbol; + if (ownerPackage == null) { - Name = identifier, - Alias = alias - }; + registeredSymbol = new WrappedPropertySymbol(bslPropertyInfo) + { + Name = identifier, + Alias = alias + }; + } + else + { + registeredSymbol = new WrappedLibraryPropertySymbol(bslPropertyInfo, ownerPackage) + { + Name = identifier, + Alias = alias + }; + } - _scopeOfGlobalProperties.DefineVariable(symbol); + _scopeOfGlobalProperties.DefineVariable(registeredSymbol); } - - public void InjectGlobalProperty(IValue value, string identifier, bool readOnly) + + public void InjectGlobalProperty(IValue value, BslPropertyInfo definition) { - InjectGlobalProperty(value, identifier, default, readOnly); + CreateGlobalScopeIfNeeded(); + _injectedProperties.Insert(value, definition); + + var symbol = new WrappedPropertySymbol(definition) + { + Name = definition.Name, + Alias = definition.Alias + }; + + _scopeOfGlobalProperties.DefineVariable(symbol); } private void RegisterObject(IAttachableContext context) @@ -103,14 +147,9 @@ public IValue GetGlobalProperty(string propertyName) public SymbolTable GetSymbolTable() => _symbols; - public IReadOnlyCollection AttachedContexts => _contexts; - - public IEnumerable GetLibraries() - { - return _libraryManager.GetLibraries(); - } + public IReadOnlyList AttachedContexts => _contexts; - public void InitExternalLibrary(ScriptingEngine runtime, ExternalLibraryDef library, IBslProcess process) + public void InitExternalLibrary(ScriptingEngine runtime, ExternalLibraryInfo library, IBslProcess process) { _libraryManager.InitExternalLibrary(runtime, library, process); } @@ -127,5 +166,22 @@ public WrappedPropertySymbol(BslPropertyInfo propInfo) public Type Type => Property.PropertyType; public BslPropertyInfo Property { get; } } + + private class WrappedLibraryPropertySymbol : IPropertySymbol, IPackageSymbol + { + public WrappedLibraryPropertySymbol(BslPropertyInfo propInfo, PackageInfo ownerPackage) + { + Property = propInfo; + Package = ownerPackage; + } + + public string Name { get; set; } + public string Alias { get; set; } + public Type Type => Property.PropertyType; + public BslPropertyInfo Property { get; } + private PackageInfo Package { get; } + + public PackageInfo GetPackageInfo() => Package; + } } } diff --git a/src/ScriptEngine/ScriptSourceFactory.cs b/src/ScriptEngine/ScriptSourceFactory.cs index b1e57fa06..572bd7d20 100644 --- a/src/ScriptEngine/ScriptSourceFactory.cs +++ b/src/ScriptEngine/ScriptSourceFactory.cs @@ -31,6 +31,18 @@ public SourceCode FromFile(string path) .FromFile(path, ReaderEncoding) .Build(); } + + /// + /// Создаёт SourceCode из файла с указанием пакета-владельца. + /// + public SourceCode FromFile(string path, string ownerPackageId) + { + return SourceCodeBuilder + .Create() + .FromFile(path, ReaderEncoding) + .WithOwnerPackage(ownerPackageId) + .Build(); + } public Encoding ReaderEncoding { get; set; } } diff --git a/src/ScriptEngine/ScriptingEngine.cs b/src/ScriptEngine/ScriptingEngine.cs index a2b63cd9c..5b8340900 100644 --- a/src/ScriptEngine/ScriptingEngine.cs +++ b/src/ScriptEngine/ScriptingEngine.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.Linq; -using System.Threading.Tasks; using OneScript.Compilation; using OneScript.Contexts; using OneScript.DependencyInjection; @@ -16,13 +14,13 @@ This Source Code Form is subject to the terms of the using ScriptEngine.Machine.Contexts; using ScriptEngine.Compiler; using ScriptEngine.Libraries; +using ScriptEngine.Machine.Debugger; namespace ScriptEngine { public class ScriptingEngine : IDisposable { private AttachedScriptsFactory _attachedScriptsFactory; - private IDebugController _debugController; private IRuntimeEnvironment _runtimeEnvironment; private readonly ILibraryManager _libraryManager; @@ -31,6 +29,7 @@ public ScriptingEngine(ITypeManager types, IGlobalsManager globals, RuntimeEnvironment env, OneScriptCoreOptions options, + IDebugger debugger, IServiceContainer services) { TypeManager = types; @@ -43,7 +42,14 @@ public ScriptingEngine(ITypeManager types, Loader = new ScriptSourceFactory(); Services = services; ContextDiscoverer = new ContextDiscoverer(types, globals, services); - DebugController = services.TryResolve(); + + Debugger = debugger; + + if (debugger.IsEnabled) + { + ProduceExtraCode |= CodeGenerationFlags.DebugCode; + } + Loader.ReaderEncoding = options.FileReaderEncoding; } @@ -168,18 +174,7 @@ public void InitializeSDO(ScriptDrivenObject sdo, IBslProcess process) public AttachedScriptsFactory AttachedScriptsFactory => _attachedScriptsFactory; - public IDebugController DebugController - { - get => _debugController; - private set - { - _debugController = value; - if (value != null) - { - ProduceExtraCode |= CodeGenerationFlags.DebugCode; - } - } - } + public IDebugger Debugger { get; } private void EnableCodeStatistics() { @@ -194,7 +189,6 @@ private void EnableCodeStatistics() public void Dispose() { - DebugController?.Dispose(); AttachedScriptsFactory.SetInstance(null); } diff --git a/src/ScriptEngine/SystemLogger.cs b/src/ScriptEngine/SystemLogger.cs index a943033c6..2e0eff04a 100644 --- a/src/ScriptEngine/SystemLogger.cs +++ b/src/ScriptEngine/SystemLogger.cs @@ -24,6 +24,11 @@ public static void SetWriter(ISystemLogWriter writer) _writer = writer; } + public static void Reset() + { + _writer = new NullWriter(); + } + public static void Write(string text) { _writer.Write(text); diff --git a/src/TestApp/EditedFileSource.cs b/src/TestApp/EditedFileSource.cs index fbf1ca2e8..57a6cb74f 100644 --- a/src/TestApp/EditedFileSource.cs +++ b/src/TestApp/EditedFileSource.cs @@ -6,7 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System.IO; -using OneScript.Sources; +using OneScript.Language.Sources; namespace TestApp { diff --git a/src/TestApp/TestApp.csproj b/src/TestApp/TestApp.csproj index 7d49eb936..241a30b6c 100644 --- a/src/TestApp/TestApp.csproj +++ b/src/TestApp/TestApp.csproj @@ -3,7 +3,7 @@ - net6.0-windows + net8.0-windows logo.ico WinExe diff --git a/src/Tests/OneScript.Core.Tests/CodeGenerationTests.cs b/src/Tests/OneScript.Core.Tests/CodeGenerationTests.cs index ca65c5291..db8ec91c2 100644 --- a/src/Tests/OneScript.Core.Tests/CodeGenerationTests.cs +++ b/src/Tests/OneScript.Core.Tests/CodeGenerationTests.cs @@ -14,6 +14,7 @@ This Source Code Form is subject to the terms of the using OneScript.Language.SyntaxAnalysis; using OneScript.Language.SyntaxAnalysis.AstNodes; using OneScript.Sources; +using ScriptEngine; using ScriptEngine.Compiler; using ScriptEngine.Machine; using Xunit; @@ -67,8 +68,8 @@ private static StackRuntimeModule BuildModule(string code, IBslProcess process) var node = parser.ParseStatefulModule() as ModuleNode; var ctx = new SymbolTable(); - ctx.PushScope(new SymbolScope(), null); - var compiler = new StackMachineCodeGenerator(errSink); + ctx.PushScope(new SymbolScope(), ScopeBindingDescriptor.Static(null)); + var compiler = new StackMachineCodeGenerator(errSink, ExplicitImportsBehavior.Disabled); return compiler.CreateModule(node, lexer.Iterator.Source, ctx, process); } } diff --git a/src/Tests/OneScript.Core.Tests/ExplicitImportsTest.cs b/src/Tests/OneScript.Core.Tests/ExplicitImportsTest.cs new file mode 100644 index 000000000..040ff768f --- /dev/null +++ b/src/Tests/OneScript.Core.Tests/ExplicitImportsTest.cs @@ -0,0 +1,312 @@ +/*---------------------------------------------------------- +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 FluentAssertions; +using Moq; +using OneScript.Compilation; +using OneScript.Contexts; +using OneScript.Execution; +using OneScript.Sources; +using ScriptEngine; +using ScriptEngine.Hosting; +using ScriptEngine.Machine.Debugger; +using Xunit; + +namespace OneScript.Core.Tests +{ + [Collection("SystemLogger")] + public class ExplicitImportsTest : IDisposable + { + private readonly List _messages; + private readonly ISystemLogWriter _logWriter; + + // Названия для тестовых скриптов + private const string LibraryModuleName = "СкриптБиблиотеки"; + private const string LibraryPackageId = "testlib"; + private const string LibraryShortName = "TestLib"; + + public ExplicitImportsTest() + { + var mock = new Mock(); + mock.Setup(x => x.Write(It.IsAny())) + .Callback(str => _messages.Add(str)); + + _messages = new List(); + _logWriter = mock.Object; + SystemLogger.SetWriter(_logWriter); + } + + public void Dispose() + { + // Очищаем логгер после каждого теста + SystemLogger.Reset(); + } + + [Fact] + public void ExplicitImports_Disabled_NoWarnings() + { + var code = CompileClientScript(ExplicitImportsBehavior.Disabled, out var shouldCompile); + + shouldCompile.Should().BeTrue(); + _messages.Should().BeEmpty("в режиме Disabled не должно быть предупреждений"); + } + + [Fact] + public void ExplicitImports_Enabled_CompilationError() + { + Action act = () => CompileClientScript(ExplicitImportsBehavior.Enabled, out _); + + act.Should().Throw() + .WithMessage("*" + LibraryModuleName + " принадлежит пакету " + LibraryShortName + "*", "должна быть ошибка о неявном импорте"); + + _messages.Should().BeEmpty("в режиме Enabled выбрасывается исключение, а не пишется в лог"); + } + + [Fact] + public void ExplicitImports_Warn_HasWarning() + { + var code = CompileClientScript(ExplicitImportsBehavior.Warn, out var shouldCompile); + + shouldCompile.Should().BeTrue(); + _messages.Should().HaveCount(1, "должно быть одно предупреждение") + .And.Contain(x => + x.Contains(LibraryModuleName, StringComparison.InvariantCultureIgnoreCase) && + x.Contains(LibraryShortName, StringComparison.InvariantCultureIgnoreCase), + "предупреждение должно содержать имя библиотеки и символа"); + } + + [Fact] + public void ExplicitImports_Development_WithDebugger_CompilationError() + { + var debuggerMock = new Mock(); + debuggerMock.Setup(x => x.IsEnabled).Returns(true); + + Action act = () => CompileClientScript( + ExplicitImportsBehavior.Development, + out _, + debuggerMock.Object); + + act.Should().Throw() + .WithMessage("*" + LibraryModuleName + " принадлежит пакету " + LibraryShortName + "*", + "в режиме Development с включенным отладчиком должна быть ошибка"); + } + + [Fact] + public void ExplicitImports_Development_WithoutDebugger_NoWarnings() + { + var debuggerMock = new Mock(); + debuggerMock.Setup(x => x.IsEnabled).Returns(false); + + var code = CompileClientScript( + ExplicitImportsBehavior.Development, + out var shouldCompile, + debuggerMock.Object); + + shouldCompile.Should().BeTrue(); + _messages.Should().BeEmpty("в режиме Development без отладчика не должно быть предупреждений"); + } + + [Fact] + public void ExplicitImports_Development_NoDebuggerRegistered_NoWarnings() + { + var code = CompileClientScript( + ExplicitImportsBehavior.Development, + out var shouldCompile); + + shouldCompile.Should().BeTrue(); + _messages.Should().BeEmpty("в режиме Development без зарегистрированного отладчика не должно быть предупреждений"); + } + + [Fact] + public void ExplicitImports_WithUseDirective_NoWarnings() + { + // Скрипт с явным импортом через директиву #Использовать + var codeWithImport = $"#Использовать {LibraryShortName}\n" + + $"А = {LibraryModuleName}.Метод();"; + + var instance = CompileUserScript( + codeWithImport, + ExplicitImportsBehavior.Enabled, + out var shouldCompile); + + shouldCompile.Should().BeTrue(); + _messages.Should().BeEmpty("при явном импорте через #Использовать не должно быть предупреждений"); + } + + [Fact] + public void ExplicitImports_SamePackage_NoWarnings() + { + // Библиотека использует себя - не должно быть предупреждений + var libraryCode = $"Функция Метод() Экспорт\n" + + $" А = {LibraryModuleName};\n" + + $" Возврат А;\n" + + $"КонецФункции"; + + var instance = CompileLibraryScript( + libraryCode, + ExplicitImportsBehavior.Enabled, + out var shouldCompile); + + shouldCompile.Should().BeTrue(); + _messages.Should().BeEmpty("модули из той же библиотеки не требуют явного импорта"); + } + + private IRuntimeContextInstance CompileClientScript( + ExplicitImportsBehavior behavior, + out bool success, + IDebugger debugger = null) + { + // Код клиентского скрипта, который использует библиотеку неявно + var clientCode = $"А = {LibraryModuleName}.Метод();"; + + var instance = CompileUserScript(clientCode, behavior, out success, debugger); + return instance; + } + + private IRuntimeContextInstance CompileLibraryScript( + string code, + ExplicitImportsBehavior behavior, + out bool success, + IDebugger debugger = null) + { + var instance = CompileUserScript( + code, + behavior, + out success, + debugger, + ownerPackageId: LibraryPackageId); + + return instance; + } + + private IRuntimeContextInstance CompileUserScript( + string code, + ExplicitImportsBehavior behavior, + out bool success, + IDebugger debugger = null, + string ownerPackageId = null) + { + success = true; + + try + { + var configValue = behavior switch + { + ExplicitImportsBehavior.Enabled => "on", + ExplicitImportsBehavior.Disabled => "off", + ExplicitImportsBehavior.Warn => "warn", + ExplicitImportsBehavior.Development => "dev", + _ => throw new ArgumentException(nameof(behavior)) + }; + + var builder = DefaultEngineBuilder + .Create() + .SetupConfiguration(p => + { + p.Add(() => new Dictionary + { + { "lang.explicitImports", configValue } + }); + }) + .SetDefaultOptions(); + + // Регистрируем отладчик если передан + if (debugger != null) + { + builder.WithDebugger(debugger); + } + + // Регистрируем мок резолвера зависимостей + builder.SetupServices(services => + { + services.UseImports(_ => new TestDependencyResolver()); + }); + + var engine = builder.Build(); + + // Регистрируем библиотеку как глобальное свойство + RegisterLibrary(engine); + + var compiler = engine.GetCompilerService(); + var source = ownerPackageId != null + ? SourceCodeBuilder.Create().FromString(code).WithOwnerPackage(ownerPackageId).Build() + : engine.Loader.FromString(code); + + engine.Initialize(); + + var module = engine.AttachedScriptsFactory.CompileModuleFromSource( + compiler, + source, + null, + engine.NewProcess()); + + var instance = engine.NewObject(module, engine.NewProcess(), null); + return instance; + } + catch (CompilerException) + { + success = false; + throw; + } + } + + private void RegisterLibrary(ScriptingEngine engine) + { + // Создаем простой модуль библиотеки + var libraryCode = "Функция Метод() Экспорт\n" + + " Возврат 42;\n" + + "КонецФункции"; + + var compiler = engine.GetCompilerService(); + var source = SourceCodeBuilder.Create() + .FromString(libraryCode) + .WithOwnerPackage(LibraryPackageId) + .Build(); + engine.Initialize(); + + var libraryModule = engine.AttachedScriptsFactory.CompileModuleFromSource( + compiler, + source, + null, + engine.NewProcess()); + + var libraryInstance = engine.CreateUninitializedSDO(libraryModule); + + // Регистрируем библиотеку как глобальное свойство с PackageInfo + var packageInfo = new PackageInfo(LibraryPackageId, LibraryShortName); + engine.Environment.InjectGlobalProperty(libraryInstance, LibraryModuleName, packageInfo); + + // Инициализируем библиотеку + engine.InitializeSDO(libraryInstance, engine.NewProcess()); + } + + /// + /// Мок резолвера зависимостей для поддержки директивы #Использовать + /// + private class TestDependencyResolver : IDependencyResolver + { + public void Initialize(ScriptingEngine engine) + { + // Ничего не делаем + } + + public PackageInfo Resolve(SourceCode module, string libraryName, IBslProcess process) + { + // Возвращаем PackageInfo для нашей тестовой библиотеки + if (libraryName == LibraryShortName) + { + return new PackageInfo(LibraryPackageId, LibraryShortName); + } + + return null; + } + } + } +} + diff --git a/src/Tests/OneScript.Core.Tests/HelperClasses/DeprecatedEnum.cs b/src/Tests/OneScript.Core.Tests/HelperClasses/DeprecatedEnum.cs new file mode 100644 index 000000000..56eb3a7dd --- /dev/null +++ b/src/Tests/OneScript.Core.Tests/HelperClasses/DeprecatedEnum.cs @@ -0,0 +1,23 @@ +/*---------------------------------------------------------- +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.Contexts.Enums; + +namespace OneScript.Core.Tests +{ + [DeprecatedName("СтароеИмя")] + [EnumerationType("НовоеПеречисление")] + public enum DeprecatedEnum + { + [EnumValue("Значение1")] + Value1, + [DeprecatedName("СтароеЗначение2")] + [EnumValue("Значение2")] + Value2 + } +} \ No newline at end of file diff --git a/src/Tests/OneScript.Core.Tests/HelperClasses/TestContextClass.cs b/src/Tests/OneScript.Core.Tests/HelperClasses/TestContextClass.cs index 6baac6e5f..0ce5e9f00 100644 --- a/src/Tests/OneScript.Core.Tests/HelperClasses/TestContextClass.cs +++ b/src/Tests/OneScript.Core.Tests/HelperClasses/TestContextClass.cs @@ -33,16 +33,20 @@ public void ObsoleteMethod() // Do nothing } + [DeprecatedName("ObsoleteAlias", throwOnUse: false)] + [DeprecatedName("VeryObsoleteAlias", throwOnUse: true)] [ContextMethod("ХорошийМетод", "GoodMethod")] - [ContextMethod("ObsoleteAlias", IsDeprecated = true, ThrowOnUse = false)] - [ContextMethod("VeryObsoleteAlias", IsDeprecated = true, ThrowOnUse = true)] public void GoodMethod() { // Do nothing } + [DeprecatedName("OldBslProp")] [ContextProperty("СвойствоBsl","BslProp")] public string BslProp { get; set; } + + [ContextProperty("УстаревшееСвойство","ObsoleteProperty", IsDeprecated = true)] + public string ObsoleteProp { get; set; } public override bool IsIndexed => true; diff --git a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs index e880c7c1d..11ade2183 100644 --- a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs +++ b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs @@ -15,7 +15,6 @@ This Source Code Form is subject to the terms of the using OneScript.DependencyInjection; using OneScript.Exceptions; using OneScript.Execution; -using OneScript.Native.Runtime; using OneScript.StandardLibrary; using OneScript.StandardLibrary.Collections; using OneScript.StandardLibrary.Collections.ValueList; @@ -27,7 +26,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 ScriptEngine.Types; using Xunit; diff --git a/src/Tests/OneScript.Core.Tests/ObsoleteMembersTest.cs b/src/Tests/OneScript.Core.Tests/ObsoleteMembersTest.cs new file mode 100644 index 000000000..f0ef06648 --- /dev/null +++ b/src/Tests/OneScript.Core.Tests/ObsoleteMembersTest.cs @@ -0,0 +1,170 @@ +/*---------------------------------------------------------- +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 FluentAssertions; +using Moq; +using OneScript.Exceptions; +using OneScript.Execution; +using OneScript.Values; +using ScriptEngine; +using ScriptEngine.Hosting; +using ScriptEngine.Machine; +using ScriptEngine.Machine.Contexts; +using Xunit; + +namespace OneScript.Core.Tests +{ + [Collection("SystemLogger")] + public class ObsoleteMembersTest : IDisposable + { + private readonly List _messages; + public ObsoleteMembersTest() + { + var mock = new Mock(); + mock.Setup(x => x.Write(It.IsAny())) + .Callback(str => _messages.Add(str)); + + _messages = new List(); + LogWriter = mock.Object; + SystemLogger.SetWriter(LogWriter); + } + + private ISystemLogWriter LogWriter { get; set; } + + public void Dispose() + { + // Очищаем логгер после каждого теста + SystemLogger.Reset(); + } + + [Fact] + public void TestLoggingOfObsoletePropAccess() + { + dynamic instance = new TestContextClass(); + var value = instance.ObsoleteProperty ?? ""; + instance.УстаревшееСвойство = value; + + _messages.Should().HaveCount(1, "must be only one warning"); + _messages.Should().Contain(item => + item.IndexOf("ObsoleteProperty", StringComparison.InvariantCultureIgnoreCase) >= 0 + || item.IndexOf("УстаревшееСвойство", StringComparison.InvariantCultureIgnoreCase) >= 0); + } + + [Fact] + public void TestLoggingOfObsoleteName() + { + dynamic instance = new TestContextClass(); + var value = instance.СвойствоBsl ?? ""; // обычное имя + instance.OldBslProp = value; + + _messages.Should().HaveCount(1, "must be only one warning"); + _messages.Should().Contain(item => item.IndexOf("OldBslProp", StringComparison.InvariantCultureIgnoreCase) >= 0); + } + + [Fact] + public void TestLoggingOfObsoleteCall() + { + dynamic instance = new TestContextClass(); + instance.УстаревшийМетод(); + instance.ObsoleteMethod(); + instance.УстаревшийМетод(); + + _messages.Should().HaveCount(1, "must be only one warning"); + _messages.Should().Contain(item => + item.IndexOf("УстаревшийМетод", StringComparison.InvariantCultureIgnoreCase) >= 0 + || item.IndexOf("ObsoleteMethod", StringComparison.InvariantCultureIgnoreCase) >= 0); + } + + [Fact] + public void CallGoodMethodsHasNoWarnings() + { + dynamic instance = new TestContextClass(); + instance.ХорошийМетод(); + instance.GoodMethod(); + + _messages.Should().BeEmpty(); + } + + [Fact] + public void TestICallDeprecatedAliasAndHaveWarning() + { + dynamic instance = new TestContextClass(); + instance.ObsoleteAlias(); + + _messages.Should().HaveCount(1) + .And.Contain(x => x.IndexOf("ObsoleteAlias", StringComparison.InvariantCultureIgnoreCase) >= 0); + } + + [Fact] + public void TestICallDeprecatedAliasAndHaveException() + { + var exceptionThrown = false; + + try + { + dynamic instance = new TestContextClass(); + instance.VeryObsoleteAlias(); + } + catch (RuntimeException) + { + exceptionThrown = true; + } + + exceptionThrown.Should().BeTrue("Безнадёжно устаревший метод должен вызвать исключение"); + } + + [Fact] + public void DeprecatedEnumClassHasWarning() + { + var host = DefaultEngineBuilder.Create() + .SetDefaultOptions() + .SetupEnvironment(e => e.AddAssembly(typeof(DeprecatedEnum).Assembly)) + .Build(); + + var source = host.Loader.FromString("А = СтароеИмя.Значение1"); + host.GetCompilerService().Compile(source, ForbiddenBslProcess.Instance); + + _messages.Should().HaveCount(1) + .And.Contain(x => x.Contains("СтароеИмя", StringComparison.InvariantCultureIgnoreCase)); + } + + [Fact] + public void DeprecatedEnumClassHasNoWarningOnNewName() + { + var host = DefaultEngineBuilder.Create() + .SetDefaultOptions() + .SetupEnvironment(e => e.AddAssembly(typeof(DeprecatedEnum).Assembly)) + .Build(); + + var source = host.Loader.FromString("А = НовоеПеречисление.Значение1"); + host.GetCompilerService().Compile(source, ForbiddenBslProcess.Instance); + + _messages.Should().HaveCount(0); + } + + [Fact] + public void DeprecatedEnumValueHasWarning() + { + var env = new RuntimeEnvironment(); + var discoverer = new ContextDiscoverer(new DefaultTypeManager(), Mock.Of(), new TinyIocImplementation()); + discoverer.DiscoverGlobalContexts(env, GetType().Assembly, t => t == typeof(DeprecatedEnum)); + + var enumInstance = env.GetGlobalProperty("НовоеПеречисление") as ClrEnumWrapper; + + enumInstance.Should().NotBeNull(); + enumInstance["Значение1"].Should().BeAssignableTo(); + enumInstance["Значение2"].Should().BeAssignableTo(); + enumInstance["СтароеЗначение2"].Should().BeAssignableTo(); + enumInstance["СтароеЗначение2"].Should().BeAssignableTo(); + + _messages.Should().HaveCount(1) + .And.Contain(x => x.Contains("СтароеЗначение2", StringComparison.InvariantCultureIgnoreCase)); + } + } +} \ No newline at end of file diff --git a/src/Tests/OneScript.Core.Tests/ObsoleteMethodAttributeTest.cs b/src/Tests/OneScript.Core.Tests/ObsoleteMethodAttributeTest.cs deleted file mode 100644 index 2deae0ae4..000000000 --- a/src/Tests/OneScript.Core.Tests/ObsoleteMethodAttributeTest.cs +++ /dev/null @@ -1,86 +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 FluentAssertions; -using Moq; -using OneScript.Exceptions; -using ScriptEngine; -using Xunit; - -namespace OneScript.Core.Tests -{ - public class ObsoleteMethodAttributeTest - { - private List _messages; - public ObsoleteMethodAttributeTest() - { - var mock = new Mock(); - mock.Setup(x => x.Write(It.IsAny())) - .Callback(str => _messages.Add(str)); - - _messages = new List(); - LogWriter = mock.Object; - SystemLogger.SetWriter(LogWriter); - } - - private ISystemLogWriter LogWriter { get; set; } - - [Fact] - public void TestLoggingOfObsoleteCall() - { - dynamic instance = new TestContextClass(); - instance.УстаревшийМетод(); - instance.ObsoleteMethod(); - instance.УстаревшийМетод(); - - _messages.Should().HaveCount(1, "must be only one warning"); - _messages.Should().Contain(item => - item.IndexOf("УстаревшийМетод", StringComparison.InvariantCultureIgnoreCase) >= 0 - || item.IndexOf("ObsoleteMethod", StringComparison.InvariantCultureIgnoreCase) >= 0); - } - - [Fact] - public void CallGoodMethodsHasNoWarnings() - { - dynamic instance = new TestContextClass(); - instance.ХорошийМетод(); - instance.GoodMethod(); - - _messages.Should().BeEmpty(); - } - - [Fact] - public void TestICallDeprecatedAliasAndHaveWarning() - { - dynamic instance = new TestContextClass(); - instance.ObsoleteAlias(); - - _messages.Should().HaveCount(1) - .And.Contain(x => x.IndexOf("ObsoleteAlias", StringComparison.InvariantCultureIgnoreCase) >= 0); - } - - [Fact] - public void TestICallDeprecatedAliasAndHaveException() - { - var exceptionThrown = false; - - try - { - dynamic instance = new TestContextClass(); - instance.VeryObsoleteAlias(); - } - catch (RuntimeException) - { - exceptionThrown = true; - } - - exceptionThrown.Should().BeTrue("Безнадёжно устаревший метод должен вызвать исключение"); - } - } -} \ No newline at end of file diff --git a/src/Tests/OneScript.Core.Tests/SymbolsRegistrationTests.cs b/src/Tests/OneScript.Core.Tests/SymbolsRegistrationTests.cs index c38cfb734..15e84434c 100644 --- a/src/Tests/OneScript.Core.Tests/SymbolsRegistrationTests.cs +++ b/src/Tests/OneScript.Core.Tests/SymbolsRegistrationTests.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.Values; using ScriptEngine; using ScriptEngine.Hosting; using ScriptEngine.Machine; @@ -21,7 +22,7 @@ public void GlobalProperty_In_Shared_PropertyBag_IsSettable() var env = new RuntimeEnvironment(); var prop = new TestContextClass(); - env.InjectGlobalProperty(null, "TestClass", false); + env.InjectGlobalProperty(BslUndefinedValue.Instance, "TestClass", false); env.SetGlobalProperty("TestClass", prop); var storedProp = env.GetGlobalProperty("TestClass"); diff --git a/src/Tests/OneScript.Core.Tests/ValueReferenceTests.cs b/src/Tests/OneScript.Core.Tests/ValueReferenceTests.cs index 56cbfe894..3ab118dc0 100644 --- a/src/Tests/OneScript.Core.Tests/ValueReferenceTests.cs +++ b/src/Tests/OneScript.Core.Tests/ValueReferenceTests.cs @@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the using OneScript.Values; using Xunit; using FluentAssertions; -using ScriptEngine.Machine; namespace OneScript.Core.Tests { diff --git a/src/Tests/OneScript.Core.Tests/ValuesTest.cs b/src/Tests/OneScript.Core.Tests/ValuesTest.cs index 3a06461ba..5e22c455a 100644 --- a/src/Tests/OneScript.Core.Tests/ValuesTest.cs +++ b/src/Tests/OneScript.Core.Tests/ValuesTest.cs @@ -177,8 +177,8 @@ public void Invalid_Comparison_Num_And_String() var num1 = ValueFactory.Create(1); var num2 = ValueFactory.Create("2"); - Assert.ThrowsAny(() => num1.CompareTo(num2)); - Assert.ThrowsAny(() => num2.CompareTo(num1)); + Assert.ThrowsAny(() => num1.CompareTo(num2)); + Assert.ThrowsAny(() => num2.CompareTo(num1)); } [Fact] @@ -187,8 +187,7 @@ public void Invalid_Comparison_Undefined() var v1 = ValueFactory.Create(); var v2 = ValueFactory.Create(true); - //TODO: типизировать исключение ComparisonNotSupportedException - Assert.ThrowsAny(() => v1.CompareTo(v2)); + Assert.ThrowsAny(() => v1.CompareTo(v2)); } [Fact] diff --git a/src/Tests/OneScript.DebugProtocol.Test/DebuggerTests.cs b/src/Tests/OneScript.DebugProtocol.Test/DebuggerTests.cs new file mode 100644 index 000000000..c6e3bb33d --- /dev/null +++ b/src/Tests/OneScript.DebugProtocol.Test/DebuggerTests.cs @@ -0,0 +1,151 @@ +/*---------------------------------------------------------- +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.Threading; +using FluentAssertions; +using OneScript.DebugProtocol.TcpServer; +using OneScript.DebugProtocol.Test.Tools; +using OneScript.DebugServices; +using Xunit; + +namespace OneScript.DebugProtocol.Test +{ + public class DebuggerTests + { + [Fact(DisplayName = "В режиме Launch сессия до соединения неактивна, после - активна.")] + public void TestActivatingOnIncomingClient() + { + var transport = new TcpDebugServer(0); + var debugger = new DefaultDebugger(transport); + debugger.AttachMode = false; + debugger.Start(); + + debugger.GetSession().IsActive.Should().BeFalse(); + + var client = new TestDebuggerClient(); + client.Connect(transport.ActualPort()); + + WaitEvent(() => debugger.GetSession().IsActive, 2000).Should().BeTrue(); + } + + [Theory(DisplayName = "В режиме Attach метод WaitReadyToRun не блокируется.")] + [InlineData(true)] + [InlineData(false)] + public void TestNonBlockingSessionWaitToRun(bool connectBeforeWait) + { + var transport = new TcpDebugServer(0); + var debugger = new DefaultDebugger(transport); + debugger.AttachMode = true; + debugger.Start(); + + debugger.GetSession().IsActive.Should().BeFalse(); + + var client = new TestDebuggerClient(); + if (connectBeforeWait) + { + client.Connect(transport.ActualPort()); + Thread.Sleep(100); + } + + var exitEvent = new ManualResetEventSlim(false); + + ThreadPool.QueueUserWorkItem(_ => + { + debugger.GetSession().WaitReadyToRun(); // не должно зависнуть + exitEvent.Set(); + }); + + exitEvent.Wait(2000).Should().BeTrue(); + } + + [Theory(DisplayName = "В режиме Launch метод WaitReadyToRun блокируется.")] + [InlineData(true)] + [InlineData(false)] + public void TestBlockingSessionWaitToRun(bool connectBeforeWait) + { + var transport = new TcpDebugServer(0); + var debugger = new DefaultDebugger(transport); + debugger.AttachMode = false; + debugger.Start(); + + debugger.GetSession().IsActive.Should().BeFalse(); + + var client = new TestDebuggerClient(); + if (connectBeforeWait) + { + client.Connect(transport.ActualPort()); + Thread.Sleep(100); + } + + var exitEvent = new ManualResetEventSlim(false); + + ThreadPool.QueueUserWorkItem(_ => + { + debugger.GetSession().WaitReadyToRun(); // должно зависнуть до получения команды Execute + exitEvent.Set(); + }); + + if (!connectBeforeWait) + { + client.Connect(transport.ActualPort()); + Thread.Sleep(100); + } + + client.Send(RpcCall.Create(nameof(IDebuggerService), nameof(IDebuggerService.Execute), 0)); + + exitEvent.Wait(2000).Should().BeTrue(); + } + + [Fact] + public void CanCreateAnotherSessionAfterDisconnect() + { + var transport = new TcpDebugServer(0); + var debugger = new DefaultDebugger(transport); + debugger.AttachMode = true; + debugger.Start(); + + debugger.GetSession().IsActive.Should().BeFalse(); + + var client = new TestDebuggerClient(); + client.Connect(transport.ActualPort()); + + var session = debugger.GetSession(); + + WaitEvent(() => session.IsActive, 2000).Should().BeTrue(); + + client.Send(RpcCall.Create(nameof(IDebuggerService), nameof(IDebuggerService.Disconnect), false)); + + WaitEvent(() => !session.IsActive, 2000).Should().BeTrue(); + + var client2 = new TestDebuggerClient(); + client2.Connect(transport.ActualPort()); + var session2 = debugger.GetSession(); + + WaitEvent(() => session2.IsActive, 2000).Should().BeTrue(); + + session2.Should().NotBe(session); + } + + private bool WaitEvent(Func predicate, int timeout) + { + var wait = new SpinWait(); + int start = Environment.TickCount; + while (!predicate()) + { + wait.SpinOnce(); + var elapsed = Environment.TickCount - start; + if (elapsed > timeout) + { + return false; + } + } + + return true; + } + } +} \ No newline at end of file diff --git a/src/Tests/OneScript.DebugProtocol.Test/JsonChannelTest.cs b/src/Tests/OneScript.DebugProtocol.Test/JsonChannelTest.cs index 709c1d744..e68fa074e 100644 --- a/src/Tests/OneScript.DebugProtocol.Test/JsonChannelTest.cs +++ b/src/Tests/OneScript.DebugProtocol.Test/JsonChannelTest.cs @@ -5,10 +5,7 @@ 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.Text; using FluentAssertions; -using Newtonsoft.Json; using OneScript.DebugProtocol.TcpServer; using OneScript.Exceptions; using Xunit; diff --git a/src/Tests/OneScript.DebugProtocol.Test/TcpServerTest.cs b/src/Tests/OneScript.DebugProtocol.Test/TcpServerTest.cs new file mode 100644 index 000000000..c2a210e51 --- /dev/null +++ b/src/Tests/OneScript.DebugProtocol.Test/TcpServerTest.cs @@ -0,0 +1,68 @@ +/*---------------------------------------------------------- +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 System.Net; +using System.Net.Sockets; +using System.Threading; +using FluentAssertions; +using OneScript.DebugServices; +using Xunit; + +namespace OneScript.DebugProtocol.Test +{ + public class TcpServerTest + { + [Fact] + public void ServerCanStartAndStop() + { + var logMessages = new List(); + var syncEvent = new AutoResetEvent(false); + var server = new TcpDebugServer(0); + server.OnLogEvent += (level, message) => + { + if ((int)level >= (int)TcpDebugServer.LogLevel.Info) + { + logMessages.Add(message); + syncEvent.Set(); + } + }; + + server.Listen(); + syncEvent.WaitOne(500).Should().BeTrue(); + server.Stop(); + syncEvent.WaitOne(500).Should().BeTrue(); + + logMessages.Should() + .HaveCount(2) + .And.Contain("Starting listener thread") + .And.Contain("Listener thread stopped"); + } + + [Fact] + public void ServerCanAcceptClients() + { + var server = new TcpDebugServer(0); + var syncEvent = new AutoResetEvent(false); + server.OnClientConnected += (sender, client) => + { + client.Should().NotBeNull(); + client.Connected.Should().BeTrue(); + syncEvent.Set(); + }; + + server.Listen(); + var client = new TcpClient(); + client.Connect(new IPEndPoint(IPAddress.Loopback, server.ActualPort())); + syncEvent.WaitOne(500).Should().BeTrue(); + + client.Connected.Should().BeTrue(); + client.Dispose(); + server.Stop(); + } + } +} \ No newline at end of file diff --git a/src/Tests/OneScript.DebugProtocol.Test/Tools/TestDebuggerClient.cs b/src/Tests/OneScript.DebugProtocol.Test/Tools/TestDebuggerClient.cs new file mode 100644 index 000000000..9fddb999e --- /dev/null +++ b/src/Tests/OneScript.DebugProtocol.Test/Tools/TestDebuggerClient.cs @@ -0,0 +1,48 @@ +/*---------------------------------------------------------- +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.IO; +using System.Net; +using System.Net.Sockets; +using System.Text; +using Newtonsoft.Json; +using OneScript.DebugProtocol.TcpServer; + +namespace OneScript.DebugProtocol.Test.Tools +{ + public class TestDebuggerClient + { + private readonly TcpClient _client = new TcpClient(); + + public void Connect(int port) + { + _client.Connect(new IPEndPoint(IPAddress.Loopback, port)); + var handshake = FormatReconcileUtils.GetReconcileMagic(); + _client.GetStream().Write(handshake); + _client.GetStream().Flush(); + + var buffer = new byte[FormatReconcileUtils.FORMAT_RECONCILE_RESPONSE_PREFIX.Length + sizeof(int)]; + StreamUtils.ReadStream(_client.GetStream(), buffer, buffer.Length); + } + + public void Send(RpcCall message) + { + var content = JsonConvert.SerializeObject(message); + var contentBytes = Encoding.UTF8.GetBytes(content); + + using var bufferedStream = new MemoryStream(contentBytes.Length + sizeof(int)); + using var writer = new BinaryWriter(bufferedStream, Encoding.UTF8); + + writer.Write(contentBytes.Length); + writer.Write(contentBytes, 0, contentBytes.Length); + + bufferedStream.Position = 0; + bufferedStream.CopyTo(_client.GetStream()); + _client.GetStream().Flush(); + } + } +} \ No newline at end of file diff --git a/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs b/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs index da71c77e2..d6affacbe 100644 --- a/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs +++ b/src/Tests/OneScript.Dynamic.Tests/CompileHelper.cs @@ -90,15 +90,16 @@ private DefaultBslParser GetBslParser(string code) public DynamicModule Compile(SymbolTable scopes, IBslProcess process) { if (scopes.ScopeCount == 0) - scopes.PushScope(new SymbolScope(), null); + scopes.PushScope(new SymbolScope(), ScopeBindingDescriptor.Static(null)); var compiler = new ModuleCompiler(_errors, _services, new DependencyResolverMock()); return compiler.Compile(_codeIndexer, _module, scopes, process); } private class DependencyResolverMock : ICompileTimeDependencyResolver { - public void Resolve(SourceCode module, string libraryName, IBslProcess process) + public PackageInfo Resolve(SourceCode module, string libraryName, IBslProcess process) { + return null; } } } diff --git a/src/Tests/OneScript.Dynamic.Tests/NativeSdoTests.cs b/src/Tests/OneScript.Dynamic.Tests/NativeSdoTests.cs index e535b6822..531d7fd3b 100644 --- a/src/Tests/OneScript.Dynamic.Tests/NativeSdoTests.cs +++ b/src/Tests/OneScript.Dynamic.Tests/NativeSdoTests.cs @@ -4,7 +4,7 @@ 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; + using FluentAssertions; using Moq; using OneScript.Compilation; @@ -476,7 +476,7 @@ private DynamicModule CreateModule(string code, IServiceContainer services, Symb var symbolProvider = services.Resolve(); var moduleScope = new SymbolScope(); symbolProvider.Get().FillSymbols(moduleScope); - symbols.PushScope(moduleScope, null); + symbols.PushScope(moduleScope, ScopeBindingDescriptor.Static(null)); var helper = new CompileHelper(services); helper.ParseModule(code); diff --git a/src/Tests/OneScript.Language.Tests/SourceCodeHelper.cs b/src/Tests/OneScript.Language.Tests/SourceCodeHelper.cs index 20ea754a1..36f10b99a 100644 --- a/src/Tests/OneScript.Language.Tests/SourceCodeHelper.cs +++ b/src/Tests/OneScript.Language.Tests/SourceCodeHelper.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.Language.Sources; using OneScript.Sources; namespace OneScript.Language.Tests diff --git a/src/Tests/OneScript.StandardLibrary.Tests/ObsoleteEnumTest.cs b/src/Tests/OneScript.StandardLibrary.Tests/ObsoleteEnumTest.cs new file mode 100644 index 000000000..08768b7dd --- /dev/null +++ b/src/Tests/OneScript.StandardLibrary.Tests/ObsoleteEnumTest.cs @@ -0,0 +1,41 @@ +/*---------------------------------------------------------- +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 Moq; +using OneScript.Contexts; +using OneScript.Contexts.Enums; +using ScriptEngine; + +namespace OneScript.StandardLibrary.Tests +{ + public class ObsoleteEnumTest + { + private List _messages; + + public ObsoleteEnumTest() + { + var mock = new Mock(); + mock.Setup(x => x.Write(It.IsAny())) + .Callback(str => _messages.Add(str)); + + _messages = new List(); + LogWriter = mock.Object; + SystemLogger.SetWriter(LogWriter); + } + + private ISystemLogWriter LogWriter { get; set; } + + [DeprecatedName("NonActual")] + [EnumerationType("Актуальное", "Actual")] + public enum TestEnum + { + One, + Two + } + } +} \ No newline at end of file diff --git a/src/Tests/OneScript.StandardLibrary.Tests/OneScript.StandardLibrary.Tests.csproj b/src/Tests/OneScript.StandardLibrary.Tests/OneScript.StandardLibrary.Tests.csproj index c1249e061..4d93b540e 100644 --- a/src/Tests/OneScript.StandardLibrary.Tests/OneScript.StandardLibrary.Tests.csproj +++ b/src/Tests/OneScript.StandardLibrary.Tests/OneScript.StandardLibrary.Tests.csproj @@ -11,6 +11,7 @@ + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Tests/OneScript.StandardLibrary.Tests/TimeZoneConverterTests.cs b/src/Tests/OneScript.StandardLibrary.Tests/TimeZoneConverterTests.cs new file mode 100644 index 000000000..332adae69 --- /dev/null +++ b/src/Tests/OneScript.StandardLibrary.Tests/TimeZoneConverterTests.cs @@ -0,0 +1,43 @@ +/*---------------------------------------------------------- +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 FluentAssertions; +using OneScript.StandardLibrary.Timezones; +using Xunit; + +namespace OneScript.StandardLibrary.Tests +{ + public class TimeZoneConverterTests + { + [Fact] + public void Kiev_Summer_Dst_ToUtc_And_Back() + { + var dtLocal = new DateTime(2025, 6, 24, 10, 0, 0); + var utc = TimeZoneConverter.ToUniversalTime(dtLocal, "Europe/Kiev"); + utc.Should().Be(new DateTime(2025, 6, 24, 7, 0, 0, DateTimeKind.Utc)); + + var backLocal = TimeZoneConverter.ToLocalTime(utc, "Europe/Kiev"); + backLocal.Should().Be(dtLocal); + } + + [Fact] + public void Kiev_EET_StandardTimeOffset_Is_BaseUtcOffset_2h() + { + var dtLocal = new DateTime(2025, 6, 24, 10, 0, 0); + var offsetSeconds = TimeZoneConverter.StandardTimeOffset("EET", dtLocal); + offsetSeconds.Should().Be(7200); + } + + [Fact] + public void Kiev_EET_TimeZonePresentation_Is_GmtPlus02() + { + var presentation = TimeZoneConverter.TimeZonePresentation("EET"); + presentation.Should().Be("GMT+02:00"); + } + } +} \ No newline at end of file diff --git a/src/VSCode.DebugAdapter/ConsoleLaunchOptions.cs b/src/VSCode.DebugAdapter/ConsoleLaunchOptions.cs index ceca6bf1c..7345f3fac 100644 --- a/src/VSCode.DebugAdapter/ConsoleLaunchOptions.cs +++ b/src/VSCode.DebugAdapter/ConsoleLaunchOptions.cs @@ -14,5 +14,7 @@ public class ConsoleLaunchOptions : CommonLaunchOptions public string[] Args { get; set; } public string Cwd { get; set; } + + public bool? WaitOnStart { get; set; } } } \ No newline at end of file diff --git a/src/VSCode.DebugAdapter/ConsoleProcess.cs b/src/VSCode.DebugAdapter/ConsoleProcess.cs index 58cf0c77a..a1a740278 100644 --- a/src/VSCode.DebugAdapter/ConsoleProcess.cs +++ b/src/VSCode.DebugAdapter/ConsoleProcess.cs @@ -10,7 +10,6 @@ This Source Code Form is subject to the terms of the using System.IO; using Newtonsoft.Json.Linq; using Serilog; -using VSCode.DebugAdapter.Transport; namespace VSCode.DebugAdapter { @@ -99,6 +98,7 @@ protected override void InitInternal(JObject args) ScriptArguments = Utilities.ConcatArguments(options.Args); DebugPort = options.DebugPort; Environment = options.Env; + WaitOnStart = options.WaitOnStart ?? true; } protected override Process CreateProcess() @@ -108,6 +108,11 @@ protected override Process CreateProcess() { dbgArgs.Add($"-port={DebugPort}"); } + + if (!WaitOnStart) + { + dbgArgs.Add("-noWait"); + } var debugArguments = string.Join(" ", dbgArgs); var process = new Process(); diff --git a/src/VSCode.DebugAdapter/DebugSession.cs b/src/VSCode.DebugAdapter/DebugSession.cs index 85fd8faf9..ff119d2d1 100644 --- a/src/VSCode.DebugAdapter/DebugSession.cs +++ b/src/VSCode.DebugAdapter/DebugSession.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Linq; using System.IO; -using Serilog; using VSCode.DebugAdapter; namespace VSCodeDebug diff --git a/src/VSCode.DebugAdapter/DebugeeProcess.cs b/src/VSCode.DebugAdapter/DebugeeProcess.cs index 1d0da524c..67f75d047 100644 --- a/src/VSCode.DebugAdapter/DebugeeProcess.cs +++ b/src/VSCode.DebugAdapter/DebugeeProcess.cs @@ -26,7 +26,7 @@ internal abstract class DebugeeProcess private bool _stdoutEOF; private bool _stderrEOF; private bool _attachMode; - + private Encoding _dapEncoding; private OneScriptDebuggerClient _debugger; @@ -41,9 +41,22 @@ public DebugeeProcess(PathHandlingStrategy pathHandling) { _strategy = pathHandling; } - - public bool HasExited => _process?.HasExited ?? true; - public int ExitCode => _process.ExitCode; + + public bool HasExited + { + get + { + if (_process != null) + return _process.HasExited; + + if (_attachMode && _debugger != null) + return false; + + return true; + } + } + + public int ExitCode => _process?.ExitCode ?? 0; public int DebugPort { get; set; } @@ -57,11 +70,15 @@ public int ProtocolVersion } } + public bool WaitOnStart { get; set; } + + public WorkspaceMapper PathsMapper { get; set; } + public void Start() { _process = CreateProcess(); var psi = _process.StartInfo; - + psi.RedirectStandardError = true; psi.RedirectStandardOutput = true; @@ -81,21 +98,57 @@ public void Start() _process.BeginOutputReadLine(); _process.BeginErrorReadLine(); } - + public void InitAttached() { var pid = _debugger.GetProcessId(); - _process = Process.GetProcessById(pid); + + try + { + _process = Process.GetProcessById(pid); + _process.EnableRaisingEvents = true; + _process.Exited += Process_Exited; + } + catch + { + _process = null; + } + _attachMode = true; - _process.EnableRaisingEvents = true; - _process.Exited += Process_Exited; + } - + public void Init(JObject args) { InitInternal(args); } - + + public void InitPathsMapper(JObject args) + { + if (args == null) + { + PathsMapper = null; + return; + } + + try + { + var mappingToken = args["pathsMapping"]; + if (mappingToken == null || mappingToken.Type == JTokenType.Null) + { + PathsMapper = null; + return; + } + + PathsMapper = mappingToken.ToObject(); + } + catch (Exception ex) + { + Log.Warning(ex, "Failed to initialize paths mapper; path mapping will be disabled"); + PathsMapper = null; + } + } + protected abstract Process CreateProcess(); protected abstract void InitInternal(JObject args); @@ -104,12 +157,12 @@ protected string ConvertClientPathToDebugger(string clientPath) { return _strategy.ConvertClientPathToDebugger(clientPath); } - + protected void LoadEnvironment(ProcessStartInfo psi, IDictionary variables) { if (variables == null || variables.Count <= 0) return; - + foreach (var pair in variables) { psi.EnvironmentVariables[pair.Key] = pair.Value; @@ -126,7 +179,7 @@ protected void SetEncoding(string encodingFromOptions) { _dapEncoding = Utilities.GetEncodingFromOptions(encodingFromOptions); } - + Log.Information("Encoding for debuggee output is {Encoding}", _dapEncoding); } @@ -140,10 +193,10 @@ public void SetClient(OneScriptDebuggerClient service) _debugger = service; ProtocolVersion = service.ProtocolVersion; } - + public event EventHandler OutputReceived; public event EventHandler ProcessExited; - + private void Process_Exited(object sender, EventArgs e) { _debugger?.Stop(); @@ -192,7 +245,7 @@ private void Terminate() { System.Threading.Thread.Sleep(100); } - + _terminated = true; _process = null; _debugger = null; @@ -209,7 +262,7 @@ public void HandleDisconnect(bool terminate) _debugger.Disconnect(terminate); var mustKill = terminate && !_attachMode; - + if (mustKill && _process != null && !_process.HasExited) { Log.Debug("Stopping child process..."); @@ -223,12 +276,15 @@ public void HandleDisconnect(bool terminate) Log.Debug("Process killed"); } } - + Log.Debug("Debuggee disconnected"); } public void Kill() { + if (_process == null) + return; + _process.Kill(); _process.WaitForExit(1500); } @@ -257,8 +313,18 @@ public void SetExceptionsBreakpoints((string Id, string Condition)[] filters) public Breakpoint[] SetBreakpoints(IEnumerable breakpoints) { - var confirmedBreaks = _debugger.SetMachineBreakpoints(breakpoints.ToArray()); - + var breakpointsArray = breakpoints.ToArray(); + + if (PathsMapper != null) + { + for (int i = 0; i < breakpointsArray.Length; i++) + { + breakpointsArray[i].Source = PathsMapper.LocalToRemote(breakpointsArray[i].Source); + } + } + + var confirmedBreaks = _debugger.SetMachineBreakpoints(breakpointsArray); + return confirmedBreaks; } @@ -266,21 +332,29 @@ public void BeginExecution(int threadId) { _debugger.Execute(threadId); } - + public StackFrame[] GetStackTrace(int threadId, int firstFrameIdx, int limit) { var allFrames = _debugger.GetStackFrames(threadId); - + var pathsMapperInit = PathsMapper != null; + if (limit == 0) limit = allFrames.Length; - if(allFrames.Length < firstFrameIdx) + if (allFrames.Length < firstFrameIdx) return new StackFrame[0]; var result = new List(); for (int i = firstFrameIdx; i < limit && i < allFrames.Length; i++) { + allFrames[i].ThreadId = threadId; + + if (pathsMapperInit) + { + allFrames[i].Source = PathsMapper.RemoteToLocal(allFrames[i].Source); + } + result.Add(allFrames[i]); } diff --git a/src/VSCode.DebugAdapter/OneScriptDebuggerClient.cs b/src/VSCode.DebugAdapter/OneScriptDebuggerClient.cs index 722b8ad7a..769048d0d 100644 --- a/src/VSCode.DebugAdapter/OneScriptDebuggerClient.cs +++ b/src/VSCode.DebugAdapter/OneScriptDebuggerClient.cs @@ -17,13 +17,13 @@ namespace VSCode.DebugAdapter public class OneScriptDebuggerClient : IDebuggerService { private readonly IDebugEventListener _eventBackChannel; - private readonly ICommunicationChannel _commandsChannel; + private readonly IMessageChannel _commandsChannel; private RpcProcessor _processor; private readonly ILogger Log = Serilog.Log.ForContext(); public OneScriptDebuggerClient( - ICommunicationChannel commandsChannel, + IMessageChannel commandsChannel, IDebugEventListener eventBackChannel, int protocolVersion) { @@ -42,10 +42,9 @@ public void Start() public void Stop() { _processor.Stop(); - _commandsChannel.Dispose(); } - private void RunEventsListener(ICommunicationChannel channelToListen) + private void RunEventsListener(IMessageChannel channelToListen) { var server = new DefaultMessageServer(channelToListen); server.ServerThreadName = "dbg-client-event-listener"; diff --git a/src/VSCode.DebugAdapter/OscriptDebugSession.cs b/src/VSCode.DebugAdapter/OscriptDebugSession.cs index 0b06ae403..eb691ef81 100644 --- a/src/VSCode.DebugAdapter/OscriptDebugSession.cs +++ b/src/VSCode.DebugAdapter/OscriptDebugSession.cs @@ -35,7 +35,7 @@ public override void Initialize(Response response, dynamic args) LogCommandReceived(); AdapterID = (string) args.adapterID; - _debuggee = DebugeeFactory.CreateProcess(AdapterID, PathStrategy); + _debuggee = DebugeeFactory.CreateProcess(AdapterID, PathStrategy); SendResponse(response, new Capabilities { @@ -137,7 +137,9 @@ public override void Attach(Response response, dynamic arguments) { LogCommandReceived(); SubscribeForDebuggeeProcessEvents(); + _debuggee.DebugPort = GetFromContainer(arguments, "debugPort", 2801); + _debuggee.InitPathsMapper(arguments); DebugClientFactory debugClientFactory; try diff --git a/src/VSCode.DebugAdapter/Program.cs b/src/VSCode.DebugAdapter/Program.cs index 5e05e4c6c..da026d34d 100644 --- a/src/VSCode.DebugAdapter/Program.cs +++ b/src/VSCode.DebugAdapter/Program.cs @@ -8,11 +8,8 @@ This Source Code Form is subject to the terms of the using System.Configuration; using System.IO; using System.Linq; -using System.Net; using System.Net.Sockets; using Serilog; -using Serilog.Core; -using Serilog.Events; namespace VSCode.DebugAdapter { diff --git a/src/VSCode.DebugAdapter/README.md b/src/VSCode.DebugAdapter/README.md index 0c3805040..fc4030e3a 100644 --- a/src/VSCode.DebugAdapter/README.md +++ b/src/VSCode.DebugAdapter/README.md @@ -16,6 +16,19 @@ При возникновении вопросов напишите обращение на https://github.com/EvilBeaver/OneScript/issues. Мы обязательно вам поможем. +## Маппинг путей для удаленной отладки + +При отладке приложений 1Script, работающих в Docker-контейнерах, WSL или на удаленных машинах, возникает проблема несовпадения путей к исходным файлам. Локальная IDE устанавливает точки останова (breakpoints) по локальным путям (например, `D:\projects\myapp\main.os`), но удаленный runtime видит другие пути (например, `/app/main.os` в контейнере). Без маппинга точки останова не будут срабатывать. + +Для решения этой проблемы используется параметр **pathsMapping**, который автоматически преобразует пути между локальной и удаленной файловой системой: + +* При отправке точек останова в отладчик локальные пути преобразуются в удаленные +* При получении информации о стеке вызовов удаленные пути преобразуются обратно в локальные + +Параметр **pathsMapping** доступен только в режиме "attach" и содержит два обязательных поля: +* **localPath** - путь к каталогу проекта на локальной машине +* **remotePath** - путь к каталогу проекта на удаленной машине (или в контейнере) + ## Примеры конфигураций запуска ### Запуск 1Script, файл my-program.os с передачей аргументов командной строки и установкой переменных окружения @@ -58,4 +71,42 @@ "request": "attach", "debugPort": 5051 } -``` \ No newline at end of file +``` + +### Подключение к процессу 1Script в Docker-контейнере с маппингом путей + +При отладке приложения, запущенного в Docker-контейнере, необходимо сопоставить локальные пути с путями внутри контейнера. Например, если локальный проект находится в `D:\myproject`, а внутри контейнера примонтирован в `/app`: + +```json +{ + "name": "Attach к Docker-контейнеру", + "type": "oscript", + "request": "attach", + "debugPort": 2801, + "pathsMapping": { + "localPath": "D:/myproject", + "remotePath": "/app" + } +} +``` + +**Примечание:** В localPath используйте прямые слэши (/) даже в Windows для корректной работы маппинга. + +### Удаленная отладка с маппингом путей (Linux/WSL) + +Для отладки приложения на удаленной Linux-машине или в WSL: + +```json +{ + "name": "Удаленная отладка на Linux", + "type": "oscript", + "request": "attach", + "debugPort": 2801, + "pathsMapping": { + "localPath": "C:/Users/developer/projects/myapp", + "remotePath": "/home/developer/myapp" + } +} +``` + +Отладчик автоматически преобразует пути при установке точек останова и отображении стека вызовов, что позволяет корректно работать с исходным кодом независимо от различий в файловых системах. \ No newline at end of file diff --git a/src/VSCode.DebugAdapter/ServerProcess.cs b/src/VSCode.DebugAdapter/ServerProcess.cs index 68e6e7441..844fea9d6 100644 --- a/src/VSCode.DebugAdapter/ServerProcess.cs +++ b/src/VSCode.DebugAdapter/ServerProcess.cs @@ -9,7 +9,6 @@ This Source Code Form is subject to the terms of the using System.Diagnostics; using System.IO; using Newtonsoft.Json.Linq; -using VSCode.DebugAdapter.Transport; namespace VSCode.DebugAdapter { @@ -27,8 +26,6 @@ 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(); diff --git a/src/VSCode.DebugAdapter/Transport/DebugClientFactory.cs b/src/VSCode.DebugAdapter/Transport/DebugClientFactory.cs index 94b6bdc39..ca4ea1082 100644 --- a/src/VSCode.DebugAdapter/Transport/DebugClientFactory.cs +++ b/src/VSCode.DebugAdapter/Transport/DebugClientFactory.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; -using System.Diagnostics; using System.IO; using System.Net.Sockets; using System.Text; @@ -37,12 +36,12 @@ public OneScriptDebuggerClient CreateDebugClient() { ReconcileDataFormat(_tcpClient); - ICommunicationChannel commandsChannel; + IMessageChannel commandsChannel; switch (_transport) { case TransportProtocols.Json: - commandsChannel = new JsonDtoChannel(_tcpClient); + commandsChannel = new JsonDtoChannel(new TcpDebuggerClient(_tcpClient)); break; case TransportProtocols.Binary: commandsChannel = new BinaryChannel(_tcpClient); @@ -88,7 +87,7 @@ private void ReconcileDataFormat(TcpClient client) var dataBuffer = new byte[requiredDataLength]; using (var binaryReader = new BinaryReader(stream, Encoding.ASCII, true)) { - ReadStream(binaryReader, dataBuffer,FormatReconcileUtils.FORMAT_RECONCILE_RESPONSE_PREFIX.Length); + StreamUtils.ReadStream(binaryReader.BaseStream, dataBuffer,FormatReconcileUtils.FORMAT_RECONCILE_RESPONSE_PREFIX.Length); if (!FormatReconcileUtils.CheckReconcilePrefix(dataBuffer)) { @@ -161,25 +160,32 @@ private void EmptyIncomingBuffer(TcpClient client) Log.Verbose("Reading out completed"); } - private void ReadStream(BinaryReader reader, byte[] buffer, int length) - { - int readPosition = 0; - int bytesReceived = 0; - - while (bytesReceived < length) - { - bytesReceived = reader.Read(buffer, readPosition, length - bytesReceived); - if (bytesReceived == 0) - throw new IOException("Unexpected end of stream"); - - readPosition += bytesReceived; - } - } - private void SelectSafestFormat() { _protocolVersion = ProtocolVersions.SafestVersion; _transport = TransportProtocols.Binary; } + + private class TcpDebuggerClient : IDebuggerClient + { + private TcpClient Client { get; } + + public TcpDebuggerClient(TcpClient client) + { + Client = client; + } + + public void Dispose() + { + Client.Dispose(); + } + + public Stream GetDataStream() + { + return Client.GetStream(); + } + + public bool Connected => Client.Connected; + } } } diff --git a/src/VSCode.DebugAdapter/Transport/RpcProcessor.cs b/src/VSCode.DebugAdapter/Transport/RpcProcessor.cs index 8cb2a678f..c9d6768bf 100644 --- a/src/VSCode.DebugAdapter/Transport/RpcProcessor.cs +++ b/src/VSCode.DebugAdapter/Transport/RpcProcessor.cs @@ -72,7 +72,7 @@ private void ServerOnDataReceived(object sender, CommunicationEventArgs e) } } - private void DispatchMessage(TcpProtocolDtoBase data, ICommunicationChannel responseChannel) + private void DispatchMessage(TcpProtocolDtoBase data, IMessageChannel responseChannel) { if (!_dispatchers.TryGetValue(data.ServiceName, out var serviceRecord)) { diff --git a/src/VSCode.DebugAdapter/WorkspaceMapper.cs b/src/VSCode.DebugAdapter/WorkspaceMapper.cs new file mode 100644 index 000000000..e9d60018a --- /dev/null +++ b/src/VSCode.DebugAdapter/WorkspaceMapper.cs @@ -0,0 +1,88 @@ +/*---------------------------------------------------------- +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.InteropServices; +using Newtonsoft.Json; + +namespace VSCode.DebugAdapter +{ + public class WorkspaceMapper + { + + private Workspace _localWorkspace; + private Workspace _remoteWorkspace; + + [JsonProperty("localPath")] + private string LocalPathForDeserialization + { + set { _localWorkspace = new Workspace(value ?? ""); } + } + + [JsonProperty("remotePath")] + private string RemotePathForDeserialization + { + set { _remoteWorkspace = new Workspace(value ?? ""); } + } + + public WorkspaceMapper(){} + + public WorkspaceMapper(string localPath, string remotePath) { + + this._localWorkspace = new Workspace(localPath); + this._remoteWorkspace = new Workspace(remotePath); + } + + public string LocalToRemote(string path) + { + return ConvertPath(path, _localWorkspace, _remoteWorkspace); + } + + public string RemoteToLocal(string path) + { + return ConvertPath(path, _remoteWorkspace, _localWorkspace); + } + + private string ConvertPath(string path, Workspace fromPrefix, Workspace toPrefix) + { + if (string.IsNullOrWhiteSpace(path) || + string.IsNullOrWhiteSpace(fromPrefix.Original) || + string.IsNullOrWhiteSpace(toPrefix.Original)) + return path; + + var normalizedPath = path.Replace('\\', '/'); + var normalizedFrom = fromPrefix.Normalized; + + var comparison = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) + ? StringComparison.OrdinalIgnoreCase + : StringComparison.Ordinal; + + if (normalizedPath.StartsWith(toPrefix.Normalized, comparison) || + !normalizedPath.StartsWith(normalizedFrom, comparison)) + return path; + + var relativePath = normalizedPath.Substring(normalizedFrom.Length).TrimStart('/'); + var result = toPrefix.Normalized + "/" + relativePath; + + return result; + } + + } + + internal class Workspace + { + public string Original; + public string Normalized; + + internal Workspace(string path) + { + this.Original = path; + this.Normalized = path.Replace('\\', '/').TrimEnd('/'); + } + + } + +} \ No newline at end of file diff --git a/src/VSCode.DebugAdapter/package.json b/src/VSCode.DebugAdapter/package.json index 5a922ffba..041520a14 100644 --- a/src/VSCode.DebugAdapter/package.json +++ b/src/VSCode.DebugAdapter/package.json @@ -113,6 +113,11 @@ "type": "string", "description": "Кодировка вывода отлаживаемого приложения. Отладчик будет интерпретировать вывод приложения в указанной кодировке", "default": "" + }, + "waitOnStart": { + "type": "boolean", + "description": "Ожидать подключения отладчика при старте приложения (не выполнять bsl до его подключения)", + "default": true } } }, @@ -127,7 +132,25 @@ "type": "string", "description": "Кодировка вывода отлаживаемого приложения. Отладчик будет интерпретировать вывод приложения в указанной кодировке", "default": "" + }, + "pathsMapping": { + "type": "object", + "description": "Сопоставление путей между локальной и удаленной машиной (для удаленной отладки)", + "properties": { + "localPath": { + "type": "string", + "description": "Путь к каталогу проекта на локальной машине.", + "default": "" + }, + "remotePath": { + "type": "string", + "description": "Путь к каталогу проекта на удаленной машине.", + "default": "" + } + }, + "required": ["localPath", "remotePath"] } + } } } diff --git a/src/oscommon.targets b/src/oscommon.targets index 2268a19aa..d47770e3a 100644 --- a/src/oscommon.targets +++ b/src/oscommon.targets @@ -7,7 +7,7 @@ Release x86 8.0 - net6.0 + net8.0 $(NoWarn);CS1591 False disable diff --git a/src/oscript/CgiBehavior.cs b/src/oscript/CgiBehavior.cs index 848aa20e5..911782454 100644 --- a/src/oscript/CgiBehavior.cs +++ b/src/oscript/CgiBehavior.cs @@ -8,7 +8,6 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; using OneScript.Contexts; using OneScript.Exceptions; @@ -97,12 +96,21 @@ private int RunCGIMode(string scriptFile) return exitCode; } - public void OnAttach(out IVariable[] variables, out BslMethodInfo[] methods) + IVariable IAttachableContext.GetVariable(int index) { - variables = Array.Empty(); - methods = this.GetMethods().ToArray(); + throw new IndexOutOfRangeException("No such variable at index: " + index); } + BslMethodInfo IAttachableContext.GetMethod(int index) + { + return GetMethodInfo(index); + } + + int IAttachableContext.VariablesCount => 0; + + int IAttachableContext.MethodsCount => _methods.Count; + + #region CGIHost [ContextMethod("ВывестиЗаголовок", "Header")] diff --git a/src/oscript/DebugBehavior.cs b/src/oscript/DebugBehavior.cs index 1f0be074d..740c7cd46 100644 --- a/src/oscript/DebugBehavior.cs +++ b/src/oscript/DebugBehavior.cs @@ -5,25 +5,28 @@ 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 { internal class DebugBehavior : ExecuteScriptBehavior { - private readonly int _port; - - public DebugBehavior(int port, string path, string[] args) : base(path, args) + public DebugBehavior(string path, string[] args) : base(path, args) { - _port = port; } + public int Port { get; set; } = 2801; + + public bool AttachMode { get; set; } = true; + public override int Execute() { - var tcpDebugServer = new TcpDebugServer(_port); - - DebugController = tcpDebugServer.CreateDebugController(); + var tcpDebugServer = new TcpDebugServer(Port); + + DebugController = new DefaultDebugger(tcpDebugServer) + { + AttachMode = AttachMode + }; return base.Execute(); } @@ -32,6 +35,7 @@ public static AppBehavior Create(CmdLineHelper helper) { int port = 2801; string path = null; + bool noWait = false; while (true) { @@ -54,6 +58,10 @@ public static AppBehavior Create(CmdLineHelper helper) return null; } } + else if (parsedArg.Name == "-noWait") + { + noWait = true; + } else if (parsedArg.Name == "-protocol") { // Обратная совместимость, не используется в реальности @@ -66,7 +74,10 @@ public static AppBehavior Create(CmdLineHelper helper) } } - return path == null ? null : new DebugBehavior(port, path, helper.Tail()); + return path == null ? null : new DebugBehavior(path, helper.Tail()) + { + Port = port, AttachMode = noWait + }; } } } diff --git a/src/oscript/ExecuteScriptBehavior.cs b/src/oscript/ExecuteScriptBehavior.cs index 9e6069be2..49cbc29c4 100644 --- a/src/oscript/ExecuteScriptBehavior.cs +++ b/src/oscript/ExecuteScriptBehavior.cs @@ -10,6 +10,7 @@ This Source Code Form is subject to the terms of the using ScriptEngine.HostedScript; using ScriptEngine.Hosting; using ScriptEngine.Machine; +using ScriptEngine.Machine.Debugger; namespace oscript { @@ -24,7 +25,7 @@ public ExecuteScriptBehavior(string path, string[] args) _path = path; } - public IDebugController DebugController { get; set; } + public IDebugger DebugController { get; set; } = new DisabledDebugger(); public string CodeStatFile { get; set; } @@ -50,8 +51,6 @@ public override int Execute() } var hostedScript = ConsoleHostBuilder.Build(builder); - - var source = hostedScript.Loader.FromFile(_path); Process process; diff --git a/tests/ValueTableIndex.os b/tests/ValueTableIndex.os index eb46d3fbf..b1a0e1b45 100644 --- a/tests/ValueTableIndex.os +++ b/tests/ValueTableIndex.os @@ -25,6 +25,7 @@ ВсеТесты.Добавить("ТестДолжен_ПоведениеИндексовПриУдаленииКолонок"); ВсеТесты.Добавить("ТестДолжен_ПоведениеИндексовПриИзмененииЗначенийИндексированныхПолей"); ВсеТесты.Добавить("ТестДолжен_ПроверитьВыбросИсключений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоискПоИндексированнойКолонкеСЗаданнымТипом"); Возврат ВсеТесты; @@ -243,3 +244,22 @@ юТест.ПроверитьРавенство(ПоискПоИндексу[0][ИндексированноеПоле], ИскомоеЗначение, Пояснение); КонецПроцедуры + +// к issue #1573 +Процедура ТестДолжен_ПроверитьПоискПоИндексированнойКолонкеСЗаданнымТипом() Экспорт + + Т = Новый ТаблицаЗначений; + Т.Колонки.Добавить("К1",Новый ОписаниеТипов("Строка")); + Т.Индексы.Добавить("К1"); + + Т.Добавить().К1 = "Стр1"; + Т.Добавить().К1 = "Стр2"; + Т.Добавить().К1 = "Стр3"; + + + СтруктураПоиска = Новый Структура("К1", "Стр2"); + НайденныеСтроки = Т.НайтиСтроки(СтруктураПоиска); + юТест.ПроверитьРавенство(НайденныеСтроки.Количество(), 1); + юТест.ПроверитьРавенство(НайденныеСтроки[0].К1, "Стр2"); + +КонецПроцедуры diff --git a/tests/cgi-output.os b/tests/cgi-output.os index a35f6fdde..5c776ceba 100755 --- a/tests/cgi-output.os +++ b/tests/cgi-output.os @@ -370,7 +370,7 @@ Данные = СокрЛП(Данные); ПроверочнаяСтрока = СокрЛП(ПроверочнаяСтрока); - юТест.ПроверитьРавенство(Данные, ПроверочнаяСтрока); + юТест.ПроверитьРавенство(ПроверочнаяСтрока, Данные); КонецПроцедуры diff --git a/tests/engine-behaviors.os b/tests/engine-behaviors.os index f35fefe8a..7901869f1 100644 --- a/tests/engine-behaviors.os +++ b/tests/engine-behaviors.os @@ -51,7 +51,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьПродолжениеВложенныхПопыток"); ВсеТесты.Добавить("ТестДолжен_ПроверитьИнформацияОбОшибкеВнеИсключения"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПередачуПараметровПоСсылке"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьСравнениеНаБольшеМеньше"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьОшибкиСравненияНаБольшеМеньше"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧто_ЭтотОбъект_НедоступенДляЗаписи"); ВсеТесты.Добавить("ТестДолжен_ПроверитьОперацииСДатой_Сложение"); @@ -664,41 +664,46 @@ КонецПроцедуры -Процедура ТестДолжен_ПроверитьСравнениеНаБольшеМеньше() Экспорт +Процедура ТестДолжен_ПроверитьОшибкиСравненияНаБольшеМеньше() Экспорт - Ошибка = "Сравнение на больше/меньше для данного типа не поддерживается"; - + Ошибка = "Сравнение на больше/меньше для типа 'СтатусСообщения' не поддерживается"; юТест.ПроверитьКодСОшибкой( "Рез = (СтатусСообщения.БезСтатуса <= СтатусСообщения.БезСтатуса);", Ошибка, "Для одинаковых значений перечислений" ); + Ошибка = "Сравнение на больше/меньше типов 'ЦветКонсоли' и 'СтатусСообщения' не поддерживается"; юТест.ПроверитьКодСОшибкой( "Рез = (ЦветКонсоли.Черный < СтатусСообщения.БезСтатуса);", Ошибка, "Для значений перечислений разных типов" ); + Ошибка = "Сравнение на больше/меньше для типа 'ПеречислениеКодировкаТекста' не поддерживается"; юТест.ПроверитьКодСОшибкой( "Рез = (КодировкаТекста >= КодировкаТекста);", Ошибка, "Для одинаковых перечислений" ); + + Ошибка = "Сравнение на больше/меньше типов 'ПеречислениеХешФункция' и 'ПеречислениеСтатусСообщения' не поддерживается"; юТест.ПроверитьКодСОшибкой( "Рез = (ХешФункция > СтатусСообщения);", Ошибка, "Для перечислений разных типов" ); + Ошибка = "Сравнение на больше/меньше для типа 'Тип' не поддерживается"; юТест.ПроверитьКодСОшибкой( "Рез = (ТипЗнч(истина) > ТипЗнч(0));", Ошибка, "Для значений типа 'Тип'" ); - + + Ошибка = "Сравнение на больше/меньше типов 'Массив' и 'Структура' не поддерживается"; юТест.ПроверитьКодСОшибкой( "Массив = Новый Массив(1); |Структура = Новый Структура; |Рез = (Массив > Структура);", Ошибка, "Для объектов разных типов" ); + Ошибка = "Сравнение на больше/меньше для типа 'Массив' не поддерживается"; юТест.ПроверитьКодСОшибкой( "Массив = Новый Массив(1); |Массив2 = Новый Массив(1);; |Рез = (Массив <= Массив2);", Ошибка, "Для одинаковых объектов" ); - КонецПроцедуры Процедура ТестДолжен_ПроверитьЧто_ЭтотОбъект_НедоступенДляЗаписи() Экспорт diff --git a/tests/enum.os b/tests/enum.os index 79027e94b..1a420f6d1 100644 --- a/tests/enum.os +++ b/tests/enum.os @@ -10,6 +10,7 @@ ВсеТесты.Добавить("ТестДолженПроверитьЧтоПростоеПеречислениеПриводитсяКСтроке"); ВсеТесты.Добавить("ТестДолженПроверитьРаботоспособностьСравненияПростогоПеречисления"); ВсеТесты.Добавить("ТестДолженПроверитьКорректностьКонвертацииПростогоПеречислениеСДругимНаименованиемЭлемента"); + ВсеТесты.Добавить("ТестДолженПроверитьЧтоСистемноеПеречислениеМожноПолучитьЧерезРефлектор"); Возврат ВсеТесты; @@ -47,6 +48,14 @@ КонецПроцедуры +Процедура ТестДолженПроверитьЧтоСистемноеПеречислениеМожноПолучитьЧерезРефлектор() Экспорт + + Рефлектор = Новый Рефлектор; + Свойства = Рефлектор.ПолучитьТаблицуСвойств(ДопустимыйЗнак); + юТест.ПроверитьРавенство(2, Свойства.Количество()); + +КонецПроцедуры + Функция ПростоеПеречисление() ТЗ = Новый ТаблицаЗначений(); @@ -54,4 +63,5 @@ Квалификатор = ТЗ.Колонки[0].ТипЗначения.КвалификаторыЧисла; Возврат Квалификатор.ДопустимыйЗнак; -КонецФункции \ No newline at end of file +КонецФункции + diff --git a/tests/eval.os b/tests/eval.os index 9fc1e87d3..7170064a6 100644 --- a/tests/eval.os +++ b/tests/eval.os @@ -15,6 +15,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьОператорВыполнитьСВыбросомИсключения"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВОператореВыполнитьЗапрещенВозврат"); ВсеТесты.Добавить("ТестДолжен_ПроверитьСвойствоЭтотОбъект_issue712"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьEvalНаРазныхЭкземплярахThis"); ВсеТесты.Добавить("ТестДолжен_ПроверитьКешКомпиляцииВРазныхФреймах"); ВсеТесты.Добавить("ТестДолжен_ПроверитьРекурсивныйВызовВычислить"); ВсеТесты.Добавить("ТестДолжен_ПроверитьСложныеВложенныеВызовыВычислить"); @@ -151,6 +152,23 @@ КонецПроцедуры +Процедура ТестДолжен_ПроверитьEvalНаРазныхЭкземплярахThis() Экспорт + + ПутьСценарий = ОбъединитьПути(ТекущийСценарий().Каталог, "testdata", "evalDifferentThis.os"); + Первый = ЗагрузитьСценарий(ПутьСценарий); + Второй = ЗагрузитьСценарий(ПутьСценарий); + + Первый.УстановитьЗначение("Первый"); + Второй.УстановитьЗначение("Второй"); + + Рез1 = Первый.ПолучитьЧерезВычислить(); + Рез2 = Второй.ПолучитьЧерезВычислить(); + + юТест.ПроверитьРавенство("Первый", Рез1); + юТест.ПроверитьРавенство("Второй", Рез2); + +КонецПроцедуры + Функция ТестМетод1(П1) ЛокальнаяПеременная = 1; diff --git a/tests/global-funcs.os b/tests/global-funcs.os index 705e6c9bb..dc9ddf03f 100644 --- a/tests/global-funcs.os +++ b/tests/global-funcs.os @@ -1,4 +1,4 @@ -/////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////// // // Тест проверки поведения некоторых глобальных функций // @@ -102,6 +102,8 @@ ВсеТесты.Добавить("Тест_ДолженПроверитьНСтрВозвращаетПервуюСтроку"); ВсеТесты.Добавить("Тест_ДолженПроверитьПолучениеТекущейДатыВМиллисекундах"); ВсеТесты.Добавить("Тест_ДолженПроверитьОкруглениеТекущейДатыДоСекунд"); + + ВсеТесты.Добавить("Тест_ДолженПроверитьСтрЗаменить"); Возврат ВсеТесты; КонецФункции @@ -1185,4 +1187,29 @@ ДатаИсходная = ТекущаяДата(); ДатаСозданнаяВручную = Дата(Формат(ДатаИсходная, "ДФ=ггггММддЧЧммсс")); юТест.ПроверитьРавенство(ДатаИсходная, ДатаСозданнаяВручную); -КонецПроцедуры \ No newline at end of file +КонецПроцедуры + +Процедура Тест_ДолженПроверитьСтрЗаменить() Экспорт + + Тест = СтрЗаменить("123", "1", "4"); + юТест.ПроверитьРавенство("423", Тест); + + Тест = СтрЗаменить("", "1", "4"); + юТест.ПроверитьРавенство("", Тест); + + Тест = СтрЗаменить("123", "", "4"); + юТест.ПроверитьРавенство("123", Тест); + + Тест = СтрЗаменить("123", "1", ""); + юТест.ПроверитьРавенство("23", Тест); + + Тест = СтрЗаменить("123", "", ""); + юТест.ПроверитьРавенство("123", Тест); + + Тест = СтрЗаменить("", "", "123"); + юТест.ПроверитьРавенство("", Тест); + + Тест = СтрЗаменить("", "", ""); + юТест.ПроверитьРавенство("", Тест); + +КонецПроцедуры diff --git a/tests/http.os b/tests/http.os index e430112e5..d2f89a6d5 100644 --- a/tests/http.os +++ b/tests/http.os @@ -1,6 +1,6 @@ Перем юТест; -Перем мАдресРесурса; // URL ресурса (хоста) httpbin.org для тестирования запросов +Перем мАдресРесурса; // URL ресурса (хоста) для тестирования запросов Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт @@ -40,6 +40,13 @@ Возврат ВсеТесты; КонецФункции +Процедура ПередЗапускомТеста() Экспорт + Если мАдресРесурса = Неопределено Тогда + мАдресРесурса = ВыбратьДоступныйХост(); + Сообщить("HTTP тесты: используется ресурс " + мАдресРесурса); + КонецЕсли; +КонецПроцедуры + Процедура ТестДолжен_ПроверитьАвтоматическуюРаспаковкуGZip() Экспорт Запрос = Новый HttpЗапрос("/gzip"); @@ -381,8 +388,48 @@ КонецФункции -/////////////////////////////////////////////////////////////////// -/// ИНИЦИАЛИЗАЦИЯ -/////////////////////////////////////////////////////////////////// +Функция ПроверитьДоступность(АдресХоста) + + Попытка + // Короткие таймауты для быстрой проверки доступности + Соединение = Новый HttpСоединение(АдресХоста,,,,,5); + Запрос = Новый HttpЗапрос("/get"); + Ответ = Соединение.Получить(Запрос); + Возврат Ответ.КодСостояния = 200; + Исключение + Сообщить("HTTP тесты: недоступен хост " + АдресХоста + " (" + ОписаниеОшибки() + ")"); + Возврат Ложь; + КонецПопытки; + +КонецФункции -мАдресРесурса = "httpbin.org"; +Функция ВыбратьДоступныйХост() + + // Если задана переменная окружения, используем ее при наличии значения + ЗначениеИзОкружения = ПолучитьПеременнуюСреды("OS_HTTP_TEST_HOST"); + Если ЗначениеЗаполнено(ЗначениеИзОкружения) Тогда + Если ПроверитьДоступность(ЗначениеИзОкружения) Тогда + Сообщить("HTTP тесты: выбран хост из переменной окружения OS_HTTP_TEST_HOST = " + ЗначениеИзОкружения); + Возврат ЗначениеИзОкружения; + Иначе + Сообщить("HTTP тесты: хост из переменной окружения недоступен: " + ЗначениеИзОкружения); + КонецЕсли; + КонецЕсли; + + // Пробуем типовые варианты httpbin + Кандидаты = Новый Массив; + Кандидаты.Добавить("https://httpbin.org"); + Кандидаты.Добавить("https://httpbingo.org"); + + Для Каждого Хост Из Кандидаты Цикл + Если ПроверитьДоступность(Хост) Тогда + Сообщить("HTTP тесты: автоматически выбран доступный хост " + Хост); + Возврат Хост; + КонецЕсли; + КонецЦикла; + + // По умолчанию сохраняем прежнее поведение + Сообщить("HTTP тесты: не удалось определить доступный хост, используется значение по умолчанию https://httpbin.org"); + Возврат "https://httpbin.org"; + +КонецФункции \ No newline at end of file diff --git a/tests/native-api/AddInNative.vcxproj b/tests/native-api/AddInNative.vcxproj index f3f303062..bb47f817d 100644 --- a/tests/native-api/AddInNative.vcxproj +++ b/tests/native-api/AddInNative.vcxproj @@ -26,7 +26,6 @@ {55890DF2-D13E-4C89-A01D-79CAD6726246} testCPP Win32Proj - 10.0.18362.0 diff --git a/tests/run-bsl-tests.cmd b/tests/run-bsl-tests.cmd new file mode 100644 index 000000000..6f15f2a3f --- /dev/null +++ b/tests/run-bsl-tests.cmd @@ -0,0 +1,40 @@ +@echo off +setlocal + +rem Remove trailing backslash from %~dp0 +set "SCRIPT_DIR=%~dp0" +if "%SCRIPT_DIR:~-1%"=="\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" +set OVM_LIB_PATH=%USERPROFILE%\AppData\Local\ovm\current\lib + +set OSCRIPT_CONFIG=lib.system=%OVM_LIB_PATH% + +set OSCRIPT_BIN=%~f1 +if defined OSCRIPT_BIN goto validate_bin + +if defined OSCRIPT_EXE ( + set OSCRIPT_BIN=%OSCRIPT_EXE% + goto validate_bin +) + +for /f "usebackq delims=" %%i in (`where oscript.exe 2^>nul`) do ( + set "OSCRIPT_BIN=%%i" + goto validate_bin +) + +echo [ERROR] Failed to determine path to oscript.exe. >&2 +echo Pass the path as the first parameter or set OSCRIPT_EXE variable. >&2 +exit /b 1 + +:validate_bin +if not exist "%OSCRIPT_BIN%" ( + echo [ERROR] File "%OSCRIPT_BIN%" not found. >&2 + exit /b 1 +) + +pushd "%SCRIPT_DIR%" >nul +"%OSCRIPT_BIN%" testrunner.os -runAll . +set EXIT_CODE=%ERRORLEVEL% +popd >nul + +exit /b %EXIT_CODE% + diff --git a/tests/run-bsl-tests.sh b/tests/run-bsl-tests.sh new file mode 100644 index 000000000..111b14b89 --- /dev/null +++ b/tests/run-bsl-tests.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +OVM_LIB_PATH="${HOME}/.local/share/ovm/current/lib" + +if [[ -z "${OSCRIPT_CONFIG:-}" ]]; then + export OSCRIPT_CONFIG="lib.system=${OVM_LIB_PATH}" +fi + +OSCRIPT_BIN="${1:-${OSCRIPT_EXE:-}}" +if [[ -z "${OSCRIPT_BIN}" ]]; then + OSCRIPT_BIN="$(command -v oscript 2>/dev/null || true)" +fi + +if [[ -z "${OSCRIPT_BIN}" ]]; then + echo "[ERROR] Failed to determine path to oscript." >&2 + echo "Pass it as the first parameter or set OSCRIPT_EXE variable." >&2 + exit 1 +fi + +if [[ ! -x "${OSCRIPT_BIN}" ]]; then + echo "[ERROR] File '${OSCRIPT_BIN}' does not exist or is not executable." >&2 + exit 1 +fi + +cd "${SCRIPT_DIR}" +"${OSCRIPT_BIN}" testrunner.os -runAll . + diff --git a/tests/start-all.cmd b/tests/start-all.cmd deleted file mode 100644 index 9ca8e4667..000000000 --- a/tests/start-all.cmd +++ /dev/null @@ -1,43 +0,0 @@ -@echo off - -chcp 866 > nul - -setlocal -set pathdir=%~dp0 - -rem echo ᠬ %CD% -rem echo ਯ ஢ %pathdir% - -for /f "tokens=*" %%i in ('where oscript') do set OSCRIPT=%%i -if NOT "%OSCRIPT%"=="" GOTO run - -set OS_EXE=\OneScript\bin\oscript.exe -set OSCRIPT=%ProgramFiles(x86)%%OS_EXE% -if NOT EXIST "%OSCRIPT%" set OSCRIPT=%ProgramFiles%%OS_EXE% -if NOT EXIST "%OSCRIPT%" set OSCRIPT=%ProgramW6432%%OS_EXE% - -:run -@echo on -"%OSCRIPT%" "%pathdir%testrunner.os" -runall %1 %2 %3 %4 %5 -@echo off - -rem echo %ERRORLEVEL% -if %ERRORLEVEL%==2 GOTO pending_exit -if NOT %ERRORLEVEL%==0 GOTO bad_exit - -:success_exit - -exit /B 0 - -:pending_exit - -exit /B 2 - -:bad_exit -if "-1"=="%success%" GOTO success_exit -echo . -echo ᪮쪮 ⮢ 㯠 -echo 㤠. ᭠ - -if ".%1"=="." pause -exit /B 1 \ No newline at end of file diff --git a/tests/start-all.sh b/tests/start-all.sh deleted file mode 100755 index efb317bb5..000000000 --- a/tests/start-all.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -../src/oscript/bin/Debug/oscript.exe testrunner.os -runall $@ - -if [ $? = 0 ]; then - # success - exit -fi - -if [ $? = -1 ]; then - # strange success - exit -fi - -exit 1 - diff --git a/tests/start.cmd b/tests/start.cmd deleted file mode 100644 index 20c5bf96b..000000000 --- a/tests/start.cmd +++ /dev/null @@ -1,36 +0,0 @@ -@echo off - -setlocal -set pathdir=%~dp0 - -rem echo ᠬ %CD% -rem echo ਯ ஢ %pathdir% - -for /f "tokens=*" %%i in ('where oscript') do set OSCRIPT=%%i -if NOT "%OSCRIPT%"=="" GOTO run - -set OS_EXE=\OneScript\bin\oscript.exe -set OSCRIPT=%ProgramFiles(x86)%%OS_EXE% -if NOT EXIST "%OSCRIPT%" set OSCRIPT=%ProgramFiles%%OS_EXE% -if NOT EXIST "%OSCRIPT%" set OSCRIPT=%ProgramW6432%%OS_EXE% - -:run -echo on -"%OSCRIPT%" "%pathdir%testrunner.os" -run %1 %2 %3 %4 %5 -@echo off - -rem echo %ERRORLEVEL% -if NOT %ERRORLEVEL%==0 GOTO bad_exit - -:success_exit -rem echo ᯥ譮 -rem pause - -exit /B 0 - -:bad_exit -if %ERRORLEVEL%==-1 GOTO success_exit -echo Tests failed - -pause -exit /B 1 \ No newline at end of file diff --git a/tests/start.sh b/tests/start.sh deleted file mode 100755 index 4f5f049bd..000000000 --- a/tests/start.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -../src/oscript/bin/Debug/oscript.exe testrunner.os -run $@ - -if [ $? = 0 ]; then - # success - exit -fi - -if [ $? = -1 ]; then - # strange success - exit -fi - -echo Tests failed - -exit 1 - diff --git a/tests/testdata/evalDifferentThis.os b/tests/testdata/evalDifferentThis.os new file mode 100644 index 000000000..0478536ff --- /dev/null +++ b/tests/testdata/evalDifferentThis.os @@ -0,0 +1,10 @@ +Перем Значение Экспорт; + +Процедура УстановитьЗначение(НовоеЗначение) Экспорт + Значение = НовоеЗначение; +КонецПроцедуры + +Функция ПолучитьЧерезВычислить() Экспорт + Возврат Вычислить("Значение"); +КонецФункции + diff --git a/tests/testrunner.os b/tests/testrunner.os index 658573b34..6c413590b 100644 --- a/tests/testrunner.os +++ b/tests/testrunner.os @@ -82,6 +82,18 @@ КонецЕсли; КонецПроцедуры +Процедура ПроверитьРавенствоСтрокБезУчетаРегистра(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт + Если нрег(ПервоеЗначение) <> нрег(ВтороеЗначение) Тогда + Если ТипЗнч(ПервоеЗначение) = Тип("Строка") и ТипЗнч(ВтороеЗначение) = Тип("Строка") Тогда + ВызватьИсключение ИсключениеНеравенстваСтрок(ПервоеЗначение, ВтороеЗначение, Истина) + " + |" + ДопСообщениеОшибки; + КонецЕсли; + + СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") не равны, а хотели, чтобы были равны." + ФорматДСО(ДопСообщениеОшибки); + ВызватьИсключение(СообщениеОшибки); + КонецЕсли; +КонецПроцедуры + Процедура ПроверитьНеРавенство(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт Если ПервоеЗначение = ВтороеЗначение Тогда СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") равны, а хотели, чтобы были не равны." + ФорматДСО(ДопСообщениеОшибки); @@ -196,20 +208,28 @@ Возврат СтрЗаменить(СтрЗаменить(Строка, Символы.ПС, "\n"), Символы.ВК, "\r"); КонецФункции -Функция ИсключениеНеравенстваСтрок(ПервоеЗначение, ВтороеЗначение) - ДиапазонОтНачала = 5; - ДиапазонВКонце = 5; - СтрокаНабора = " "; // длина = 2*ДиапазонОтНачала +Функция ИсключениеНеравенстваСтрок(ПервоеЗначение, ВтороеЗначение, Знач БезУчетаРегистра = Ложь) + ДиапазонОтНачала = 17; + ДиапазонВКонце = 17; + СтрокаНабора = СтрСоединить(Новый Массив(2*ДиапазонОтНачала), " "); МинДлина = Мин(СтрДлина(ПервоеЗначение), СтрДлина(ВтороеЗначение)); ИндексРазличия = МинДлина + 1; Для Сч = 1 По МинДлина Цикл + Символ1 = Сред(ПервоеЗначение, Сч, 1); Символ2 = Сред(ВтороеЗначение, Сч, 1); + + Если БезУчетаРегистра Тогда + Символ1 = нрег(Символ1); + Символ2 = нрег(Символ2); + КонецЕсли; + Если Символ1 <> Символ2 Тогда ИндексРазличия = Сч; Прервать; КонецЕсли; + КонецЦикла; ОтступНачала = ИндексРазличия - ДиапазонОтНачала; diff --git a/tests/value-list.os b/tests/value-list.os index 009df5801..2dbf03562 100644 --- a/tests/value-list.os +++ b/tests/value-list.os @@ -1,394 +1,413 @@ -Перем юТест; - -Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт - - юТест = ЮнитТестирование; - - ВсеТесты = Новый Массив; - ВсеТесты.Добавить("ТестДолжен_ПроверитьСозданиеСпискаЗначений"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьДобавлениеЭлементов"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьДоступКСвойствамЭлементаСписка"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьСвойствЭлементаСписка"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьИтерациюПоСписку"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьДоступПоИндексу"); - - ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодИндексСпискаЗначений"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодВставитьСпискаЗначений"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодСдвинутьСпискаЗначений"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодСортироватьПоЗначениюСпискаЗначений"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодСортироватьПоПредставлениюСпискаЗначений"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодНайтиСпискаЗначений"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодУдалитьСпискаЗначений"); - Возврат ВсеТесты; - -КонецФункции - -Процедура ТестДолжен_ПроверитьСозданиеСпискаЗначений() Экспорт - СЗ = Новый СписокЗначений; - юТест.ПроверитьРавенство(Тип("СписокЗначений"), ТипЗнч(СЗ)); -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьДобавлениеЭлементов() Экспорт - СЗ = Новый СписокЗначений; - СЗ.Добавить("Один"); - СЗ.Добавить("Два"); - юТест.ПроверитьРавенство(2, СЗ.Количество()); - юТест.ПроверитьРавенство(Тип("ЭлементСпискаЗначений"), ТипЗнч(СЗ.Получить(0))); -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьДоступКСвойствамЭлементаСписка() Экспорт - - СЗ = Новый СписокЗначений; - СЗ.Добавить(1,"Представление"); - СЗ.Добавить(2,"Представление2", Истина); - СЗ.Добавить(3,"Представление3", Истина, "Тут должна быть картинка, но сейчас может быть любое значение"); - СЗ.Добавить(1); - - Элемент = СЗ[0]; - юТест.ПроверитьРавенство(1, Элемент.Значение, "Значение элемента 0 должно быть установлено"); - юТест.ПроверитьРавенство("Представление", Элемент.Представление, "Представление элемента 0 должно быть установлено"); - юТест.ПроверитьРавенство(Ложь, Элемент.Пометка, "Пометка элемента 0 не должна быть установлена"); - юТест.ПроверитьРавенство(Неопределено, Элемент.Картинка, "Картинка элемента 0 не должна быть установлена"); - - Элемент = СЗ[1]; - юТест.ПроверитьРавенство(2, Элемент.Значение, "Значение элемента 1 должно быть установлено"); - юТест.ПроверитьРавенство("Представление2", Элемент.Представление, "Представление элемента 1 должно быть установлено"); - юТест.ПроверитьРавенство(Истина, Элемент.Пометка, "Пометка элемента 1 должна быть установлена"); - - Элемент = СЗ[2]; - юТест.ПроверитьРавенство(3, Элемент.Значение, "Значение элемента 2 должно быть установлено"); - юТест.ПроверитьРавенство("Представление3", Элемент.Представление, "Представление элемента 2 должно быть установлено"); - юТест.ПроверитьРавенство(Истина, Элемент.Пометка, "Пометка элемента 2 должна быть установлена"); - юТест.ПроверитьРавенство("Тут должна быть картинка, но сейчас может быть любое значение", Элемент.Картинка, "Картинка элемента 2 должна быть установлена"); - - юТест.ПроверитьРавенство("", СЗ[3].Представление, "Должно быть пустое представление по умолчанию"); - -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьЗаписьСвойствЭлементаСписка() Экспорт - СЗ = Новый СписокЗначений; - Элемент = СЗ.Добавить(1); - - Элемент.Значение = 2; - Элемент.Представление = "Привет"; - Элемент.Пометка = Истина; - Элемент.Картинка = "---"; - - юТест.ПроверитьРавенство(2, Элемент.Значение, "Значение элемента должно быть установлено"); - юТест.ПроверитьРавенство("Привет", Элемент.Представление, "Представление элемента должно быть установлено"); - юТест.ПроверитьРавенство(Истина, Элемент.Пометка, "Пометка элемента должна быть установлена"); - юТест.ПроверитьРавенство("---", Элемент.Картинка, "Картинка элемента должна быть установлена"); - -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьИтерациюПоСписку() Экспорт - СЗ = Новый СписокЗначений; - СЗ.Добавить(1); - СЗ.Добавить(2); - СЗ.Добавить(3); - СЗ.Добавить(4); - Сч = 0; - Для Каждого Элемент Из СЗ Цикл - Сч = Сч + 1; - КонецЦикла; - - юТест.ПроверитьРавенство(4, Сч); - -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьДоступПоИндексу() Экспорт - СЗ = Новый СписокЗначений; - СЗ.Добавить(1); - - юТест.ПроверитьРавенство(1, СЗ[0].Значение); - Попытка - СЗ[0] = СЗ[0]; - Исключение - юТест.ПроверитьРавенство("Индексированное значение доступно только для чтения", ИнформацияОбОшибке().Описание); - Возврат; - КонецПопытки; - - ВызватьИсключение "Должно было быть выброшено исключение, но это не произошло"; - -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьМетодИндексСпискаЗначений() Экспорт - - СЗ = Новый СписокЗначений; - - СЗ.Добавить(1); - СЗ.Добавить(2); - СЗ.Добавить(3); - СЗ.Добавить(4); - - юТест.ПроверитьРавенство(СЗ.Индекс(СЗ[0]), 0, "Метод Индекс() списка значений"); - юТест.ПроверитьРавенство(СЗ.Индекс(СЗ[1]), 1, "Метод Индекс() списка значений"); - юТест.ПроверитьРавенство(СЗ.Индекс(СЗ[2]), 2, "Метод Индекс() списка значений"); - юТест.ПроверитьРавенство(СЗ.Индекс(СЗ[3]), 3, "Метод Индекс() списка значений"); - - ДругойСЗ = Новый СписокЗначений; - ДругойСЗ.Добавить(1); - - юТест.ПроверитьРавенство(СЗ.Индекс(ДругойСЗ[0]), -1, "Метод Индекс() списка значений: несуществующий элемент"); - -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьМетодВставитьСпискаЗначений() Экспорт - - СЗ = Новый СписокЗначений; - - Э3 = СЗ.Вставить(0, 3); // Вставка в пустой список - Э1 = СЗ.Вставить(0, 1); // Вставка в начало - Э2 = СЗ.Вставить(1, 2); // Вставка в середину - Э4 = СЗ.Вставить(3, 4); // Вставка в конец - - юТест.ПроверитьРавенство(СЗ.Индекс(Э1), 0, "Метод Вставить() списка значений"); - юТест.ПроверитьРавенство(СЗ.Индекс(Э2), 1, "Метод Вставить() списка значений"); - юТест.ПроверитьРавенство(СЗ.Индекс(Э3), 2, "Метод Вставить() списка значений"); - юТест.ПроверитьРавенство(СЗ.Индекс(Э4), 3, "Метод Вставить() списка значений"); - -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьМетодУдалитьСпискаЗначений() Экспорт - - СЗ = Новый СписокЗначений; - Для Инд = 1 По 5 Цикл - СЗ.Добавить(Инд); - КонецЦикла; - Э1 = СЗ[0]; - Э2 = СЗ[1]; - Э3 = СЗ[2]; - Э4 = СЗ[3]; - Э5 = СЗ[4]; - - СЗ.Удалить(1); - юТест.ПроверитьРавенство(СЗ.Количество(),4, "Удаление по индексу"); - юТест.ПроверитьРавенство(СЗ.Индекс(Э2),-1, "Удаление по индексу"); - юТест.ПроверитьРавенство(СЗ.Индекс(Э4),2, "Удаление по индексу"); - - СЗ.Удалить(Э1); - юТест.ПроверитьРавенство(СЗ.Количество(),3, "Удаление элемента"); - юТест.ПроверитьРавенство(СЗ.Индекс(Э1),-1, "Удаление элемента"); - юТест.ПроверитьРавенство(СЗ.Индекс(Э4),1, "Удаление элемента"); - - СЗ.Удалить("1"); - юТест.ПроверитьРавенство(СЗ.Количество(),2, "Удаление по индексу типа строка"); - юТест.ПроверитьРавенство(СЗ.Индекс(Э4),-1, "Удаление по индексу типа строка"); - юТест.ПроверитьРавенство(СЗ.Индекс(Э5),1, "Удаление по индексу типа строка"); - - // Проверим ошибки - Ошибка = "Удаление с неверным индексом"; - Попытка - СЗ.Удалить(10); - Исключение - Ошибка = ИнформацияОбОшибке().Описание; - КонецПопытки; - юТест.ПроверитьРавенство(Ошибка, "Значение индекса выходит за пределы диапазона"); - - Ошибка = "Удаление несуществующего элемента"; - ДругойСЗ = Новый СписокЗначений; - ДругойСЗ.Добавить(1); - Попытка - СЗ.Удалить(ДругойСЗ[0]); - Исключение - Ошибка = ИнформацияОбОшибке().Описание; - КонецПопытки; - юТест.ПроверитьРавенство(Ошибка, "Элемент не принадлежит списку значений"); - - Ошибка = "Удаление с неверным типом параметра"; - Попытка - СЗ.Удалить("ё"); - Исключение - Ошибка = ИнформацияОбОшибке().Описание; - КонецПопытки; - юТест.ПроверитьРавенство(Ошибка, "Неверный тип аргумента"); - -КонецПроцедуры - - -Функция ПроверитьПорядок(Знач СЗ, Знач П1, - Знач П2 = Неопределено, - Знач П3 = Неопределено, - Знач П4 = Неопределено, - Знач П5 = Неопределено) - - Массив = Новый Массив; - Массив.Добавить(П1); - - Если П2 <> Неопределено Тогда - Массив.Добавить(П2); - КонецЕсли; - Если П3 <> Неопределено Тогда - Массив.Добавить(П3); - КонецЕсли; - Если П4 <> Неопределено Тогда - Массив.Добавить(П4); - КонецЕсли; - Если П5 <> Неопределено Тогда - Массив.Добавить(П5); - КонецЕсли; - - Для Инд = 0 По Массив.ВГраница() Цикл - - Если СЗ[Инд].Значение <> Массив[Инд] Тогда - Возврат Ложь; - КонецЕсли; - - КонецЦикла; - - Возврат Истина; - -КонецФункции - -Процедура ТестДолжен_ПроверитьМетодСдвинутьСпискаЗначений() Экспорт - - СЗ = Новый СписокЗначений; - - Для Инд = 1 По 5 Цикл - СЗ.Добавить(Инд); - КонецЦикла; - - С1 = СЗ[0]; - С2 = СЗ[1]; - С3 = СЗ[2]; - С4 = СЗ[3]; - С5 = СЗ[4]; - - // Проверим обычное перемещение - СЗ.Сдвинуть(С2, -1); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 1, 3, 4, 5), "Сдвиг вверх"); - - СЗ.Сдвинуть(С1, 2); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 3, 4, 1, 5), "Сдвиг вниз"); - - СЗ.Сдвинуть(3, -2); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 1, 3, 4, 5), "Сдвиг по индексу вверх"); - - СЗ.Сдвинуть(1, 2); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 3, 4, 1, 5), "Сдвиг по индексу вниз"); - - // Проверим приведение типа - СЗ.Сдвинуть("2", 2); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 3, 1, 5, 4), "Сдвиг, индекс - строка"); - - СЗ.Сдвинуть("1", "2"); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 1, 5, 3, 4), "Сдвиг, индекс и смещение - строки"); - - // Проверим крайние случаи - СЗ.Сдвинуть(0, 4); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 1, 5, 3, 4, 2), "Сдвиг по индексу вниз"); - - СЗ.Сдвинуть(4, -4); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 1, 5, 3, 4), "Сдвиг по индексу вниз"); - - // Проверим ошибки - Ошибка = "Сдвиг за пределы вниз"; - Попытка - СЗ.Сдвинуть(0, 5); - Исключение - Ошибка = ИнформацияОбОшибке().Описание; - КонецПопытки; - юТест.ПроверитьРавенство(Ошибка, "Неверное значение аргумента номер 2"); - - Ошибка = "Сдвиг за пределы вверх"; - Попытка - СЗ.Сдвинуть(1, -3); - Исключение - Ошибка = ИнформацияОбОшибке().Описание; - КонецПопытки; - юТест.ПроверитьРавенство(Ошибка, "Неверное значение аргумента номер 2"); - - Ошибка = "Сдвиг с неверным индексом"; - Попытка - СЗ.Сдвинуть(10, 2); - Исключение - Ошибка = ИнформацияОбОшибке().Описание; - КонецПопытки; - юТест.ПроверитьРавенство(Ошибка, "Значение индекса выходит за пределы диапазона"); - - Ошибка = "Сдвиг несуществующего элемента"; - ДругойСЗ = Новый СписокЗначений; - ДругойСЗ.Добавить(1); - Попытка - СЗ.Сдвинуть(ДругойСЗ[0], 2); - Исключение - Ошибка = ИнформацияОбОшибке().Описание; - КонецПопытки; - юТест.ПроверитьРавенство(Ошибка, "Элемент не принадлежит списку значений"); - - Ошибка = "Сдвиг с неверным типом параметра"; - Попытка - СЗ.Сдвинуть("ё", 2); - Исключение - Ошибка = ИнформацияОбОшибке().Описание; - КонецПопытки; - юТест.ПроверитьРавенство(Ошибка, "Неверный тип аргумента"); - -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьМетодСортироватьПоЗначениюСпискаЗначений() Экспорт - - СЗ = Новый СписокЗначений; - СЗ.Добавить(4); - СЗ.Добавить(3); - СЗ.Добавить(2); - СЗ.Добавить(1); - - СЗ.СортироватьПоЗначению(); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 1, 2, 3, 4), "Сортировка по-умолчанию"); - - СЗ.СортироватьПоЗначению(НаправлениеСортировки.Убыв); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 4, 3, 2, 1), "Сортировка по убыванию"); - - СЗ.СортироватьПоЗначению(НаправлениеСортировки.Возр); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 1, 2, 3, 4), "Сортировка по возрастанию"); - - СЗ = Новый СписокЗначений; - СЗ.Добавить("аааааб"); - СЗ.Добавить("аааааа"); - СЗ.Добавить("Бааааа"); - - СЗ.СортироватьПоЗначению(); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, "аааааа", "аааааб", "Бааааа"), "Сортировка по регистру"); - -КонецПроцедуры - - -Процедура ТестДолжен_ПроверитьМетодСортироватьПоПредставлениюСпискаЗначений() Экспорт - - СЗ = Новый СписокЗначений; - СЗ.Добавить(4,"14"); - СЗ.Добавить(3,"3"); - СЗ.Добавить(2,"2"); - СЗ.Добавить(1,"1"); - - СЗ.СортироватьПоПредставлению(); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 1, 4, 2, 3), "Сортировка по-умолчанию"); - - СЗ.СортироватьПоПредставлению(НаправлениеСортировки.Убыв); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 3, 2, 4, 1), "Сортировка по убыванию"); - - СЗ.СортироватьПоПредставлению(НаправлениеСортировки.Возр); - юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 1, 4, 2, 3), "Сортировка по возрастанию"); - -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьМетодНайтиСпискаЗначений() Экспорт - - СЗ = Новый СписокЗначений; - Э0 = СЗ.Добавить(1.2); - Э1 = СЗ.Добавить("абв"); - Э2 = СЗ.Добавить('20161009'); - Э3 = СЗ.Добавить(Истина); - Э4 = СЗ.Добавить(Null); - Э5 = СЗ.Добавить(Неопределено); - - юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению(1.2) , Э0, "Поиск числа"); - юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению("абв") , Э1, "Поиск строки"); - юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению("АБВ") , Неопределено, "Поиск строки в другом регистре"); - юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению('20161009') , Э2, "Поиск даты"); - юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению(Истина) , Э3, "Поиск Истины"); - юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению(Null) , Э4, "Поиск Null"); - юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению(Неопределено), Э5, "Поиск Неопределено"); - -КонецПроцедуры +Перем юТест; + +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + + юТест = ЮнитТестирование; + + ВсеТесты = Новый Массив; + ВсеТесты.Добавить("ТестДолжен_ПроверитьСозданиеСпискаЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьДобавлениеЭлементов"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьДоступКСвойствамЭлементаСписка"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьСвойствЭлементаСписка"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьИтерациюПоСписку"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьДоступПоИндексу"); + + ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодИндексСпискаЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодВставитьСпискаЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодСдвинутьСпискаЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодСортироватьПоЗначениюСпискаЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодСортироватьПоПредставлениюСпискаЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодНайтиСпискаЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодУдалитьСпискаЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПреобразованиеЭлементаСпискаВСтроку"); + Возврат ВсеТесты; + +КонецФункции + +Процедура ТестДолжен_ПроверитьСозданиеСпискаЗначений() Экспорт + СЗ = Новый СписокЗначений; + юТест.ПроверитьРавенство(Тип("СписокЗначений"), ТипЗнч(СЗ)); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьДобавлениеЭлементов() Экспорт + СЗ = Новый СписокЗначений; + СЗ.Добавить("Один"); + СЗ.Добавить("Два"); + юТест.ПроверитьРавенство(2, СЗ.Количество()); + юТест.ПроверитьРавенство(Тип("ЭлементСпискаЗначений"), ТипЗнч(СЗ.Получить(0))); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьДоступКСвойствамЭлементаСписка() Экспорт + + СЗ = Новый СписокЗначений; + СЗ.Добавить(1,"Представление"); + СЗ.Добавить(2,"Представление2", Истина); + СЗ.Добавить(3,"Представление3", Истина, "Тут должна быть картинка, но сейчас может быть любое значение"); + СЗ.Добавить(1); + + Элемент = СЗ[0]; + юТест.ПроверитьРавенство(1, Элемент.Значение, "Значение элемента 0 должно быть установлено"); + юТест.ПроверитьРавенство("Представление", Элемент.Представление, "Представление элемента 0 должно быть установлено"); + юТест.ПроверитьРавенство(Ложь, Элемент.Пометка, "Пометка элемента 0 не должна быть установлена"); + юТест.ПроверитьРавенство(Неопределено, Элемент.Картинка, "Картинка элемента 0 не должна быть установлена"); + + Элемент = СЗ[1]; + юТест.ПроверитьРавенство(2, Элемент.Значение, "Значение элемента 1 должно быть установлено"); + юТест.ПроверитьРавенство("Представление2", Элемент.Представление, "Представление элемента 1 должно быть установлено"); + юТест.ПроверитьРавенство(Истина, Элемент.Пометка, "Пометка элемента 1 должна быть установлена"); + + Элемент = СЗ[2]; + юТест.ПроверитьРавенство(3, Элемент.Значение, "Значение элемента 2 должно быть установлено"); + юТест.ПроверитьРавенство("Представление3", Элемент.Представление, "Представление элемента 2 должно быть установлено"); + юТест.ПроверитьРавенство(Истина, Элемент.Пометка, "Пометка элемента 2 должна быть установлена"); + юТест.ПроверитьРавенство("Тут должна быть картинка, но сейчас может быть любое значение", Элемент.Картинка, "Картинка элемента 2 должна быть установлена"); + + юТест.ПроверитьРавенство("", СЗ[3].Представление, "Должно быть пустое представление по умолчанию"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЗаписьСвойствЭлементаСписка() Экспорт + СЗ = Новый СписокЗначений; + Элемент = СЗ.Добавить(1); + + Элемент.Значение = 2; + Элемент.Представление = "Привет"; + Элемент.Пометка = Истина; + Элемент.Картинка = "---"; + + юТест.ПроверитьРавенство(2, Элемент.Значение, "Значение элемента должно быть установлено"); + юТест.ПроверитьРавенство("Привет", Элемент.Представление, "Представление элемента должно быть установлено"); + юТест.ПроверитьРавенство(Истина, Элемент.Пометка, "Пометка элемента должна быть установлена"); + юТест.ПроверитьРавенство("---", Элемент.Картинка, "Картинка элемента должна быть установлена"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьИтерациюПоСписку() Экспорт + СЗ = Новый СписокЗначений; + СЗ.Добавить(1); + СЗ.Добавить(2); + СЗ.Добавить(3); + СЗ.Добавить(4); + Сч = 0; + Для Каждого Элемент Из СЗ Цикл + Сч = Сч + 1; + КонецЦикла; + + юТест.ПроверитьРавенство(4, Сч); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьДоступПоИндексу() Экспорт + СЗ = Новый СписокЗначений; + СЗ.Добавить(1); + + юТест.ПроверитьРавенство(1, СЗ[0].Значение); + Попытка + СЗ[0] = СЗ[0]; + Исключение + юТест.ПроверитьРавенство("Индексированное значение доступно только для чтения", ИнформацияОбОшибке().Описание); + Возврат; + КонецПопытки; + + ВызватьИсключение "Должно было быть выброшено исключение, но это не произошло"; + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьМетодИндексСпискаЗначений() Экспорт + + СЗ = Новый СписокЗначений; + + СЗ.Добавить(1); + СЗ.Добавить(2); + СЗ.Добавить(3); + СЗ.Добавить(4); + + юТест.ПроверитьРавенство(СЗ.Индекс(СЗ[0]), 0, "Метод Индекс() списка значений"); + юТест.ПроверитьРавенство(СЗ.Индекс(СЗ[1]), 1, "Метод Индекс() списка значений"); + юТест.ПроверитьРавенство(СЗ.Индекс(СЗ[2]), 2, "Метод Индекс() списка значений"); + юТест.ПроверитьРавенство(СЗ.Индекс(СЗ[3]), 3, "Метод Индекс() списка значений"); + + ДругойСЗ = Новый СписокЗначений; + ДругойСЗ.Добавить(1); + + юТест.ПроверитьРавенство(СЗ.Индекс(ДругойСЗ[0]), -1, "Метод Индекс() списка значений: несуществующий элемент"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьМетодВставитьСпискаЗначений() Экспорт + + СЗ = Новый СписокЗначений; + + Э3 = СЗ.Вставить(0, 3); // Вставка в пустой список + Э1 = СЗ.Вставить(0, 1); // Вставка в начало + Э2 = СЗ.Вставить(1, 2); // Вставка в середину + Э4 = СЗ.Вставить(3, 4); // Вставка в конец + + юТест.ПроверитьРавенство(СЗ.Индекс(Э1), 0, "Метод Вставить() списка значений"); + юТест.ПроверитьРавенство(СЗ.Индекс(Э2), 1, "Метод Вставить() списка значений"); + юТест.ПроверитьРавенство(СЗ.Индекс(Э3), 2, "Метод Вставить() списка значений"); + юТест.ПроверитьРавенство(СЗ.Индекс(Э4), 3, "Метод Вставить() списка значений"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьМетодУдалитьСпискаЗначений() Экспорт + + СЗ = Новый СписокЗначений; + Для Инд = 1 По 5 Цикл + СЗ.Добавить(Инд); + КонецЦикла; + Э1 = СЗ[0]; + Э2 = СЗ[1]; + Э3 = СЗ[2]; + Э4 = СЗ[3]; + Э5 = СЗ[4]; + + СЗ.Удалить(1); + юТест.ПроверитьРавенство(СЗ.Количество(),4, "Удаление по индексу"); + юТест.ПроверитьРавенство(СЗ.Индекс(Э2),-1, "Удаление по индексу"); + юТест.ПроверитьРавенство(СЗ.Индекс(Э4),2, "Удаление по индексу"); + + СЗ.Удалить(Э1); + юТест.ПроверитьРавенство(СЗ.Количество(),3, "Удаление элемента"); + юТест.ПроверитьРавенство(СЗ.Индекс(Э1),-1, "Удаление элемента"); + юТест.ПроверитьРавенство(СЗ.Индекс(Э4),1, "Удаление элемента"); + + СЗ.Удалить("1"); + юТест.ПроверитьРавенство(СЗ.Количество(),2, "Удаление по индексу типа строка"); + юТест.ПроверитьРавенство(СЗ.Индекс(Э4),-1, "Удаление по индексу типа строка"); + юТест.ПроверитьРавенство(СЗ.Индекс(Э5),1, "Удаление по индексу типа строка"); + + // Проверим ошибки + Ошибка = "Удаление с неверным индексом"; + Попытка + СЗ.Удалить(10); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + КонецПопытки; + юТест.ПроверитьРавенство(Ошибка, "Значение индекса выходит за пределы диапазона"); + + Ошибка = "Удаление несуществующего элемента"; + ДругойСЗ = Новый СписокЗначений; + ДругойСЗ.Добавить(1); + Попытка + СЗ.Удалить(ДругойСЗ[0]); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + КонецПопытки; + юТест.ПроверитьРавенство(Ошибка, "Элемент не принадлежит списку значений"); + + Ошибка = "Удаление с неверным типом параметра"; + Попытка + СЗ.Удалить("ё"); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + КонецПопытки; + юТест.ПроверитьРавенство(Ошибка, "Неверный тип аргумента"); + +КонецПроцедуры + + +Функция ПроверитьПорядок(Знач СЗ, Знач П1, + Знач П2 = Неопределено, + Знач П3 = Неопределено, + Знач П4 = Неопределено, + Знач П5 = Неопределено) + + Массив = Новый Массив; + Массив.Добавить(П1); + + Если П2 <> Неопределено Тогда + Массив.Добавить(П2); + КонецЕсли; + Если П3 <> Неопределено Тогда + Массив.Добавить(П3); + КонецЕсли; + Если П4 <> Неопределено Тогда + Массив.Добавить(П4); + КонецЕсли; + Если П5 <> Неопределено Тогда + Массив.Добавить(П5); + КонецЕсли; + + Для Инд = 0 По Массив.ВГраница() Цикл + + Если СЗ[Инд].Значение <> Массив[Инд] Тогда + Возврат Ложь; + КонецЕсли; + + КонецЦикла; + + Возврат Истина; + +КонецФункции + +Процедура ТестДолжен_ПроверитьМетодСдвинутьСпискаЗначений() Экспорт + + СЗ = Новый СписокЗначений; + + Для Инд = 1 По 5 Цикл + СЗ.Добавить(Инд); + КонецЦикла; + + С1 = СЗ[0]; + С2 = СЗ[1]; + С3 = СЗ[2]; + С4 = СЗ[3]; + С5 = СЗ[4]; + + // Проверим обычное перемещение + СЗ.Сдвинуть(С2, -1); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 1, 3, 4, 5), "Сдвиг вверх"); + + СЗ.Сдвинуть(С1, 2); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 3, 4, 1, 5), "Сдвиг вниз"); + + СЗ.Сдвинуть(3, -2); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 1, 3, 4, 5), "Сдвиг по индексу вверх"); + + СЗ.Сдвинуть(1, 2); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 3, 4, 1, 5), "Сдвиг по индексу вниз"); + + // Проверим приведение типа + СЗ.Сдвинуть("2", 2); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 3, 1, 5, 4), "Сдвиг, индекс - строка"); + + СЗ.Сдвинуть("1", "2"); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 1, 5, 3, 4), "Сдвиг, индекс и смещение - строки"); + + // Проверим крайние случаи + СЗ.Сдвинуть(0, 4); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 1, 5, 3, 4, 2), "Сдвиг по индексу вниз"); + + СЗ.Сдвинуть(4, -4); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 2, 1, 5, 3, 4), "Сдвиг по индексу вниз"); + + // Проверим ошибки + Ошибка = "Сдвиг за пределы вниз"; + Попытка + СЗ.Сдвинуть(0, 5); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + КонецПопытки; + юТест.ПроверитьРавенство(Ошибка, "Неверное значение аргумента номер 2"); + + Ошибка = "Сдвиг за пределы вверх"; + Попытка + СЗ.Сдвинуть(1, -3); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + КонецПопытки; + юТест.ПроверитьРавенство(Ошибка, "Неверное значение аргумента номер 2"); + + Ошибка = "Сдвиг с неверным индексом"; + Попытка + СЗ.Сдвинуть(10, 2); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + КонецПопытки; + юТест.ПроверитьРавенство(Ошибка, "Значение индекса выходит за пределы диапазона"); + + Ошибка = "Сдвиг несуществующего элемента"; + ДругойСЗ = Новый СписокЗначений; + ДругойСЗ.Добавить(1); + Попытка + СЗ.Сдвинуть(ДругойСЗ[0], 2); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + КонецПопытки; + юТест.ПроверитьРавенство(Ошибка, "Элемент не принадлежит списку значений"); + + Ошибка = "Сдвиг с неверным типом параметра"; + Попытка + СЗ.Сдвинуть("ё", 2); + Исключение + Ошибка = ИнформацияОбОшибке().Описание; + КонецПопытки; + юТест.ПроверитьРавенство(Ошибка, "Неверный тип аргумента"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьМетодСортироватьПоЗначениюСпискаЗначений() Экспорт + + СЗ = Новый СписокЗначений; + СЗ.Добавить(4); + СЗ.Добавить(3); + СЗ.Добавить(2); + СЗ.Добавить(1); + + СЗ.СортироватьПоЗначению(); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 1, 2, 3, 4), "Сортировка по-умолчанию"); + + СЗ.СортироватьПоЗначению(НаправлениеСортировки.Убыв); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 4, 3, 2, 1), "Сортировка по убыванию"); + + СЗ.СортироватьПоЗначению(НаправлениеСортировки.Возр); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 1, 2, 3, 4), "Сортировка по возрастанию"); + + СЗ = Новый СписокЗначений; + СЗ.Добавить("аааааб"); + СЗ.Добавить("аааааа"); + СЗ.Добавить("Бааааа"); + + СЗ.СортироватьПоЗначению(); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, "аааааа", "аааааб", "Бааааа"), "Сортировка по регистру"); + +КонецПроцедуры + + +Процедура ТестДолжен_ПроверитьМетодСортироватьПоПредставлениюСпискаЗначений() Экспорт + + СЗ = Новый СписокЗначений; + СЗ.Добавить(4,"14"); + СЗ.Добавить(3,"3"); + СЗ.Добавить(2,"2"); + СЗ.Добавить(1,"1"); + + СЗ.СортироватьПоПредставлению(); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 1, 4, 2, 3), "Сортировка по-умолчанию"); + + СЗ.СортироватьПоПредставлению(НаправлениеСортировки.Убыв); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 3, 2, 4, 1), "Сортировка по убыванию"); + + СЗ.СортироватьПоПредставлению(НаправлениеСортировки.Возр); + юТест.ПроверитьИстину(ПроверитьПорядок(СЗ, 1, 4, 2, 3), "Сортировка по возрастанию"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьМетодНайтиСпискаЗначений() Экспорт + + СЗ = Новый СписокЗначений; + Э0 = СЗ.Добавить(1.2); + Э1 = СЗ.Добавить("абв"); + Э2 = СЗ.Добавить('20161009'); + Э3 = СЗ.Добавить(Истина); + Э4 = СЗ.Добавить(Null); + Э5 = СЗ.Добавить(Неопределено); + + юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению(1.2) , Э0, "Поиск числа"); + юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению("абв") , Э1, "Поиск строки"); + юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению("АБВ") , Неопределено, "Поиск строки в другом регистре"); + юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению('20161009') , Э2, "Поиск даты"); + юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению(Истина) , Э3, "Поиск Истины"); + юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению(Null) , Э4, "Поиск Null"); + юТест.ПроверитьРавенство(СЗ.НайтиПоЗначению(Неопределено), Э5, "Поиск Неопределено"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПреобразованиеЭлементаСпискаВСтроку() Экспорт + СЗ = Новый СписокЗначений; + СЗ.Добавить(0); + СЗ.Добавить(1, ""); + СЗ.Добавить(2, Неопределено); + СЗ.Добавить(3, " "); + + юТест.ПроверитьРавенство("0", Строка(СЗ[0]), "Строка, без указания"); + юТест.ПроверитьРавенство("", СЗ[0].Представление, "Представление, без указания"); + юТест.ПроверитьРавенство("1", Строка(СЗ[1]), "Строка, с пустой"); + юТест.ПроверитьРавенство("", СЗ[1].Представление, "Представление, с пустой"); + юТест.ПроверитьРавенство("2", Строка(СЗ[2]), "Строка, Неопределено"); + юТест.ПроверитьРавенство("", СЗ[2].Представление, "Представление, Неопределено"); + юТест.ПроверитьРавенство(" ", Строка(СЗ[3]), "Строка, пробел"); + юТест.ПроверитьРавенство(" ", СЗ[3].Представление, "Представление, пробел"); + +КонецПроцедуры \ No newline at end of file diff --git a/tests/valuetable.os b/tests/valuetable.os index 4bdbcdedd..d02bb4653 100644 --- a/tests/valuetable.os +++ b/tests/valuetable.os @@ -43,6 +43,15 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьСверткуПоКолонкамСуммированияСРазнымиТипами"); ВсеТесты.Добавить("ТестДолжен_ПроверитьСверткуПоОднойКолонкеСРазнымиТипами"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировку_Чисел"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировку_Булевых"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировку_Дат"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировку_Строк"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировку_СтрокРазныхАлфавитов"); + + ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировкуНеупорядочиваемыхТипов"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировкуРазныхТипов"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировкуПоПредставлению"); Возврат ВсеТесты; КонецФункции @@ -779,3 +788,166 @@ юТест.ПроверитьРавенство( СтрТЗ2[КолонкаСуммы], Количество, СтрШаблон("Сумма колонки %1 для значения %2 типа %3", КолонкаСуммы, Значение, ТипЗнч(Значение)) ); КонецПроцедуры + +Процедура ТестДолжен_ПроверитьСортировку_Чисел() Экспорт + ТЗ = Новый ТаблицаЗначений(); + ТЗ.Колонки.Добавить("Тест"); + + ТЗ.Добавить().Тест = 5; + ТЗ.Добавить().Тест = 10; + ТЗ.Добавить().Тест = -2; + + ТЗ.Сортировать("Тест"); + + юТест.ПроверитьРавенство(ТЗ[0].Тест, -2, "ТЗ[0]"); + юТест.ПроверитьРавенство(ТЗ[1].Тест, 5, "ТЗ[1]"); + юТест.ПроверитьРавенство(ТЗ[2].Тест, 10, "ТЗ[2]"); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьСортировку_Булевых() Экспорт + ТЗ = Новый ТаблицаЗначений(); + ТЗ.Колонки.Добавить("Тест"); + + ТЗ.Добавить().Тест = Истина; + ТЗ.Добавить().Тест = Ложь; + ТЗ.Добавить().Тест = Истина; + + ТЗ.Сортировать("Тест"); + + юТест.ПроверитьРавенство(ТЗ[0].Тест, Ложь, "ТЗ[0]"); + юТест.ПроверитьРавенство(ТЗ[1].Тест, Истина, "ТЗ[1]"); + юТест.ПроверитьРавенство(ТЗ[2].Тест, Истина, "ТЗ[2]"); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьСортировку_Дат() Экспорт + ТЗ = Новый ТаблицаЗначений(); + ТЗ.Колонки.Добавить("Тест"); + + Сегодня = ТекущаяДата(); + Пустая = '0001-01-01 00:00'; + ТЗ.Добавить().Тест = Сегодня; + ТЗ.Добавить().Тест = Сегодня + 2; + ТЗ.Добавить().Тест = Сегодня - 2; + ТЗ.Добавить().Тест = Пустая; + + ТЗ.Сортировать("Тест"); + + юТест.ПроверитьРавенство(ТЗ[0].Тест, Пустая, "ТЗ[0]"); + юТест.ПроверитьРавенство(ТЗ[1].Тест, Сегодня - 2, "ТЗ[1]"); + юТест.ПроверитьРавенство(ТЗ[2].Тест, Сегодня, "ТЗ[2]"); + юТест.ПроверитьРавенство(ТЗ[3].Тест, Сегодня + 2, "ТЗ[3]"); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьСортировку_Строк() Экспорт + ТЗ = Новый ТаблицаЗначений(); + ТЗ.Колонки.Добавить("Тест"); + + ТЗ.Добавить().Тест = "Ели"; + ТЗ.Добавить().Тест = "ежи"; + ТЗ.Добавить().Тест = "Ёлки"; + ТЗ.Добавить().Тест = "ёжики"; + + ТЗ.Сортировать("Тест"); + + юТест.ПроверитьРавенство(ТЗ[0].Тест, "ежи", "ТЗ[0]"); + юТест.ПроверитьРавенство(ТЗ[1].Тест, "ёжики", "ТЗ[1]"); + юТест.ПроверитьРавенство(ТЗ[2].Тест, "Ели", "ТЗ[2]"); + юТест.ПроверитьРавенство(ТЗ[3].Тест, "Ёлки", "ТЗ[3]"); +КонецПроцедуры + + +// к issue #1577 +Процедура ТестДолжен_ПроверитьСортировкуНеупорядочиваемыхТипов() Экспорт + ТЗ = Новый ТаблицаЗначений(); + ТЗ.Колонки.Добавить("Тест"); + + ТЗ.Добавить().Тест = Неопределено; + ТЗ.Добавить().Тест = Неопределено; + + ТЗ.Сортировать("Тест"); // не должно упасть + + юТест.ПроверитьРавенство(ТЗ[0].Тест, Неопределено); + юТест.ПроверитьРавенство(ТЗ[1].Тест, Неопределено); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьСортировкуРазныхТипов() Экспорт + ТЗ = Новый ТаблицаЗначений(); + ТЗ.Колонки.Добавить("Тест"); + + ТЗ.Добавить().Тест = Тип("Строка"); + ТЗ.Добавить().Тест = "Стр2"; + ТЗ.Добавить().Тест = "СтрЪ"; + ТЗ.Добавить().Тест = Новый Структура; + ТЗ.Добавить().Тест = Новый Массив; + ТЗ.Добавить().Тест = null; + ТЗ.Добавить().Тест = Тип("Булево"); + ТЗ.Добавить().Тест = Тип("Массив"); + + ТЗ.Сортировать("Тест"); // не должно упасть + + юТест.ПроверитьРавенство(ТЗ[0].Тест, Null); + юТест.ПроверитьРавенство(ТЗ[1].Тест, "Стр2"); + юТест.ПроверитьРавенство(ТЗ[2].Тест, "СтрЪ"); + юТест.ПроверитьРавенство(ТипЗнч(ТЗ[3].Тест), Тип("Массив")); + юТест.ПроверитьРавенство(ТипЗнч(ТЗ[4].Тест), Тип("Структура")); + юТест.ПроверитьРавенство(ТЗ[5].Тест, Тип("Булево")); + юТест.ПроверитьРавенство(ТЗ[6].Тест, Тип("Массив")); + юТест.ПроверитьРавенство(ТЗ[7].Тест, Тип("Строка")); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьСортировкуПоПредставлению() Экспорт + ТЗ = Новый ТаблицаЗначений(); + ТЗ.Колонки.Добавить("Тест"); + + ТекстКласса = + "Процедура ОбработкаПолученияПредставления(Представление, СтандартнаяОбработка) + | СтандартнаяОбработка = Ложь; + | Представление = ""Представление0""; + |КонецПроцедуры"; + КлассИзСтроки0 = ЗагрузитьСценарийИзСтроки(ТекстКласса); + + ТекстКласса = + "Процедура ОбработкаПолученияПредставления(Представление, СтандартнаяОбработка) + | СтандартнаяОбработка = Ложь; + | Представление = ""Представление1""; + |КонецПроцедуры"; + КлассИзСтроки1 = ЗагрузитьСценарийИзСтроки(ТекстКласса); + + ТекстКласса = + "Процедура ОбработкаПолученияПредставления(Представление, СтандартнаяОбработка) + | СтандартнаяОбработка = Ложь; + | Представление = ""Представление3""; + |КонецПроцедуры"; + КлассИзСтроки3 = ЗагрузитьСценарийИзСтроки(ТекстКласса); + + ТЗ.Добавить().Тест = КлассИзСтроки3; + ТЗ.Добавить().Тест = "Представление2"; + ТЗ.Добавить().Тест = КлассИзСтроки0; + ТЗ.Добавить().Тест = КлассИзСтроки1; + + ТЗ.Сортировать("Тест"); + юТест.ПроверитьРавенство(ТЗ[0].Тест, "Представление2", "строка"); + юТест.ПроверитьРавенство(Строка(ТЗ[1].Тест), "Представление0", "сценарий 0"); + юТест.ПроверитьРавенство(Строка(ТЗ[2].Тест), "Представление1", "сценарий 1"); + юТест.ПроверитьРавенство(Строка(ТЗ[3].Тест), "Представление3", "сценарий 3"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьСортировку_СтрокРазныхАлфавитов() Экспорт + ТЗ = Новый ТаблицаЗначений(); + ТЗ.Колонки.Добавить("Тест"); + + ТЗ.Добавить().Тест = "Е"; // cyrillic + ТЗ.Добавить().Тест = "E"; // latin + ТЗ.Добавить().Тест = "Ε"; // greek + ТЗ.Добавить().Тест = "∃"; // math + ТЗ.Добавить().Тест = "E"; // full-width + + ТЗ.Сортировать("Тест"); + + юТест.ПроверитьРавенство(КодСимвола(ТЗ[0].Тест,1), 8707, "math"); + юТест.ПроверитьРавенство(КодСимвола(ТЗ[1].Тест,1), 69, "latin"); + юТест.ПроверитьРавенство(КодСимвола(ТЗ[2].Тест,1), 65317, "full-width"); + юТест.ПроверитьРавенство(КодСимвола(ТЗ[3].Тест,1), 917, "greek"); + юТест.ПроверитьРавенство(КодСимвола(ТЗ[4].Тест,1), 1045, "cyrillic"); +КонецПроцедуры diff --git a/tests/xmlwrite.os b/tests/xmlwrite.os index 5d594c3b1..5b3e4665f 100644 --- a/tests/xmlwrite.os +++ b/tests/xmlwrite.os @@ -26,8 +26,26 @@ ВсеТесты.Добавить("ТестДолжен_ЗаписатьВСтрокуБезПробелаПередЗакрытием"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПравильныйВыводПробелСлэша"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекст"); + + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_БезЧтения"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_НачалоЭлемента"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_НачалоВложенногоЭлемента"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлемента"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСОпределениемПространстваИмен"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСПерекрывающимОпределениемПространстваИмен"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСЛишнимПереопределениемПространстваИмен"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_КонецЭлемента"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_Текст"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_CDATA"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_Комментарий"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_СсылкаНаСушность"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_ПолноеКопирование"); + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_ИнструкцииОбработки"); + + ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_ОбъявлениеИТипДокумента"); Возврат ВсеТесты; + КонецФункции Процедура ТестДолжен_ЗаписатьВСтроку() Экспорт @@ -272,3 +290,472 @@ юТест.ПроверитьРавенство(Результат, "123"); КонецПроцедуры + + +Процедура ТестДолжен_ЗаписатьТекущий_БезЧтения() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство("", ПолученныйТекст, "Ничего не прочитано - ничего не пишется"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_НачалоЭлемента() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство("", // dotnet автоматом закроет элемент + ПолученныйТекст, + "Первый элемент"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_НачалоВложенногоЭлемента() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство("", // dotnet автоматом закроет элемент + ПолученныйТекст, + "Второй элемент"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлемента() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + + ЧтениеXML.ПервыйАтрибут(); + ЧтениеXML.СледующийАтрибут(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство("<эл inner2=""456"" />", // dotnet автоматом закроет элемент + ПолученныйТекст, + "Второй атрибут"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСОпределениемПространстваИмен() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + ЧтениеXML.Пропустить(); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + + ЧтениеXML.ПервыйАтрибут(); + ЧтениеXML.СледующийАтрибут(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство( + "<эл xmlns:ins=""inner namespace mapping"" ins:attr=""1"" />", // dotnet автоматом закроет элемент + ПолученныйТекст, + "Автоматически добавляется определение пространства имен"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСЛишнимПереопределениемПространстваИмен() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + ЧтениеXML.Пропустить(); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + + ЧтениеXML.ПервыйАтрибут(); + ЧтениеXML.СледующийАтрибут(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("корень"); + ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("ins", "inner namespace mapping"); + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство( + "<корень xmlns:ins=""inner namespace mapping""><эл ins:attr=""1"" />", // dotnet автоматом закроет элементы + ПолученныйТекст, + "Определение пространства имен не добавляется"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСПерекрывающимОпределениемПространстваИмен() Экспорт + + // BSLLS:LineLength-off + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + ЧтениеXML.Пропустить(); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + + ЧтениеXML.ПервыйАтрибут(); + ЧтениеXML.СледующийАтрибут(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("корень"); + ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("ins2", "inner namespace mapping"); + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство( + "<корень xmlns:ins2=""inner namespace mapping""><эл xmlns:ins=""inner namespace mapping"" ins:attr=""1"" />", // dotnet автоматом закроет элементы + ПолученныйТекст, + "Определение пространства имен добавляется, так как не совпадают префиксы"); + // BSLLS:LineLength-on +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_КонецЭлемента() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + + ЧтениеXML.ПервыйАтрибут(); + ЧтениеXML.СледующийАтрибут(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.Текст, "Some Value"); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.КонецЭлемента, ""); + + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство("<эл inner2=""456""/>", + ПолученныйТекст, + "Закрытие элемента"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_Текст() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.Текст, "Спозиционированы на текст Some text"); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство("<эл>Some Text", + ПолученныйТекст, + "Текст"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_CDATA() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + ДойтиДоИмени(ЧтениеXML, "cdata"); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.СекцияCDATA); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ЗаписьXML.ЗаписатьСекциюCDATA(", к которому добавили ещё текст"); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство("<эл>", + ПолученныйТекст, + "CDATA"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_Комментарий() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + ДойтиДоИмени(ЧтениеXML, "БлокСКомментарием"); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.Комментарий); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + + ЗаписьXML.ЗаписатьТекст("Текст"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); // можем записать ещё раз + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство("<эл> Текст", + ПолученныйТекст, + "Комментарий"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_ПолноеКопирование() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + Пока ЧтениеXML.Прочитать() Цикл + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + КонецЦикла; + + ЗаписьXML.Закрыть(); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_ОбъявлениеИТипДокумента() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, ""); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, ""); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, ""); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенствоСтрокБезУчетаРегистра( + "<эл/>", + ПолученныйТекст, + "Объявления и тип документа"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_СсылкаНаСушность() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ДойтиДоИмени(ЧтениеXML, "entity"); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.СсылкаНаСущность); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство("<эл>&СсылкаНаСущность;", + ПолученныйТекст, + "Ссылка на сущность"); + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ДойтиДоИмени(ЧтениеXML, "entity2"); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.Текст); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.СсылкаНаСущность); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ПолученныйТекст = ЗаписьXML.Закрыть(); + юТест.ПроверитьРавенство("<эл>Это &СсылкаНаСущность;", + ПолученныйТекст, + "Ссылка на сущность внутри текста"); + +КонецПроцедуры + +Процедура ТестДолжен_ЗаписатьТекущий_ИнструкцииОбработки() Экспорт + + Перем ЧтениеXML, ЗаписьXML; + + ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); + + ДойтиДоИмени(ЧтениеXML, "PI"); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ИнструкцияОбработки); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ПолученныйТекст = ЗаписьXML.Закрыть(); + + // Несовместимость: dotnet всегда добавляет пробел, даже если нет текста инструкции + юТест.ПроверитьРавенство("<эл>", + // ^ + ПолученныйТекст, + "Инструкция обработки"); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.КонецЭлемента); + ЧтениеXML.Прочитать(); + + // + + ПодготовитьЗаписьXML(ЗаписьXML); + ДойтиДоИмени(ЧтениеXML, "PI"); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ИнструкцияОбработки); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ПолученныйТекст = ЗаписьXML.Закрыть(); + + юТест.ПроверитьРавенство("<эл>", + ПолученныйТекст, + "Инструкция обработки с текстом"); + + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.КонецЭлемента); + ЧтениеXML.Прочитать(); + + // + + ПодготовитьЗаписьXML(ЗаписьXML); + ДойтиДоИмени(ЧтениеXML, "PI"); + ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ИнструкцияОбработки); + + ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); + ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ПолученныйТекст = ЗаписьXML.Закрыть(); + + юТест.ПроверитьРавенство("<эл>", + ПолученныйТекст, + "Инструкция обработки с текстом и служебными символами"); + +КонецПроцедуры + +Процедура ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML) + + ПодопытныйТекст = + " + | + | + | Some Text + | + | + | <БлокСКомментарием> + | &СсылкаНаСущность; + | Это &СсылкаНаСущность; + | + | + | + |" + ; + + ПараметрыЧтения = Новый ПараметрыЧтенияXml( + , // Версия + , // Язык + , // ПробельныеСимволы + , // ТипПроверкиПравильности, + Ложь, // ИгнорироватьОбъявлениеXML + Ложь, // ИгнорироватьТипДокумента + Ложь, // ИгнорироватьИнструкцииОбработки + Ложь, // ИгнорироватьКомментарии + Ложь, // ИгнорироватьПробельныеСимволы + Ложь, // СекцииCDATAКакТекст + Истина // ИспользоватьИгнорируемыеПробельныеСимволы + ); + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.УстановитьСтроку(ПодопытныйТекст, ПараметрыЧтения); + + ПодготовитьЗаписьXML(ЗаписьXML); + +КонецПроцедуры + +Процедура ПодготовитьЗаписьXML(ЗаписьXML) + + ПараметрыЗаписи = Новый ПараметрыЗаписиXml(, , Ложь); // без переносов + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(ПараметрыЗаписи); + +КонецПроцедуры + +Функция ДойтиДоИмени(Знач ЧтениеXML, Знач Имя) + + Пока ЧтениеXML.Имя <> Имя Цикл + + Если Не ЧтениеXML.Прочитать() Тогда + Возврат Ложь; + КонецЕсли; + + КонецЦикла; + + Возврат Истина; + +КонецФункции + +Процедура ПрочитатьИПроверитьТип(Знач ЧтениеXML, Знач ТипУзла, Знач Сообщение = Неопределено) + ЧтениеXML.Прочитать(); + юТест.ПроверитьРавенство(ЧтениеXML.ТипУзла, ТипУзла, Сообщение); +КонецПроцедуры