From 47c61d8b14899d692085b197ec50f495544db7cb Mon Sep 17 00:00:00 2001 From: AlexanderZemlyak <92867056+AlexanderZemlyak@users.noreply.github.com> Date: Fri, 2 Aug 2024 10:48:07 +0300 Subject: [PATCH] New directive to disable linking pascal standard modules (#3186) * Add new 'disable standard units' directive and it's processing * Refactor InitializeNewUnit function * Improve disable standard units directive checks * Add null check in programs.cs to avoid error * Rename error related to disable standard units directive * Add referencing standard net libraries * Add checks for duplicates when injecting references --- Compiler/Compiler.cs | 224 ++++++++++++------ Compiler/Errors.cs | 12 + Parsers/PascalABCParserNewSaushkin/Parser.cs | 1 + StringConstants/StringConstants.cs | 59 ++--- TreeConverter/TreeRealization/programs.cs | 2 +- .../CompilerController/CompilerInformation.cs | 4 +- bin/Lng/Eng/CompilerErrors.dat | 1 + bin/Lng/Rus/CompilerErrors.dat | 1 + 8 files changed, 202 insertions(+), 102 deletions(-) diff --git a/Compiler/Compiler.cs b/Compiler/Compiler.cs index bd5050b4b..27ca268eb 100644 --- a/Compiler/Compiler.cs +++ b/Compiler/Compiler.cs @@ -276,6 +276,7 @@ namespace PascalABCCompiler public bool ForIntellisense = false; public bool Rebuild = false; public bool Optimise = false; + public bool DisableStandardUnits = false; // true устанавливается соответствующей директивой public bool SavePCUInThreadPull = false; public bool RunWithEnvironment = false; public string CompiledUnitExtension = StringConstants.pascalCompiledUnitExtension; @@ -488,7 +489,6 @@ namespace PascalABCCompiler public bool CodeGeneration = true; public bool SemanticAnalysis = true; public bool PCUGenerate = true; - public bool AddStandartUnits = true; public bool SkipPCUErrors = true; public bool IncludeDebugInfoInPCU = true; public bool AlwaysGenerateXMLDoc = false; @@ -974,6 +974,9 @@ namespace PascalABCCompiler UnitsToCompileDelayedList.Clear(); DLLCache.Clear(); project = null; + + // обнуляем здесь, чтобы значение не сохранялось между запусками EVA + CompilerOptions.DisableStandardUnits = false; } void CheckErrorsAndThrowTheFirstOne() @@ -3054,8 +3057,14 @@ namespace PascalABCCompiler directives = (compilationUnit.SemanticTree as common_unit_node).compiler_directives; else directives = GetDirectivesAsSemanticNodes(compilationUnit.SyntaxTree.compiler_directives, compilationUnit.SyntaxTree.file_name); + + DisablePABCRtlIfUsingDotnet5(directives); - AddReferencesToSystemUnits(compilationUnit, directives); + if (CompilerOptions.UseDllForSystemUnits) + { + directives.Add(new compiler_directive("reference", "%GAC%\\PABCRtl.dll", null, ".")); + AddReferencesToNetSystemLibraries(compilationUnit, directives); + } var referenceDirectives = new List(); foreach (compiler_directive directive in directives) @@ -3095,15 +3104,15 @@ namespace PascalABCCompiler throw new CommonCompilerError(ex.Message, compilationUnit.SyntaxTree.file_name, reference.location.begin_line_num, reference.location.end_line_num); } } - - + + foreach (var reference in referenceDirectives) CompileReference(dlls, reference); return dlls; } - private void AddReferencesToSystemUnits(CompilationUnit compilationUnit, List directives) + private void DisablePABCRtlIfUsingDotnet5(List directives) { foreach (compiler_directive cd in directives) { @@ -3113,31 +3122,58 @@ namespace PascalABCCompiler CompilerOptions.UseDllForSystemUnits = false; } } - if (CompilerOptions.UseDllForSystemUnits) + } + + /// + /// Добавляет ссылки на стандартные системные dll .NET - версия с директивами уровня семантики + /// + /// + /// + private void AddReferencesToNetSystemLibraries(CompilationUnit compilationUnit, List directives) + { + IEnumerable librariesToAdd = StringConstants.netSystemLibraries.Select(dll => $"%GAC%\\{dll}") + .Except(directives.Where(directive => directive.name.Equals("reference", StringComparison.CurrentCultureIgnoreCase)) + .Select(directive => directive.directive), StringComparer.CurrentCultureIgnoreCase); + + directives.AddRange(librariesToAdd.Select(dll => new compiler_directive("reference", dll, null, "."))); + + if (compilationUnit.SyntaxTree is SyntaxTree.program_module program && program.used_units != null) { - directives.Add(new compiler_directive("reference", "%GAC%\\PABCRtl.dll", null, ".")); - directives.Add(new compiler_directive("reference", "%GAC%\\mscorlib.dll", null, ".")); - directives.Add(new compiler_directive("reference", "%GAC%\\System.dll", null, ".")); - directives.Add(new compiler_directive("reference", "%GAC%\\System.Core.dll", null, ".")); - directives.Add(new compiler_directive("reference", "%GAC%\\System.Numerics.dll", null, ".")); - directives.Add(new compiler_directive("reference", "%GAC%\\System.Windows.Forms.dll", null, ".")); - directives.Add(new compiler_directive("reference", "%GAC%\\System.Drawing.dll", null, ".")); - - if (compilationUnit.SyntaxTree is SyntaxTree.program_module && (compilationUnit.SyntaxTree as SyntaxTree.program_module).used_units != null) + var graph3DUnit = program.used_units.units.FirstOrDefault(u => u.name.ToString() == "Graph3D"); + if (graph3DUnit != null) { - foreach (SyntaxTree.unit_or_namespace usedUnit in (compilationUnit.SyntaxTree as SyntaxTree.program_module).used_units.units) - { - if (usedUnit.name.ToString() == "Graph3D") - { - directives.Add(new compiler_directive("reference", "%GAC%\\PresentationFramework.dll", null, ".")); - directives.Add(new compiler_directive("reference", "%GAC%\\WindowsBase.dll", null, ".")); - directives.Add(new compiler_directive("reference", "%GAC%\\PresentationCore.dll", null, ".")); - directives.Add(new compiler_directive("reference", "%GAC%\\HelixToolkit.Wpf.dll", null, ".")); - directives.Add(new compiler_directive("reference", "%GAC%\\HelixToolkit.dll", null, ".")); + IEnumerable graphLibrariesToAdd = StringConstants.graph3DDependencies.Select(dll => $"%GAC%\\{dll}") + .Except(directives.Where(directive => directive.name.Equals("reference", StringComparison.CurrentCultureIgnoreCase)) + .Select(directive => directive.directive), StringComparer.CurrentCultureIgnoreCase); - break; - } - } + directives.AddRange(graphLibrariesToAdd.Select(dll => new compiler_directive("reference", dll, null, "."))); + } + } + } + + /// + /// Добавляет ссылки на стандартные системные dll .NET - версия с директивами уровня синтаксиса + /// + /// + /// + private void AddReferencesToNetSystemLibraries(CompilationUnit compilationUnit, List directives) + { + IEnumerable librariesToAdd = StringConstants.netSystemLibraries.Select(dll => $"%GAC%\\{dll}") + .Except(directives.Where(directive => directive.Name.text.Equals("reference", StringComparison.CurrentCultureIgnoreCase)) + .Select(directive => directive.Directive.text), StringComparer.CurrentCultureIgnoreCase); + + directives.AddRange(librariesToAdd.Select(dll => new SyntaxTree.compiler_directive(new SyntaxTree.token_info("reference"), new SyntaxTree.token_info(dll)))); + + if (compilationUnit.SyntaxTree is SyntaxTree.program_module program && program.used_units != null) + { + var graph3DUnit = program.used_units.units.FirstOrDefault(u => u.name.ToString() == "Graph3D"); + if (graph3DUnit != null) + { + IEnumerable graphLibrariesToAdd = StringConstants.graph3DDependencies.Select(dll => $"%GAC%\\{dll}") + .Except(directives.Where(directive => directive.Name.text.Equals("reference", StringComparison.CurrentCultureIgnoreCase)) + .Select(directive => directive.Directive.text), StringComparer.CurrentCultureIgnoreCase); + + directives.AddRange(graphLibrariesToAdd.Select(dll => new SyntaxTree.compiler_directive(new SyntaxTree.token_info("reference"), new SyntaxTree.token_info(dll)))); } } } @@ -3317,19 +3353,16 @@ namespace PascalABCCompiler /// public static bool IsDll(SyntaxTree.compilation_unit unitSyntaxTree, out SyntaxTree.compiler_directive dllDirective) { - if (unitSyntaxTree != null) + foreach (SyntaxTree.compiler_directive directive in unitSyntaxTree.compiler_directives) { - foreach (SyntaxTree.compiler_directive directive in unitSyntaxTree.compiler_directives) + if (string.Equals(directive.Name.text, StringConstants.compiler_directive_apptype, StringComparison.CurrentCultureIgnoreCase) + && string.Equals(directive.Directive.text, "dll", StringComparison.CurrentCultureIgnoreCase)) { - if (string.Equals(directive.Name.text, "apptype", StringComparison.CurrentCultureIgnoreCase) - && string.Equals(directive.Directive.text, "dll", StringComparison.CurrentCultureIgnoreCase)) - { - dllDirective = directive; - return true; - } + dllDirective = directive; + return true; } } - + dllDirective = null; return false; } @@ -3382,7 +3415,7 @@ namespace PascalABCCompiler return currentUnit; // нет pcu и модуль не откомпилирован => новый модуль EVA - InitializeNewUnit(unitFileName, unitId, ref currentUnit, ref docs); + InitializeNewUnit(unitFileName, unitId, ref currentUnit, out docs); } // формирование списков зависимостей текущего модуля (uses list, dll, пространства имен) @@ -3730,7 +3763,7 @@ namespace PascalABCCompiler /// генерация синтаксического дерева, /// обработка синтаксических ошибок /// - private void InitializeNewUnit(string unitFileName, string UnitId, ref CompilationUnit currentUnit, ref Dictionary docs) + private void InitializeNewUnit(string unitFileName, string UnitId, ref CompilationUnit currentUnit, out Dictionary docs) { currentUnit = new CompilationUnit(); if (firstCompilationUnit == null) @@ -3741,28 +3774,76 @@ namespace PascalABCCompiler // запоминание языка currentUnit.Language = LanguageProvider.SelectLanguageByExtension(unitFileName); - OnChangeCompilerState(this, CompilerState.BeginCompileFile, unitFileName); // начало компиляции модуля + currentUnit.CaseSensitive = currentUnit.Language.CaseSensitive; + + // получение итогового синтаксического дерева после сахарных преобразований + ConstructSyntaxTreeAndRunSugarConversions(unitFileName, currentUnit, out docs); - #region SYNTAX TREE CONSTRUCTING + InitializeCompilerOptionsRelatedToStandardUnits(currentUnit.SyntaxTree); + + RunSemanticChecks(unitFileName, currentUnit); + + // местоположение этой строчки важно, потому что проверяется UnitTable.Count > 0 выше EVA + UnitTable[UnitId] = currentUnit; + + // здесь добавляем стандартные модули в секцию uses интерфейса + if (!CompilerOptions.DisableStandardUnits) + AddStandardUnitsToInterfaceUsesSection(currentUnit); + else + { + AddReferencesToNetSystemLibraries(currentUnit, currentUnit.SyntaxTree.compiler_directives); + } + } + + + /// + /// Строит синтаксическое дерево, бросает первую из найденных ошибок (если они есть) и запускает сахарные преобразования + /// + private void ConstructSyntaxTreeAndRunSugarConversions(string unitFileName, CompilationUnit currentUnit, out Dictionary docs) + { + OnChangeCompilerState(this, CompilerState.BeginCompileFile, unitFileName); // начало компиляции модуля + // получение синтаксического дерева string sourceText = GetSourceCode(unitFileName, currentUnit); currentUnit.SyntaxTree = ConstructSyntaxTree(unitFileName, currentUnit, sourceText); - #endregion - if (currentUnit.SyntaxTree is SyntaxTree.unit_module) - CompilerOptions.UseDllForSystemUnits = false; + // сопоставление нодам ошибок EVA + MatchSyntaxErrorsToBadNodes(currentUnit); - if (errorsList.Count == 0) // SSM 2/05/16 - для преобразования синтаксических деревьев извне (синтаксический сахар) - { - currentUnit.SyntaxTree = ConvertSyntaxTree(currentUnit.SyntaxTree, currentUnit.Language.SyntaxTreeConverters); - } + CheckErrorsAndThrowTheFirstOne(); + + // SSM 2/05/16 - для преобразования синтаксических деревьев извне (синтаксический сахар) + currentUnit.SyntaxTree = ConvertSyntaxTree(currentUnit.SyntaxTree, currentUnit.Language.SyntaxTreeConverters); // генерация документации к узлам синтаксического дерева EVA docs = GenUnitDocumentation(currentUnit, sourceText); + } - #region SEMANTIC CHECKS : DIRECTIVES AND OUTPUT FILE TYPE + /// + /// Устанавливает значения опций DisableStandardUnits и UseDllForSystemUnits + /// + private void InitializeCompilerOptionsRelatedToStandardUnits(SyntaxTree.compilation_unit unitSyntaxTree) + { + // проверяем только для основной программы или dll + if (UnitTable.Count == 0) + { + var disableStandardUnitsDirective = unitSyntaxTree.compiler_directives.Find(directive => + directive.Name.text.Equals(StringConstants.compiler_directive_disable_standard_units, StringComparison.CurrentCultureIgnoreCase)); + if (disableStandardUnitsDirective != null) + CompilerOptions.DisableStandardUnits = true; + } + + if (unitSyntaxTree is SyntaxTree.unit_module) + CompilerOptions.UseDllForSystemUnits = false; + } + + /// + /// Семантические проверки по директивам и по типу файла + /// + private void RunSemanticChecks(string unitFileName, CompilationUnit currentUnit) + { // SSM 21/05/20 Проверка, что мы не записали apptype dll в небиблиотеку bool isDll = IsDll(currentUnit.SyntaxTree, out var dllDirective); SemanticCheckDLLDirectiveOnlyForLibraries(currentUnit.SyntaxTree, isDll, dllDirective); @@ -3772,30 +3853,10 @@ namespace PascalABCCompiler // ошибка директива include в паскалевском юните SemanticCheckNoIncludeNamespaceDirectivesInUnit(currentUnit); - #endregion - if (isDll) - CompilerOptions.OutputFileType = CompilerOptions.OutputType.ClassLibrary; // есть также в конце Compile - - currentUnit.CaseSensitive = currentUnit.Language.CaseSensitive; - - // currentUnit.SyntaxUnitName = currentUnitNode; - - // сопоставление нодам ошибок EVA - MatchErrorsToBadNodes(currentUnit); + SemanticCheckDisableStandardUnitsDirectiveInUnit(currentUnit.SyntaxTree); CheckErrorsAndThrowTheFirstOne(); - - // местоположение этой строчки важно, потому что проверяется UnitTable.Count > 0 выше EVA - UnitTable[UnitId] = currentUnit; - - // здесь добавляем стандартные модули в секцию uses интерфейса -#if DEBUG - if (InternalDebug.AddStandartUnits) -#endif - AddStandardUnitsToInterfaceUsesSection(currentUnit); - - currentUnit.possibleNamespaces.Clear(); } private SyntaxTree.compilation_unit ConvertSyntaxTree(SyntaxTree.compilation_unit syntaxTree, List converters) @@ -3833,7 +3894,7 @@ namespace PascalABCCompiler } } - private void MatchErrorsToBadNodes(CompilationUnit currentUnit) + private void MatchSyntaxErrorsToBadNodes(CompilationUnit currentUnit) { if (errorsList.Count > 0) { @@ -3851,7 +3912,7 @@ namespace PascalABCCompiler private void SemanticCheckDLLDirectiveOnlyForLibraries(SyntaxTree.compilation_unit unitSyntaxTree, bool isDll, SyntaxTree.compiler_directive dllDirective) { // Если Library и apptype dll не указано, то никакой ошибки нет EVA - if (unitSyntaxTree != null && isDll) + if (isDll) { if (!(unitSyntaxTree is SyntaxTree.unit_module) || (unitSyntaxTree is SyntaxTree.unit_module unitNode && unitNode.unit_name.HeaderKeyword != SyntaxTree.UnitHeaderKeyword.Library)) @@ -3862,6 +3923,25 @@ namespace PascalABCCompiler } } + /// + /// Ошибка указания директивы DisableStandardUnits в подключенном модулей + /// + /// + private void SemanticCheckDisableStandardUnitsDirectiveInUnit(SyntaxTree.compilation_unit unitSyntaxTree) + { + // проверяем для используемых модулей + if (UnitTable.Count > 0) + { + var foundDirective = unitSyntaxTree.compiler_directives.Find(directive => + directive.Name.text.Equals(StringConstants.compiler_directive_disable_standard_units, StringComparison.CurrentCultureIgnoreCase)); + + if (foundDirective != null) + { + ErrorsList.Add(new DisableStandardUnitsDirectiveDisallowedInUsedUnits(unitSyntaxTree.file_name, foundDirective.source_context)); + } + } + } + private SyntaxTree.compilation_unit ConstructSyntaxTree(string unitFileName, CompilationUnit currentUnit, string sourceText) { List DefinesList = new List { "PASCALABC" }; @@ -3919,7 +3999,7 @@ namespace PascalABCCompiler { Dictionary docs = null; - if (errorsList.Count == 0 && IsDocumentationNeeded(currentUnit.SyntaxTree)) + if (IsDocumentationNeeded(currentUnit.SyntaxTree)) { if (SourceText != null) { diff --git a/Compiler/Errors.cs b/Compiler/Errors.cs index f0b5aa8a2..071f9b9ac 100644 --- a/Compiler/Errors.cs +++ b/Compiler/Errors.cs @@ -85,6 +85,18 @@ namespace PascalABCCompiler.Errors } } + /// + /// Бросается при обраружении директивы {$DisableStandardUnits} в подключенном модуле + /// + public class DisableStandardUnitsDirectiveDisallowedInUsedUnits : CompilerThrownError + { + public DisableStandardUnitsDirectiveDisallowedInUsedUnits(string FileName, SyntaxTree.SourceContext sc) + : base(StringResources.Get("COMPILATIONERROR_DISABLE_STANDARD_UNITS_DIRECTIVE_DISALLOWED_IN_USED_UNITS"), FileName) + { + this.source_context = sc; + } + } + /// /// Бросается при компиляции библиотеки не первой /// diff --git a/Parsers/PascalABCParserNewSaushkin/Parser.cs b/Parsers/PascalABCParserNewSaushkin/Parser.cs index 7695e5c39..78ec587f4 100644 --- a/Parsers/PascalABCParserNewSaushkin/Parser.cs +++ b/Parsers/PascalABCParserNewSaushkin/Parser.cs @@ -122,6 +122,7 @@ namespace Languages.Pascal.Frontend.Wrapping [StringConstants.compiler_directive_include] = new DirectiveInfo(quotesAreSpecialSymbols: true), [StringConstants.compiler_directive_targetframework] = new DirectiveInfo(), [StringConstants.compiler_directive_hidden_idents] = NoParamsDirectiveInfo(), + [StringConstants.compiler_directive_disable_standard_units] = NoParamsDirectiveInfo(), [StringConstants.compiler_directive_version_string] = new DirectiveInfo(IsValidVersionCheck()), [StringConstants.compiler_directive_product_string] = new DirectiveInfo(quotesAreSpecialSymbols: true), [StringConstants.compiler_directive_company_string] = new DirectiveInfo(quotesAreSpecialSymbols: true), diff --git a/StringConstants/StringConstants.cs b/StringConstants/StringConstants.cs index e580a8ff4..3958ded8b 100644 --- a/StringConstants/StringConstants.cs +++ b/StringConstants/StringConstants.cs @@ -317,33 +317,34 @@ namespace PascalABCCompiler public static string default_constructor_name = "create"; #region PASCAL COMPILER DIRECTIVES - public static string compiler_directive_apptype = "apptype"; - public static string compiler_directive_reference = "reference"; - public static string compiler_directive_include_namespace = "includenamespace"; - public static string compiler_directive_savepcu = "savepcu"; - public static string compiler_directive_zerobasedstrings = "zerobasedstrings"; - public static string compiler_directive_zerobasedstrings_ON = "string_zerobased+"; - public static string compiler_directive_zerobasedstrings_OFF = "string_zerobased-"; - public static string compiler_directive_nullbasedstrings_ON = "string_nullbased+"; // для совместимости. Deprecated - public static string compiler_directive_nullbasedstrings_OFF = "string_nullbased-"; // для совместимости. Deprecated - public static string compiler_directive_initstring_as_empty_ON = "string_initempty+"; - public static string compiler_directive_initstring_as_empty_OFF = "string_initempty-"; - public static string compiler_directive_resource = "resource"; - public static string compiler_directive_platformtarget = "platformtarget"; - public static string compiler_directive_faststrings = "faststrings"; - public static string compiler_directive_gendoc = "gendoc"; - public static string compiler_directive_region = "region"; - public static string compiler_directive_endregion = "endregion"; - public static string compiler_directive_ifdef = "ifdef"; - public static string compiler_directive_endif = "endif"; - public static string compiler_directive_ifndef = "ifndef"; - public static string compiler_directive_else = "else"; - public static string compiler_directive_undef = "undef"; - public static string compiler_directive_define = "define"; - public static string compiler_directive_include = "include"; - public static string compiler_directive_targetframework = "targetframework"; - public static string compiler_directive_hidden_idents = "hiddenidents"; - public static string compiler_directive_omp = "omp"; + public const string compiler_directive_apptype = "apptype"; + public const string compiler_directive_reference = "reference"; + public const string compiler_directive_include_namespace = "includenamespace"; + public const string compiler_directive_savepcu = "savepcu"; + public const string compiler_directive_zerobasedstrings = "zerobasedstrings"; + public const string compiler_directive_zerobasedstrings_ON = "string_zerobased+"; + public const string compiler_directive_zerobasedstrings_OFF = "string_zerobased-"; + public const string compiler_directive_nullbasedstrings_ON = "string_nullbased+"; // для совместимости. Deprecated + public const string compiler_directive_nullbasedstrings_OFF = "string_nullbased-"; // для совместимости. Deprecated + public const string compiler_directive_initstring_as_empty_ON = "string_initempty+"; + public const string compiler_directive_initstring_as_empty_OFF = "string_initempty-"; + public const string compiler_directive_resource = "resource"; + public const string compiler_directive_platformtarget = "platformtarget"; + public const string compiler_directive_faststrings = "faststrings"; + public const string compiler_directive_gendoc = "gendoc"; + public const string compiler_directive_region = "region"; + public const string compiler_directive_endregion = "endregion"; + public const string compiler_directive_ifdef = "ifdef"; + public const string compiler_directive_endif = "endif"; + public const string compiler_directive_ifndef = "ifndef"; + public const string compiler_directive_else = "else"; + public const string compiler_directive_undef = "undef"; + public const string compiler_directive_define = "define"; + public const string compiler_directive_include = "include"; + public const string compiler_directive_targetframework = "targetframework"; + public const string compiler_directive_hidden_idents = "hiddenidents"; + public const string compiler_directive_disable_standard_units = "disablestandardunits"; + public const string compiler_directive_omp = "omp"; public const string compiler_directive_version_string = "version"; public const string compiler_directive_product_string = "product"; public const string compiler_directive_company_string = "company"; @@ -372,6 +373,10 @@ namespace PascalABCCompiler public const string pascalLanguageDllName = "PascalLanguage.dll"; #endregion + public static readonly string[] netSystemLibraries = new[] { "mscorlib.dll", "System.dll", "System.Core.dll", "System.Numerics.dll", "System.Windows.Forms.dll", "System.Drawing.dll" }; + + public static readonly string[] graph3DDependencies = new[] { "PresentationFramework.dll", "WindowsBase.dll", "PresentationCore.dll", "HelixToolkit.Wpf.dll", "HelixToolkit.dll" }; + public static string get_array_type_name(string type_name, int rank) { if (rank == 1) diff --git a/TreeConverter/TreeRealization/programs.cs b/TreeConverter/TreeRealization/programs.cs index 6260db2a0..152d0f15d 100644 --- a/TreeConverter/TreeRealization/programs.cs +++ b/TreeConverter/TreeRealization/programs.cs @@ -317,7 +317,7 @@ namespace PascalABCCompiler.TreeRealization { sl.statements.AddElementFirst(units[0].IsConsoleApplicationVariableAssignExpr); } - else if (SystemLibrary.SystemLibInitializer.ConfigVariable.sym_info is compiled_variable_definition && units[0].IsConsoleApplicationVariableValue.constant_value) + else if (SystemLibrary.SystemLibInitializer.ConfigVariable?.sym_info is compiled_variable_definition && units[0].IsConsoleApplicationVariableValue.constant_value) { bool is_console = true; diff --git a/VisualPlugins/CompilerController/CompilerInformation.cs b/VisualPlugins/CompilerController/CompilerInformation.cs index b7f842105..5679c88e2 100644 --- a/VisualPlugins/CompilerController/CompilerInformation.cs +++ b/VisualPlugins/CompilerController/CompilerInformation.cs @@ -50,7 +50,7 @@ namespace VisualPascalABCPlugins NoSavePCU.Checked = !VisualEnvironmentCompiler.Compiler.InternalDebug.PCUGenerate; NoSemantic.Checked = !VisualEnvironmentCompiler.Compiler.InternalDebug.SemanticAnalysis; NoCodeGeneration.Checked = !VisualEnvironmentCompiler.Compiler.InternalDebug.CodeGeneration; - NoAddStandartUnits.Checked = !VisualEnvironmentCompiler.Compiler.InternalDebug.AddStandartUnits; + NoAddStandartUnits.Checked = VisualEnvironmentCompiler.Compiler.CompilerOptions.DisableStandardUnits; NoSkipPCUErrors.Checked = !VisualEnvironmentCompiler.Compiler.InternalDebug.SkipPCUErrors; NoSkipInternalErrorsIfSyntaxTreeIsCorrupt.Checked = !VisualEnvironmentCompiler.Compiler.InternalDebug.SkipInternalErrorsIfSyntaxTreeIsCorrupt; NoIncludeDebugInfoInPCU.Checked = !VisualEnvironmentCompiler.Compiler.InternalDebug.IncludeDebugInfoInPCU; @@ -119,7 +119,7 @@ namespace VisualPascalABCPlugins private void NoAddStandartUnits_CheckedChanged(object sender, EventArgs e) { - VisualEnvironmentCompiler.Compiler.InternalDebug.AddStandartUnits = !NoAddStandartUnits.Checked; + VisualEnvironmentCompiler.Compiler.CompilerOptions.DisableStandardUnits = NoAddStandartUnits.Checked; } private void OnRebuld_CheckedChanged(object sender, EventArgs e) diff --git a/bin/Lng/Eng/CompilerErrors.dat b/bin/Lng/Eng/CompilerErrors.dat index fb8604b24..908ae8c74 100644 --- a/bin/Lng/Eng/CompilerErrors.dat +++ b/bin/Lng/Eng/CompilerErrors.dat @@ -18,6 +18,7 @@ FILE_{0}_NOT_FOUND=File '{0}' not found NAMESPACE_CAN_BE_COMPILED_ONLY_IN_PROJECTS=Files with namespaces can be compiled only inside projects NAMESPACE_CANNOT_HAVE_IN_SECTION=Namespace cannot have 'in' section APPTYPE_DLL_IS_ALLOWED_ONLY_FOR_LIBRARIES=Parameter 'dll' in 'apptype' directive is allowed only for libraries +DISABLE_STANDARD_UNITS_DIRECTIVE_DISALLOWED_IN_USED_UNITS=Directive 'DisableStandardUnits' is disallowed in attached (by uses keyword) units USES_IN_WRONG_NAME=Unit name in uses-in ({0}) must be same as file name ({1}) UNSUPPORTED_TARGETFRAMEWORK_{0}=TargetFramework '{0}' is not supported UNSUPPORTED_TARGET_PLATFORM{0}=Platform '{0}' is not supported diff --git a/bin/Lng/Rus/CompilerErrors.dat b/bin/Lng/Rus/CompilerErrors.dat index 94a64748f..680a2452c 100644 --- a/bin/Lng/Rus/CompilerErrors.dat +++ b/bin/Lng/Rus/CompilerErrors.dat @@ -18,6 +18,7 @@ NAMESPACE_CAN_BE_COMPILED_ONLY_IN_PROJECTS=Компиляция файлов с FILE_{0}_NOT_FOUND=Файл '{0}' не найден NAMESPACE_CANNOT_HAVE_IN_SECTION=Для пространства имен не может указываться секция in APPTYPE_DLL_IS_ALLOWED_ONLY_FOR_LIBRARIES=Параметр 'dll' директивы 'apptype' разрешается только для библиотек +DISABLE_STANDARD_UNITS_DIRECTIVE_DISALLOWED_IN_USED_UNITS=Указание директивы 'DisableStandardUnits' в подключенных модулях не разрешается USES_IN_WRONG_NAME=Имя модуля в uses-in ({0}) должно совпадать с именем файла ({1}) UNSUPPORTED_TARGETFRAMEWORK_{0}=TargetFramework '{0}' не поддерживается UNSUPPORTED_TARGET_PLATFORM{0}=Платформа '{0}' не поддерживается