From 149bdb5f08002b7f79f0ef2e4689d5a13ef58980 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sun, 26 Mar 2017 19:36:31 +0000 Subject: [PATCH 01/14] Minor fixes to changelog. --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8b4ecd2..9fe13e39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,10 +19,10 @@ These are the changes to each version that has been released to the Visual Studi - [x] Features - [x] [#359](https://github.com/codecadwallader/codemaid/pull/359) - Reorganizing: Add option to sort private->public vs. public->private - thanks [ahalassy](https://github.com/ahalassy)! - [x] [#394](https://github.com/codecadwallader/codemaid/pull/394) - Finding: Add ability to clear solution explorer search before finding - thanks [joeburdick](https://github.com/joeburdick)! - - [x] [#420](https://github.com/codecadwallader/codemaid/issues/420) - Upgraded projects to .NET 4.6.1 and misc. fixes for VS2017 build support + - [x] [#420](https://github.com/codecadwallader/codemaid/pull/420) - Upgraded projects to .NET 4.6.1 and misc. fixes for VS2017 build support - [x] Fixes - - [x] [#419](https://github.com/codecadwallader/codemaid/issues/419) - Cleaning: Switched using statement cleanup command to workaround VS2017+ReSharper issue that prevented using statement cleanup from activating - thanks [jlbeard84](https://github.com/jlbeard84)! + - [x] [#419](https://github.com/codecadwallader/codemaid/pull/419) - Cleaning: Switched using statement cleanup command to workaround VS2017+ReSharper issue that prevented using statement cleanup from activating - thanks [jlbeard84](https://github.com/jlbeard84)! ## 10.2 From 19b023fc171170e95cf467ccc87521b633a7ade0 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 8 Apr 2017 12:39:37 +0000 Subject: [PATCH 02/14] Experiment with a conditional so Vsix gallery deploys only happen on master/stable commits. --- appveyor.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 79e47321..2e3978b9 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,4 +23,5 @@ test: assemblies: SteveCadwallader.CodeMaid.UnitTests.dll after_test: - - ps: Vsix-PushArtifacts | Vsix-PublishToGallery \ No newline at end of file + - ps: if (['master', 'stable'].contains($env:APPVEYOR_REPO_BRANCH)) { Vsix-PushArtifacts | Vsix-PublishToGallery } + - ps: if (!(['master', 'stable'].contains($env:APPVEYOR_REPO_BRANCH))) { Vsix-PushArtifacts } \ No newline at end of file From 86a902d9b415f2a5474a993f648ea1fcaaed3972 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 8 Apr 2017 12:42:19 +0000 Subject: [PATCH 03/14] Test alternate conditional ps syntax. --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 2e3978b9..a475c219 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,5 +23,5 @@ test: assemblies: SteveCadwallader.CodeMaid.UnitTests.dll after_test: - - ps: if (['master', 'stable'].contains($env:APPVEYOR_REPO_BRANCH)) { Vsix-PushArtifacts | Vsix-PublishToGallery } - - ps: if (!(['master', 'stable'].contains($env:APPVEYOR_REPO_BRANCH))) { Vsix-PushArtifacts } \ No newline at end of file + - ps: if ($env:APPVEYOR_REPO_BRANCH -eq 'master' -or $env:APPVEYOR_REPO_BRANCH -eq 'stable') { Vsix-PushArtifacts | Vsix-PublishToGallery } + - ps: if ($env:APPVEYOR_REPO_BRANCH -ne 'master' -and $env:APPVEYOR_REPO_BRANCH -ne 'stable') { Vsix-PushArtifacts } \ No newline at end of file From d474939b945a04b9b91274ea3f22314d506a9399 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Mon, 24 Apr 2017 11:14:39 +0000 Subject: [PATCH 04/14] #440 exclude minimized CSS and JS files by default. --- CHANGELOG.md | 1 + CodeMaid/Properties/Settings.Designer.cs | 4 +- CodeMaid/Properties/Settings.settings | 2 +- CodeMaid/app.config | 146 +++++++++++++++-------- 4 files changed, 101 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fe13e39..fd7e1f30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ These changes have not been released to the Visual Studio marketplace, but (if c - [x] Features - [x] Fixes + - [x] [#440](https://github.com/codecadwallader/codemaid/issues/440) - Cleaning: Exclude *.min.css and *.min.js files by default ## Previous Releases diff --git a/CodeMaid/Properties/Settings.Designer.cs b/CodeMaid/Properties/Settings.Designer.cs index 1d470b94..331cbe4c 100644 --- a/CodeMaid/Properties/Settings.Designer.cs +++ b/CodeMaid/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace SteveCadwallader.CodeMaid.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.0.1.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.0.0")] public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -61,7 +61,7 @@ public bool Cleaning_ExcludeT4GeneratedCode { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("\\.Designer\\.cs$||\\.Designer\\.vb$||\\.resx$")] + [global::System.Configuration.DefaultSettingValueAttribute("\\.Designer\\.cs$||\\.Designer\\.vb$||\\.resx$||\\.min\\.css$||\\.min\\.js$")] public string Cleaning_ExclusionExpression { get { return ((string)(this["Cleaning_ExclusionExpression"])); diff --git a/CodeMaid/Properties/Settings.settings b/CodeMaid/Properties/Settings.settings index 85043509..2470383f 100644 --- a/CodeMaid/Properties/Settings.settings +++ b/CodeMaid/Properties/Settings.settings @@ -12,7 +12,7 @@ True - \.Designer\.cs$||\.Designer\.vb$||\.resx$ + \.Designer\.cs$||\.Designer\.vb$||\.resx$||\.min\.css$||\.min\.js$ True diff --git a/CodeMaid/app.config b/CodeMaid/app.config index 8a6feba1..7f8e29ca 100644 --- a/CodeMaid/app.config +++ b/CodeMaid/app.config @@ -17,7 +17,7 @@ True - \.Designer\.cs$||\.Designer\.vb$||\.resx$ + \.Designer\.cs$||\.Designer\.vb$||\.resx$||\.min\.css$||\.min\.js$ True @@ -73,127 +73,163 @@ True - + True - + True - + True True - + True - + True True - + True - + True - + False - + True True - + True - + True - + True - + True - + True - + True True - + True - + True - + True - + True - + True - + False - + True - + False - + True - + True - + False - + True False - + True - + True - + True - + True - + True - + True - + True - + True - + True @@ -217,10 +253,12 @@ True - + True - + True @@ -229,22 +267,27 @@ True - + True 1 - + True - + True - + True - + False @@ -301,7 +344,8 @@ True - + @@ -370,7 +414,8 @@ False - + True @@ -397,7 +442,8 @@ True - + True @@ -415,7 +461,8 @@ True - + True @@ -460,7 +507,8 @@ Structs||11||Structs - + 0 From ba6bae644bcd83540fc9cb7f23f70466a86c3a29 Mon Sep 17 00:00:00 2001 From: Michael Huttinger Date: Thu, 4 May 2017 23:13:26 -0500 Subject: [PATCH 05/14] VB.Net Code Element Positions: Fixing issue #333 --- CodeMaid/Model/CodeItems/BaseCodeItemElement.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CodeMaid/Model/CodeItems/BaseCodeItemElement.cs b/CodeMaid/Model/CodeItems/BaseCodeItemElement.cs index d9294d14..36a83a47 100644 --- a/CodeMaid/Model/CodeItems/BaseCodeItemElement.cs +++ b/CodeMaid/Model/CodeItems/BaseCodeItemElement.cs @@ -40,7 +40,7 @@ protected BaseCodeItemElement() /// /// Gets the start point adjusted for leading comments, may be null. /// - public override EditPoint StartPoint => CodeElement != null ? GetStartPointAdjustedForComments(CodeElement.StartPoint) : null; + public override EditPoint StartPoint => CodeElement != null ? GetStartPointAdjustedForComments(CodeElement.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes)) : null; /// /// Gets the end point, may be null. @@ -66,10 +66,10 @@ public override void LoadLazyInitializedValues() /// public override void RefreshCachedPositionAndName() { - StartLine = CodeElement.StartPoint.Line; - StartOffset = CodeElement.StartPoint.AbsoluteCharOffset; - EndLine = CodeElement.EndPoint.Line; - EndOffset = CodeElement.EndPoint.AbsoluteCharOffset; + StartLine = CodeElement.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes).Line; + StartOffset = CodeElement.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes).AbsoluteCharOffset; + EndLine = CodeElement.GetEndPoint(vsCMPart.vsCMPartWholeWithAttributes).Line; + EndOffset = CodeElement.GetEndPoint(vsCMPart.vsCMPartWholeWithAttributes).AbsoluteCharOffset; Name = CodeElement.Name; } From 3246e0d1a20141bfbc486ada26b7c25f11c70c53 Mon Sep 17 00:00:00 2001 From: Michael Huttinger Date: Fri, 5 May 2017 08:52:46 -0500 Subject: [PATCH 06/14] Modifed code for formatting VB.Net to implement most of what C# does --- CodeMaid/Logic/Cleaning/CodeCleanupManager.cs | 119 +++++++++++++++++- 1 file changed, 118 insertions(+), 1 deletion(-) diff --git a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs index dd0f99c3..ec096ffa 100644 --- a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs +++ b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs @@ -191,6 +191,9 @@ private Action FindCodeCleanupMethod(Document document) case CodeLanguage.CSharp: return RunCodeCleanupCSharp; + case CodeLanguage.VisualBasic: + return RunCodeCleanupVB; + case CodeLanguage.CPlusPlus: case CodeLanguage.CSS: case CodeLanguage.JavaScript: @@ -209,7 +212,7 @@ private Action FindCodeCleanupMethod(Document document) return RunCodeCleanupMarkup; case CodeLanguage.FSharp: - case CodeLanguage.VisualBasic: + //case CodeLanguage.VisualBasic: case CodeLanguage.Unknown: return RunCodeCleanupGeneric; @@ -338,6 +341,120 @@ private void RunCodeCleanupCSharp(Document document) _commentFormatLogic.FormatComments(textDocument); } + /// + /// Attempts to run code cleanup on the specified VB.Net document. + /// + /// The document for cleanup. + private void RunCodeCleanupVB(Document document) + { + var textDocument = document.GetTextDocument(); + + // Perform any actions that can modify the file code model first. + RunExternalFormatting(textDocument); + if (!document.IsExternal()) + { + _usingStatementCleanupLogic.RemoveAndSortUsingStatements(textDocument); + } + + // Interpret the document into a collection of elements. + var codeItems = _codeModelManager.RetrieveAllCodeItems(document); + + var regions = codeItems.OfType().ToList(); + var usingStatements = codeItems.OfType().ToList(); + var namespaces = codeItems.OfType().ToList(); + var classes = codeItems.OfType().ToList(); + var delegates = codeItems.OfType().ToList(); + var enumerations = codeItems.OfType().ToList(); + var events = codeItems.OfType().ToList(); + var fields = codeItems.OfType().ToList(); + var interfaces = codeItems.OfType().ToList(); + var methods = codeItems.OfType().ToList(); + var properties = codeItems.OfType().ToList(); + var structs = codeItems.OfType().ToList(); + + // Build up more complicated collections. + var usingStatementBlocks = CodeModelHelper.GetCodeItemBlocks(usingStatements).ToList(); + var usingStatementsThatStartBlocks = (from IEnumerable block in usingStatementBlocks select block.First()).ToList(); + var usingStatementsThatEndBlocks = (from IEnumerable block in usingStatementBlocks select block.Last()).ToList(); + + // Perform file header cleanup. + _fileHeaderLogic.UpdateFileHeader(textDocument); + + // Perform removal cleanup. + _removeRegionLogic.RemoveRegionsPerSettings(regions); + _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); + _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAfterAttributes(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesBetweenChainedStatements(textDocument); + _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); + + // Perform insertion of blank line padding cleanup. + _insertBlankLinePaddingLogic.InsertPaddingBeforeRegionTags(regions); + _insertBlankLinePaddingLogic.InsertPaddingAfterRegionTags(regions); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeEndRegionTags(regions); + _insertBlankLinePaddingLogic.InsertPaddingAfterEndRegionTags(regions); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(usingStatementsThatStartBlocks); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(usingStatementsThatEndBlocks); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(namespaces); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(namespaces); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(classes); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(classes); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(delegates); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(delegates); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(enumerations); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(enumerations); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(events); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(events); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(fields); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(fields); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(interfaces); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(interfaces); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(methods); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(methods); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(properties); + _insertBlankLinePaddingLogic.InsertPaddingBetweenMultiLinePropertyAccessors(properties); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(properties); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(structs); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(structs); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCaseStatements(textDocument); + _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); + + // Perform insertion of explicit access modifier cleanup. + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnClasses(classes); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnDelegates(delegates); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEnumerations(enumerations); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEvents(events); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnFields(fields); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnInterfaces(interfaces); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnMethods(methods); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnProperties(properties); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnStructs(structs); + + // Perform insertion of whitespace cleanup. + _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); + + // Perform update cleanup. + _updateLogic.UpdateEndRegionDirectives(textDocument); + + // Perform comment cleaning. + _commentFormatLogic.FormatComments(textDocument); + } + /// /// Attempts to run code cleanup on the specified C/C++ document. /// From 3e4b18ce0b47985ef9597ab5ff8f84aad6cba22b Mon Sep 17 00:00:00 2001 From: Michael Huttinger Date: Fri, 5 May 2017 10:31:59 -0500 Subject: [PATCH 07/14] Removed handling of InsertExplicitAccessModifiers for all VB.Net code (modifiers are not the same) --- CodeMaid/Logic/Cleaning/CodeCleanupManager.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs index ec096ffa..8b9bdea1 100644 --- a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs +++ b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs @@ -435,15 +435,15 @@ private void RunCodeCleanupVB(Document document) _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); // Perform insertion of explicit access modifier cleanup. - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnClasses(classes); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnDelegates(delegates); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEnumerations(enumerations); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEvents(events); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnFields(fields); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnInterfaces(interfaces); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnMethods(methods); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnProperties(properties); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnStructs(structs); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnClasses(classes); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnDelegates(delegates); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEnumerations(enumerations); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEvents(events); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnFields(fields); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnInterfaces(interfaces); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnMethods(methods); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnProperties(properties); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnStructs(structs); // Perform insertion of whitespace cleanup. _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); From a76c613e3d7e2e97a055a7d4db3f1414070e50e1 Mon Sep 17 00:00:00 2001 From: Michael Huttinger Date: Fri, 5 May 2017 10:33:47 -0500 Subject: [PATCH 08/14] Removed handling of InsertExplicitAccessModifiers for all VB.Net code (modifiers are not the same) --- CodeMaid/Logic/Cleaning/CodeCleanupManager.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs index ec096ffa..8b9bdea1 100644 --- a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs +++ b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs @@ -435,15 +435,15 @@ private void RunCodeCleanupVB(Document document) _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); // Perform insertion of explicit access modifier cleanup. - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnClasses(classes); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnDelegates(delegates); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEnumerations(enumerations); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEvents(events); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnFields(fields); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnInterfaces(interfaces); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnMethods(methods); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnProperties(properties); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnStructs(structs); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnClasses(classes); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnDelegates(delegates); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEnumerations(enumerations); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEvents(events); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnFields(fields); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnInterfaces(interfaces); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnMethods(methods); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnProperties(properties); + //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnStructs(structs); // Perform insertion of whitespace cleanup. _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); From 93baa8419a1a377f7caaa6f91af3ccd85f0a03d1 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 6 May 2017 11:50:33 +0000 Subject: [PATCH 09/14] vsCMPart.vsCMPartWholeWithAttributes is the defaulted argument so it does not need to be specified. Replicate changes to CodeItemUsingStatement's RefreshCachesPositionAndName for consistency. --- CodeMaid/Model/CodeItems/BaseCodeItemElement.cs | 15 +++++++++------ .../Model/CodeItems/CodeItemUsingStatement.cs | 11 +++++++---- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/CodeMaid/Model/CodeItems/BaseCodeItemElement.cs b/CodeMaid/Model/CodeItems/BaseCodeItemElement.cs index 36a83a47..2c4bd443 100644 --- a/CodeMaid/Model/CodeItems/BaseCodeItemElement.cs +++ b/CodeMaid/Model/CodeItems/BaseCodeItemElement.cs @@ -40,12 +40,12 @@ protected BaseCodeItemElement() /// /// Gets the start point adjusted for leading comments, may be null. /// - public override EditPoint StartPoint => CodeElement != null ? GetStartPointAdjustedForComments(CodeElement.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes)) : null; + public override EditPoint StartPoint => CodeElement != null ? GetStartPointAdjustedForComments(CodeElement.GetStartPoint()) : null; /// /// Gets the end point, may be null. /// - public override EditPoint EndPoint => CodeElement?.EndPoint.CreateEditPoint(); + public override EditPoint EndPoint => CodeElement?.GetEndPoint().CreateEditPoint(); /// /// Loads all lazy initialized values immediately. @@ -66,10 +66,13 @@ public override void LoadLazyInitializedValues() /// public override void RefreshCachedPositionAndName() { - StartLine = CodeElement.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes).Line; - StartOffset = CodeElement.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes).AbsoluteCharOffset; - EndLine = CodeElement.GetEndPoint(vsCMPart.vsCMPartWholeWithAttributes).Line; - EndOffset = CodeElement.GetEndPoint(vsCMPart.vsCMPartWholeWithAttributes).AbsoluteCharOffset; + var startPoint = CodeElement.GetStartPoint(); + var endPoint = CodeElement.GetEndPoint(); + + StartLine = startPoint.Line; + StartOffset = startPoint.AbsoluteCharOffset; + EndLine = endPoint.Line; + EndOffset = endPoint.AbsoluteCharOffset; Name = CodeElement.Name; } diff --git a/CodeMaid/Model/CodeItems/CodeItemUsingStatement.cs b/CodeMaid/Model/CodeItems/CodeItemUsingStatement.cs index 4bb8e141..8f32809b 100644 --- a/CodeMaid/Model/CodeItems/CodeItemUsingStatement.cs +++ b/CodeMaid/Model/CodeItems/CodeItemUsingStatement.cs @@ -36,10 +36,13 @@ public CodeItemUsingStatement() /// public override void RefreshCachedPositionAndName() { - StartLine = CodeElement.StartPoint.Line; - StartOffset = CodeElement.StartPoint.AbsoluteCharOffset; - EndLine = CodeElement.EndPoint.Line; - EndOffset = CodeElement.EndPoint.AbsoluteCharOffset; + var startPoint = CodeElement.GetStartPoint(); + var endPoint = CodeElement.GetEndPoint(); + + StartLine = startPoint.Line; + StartOffset = startPoint.AbsoluteCharOffset; + EndLine = endPoint.Line; + EndOffset = endPoint.AbsoluteCharOffset; } #endregion BaseCodeItem Overrides From e21d30d12ff7dd8b7acc489bb68f9a7e30bad909 Mon Sep 17 00:00:00 2001 From: TheHUTMan Date: Sat, 6 May 2017 13:49:51 -0500 Subject: [PATCH 10/14] Removed commented code --- CodeMaid/Logic/Cleaning/CodeCleanupManager.cs | 1195 ++++++++--------- 1 file changed, 592 insertions(+), 603 deletions(-) diff --git a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs index 8b9bdea1..2f6cc453 100644 --- a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs +++ b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs @@ -11,607 +11,596 @@ namespace SteveCadwallader.CodeMaid.Logic.Cleaning { - /// - /// A manager class for cleaning up code. - /// - /// - /// - /// Note: All POSIXRegEx text replacements search against '\n' but insert/replace with - /// Environment.NewLine. This handles line endings correctly. - /// - internal class CodeCleanupManager - { - #region Fields - - private readonly CodeMaidPackage _package; - - private readonly CodeModelManager _codeModelManager; - private readonly CodeReorganizationManager _codeReorganizationManager; - private readonly CommandHelper _commandHelper; - - private readonly CodeCleanupAvailabilityLogic _codeCleanupAvailabilityLogic; - private readonly CommentFormatLogic _commentFormatLogic; - private readonly InsertBlankLinePaddingLogic _insertBlankLinePaddingLogic; - private readonly InsertExplicitAccessModifierLogic _insertExplicitAccessModifierLogic; - private readonly InsertWhitespaceLogic _insertWhitespaceLogic; - private readonly FileHeaderLogic _fileHeaderLogic; - private readonly RemoveRegionLogic _removeRegionLogic; - private readonly RemoveWhitespaceLogic _removeWhitespaceLogic; - private readonly UpdateLogic _updateLogic; - private readonly UsingStatementCleanupLogic _usingStatementCleanupLogic; - - private readonly CachedSettingSet _otherCleaningCommands = - new CachedSettingSet(() => Settings.Default.ThirdParty_OtherCleaningCommandsExpression, - expression => - expression.Split(new[] { "||" }, StringSplitOptions.RemoveEmptyEntries) - .Select(x => x.Trim()) - .Where(y => !string.IsNullOrEmpty(y)) - .ToList()); - - #endregion Fields - - #region Constructors - - /// - /// The singleton instance of the class. - /// - private static CodeCleanupManager _instance; - - /// - /// Gets an instance of the class. - /// - /// The hosting package. - /// An instance of the class. - internal static CodeCleanupManager GetInstance(CodeMaidPackage package) - { - return _instance ?? (_instance = new CodeCleanupManager(package)); - } - - /// - /// Initializes a new instance of the class. - /// - /// The hosting package. - private CodeCleanupManager(CodeMaidPackage package) - { - _package = package; - - _codeModelManager = CodeModelManager.GetInstance(_package); - _codeReorganizationManager = CodeReorganizationManager.GetInstance(_package); - _commandHelper = CommandHelper.GetInstance(_package); - - _codeCleanupAvailabilityLogic = CodeCleanupAvailabilityLogic.GetInstance(_package); - _commentFormatLogic = CommentFormatLogic.GetInstance(_package); - _insertBlankLinePaddingLogic = InsertBlankLinePaddingLogic.GetInstance(_package); - _insertExplicitAccessModifierLogic = InsertExplicitAccessModifierLogic.GetInstance(); - _insertWhitespaceLogic = InsertWhitespaceLogic.GetInstance(_package); - _fileHeaderLogic = FileHeaderLogic.GetInstance(_package); - _removeRegionLogic = RemoveRegionLogic.GetInstance(_package); - _removeWhitespaceLogic = RemoveWhitespaceLogic.GetInstance(_package); - _updateLogic = UpdateLogic.GetInstance(_package); - _usingStatementCleanupLogic = UsingStatementCleanupLogic.GetInstance(_package); - } - - #endregion Constructors - - #region Internal Methods - - /// - /// Attempts to run code cleanup on the specified project item. - /// - /// The project item for cleanup. - internal void Cleanup(ProjectItem projectItem) - { - if (!_codeCleanupAvailabilityLogic.CanCleanupProjectItem(projectItem)) return; - - // Attempt to open the document if not already opened. - bool wasOpen = projectItem.IsOpen[Constants.vsViewKindTextView] || projectItem.IsOpen[Constants.vsViewKindCode]; - if (!wasOpen) - { - try - { - projectItem.Open(Constants.vsViewKindTextView); - } - catch (Exception) - { - // OK if file cannot be opened (ex: deleted from disk, non-text based type.) - } - } - - if (projectItem.Document != null) - { - Cleanup(projectItem.Document); - - // Close the document if it was opened for cleanup. - if (Settings.Default.Cleaning_AutoSaveAndCloseIfOpenedByCleanup && !wasOpen) - { - projectItem.Document.Close(vsSaveChanges.vsSaveChangesYes); - } - } - } - - /// - /// Attempts to run code cleanup on the specified document. - /// - /// The document for cleanup. - internal void Cleanup(Document document) - { - if (!_codeCleanupAvailabilityLogic.CanCleanupDocument(document, true)) return; - - // Make sure the document to be cleaned up is active, required for some commands like format document. - document.Activate(); - - // Check for designer windows being active, which should not proceed with cleanup as the code isn't truly active. - if (document.ActiveWindow.Caption.EndsWith(" [Design]")) - { - return; - } - - if (_package.ActiveDocument != document) - { - OutputWindowHelper.WarningWriteLine($"Activation was not completed before cleaning began for '{document.Name}'"); - } - - // Conditionally start cleanup with reorganization. - if (Settings.Default.Reorganizing_RunAtStartOfCleanup) - { - _codeReorganizationManager.Reorganize(document); - } - - new UndoTransactionHelper(_package, $"CodeMaid Cleanup for '{document.Name}'").Run( - delegate - { - var cleanupMethod = FindCodeCleanupMethod(document); - if (cleanupMethod != null) - { - OutputWindowHelper.DiagnosticWriteLine($"CodeCleanupManager.Cleanup started for '{document.FullName}'"); - _package.IDE.StatusBar.Text = $"CodeMaid is cleaning '{document.Name}'..."; - - // Perform the set of configured cleanups based on the language. - cleanupMethod(document); - - _package.IDE.StatusBar.Text = $"CodeMaid cleaned '{document.Name}'."; - OutputWindowHelper.DiagnosticWriteLine($"CodeCleanupManager.Cleanup completed for '{document.FullName}'"); - } - }); - } - - #endregion Internal Methods - - #region Private Language Methods - - /// - /// Finds a code cleanup method appropriate for the specified document, otherwise null. - /// - /// The document. - /// The code cleanup method, otherwise null. - private Action FindCodeCleanupMethod(Document document) - { - switch (document.GetCodeLanguage()) - { - case CodeLanguage.CSharp: - return RunCodeCleanupCSharp; - - case CodeLanguage.VisualBasic: - return RunCodeCleanupVB; - - case CodeLanguage.CPlusPlus: - case CodeLanguage.CSS: - case CodeLanguage.JavaScript: - case CodeLanguage.JSON: - case CodeLanguage.LESS: - case CodeLanguage.PHP: - case CodeLanguage.PowerShell: - case CodeLanguage.R: - case CodeLanguage.SCSS: - case CodeLanguage.TypeScript: - return RunCodeCleanupC; - - case CodeLanguage.HTML: - case CodeLanguage.XAML: - case CodeLanguage.XML: - return RunCodeCleanupMarkup; - - case CodeLanguage.FSharp: - //case CodeLanguage.VisualBasic: - case CodeLanguage.Unknown: - return RunCodeCleanupGeneric; - - default: - OutputWindowHelper.WarningWriteLine($"FindCodeCleanupMethod does not recognize document language '{document.Language}'"); - return null; - } - } - - /// - /// Attempts to run code cleanup on the specified CSharp document. - /// - /// The document for cleanup. - private void RunCodeCleanupCSharp(Document document) - { - var textDocument = document.GetTextDocument(); - - // Perform any actions that can modify the file code model first. - RunExternalFormatting(textDocument); - if (!document.IsExternal()) - { - _usingStatementCleanupLogic.RemoveAndSortUsingStatements(textDocument); - } - - // Interpret the document into a collection of elements. - var codeItems = _codeModelManager.RetrieveAllCodeItems(document); - - var regions = codeItems.OfType().ToList(); - var usingStatements = codeItems.OfType().ToList(); - var namespaces = codeItems.OfType().ToList(); - var classes = codeItems.OfType().ToList(); - var delegates = codeItems.OfType().ToList(); - var enumerations = codeItems.OfType().ToList(); - var events = codeItems.OfType().ToList(); - var fields = codeItems.OfType().ToList(); - var interfaces = codeItems.OfType().ToList(); - var methods = codeItems.OfType().ToList(); - var properties = codeItems.OfType().ToList(); - var structs = codeItems.OfType().ToList(); - - // Build up more complicated collections. - var usingStatementBlocks = CodeModelHelper.GetCodeItemBlocks(usingStatements).ToList(); - var usingStatementsThatStartBlocks = (from IEnumerable block in usingStatementBlocks select block.First()).ToList(); - var usingStatementsThatEndBlocks = (from IEnumerable block in usingStatementBlocks select block.Last()).ToList(); - - // Perform file header cleanup. - _fileHeaderLogic.UpdateFileHeader(textDocument); - - // Perform removal cleanup. - _removeRegionLogic.RemoveRegionsPerSettings(regions); - _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); - _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAfterAttributes(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAfterOpeningBrace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesBeforeClosingBrace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesBetweenChainedStatements(textDocument); - _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); - - // Perform insertion of blank line padding cleanup. - _insertBlankLinePaddingLogic.InsertPaddingBeforeRegionTags(regions); - _insertBlankLinePaddingLogic.InsertPaddingAfterRegionTags(regions); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeEndRegionTags(regions); - _insertBlankLinePaddingLogic.InsertPaddingAfterEndRegionTags(regions); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(usingStatementsThatStartBlocks); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(usingStatementsThatEndBlocks); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(namespaces); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(namespaces); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(classes); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(classes); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(delegates); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(delegates); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(enumerations); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(enumerations); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(events); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(events); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(fields); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(fields); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(interfaces); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(interfaces); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(methods); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(methods); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(properties); - _insertBlankLinePaddingLogic.InsertPaddingBetweenMultiLinePropertyAccessors(properties); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(properties); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(structs); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(structs); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCaseStatements(textDocument); - _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); - - // Perform insertion of explicit access modifier cleanup. - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnClasses(classes); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnDelegates(delegates); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEnumerations(enumerations); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEvents(events); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnFields(fields); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnInterfaces(interfaces); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnMethods(methods); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnProperties(properties); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnStructs(structs); - - // Perform insertion of whitespace cleanup. - _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); - - // Perform update cleanup. - _updateLogic.UpdateEndRegionDirectives(textDocument); - _updateLogic.UpdateEventAccessorsToBothBeSingleLineOrMultiLine(events); - _updateLogic.UpdatePropertyAccessorsToBothBeSingleLineOrMultiLine(properties); - _updateLogic.UpdateSingleLineMethods(methods); - - // Perform comment cleaning. - _commentFormatLogic.FormatComments(textDocument); - } - - /// - /// Attempts to run code cleanup on the specified VB.Net document. - /// - /// The document for cleanup. - private void RunCodeCleanupVB(Document document) - { - var textDocument = document.GetTextDocument(); - - // Perform any actions that can modify the file code model first. - RunExternalFormatting(textDocument); - if (!document.IsExternal()) - { - _usingStatementCleanupLogic.RemoveAndSortUsingStatements(textDocument); - } - - // Interpret the document into a collection of elements. - var codeItems = _codeModelManager.RetrieveAllCodeItems(document); - - var regions = codeItems.OfType().ToList(); - var usingStatements = codeItems.OfType().ToList(); - var namespaces = codeItems.OfType().ToList(); - var classes = codeItems.OfType().ToList(); - var delegates = codeItems.OfType().ToList(); - var enumerations = codeItems.OfType().ToList(); - var events = codeItems.OfType().ToList(); - var fields = codeItems.OfType().ToList(); - var interfaces = codeItems.OfType().ToList(); - var methods = codeItems.OfType().ToList(); - var properties = codeItems.OfType().ToList(); - var structs = codeItems.OfType().ToList(); - - // Build up more complicated collections. - var usingStatementBlocks = CodeModelHelper.GetCodeItemBlocks(usingStatements).ToList(); - var usingStatementsThatStartBlocks = (from IEnumerable block in usingStatementBlocks select block.First()).ToList(); - var usingStatementsThatEndBlocks = (from IEnumerable block in usingStatementBlocks select block.Last()).ToList(); - - // Perform file header cleanup. - _fileHeaderLogic.UpdateFileHeader(textDocument); - - // Perform removal cleanup. - _removeRegionLogic.RemoveRegionsPerSettings(regions); - _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); - _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAfterAttributes(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesBetweenChainedStatements(textDocument); - _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); - - // Perform insertion of blank line padding cleanup. - _insertBlankLinePaddingLogic.InsertPaddingBeforeRegionTags(regions); - _insertBlankLinePaddingLogic.InsertPaddingAfterRegionTags(regions); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeEndRegionTags(regions); - _insertBlankLinePaddingLogic.InsertPaddingAfterEndRegionTags(regions); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(usingStatementsThatStartBlocks); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(usingStatementsThatEndBlocks); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(namespaces); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(namespaces); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(classes); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(classes); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(delegates); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(delegates); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(enumerations); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(enumerations); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(events); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(events); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(fields); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(fields); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(interfaces); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(interfaces); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(methods); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(methods); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(properties); - _insertBlankLinePaddingLogic.InsertPaddingBetweenMultiLinePropertyAccessors(properties); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(properties); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(structs); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(structs); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCaseStatements(textDocument); - _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); - - // Perform insertion of explicit access modifier cleanup. - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnClasses(classes); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnDelegates(delegates); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEnumerations(enumerations); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEvents(events); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnFields(fields); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnInterfaces(interfaces); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnMethods(methods); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnProperties(properties); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnStructs(structs); - - // Perform insertion of whitespace cleanup. - _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); - - // Perform update cleanup. - _updateLogic.UpdateEndRegionDirectives(textDocument); - - // Perform comment cleaning. - _commentFormatLogic.FormatComments(textDocument); - } - - /// - /// Attempts to run code cleanup on the specified C/C++ document. - /// - /// The document for cleanup. - private void RunCodeCleanupC(Document document) - { - var textDocument = document.GetTextDocument(); - - RunExternalFormatting(textDocument); - - // Perform file header cleanup. - _fileHeaderLogic.UpdateFileHeader(textDocument); - - // Perform removal cleanup. - _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); - _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAfterOpeningBrace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesBeforeClosingBrace(textDocument); - _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); - - // Perform insertion of blank line padding cleanup. - _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); - - // Perform insertion of whitespace cleanup. - _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); - } - - /// - /// Attempts to run code cleanup on the specified markup document. - /// - /// The document for cleanup. - private void RunCodeCleanupMarkup(Document document) - { - var textDocument = document.GetTextDocument(); - - RunExternalFormatting(textDocument); - - // Perform file header cleanup. - _fileHeaderLogic.UpdateFileHeader(textDocument); - - // Perform removal cleanup. - _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); - _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesBeforeClosingTag(textDocument); - _removeWhitespaceLogic.RemoveBlankSpacesBeforeClosingAngleBracket(textDocument); - _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); - - // Perform insertion cleanup. - _insertWhitespaceLogic.InsertBlankSpaceBeforeSelfClosingAngleBracket(textDocument); - _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); - } - - /// - /// Attempts to run code cleanup on the specified generic document. - /// - /// The document for cleanup. - private void RunCodeCleanupGeneric(Document document) - { - var textDocument = document.GetTextDocument(); - - RunExternalFormatting(textDocument); - - // Perform file header cleanup. - _fileHeaderLogic.UpdateFileHeader(textDocument); - - // Perform removal cleanup. - _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); - _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); - _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); - - // Perform insertion cleanup. - _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); - } - - #endregion Private Language Methods - - #region Private Cleanup Methods - - /// - /// Runs external formatting tools (e.g. Visual Studio, JetBrains ReSharper, Telerik JustCode). - /// - /// The text document to cleanup. - private void RunExternalFormatting(TextDocument textDocument) - { - RunVisualStudioFormatDocument(textDocument); - RunJetBrainsReSharperCleanup(textDocument); - RunTelerikJustCodeCleanup(textDocument); - RunXAMLStylerCleanup(textDocument); - RunOtherCleanupCommands(textDocument); - } - - /// - /// Runs the Visual Studio built-in format document command. - /// - /// The text document to cleanup. - private void RunVisualStudioFormatDocument(TextDocument textDocument) - { - if (!Settings.Default.Cleaning_RunVisualStudioFormatDocumentCommand) return; - - _commandHelper.ExecuteCommand(textDocument, "Edit.FormatDocument"); - } - - /// - /// Runs the JetBrains ReSharper cleanup command. - /// - /// The text document to cleanup. - private void RunJetBrainsReSharperCleanup(TextDocument textDocument) - { - if (!Settings.Default.ThirdParty_UseJetBrainsReSharperCleanup) return; - - // This command changed to include the leading 'ReSharper.' in version 2016.1. - // Execute both commands for backwards compatibility. - _commandHelper.ExecuteCommand(textDocument, "ReSharper_SilentCleanupCode", "ReSharper.ReSharper_SilentCleanupCode"); - } - - /// - /// Runs the Telerik JustCode cleanup command. - /// - /// The text document to cleanup. - private void RunTelerikJustCodeCleanup(TextDocument textDocument) - { - if (!Settings.Default.ThirdParty_UseTelerikJustCodeCleanup) return; - - _commandHelper.ExecuteCommand(textDocument, "JustCode.JustCode_CleanCodeWithDefaultProfile"); - } - - /// - /// Runs the XAML Styler cleanup command. - /// - /// The text document to cleanup. - private void RunXAMLStylerCleanup(TextDocument textDocument) - { - if (!Settings.Default.ThirdParty_UseXAMLStylerCleanup) return; - - _commandHelper.ExecuteCommand(textDocument, "EditorContextMenus.XAMLEditor.BeautifyXaml", "EditorContextMenus.XAMLEditor.FormatXAML"); - } - - /// - /// Runs the other cleanup commands. - /// - /// The text document to cleanup. - private void RunOtherCleanupCommands(TextDocument textDocument) - { - if (!_otherCleaningCommands.Value.Any()) return; - - foreach (var commandName in _otherCleaningCommands.Value) - { - _commandHelper.ExecuteCommand(textDocument, commandName); - } - } - - #endregion Private Cleanup Methods - } + /// + /// A manager class for cleaning up code. + /// + /// + /// + /// Note: All POSIXRegEx text replacements search against '\n' but insert/replace with + /// Environment.NewLine. This handles line endings correctly. + /// + internal class CodeCleanupManager + { + #region Fields + + private readonly CodeMaidPackage _package; + + private readonly CodeModelManager _codeModelManager; + private readonly CodeReorganizationManager _codeReorganizationManager; + private readonly CommandHelper _commandHelper; + + private readonly CodeCleanupAvailabilityLogic _codeCleanupAvailabilityLogic; + private readonly CommentFormatLogic _commentFormatLogic; + private readonly InsertBlankLinePaddingLogic _insertBlankLinePaddingLogic; + private readonly InsertExplicitAccessModifierLogic _insertExplicitAccessModifierLogic; + private readonly InsertWhitespaceLogic _insertWhitespaceLogic; + private readonly FileHeaderLogic _fileHeaderLogic; + private readonly RemoveRegionLogic _removeRegionLogic; + private readonly RemoveWhitespaceLogic _removeWhitespaceLogic; + private readonly UpdateLogic _updateLogic; + private readonly UsingStatementCleanupLogic _usingStatementCleanupLogic; + + private readonly CachedSettingSet _otherCleaningCommands = + new CachedSettingSet(() => Settings.Default.ThirdParty_OtherCleaningCommandsExpression, + expression => + expression.Split(new[] { "||" }, StringSplitOptions.RemoveEmptyEntries) + .Select(x => x.Trim()) + .Where(y => !string.IsNullOrEmpty(y)) + .ToList()); + + #endregion Fields + + #region Constructors + + /// + /// The singleton instance of the class. + /// + private static CodeCleanupManager _instance; + + /// + /// Gets an instance of the class. + /// + /// The hosting package. + /// An instance of the class. + internal static CodeCleanupManager GetInstance(CodeMaidPackage package) + { + return _instance ?? (_instance = new CodeCleanupManager(package)); + } + + /// + /// Initializes a new instance of the class. + /// + /// The hosting package. + private CodeCleanupManager(CodeMaidPackage package) + { + _package = package; + + _codeModelManager = CodeModelManager.GetInstance(_package); + _codeReorganizationManager = CodeReorganizationManager.GetInstance(_package); + _commandHelper = CommandHelper.GetInstance(_package); + + _codeCleanupAvailabilityLogic = CodeCleanupAvailabilityLogic.GetInstance(_package); + _commentFormatLogic = CommentFormatLogic.GetInstance(_package); + _insertBlankLinePaddingLogic = InsertBlankLinePaddingLogic.GetInstance(_package); + _insertExplicitAccessModifierLogic = InsertExplicitAccessModifierLogic.GetInstance(); + _insertWhitespaceLogic = InsertWhitespaceLogic.GetInstance(_package); + _fileHeaderLogic = FileHeaderLogic.GetInstance(_package); + _removeRegionLogic = RemoveRegionLogic.GetInstance(_package); + _removeWhitespaceLogic = RemoveWhitespaceLogic.GetInstance(_package); + _updateLogic = UpdateLogic.GetInstance(_package); + _usingStatementCleanupLogic = UsingStatementCleanupLogic.GetInstance(_package); + } + + #endregion Constructors + + #region Internal Methods + + /// + /// Attempts to run code cleanup on the specified project item. + /// + /// The project item for cleanup. + internal void Cleanup(ProjectItem projectItem) + { + if (!_codeCleanupAvailabilityLogic.CanCleanupProjectItem(projectItem)) return; + + // Attempt to open the document if not already opened. + bool wasOpen = projectItem.IsOpen[Constants.vsViewKindTextView] || projectItem.IsOpen[Constants.vsViewKindCode]; + if (!wasOpen) + { + try + { + projectItem.Open(Constants.vsViewKindTextView); + } + catch (Exception) + { + // OK if file cannot be opened (ex: deleted from disk, non-text based type.) + } + } + + if (projectItem.Document != null) + { + Cleanup(projectItem.Document); + + // Close the document if it was opened for cleanup. + if (Settings.Default.Cleaning_AutoSaveAndCloseIfOpenedByCleanup && !wasOpen) + { + projectItem.Document.Close(vsSaveChanges.vsSaveChangesYes); + } + } + } + + /// + /// Attempts to run code cleanup on the specified document. + /// + /// The document for cleanup. + internal void Cleanup(Document document) + { + if (!_codeCleanupAvailabilityLogic.CanCleanupDocument(document, true)) return; + + // Make sure the document to be cleaned up is active, required for some commands like format document. + document.Activate(); + + // Check for designer windows being active, which should not proceed with cleanup as the code isn't truly active. + if (document.ActiveWindow.Caption.EndsWith(" [Design]")) + { + return; + } + + if (_package.ActiveDocument != document) + { + OutputWindowHelper.WarningWriteLine($"Activation was not completed before cleaning began for '{document.Name}'"); + } + + // Conditionally start cleanup with reorganization. + if (Settings.Default.Reorganizing_RunAtStartOfCleanup) + { + _codeReorganizationManager.Reorganize(document); + } + + new UndoTransactionHelper(_package, $"CodeMaid Cleanup for '{document.Name}'").Run( + delegate + { + var cleanupMethod = FindCodeCleanupMethod(document); + if (cleanupMethod != null) + { + OutputWindowHelper.DiagnosticWriteLine($"CodeCleanupManager.Cleanup started for '{document.FullName}'"); + _package.IDE.StatusBar.Text = $"CodeMaid is cleaning '{document.Name}'..."; + + // Perform the set of configured cleanups based on the language. + cleanupMethod(document); + + _package.IDE.StatusBar.Text = $"CodeMaid cleaned '{document.Name}'."; + OutputWindowHelper.DiagnosticWriteLine($"CodeCleanupManager.Cleanup completed for '{document.FullName}'"); + } + }); + } + + #endregion Internal Methods + + #region Private Language Methods + + /// + /// Finds a code cleanup method appropriate for the specified document, otherwise null. + /// + /// The document. + /// The code cleanup method, otherwise null. + private Action FindCodeCleanupMethod(Document document) + { + switch (document.GetCodeLanguage()) + { + case CodeLanguage.CSharp: + return RunCodeCleanupCSharp; + + case CodeLanguage.VisualBasic: + return RunCodeCleanupVB; + + case CodeLanguage.CPlusPlus: + case CodeLanguage.CSS: + case CodeLanguage.JavaScript: + case CodeLanguage.JSON: + case CodeLanguage.LESS: + case CodeLanguage.PHP: + case CodeLanguage.PowerShell: + case CodeLanguage.R: + case CodeLanguage.SCSS: + case CodeLanguage.TypeScript: + return RunCodeCleanupC; + + case CodeLanguage.HTML: + case CodeLanguage.XAML: + case CodeLanguage.XML: + return RunCodeCleanupMarkup; + + case CodeLanguage.FSharp: + //case CodeLanguage.VisualBasic: + case CodeLanguage.Unknown: + return RunCodeCleanupGeneric; + + default: + OutputWindowHelper.WarningWriteLine($"FindCodeCleanupMethod does not recognize document language '{document.Language}'"); + return null; + } + } + + /// + /// Attempts to run code cleanup on the specified CSharp document. + /// + /// The document for cleanup. + private void RunCodeCleanupCSharp(Document document) + { + var textDocument = document.GetTextDocument(); + + // Perform any actions that can modify the file code model first. + RunExternalFormatting(textDocument); + if (!document.IsExternal()) + { + _usingStatementCleanupLogic.RemoveAndSortUsingStatements(textDocument); + } + + // Interpret the document into a collection of elements. + var codeItems = _codeModelManager.RetrieveAllCodeItems(document); + + var regions = codeItems.OfType().ToList(); + var usingStatements = codeItems.OfType().ToList(); + var namespaces = codeItems.OfType().ToList(); + var classes = codeItems.OfType().ToList(); + var delegates = codeItems.OfType().ToList(); + var enumerations = codeItems.OfType().ToList(); + var events = codeItems.OfType().ToList(); + var fields = codeItems.OfType().ToList(); + var interfaces = codeItems.OfType().ToList(); + var methods = codeItems.OfType().ToList(); + var properties = codeItems.OfType().ToList(); + var structs = codeItems.OfType().ToList(); + + // Build up more complicated collections. + var usingStatementBlocks = CodeModelHelper.GetCodeItemBlocks(usingStatements).ToList(); + var usingStatementsThatStartBlocks = (from IEnumerable block in usingStatementBlocks select block.First()).ToList(); + var usingStatementsThatEndBlocks = (from IEnumerable block in usingStatementBlocks select block.Last()).ToList(); + + // Perform file header cleanup. + _fileHeaderLogic.UpdateFileHeader(textDocument); + + // Perform removal cleanup. + _removeRegionLogic.RemoveRegionsPerSettings(regions); + _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); + _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAfterAttributes(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAfterOpeningBrace(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesBeforeClosingBrace(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesBetweenChainedStatements(textDocument); + _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); + + // Perform insertion of blank line padding cleanup. + _insertBlankLinePaddingLogic.InsertPaddingBeforeRegionTags(regions); + _insertBlankLinePaddingLogic.InsertPaddingAfterRegionTags(regions); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeEndRegionTags(regions); + _insertBlankLinePaddingLogic.InsertPaddingAfterEndRegionTags(regions); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(usingStatementsThatStartBlocks); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(usingStatementsThatEndBlocks); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(namespaces); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(namespaces); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(classes); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(classes); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(delegates); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(delegates); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(enumerations); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(enumerations); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(events); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(events); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(fields); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(fields); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(interfaces); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(interfaces); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(methods); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(methods); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(properties); + _insertBlankLinePaddingLogic.InsertPaddingBetweenMultiLinePropertyAccessors(properties); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(properties); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(structs); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(structs); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCaseStatements(textDocument); + _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); + + // Perform insertion of explicit access modifier cleanup. + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnClasses(classes); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnDelegates(delegates); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEnumerations(enumerations); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEvents(events); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnFields(fields); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnInterfaces(interfaces); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnMethods(methods); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnProperties(properties); + _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnStructs(structs); + + // Perform insertion of whitespace cleanup. + _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); + + // Perform update cleanup. + _updateLogic.UpdateEndRegionDirectives(textDocument); + _updateLogic.UpdateEventAccessorsToBothBeSingleLineOrMultiLine(events); + _updateLogic.UpdatePropertyAccessorsToBothBeSingleLineOrMultiLine(properties); + _updateLogic.UpdateSingleLineMethods(methods); + + // Perform comment cleaning. + _commentFormatLogic.FormatComments(textDocument); + } + + /// + /// Attempts to run code cleanup on the specified VB.Net document. + /// + /// The document for cleanup. + private void RunCodeCleanupVB(Document document) + { + var textDocument = document.GetTextDocument(); + + // Perform any actions that can modify the file code model first. + RunExternalFormatting(textDocument); + if (!document.IsExternal()) + { + _usingStatementCleanupLogic.RemoveAndSortUsingStatements(textDocument); + } + + // Interpret the document into a collection of elements. + var codeItems = _codeModelManager.RetrieveAllCodeItems(document); + + var regions = codeItems.OfType().ToList(); + var usingStatements = codeItems.OfType().ToList(); + var namespaces = codeItems.OfType().ToList(); + var classes = codeItems.OfType().ToList(); + var delegates = codeItems.OfType().ToList(); + var enumerations = codeItems.OfType().ToList(); + var events = codeItems.OfType().ToList(); + var fields = codeItems.OfType().ToList(); + var interfaces = codeItems.OfType().ToList(); + var methods = codeItems.OfType().ToList(); + var properties = codeItems.OfType().ToList(); + var structs = codeItems.OfType().ToList(); + + // Build up more complicated collections. + var usingStatementBlocks = CodeModelHelper.GetCodeItemBlocks(usingStatements).ToList(); + var usingStatementsThatStartBlocks = (from IEnumerable block in usingStatementBlocks select block.First()).ToList(); + var usingStatementsThatEndBlocks = (from IEnumerable block in usingStatementBlocks select block.Last()).ToList(); + + // Perform file header cleanup. + _fileHeaderLogic.UpdateFileHeader(textDocument); + + // Perform removal cleanup. + _removeRegionLogic.RemoveRegionsPerSettings(regions); + _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); + _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAfterAttributes(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesBetweenChainedStatements(textDocument); + _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); + + // Perform insertion of blank line padding cleanup. + _insertBlankLinePaddingLogic.InsertPaddingBeforeRegionTags(regions); + _insertBlankLinePaddingLogic.InsertPaddingAfterRegionTags(regions); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeEndRegionTags(regions); + _insertBlankLinePaddingLogic.InsertPaddingAfterEndRegionTags(regions); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(usingStatementsThatStartBlocks); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(usingStatementsThatEndBlocks); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(namespaces); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(namespaces); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(classes); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(classes); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(delegates); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(delegates); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(enumerations); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(enumerations); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(events); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(events); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(fields); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(fields); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(interfaces); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(interfaces); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(methods); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(methods); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(properties); + _insertBlankLinePaddingLogic.InsertPaddingBetweenMultiLinePropertyAccessors(properties); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(properties); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(structs); + _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(structs); + + _insertBlankLinePaddingLogic.InsertPaddingBeforeCaseStatements(textDocument); + _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); + + // Perform insertion of whitespace cleanup. + _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); + + // Perform update cleanup. + _updateLogic.UpdateEndRegionDirectives(textDocument); + + // Perform comment cleaning. + _commentFormatLogic.FormatComments(textDocument); + } + + /// + /// Attempts to run code cleanup on the specified C/C++ document. + /// + /// The document for cleanup. + private void RunCodeCleanupC(Document document) + { + var textDocument = document.GetTextDocument(); + + RunExternalFormatting(textDocument); + + // Perform file header cleanup. + _fileHeaderLogic.UpdateFileHeader(textDocument); + + // Perform removal cleanup. + _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); + _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAfterOpeningBrace(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesBeforeClosingBrace(textDocument); + _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); + + // Perform insertion of blank line padding cleanup. + _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); + + // Perform insertion of whitespace cleanup. + _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); + } + + /// + /// Attempts to run code cleanup on the specified markup document. + /// + /// The document for cleanup. + private void RunCodeCleanupMarkup(Document document) + { + var textDocument = document.GetTextDocument(); + + RunExternalFormatting(textDocument); + + // Perform file header cleanup. + _fileHeaderLogic.UpdateFileHeader(textDocument); + + // Perform removal cleanup. + _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); + _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesBeforeClosingTag(textDocument); + _removeWhitespaceLogic.RemoveBlankSpacesBeforeClosingAngleBracket(textDocument); + _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); + + // Perform insertion cleanup. + _insertWhitespaceLogic.InsertBlankSpaceBeforeSelfClosingAngleBracket(textDocument); + _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); + } + + /// + /// Attempts to run code cleanup on the specified generic document. + /// + /// The document for cleanup. + private void RunCodeCleanupGeneric(Document document) + { + var textDocument = document.GetTextDocument(); + + RunExternalFormatting(textDocument); + + // Perform file header cleanup. + _fileHeaderLogic.UpdateFileHeader(textDocument); + + // Perform removal cleanup. + _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); + _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); + _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); + _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); + + // Perform insertion cleanup. + _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); + } + + #endregion Private Language Methods + + #region Private Cleanup Methods + + /// + /// Runs external formatting tools (e.g. Visual Studio, JetBrains ReSharper, Telerik JustCode). + /// + /// The text document to cleanup. + private void RunExternalFormatting(TextDocument textDocument) + { + RunVisualStudioFormatDocument(textDocument); + RunJetBrainsReSharperCleanup(textDocument); + RunTelerikJustCodeCleanup(textDocument); + RunXAMLStylerCleanup(textDocument); + RunOtherCleanupCommands(textDocument); + } + + /// + /// Runs the Visual Studio built-in format document command. + /// + /// The text document to cleanup. + private void RunVisualStudioFormatDocument(TextDocument textDocument) + { + if (!Settings.Default.Cleaning_RunVisualStudioFormatDocumentCommand) return; + + _commandHelper.ExecuteCommand(textDocument, "Edit.FormatDocument"); + } + + /// + /// Runs the JetBrains ReSharper cleanup command. + /// + /// The text document to cleanup. + private void RunJetBrainsReSharperCleanup(TextDocument textDocument) + { + if (!Settings.Default.ThirdParty_UseJetBrainsReSharperCleanup) return; + + // This command changed to include the leading 'ReSharper.' in version 2016.1. + // Execute both commands for backwards compatibility. + _commandHelper.ExecuteCommand(textDocument, "ReSharper_SilentCleanupCode", "ReSharper.ReSharper_SilentCleanupCode"); + } + + /// + /// Runs the Telerik JustCode cleanup command. + /// + /// The text document to cleanup. + private void RunTelerikJustCodeCleanup(TextDocument textDocument) + { + if (!Settings.Default.ThirdParty_UseTelerikJustCodeCleanup) return; + + _commandHelper.ExecuteCommand(textDocument, "JustCode.JustCode_CleanCodeWithDefaultProfile"); + } + + /// + /// Runs the XAML Styler cleanup command. + /// + /// The text document to cleanup. + private void RunXAMLStylerCleanup(TextDocument textDocument) + { + if (!Settings.Default.ThirdParty_UseXAMLStylerCleanup) return; + + _commandHelper.ExecuteCommand(textDocument, "EditorContextMenus.XAMLEditor.BeautifyXaml", "EditorContextMenus.XAMLEditor.FormatXAML"); + } + + /// + /// Runs the other cleanup commands. + /// + /// The text document to cleanup. + private void RunOtherCleanupCommands(TextDocument textDocument) + { + if (!_otherCleaningCommands.Value.Any()) return; + + foreach (var commandName in _otherCleaningCommands.Value) + { + _commandHelper.ExecuteCommand(textDocument, commandName); + } + } + + #endregion Private Cleanup Methods + } } \ No newline at end of file From e1e78c54ae8242fcfb03d4aab389acc641f5285b Mon Sep 17 00:00:00 2001 From: TheHUTMan Date: Sat, 6 May 2017 14:23:33 -0500 Subject: [PATCH 11/14] Removed code comments that aren't necessary, fixed previous checking bugs that got merged wrong (git problems) --- CodeMaid/Logic/Cleaning/CodeCleanupManager.cs | 606 ------------------ 1 file changed, 606 deletions(-) diff --git a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs index b634bfc6..439e7978 100644 --- a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs +++ b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs @@ -11,600 +11,6 @@ namespace SteveCadwallader.CodeMaid.Logic.Cleaning { -<<<<<<< HEAD - /// - /// A manager class for cleaning up code. - /// - /// - /// - /// Note: All POSIXRegEx text replacements search against '\n' but insert/replace with - /// Environment.NewLine. This handles line endings correctly. - /// - internal class CodeCleanupManager - { - #region Fields - - private readonly CodeMaidPackage _package; - - private readonly CodeModelManager _codeModelManager; - private readonly CodeReorganizationManager _codeReorganizationManager; - private readonly CommandHelper _commandHelper; - - private readonly CodeCleanupAvailabilityLogic _codeCleanupAvailabilityLogic; - private readonly CommentFormatLogic _commentFormatLogic; - private readonly InsertBlankLinePaddingLogic _insertBlankLinePaddingLogic; - private readonly InsertExplicitAccessModifierLogic _insertExplicitAccessModifierLogic; - private readonly InsertWhitespaceLogic _insertWhitespaceLogic; - private readonly FileHeaderLogic _fileHeaderLogic; - private readonly RemoveRegionLogic _removeRegionLogic; - private readonly RemoveWhitespaceLogic _removeWhitespaceLogic; - private readonly UpdateLogic _updateLogic; - private readonly UsingStatementCleanupLogic _usingStatementCleanupLogic; - - private readonly CachedSettingSet _otherCleaningCommands = - new CachedSettingSet(() => Settings.Default.ThirdParty_OtherCleaningCommandsExpression, - expression => - expression.Split(new[] { "||" }, StringSplitOptions.RemoveEmptyEntries) - .Select(x => x.Trim()) - .Where(y => !string.IsNullOrEmpty(y)) - .ToList()); - - #endregion Fields - - #region Constructors - - /// - /// The singleton instance of the class. - /// - private static CodeCleanupManager _instance; - - /// - /// Gets an instance of the class. - /// - /// The hosting package. - /// An instance of the class. - internal static CodeCleanupManager GetInstance(CodeMaidPackage package) - { - return _instance ?? (_instance = new CodeCleanupManager(package)); - } - - /// - /// Initializes a new instance of the class. - /// - /// The hosting package. - private CodeCleanupManager(CodeMaidPackage package) - { - _package = package; - - _codeModelManager = CodeModelManager.GetInstance(_package); - _codeReorganizationManager = CodeReorganizationManager.GetInstance(_package); - _commandHelper = CommandHelper.GetInstance(_package); - - _codeCleanupAvailabilityLogic = CodeCleanupAvailabilityLogic.GetInstance(_package); - _commentFormatLogic = CommentFormatLogic.GetInstance(_package); - _insertBlankLinePaddingLogic = InsertBlankLinePaddingLogic.GetInstance(_package); - _insertExplicitAccessModifierLogic = InsertExplicitAccessModifierLogic.GetInstance(); - _insertWhitespaceLogic = InsertWhitespaceLogic.GetInstance(_package); - _fileHeaderLogic = FileHeaderLogic.GetInstance(_package); - _removeRegionLogic = RemoveRegionLogic.GetInstance(_package); - _removeWhitespaceLogic = RemoveWhitespaceLogic.GetInstance(_package); - _updateLogic = UpdateLogic.GetInstance(_package); - _usingStatementCleanupLogic = UsingStatementCleanupLogic.GetInstance(_package); - } - - #endregion Constructors - - #region Internal Methods - - /// - /// Attempts to run code cleanup on the specified project item. - /// - /// The project item for cleanup. - internal void Cleanup(ProjectItem projectItem) - { - if (!_codeCleanupAvailabilityLogic.CanCleanupProjectItem(projectItem)) return; - - // Attempt to open the document if not already opened. - bool wasOpen = projectItem.IsOpen[Constants.vsViewKindTextView] || projectItem.IsOpen[Constants.vsViewKindCode]; - if (!wasOpen) - { - try - { - projectItem.Open(Constants.vsViewKindTextView); - } - catch (Exception) - { - // OK if file cannot be opened (ex: deleted from disk, non-text based type.) - } - } - - if (projectItem.Document != null) - { - Cleanup(projectItem.Document); - - // Close the document if it was opened for cleanup. - if (Settings.Default.Cleaning_AutoSaveAndCloseIfOpenedByCleanup && !wasOpen) - { - projectItem.Document.Close(vsSaveChanges.vsSaveChangesYes); - } - } - } - - /// - /// Attempts to run code cleanup on the specified document. - /// - /// The document for cleanup. - internal void Cleanup(Document document) - { - if (!_codeCleanupAvailabilityLogic.CanCleanupDocument(document, true)) return; - - // Make sure the document to be cleaned up is active, required for some commands like format document. - document.Activate(); - - // Check for designer windows being active, which should not proceed with cleanup as the code isn't truly active. - if (document.ActiveWindow.Caption.EndsWith(" [Design]")) - { - return; - } - - if (_package.ActiveDocument != document) - { - OutputWindowHelper.WarningWriteLine($"Activation was not completed before cleaning began for '{document.Name}'"); - } - - // Conditionally start cleanup with reorganization. - if (Settings.Default.Reorganizing_RunAtStartOfCleanup) - { - _codeReorganizationManager.Reorganize(document); - } - - new UndoTransactionHelper(_package, $"CodeMaid Cleanup for '{document.Name}'").Run( - delegate - { - var cleanupMethod = FindCodeCleanupMethod(document); - if (cleanupMethod != null) - { - OutputWindowHelper.DiagnosticWriteLine($"CodeCleanupManager.Cleanup started for '{document.FullName}'"); - _package.IDE.StatusBar.Text = $"CodeMaid is cleaning '{document.Name}'..."; - - // Perform the set of configured cleanups based on the language. - cleanupMethod(document); - - _package.IDE.StatusBar.Text = $"CodeMaid cleaned '{document.Name}'."; - OutputWindowHelper.DiagnosticWriteLine($"CodeCleanupManager.Cleanup completed for '{document.FullName}'"); - } - }); - } - - #endregion Internal Methods - - #region Private Language Methods - - /// - /// Finds a code cleanup method appropriate for the specified document, otherwise null. - /// - /// The document. - /// The code cleanup method, otherwise null. - private Action FindCodeCleanupMethod(Document document) - { - switch (document.GetCodeLanguage()) - { - case CodeLanguage.CSharp: - return RunCodeCleanupCSharp; - - case CodeLanguage.VisualBasic: - return RunCodeCleanupVB; - - case CodeLanguage.CPlusPlus: - case CodeLanguage.CSS: - case CodeLanguage.JavaScript: - case CodeLanguage.JSON: - case CodeLanguage.LESS: - case CodeLanguage.PHP: - case CodeLanguage.PowerShell: - case CodeLanguage.R: - case CodeLanguage.SCSS: - case CodeLanguage.TypeScript: - return RunCodeCleanupC; - - case CodeLanguage.HTML: - case CodeLanguage.XAML: - case CodeLanguage.XML: - return RunCodeCleanupMarkup; - - case CodeLanguage.FSharp: - //case CodeLanguage.VisualBasic: - case CodeLanguage.Unknown: - return RunCodeCleanupGeneric; - - default: - OutputWindowHelper.WarningWriteLine($"FindCodeCleanupMethod does not recognize document language '{document.Language}'"); - return null; - } - } - - /// - /// Attempts to run code cleanup on the specified CSharp document. - /// - /// The document for cleanup. - private void RunCodeCleanupCSharp(Document document) - { - var textDocument = document.GetTextDocument(); - - // Perform any actions that can modify the file code model first. - RunExternalFormatting(textDocument); - if (!document.IsExternal()) - { - _usingStatementCleanupLogic.RemoveAndSortUsingStatements(textDocument); - } - - // Interpret the document into a collection of elements. - var codeItems = _codeModelManager.RetrieveAllCodeItems(document); - - var regions = codeItems.OfType().ToList(); - var usingStatements = codeItems.OfType().ToList(); - var namespaces = codeItems.OfType().ToList(); - var classes = codeItems.OfType().ToList(); - var delegates = codeItems.OfType().ToList(); - var enumerations = codeItems.OfType().ToList(); - var events = codeItems.OfType().ToList(); - var fields = codeItems.OfType().ToList(); - var interfaces = codeItems.OfType().ToList(); - var methods = codeItems.OfType().ToList(); - var properties = codeItems.OfType().ToList(); - var structs = codeItems.OfType().ToList(); - - // Build up more complicated collections. - var usingStatementBlocks = CodeModelHelper.GetCodeItemBlocks(usingStatements).ToList(); - var usingStatementsThatStartBlocks = (from IEnumerable block in usingStatementBlocks select block.First()).ToList(); - var usingStatementsThatEndBlocks = (from IEnumerable block in usingStatementBlocks select block.Last()).ToList(); - - // Perform file header cleanup. - _fileHeaderLogic.UpdateFileHeader(textDocument); - - // Perform removal cleanup. - _removeRegionLogic.RemoveRegionsPerSettings(regions); - _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); - _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAfterAttributes(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAfterOpeningBrace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesBeforeClosingBrace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesBetweenChainedStatements(textDocument); - _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); - - // Perform insertion of blank line padding cleanup. - _insertBlankLinePaddingLogic.InsertPaddingBeforeRegionTags(regions); - _insertBlankLinePaddingLogic.InsertPaddingAfterRegionTags(regions); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeEndRegionTags(regions); - _insertBlankLinePaddingLogic.InsertPaddingAfterEndRegionTags(regions); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(usingStatementsThatStartBlocks); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(usingStatementsThatEndBlocks); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(namespaces); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(namespaces); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(classes); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(classes); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(delegates); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(delegates); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(enumerations); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(enumerations); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(events); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(events); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(fields); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(fields); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(interfaces); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(interfaces); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(methods); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(methods); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(properties); - _insertBlankLinePaddingLogic.InsertPaddingBetweenMultiLinePropertyAccessors(properties); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(properties); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(structs); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(structs); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCaseStatements(textDocument); - _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); - - // Perform insertion of explicit access modifier cleanup. - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnClasses(classes); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnDelegates(delegates); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEnumerations(enumerations); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEvents(events); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnFields(fields); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnInterfaces(interfaces); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnMethods(methods); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnProperties(properties); - _insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnStructs(structs); - - // Perform insertion of whitespace cleanup. - _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); - - // Perform update cleanup. - _updateLogic.UpdateEndRegionDirectives(textDocument); - _updateLogic.UpdateEventAccessorsToBothBeSingleLineOrMultiLine(events); - _updateLogic.UpdatePropertyAccessorsToBothBeSingleLineOrMultiLine(properties); - _updateLogic.UpdateSingleLineMethods(methods); - - // Perform comment cleaning. - _commentFormatLogic.FormatComments(textDocument); - } - - /// - /// Attempts to run code cleanup on the specified VB.Net document. - /// - /// The document for cleanup. - private void RunCodeCleanupVB(Document document) - { - var textDocument = document.GetTextDocument(); - - // Perform any actions that can modify the file code model first. - RunExternalFormatting(textDocument); - if (!document.IsExternal()) - { - _usingStatementCleanupLogic.RemoveAndSortUsingStatements(textDocument); - } - - // Interpret the document into a collection of elements. - var codeItems = _codeModelManager.RetrieveAllCodeItems(document); - - var regions = codeItems.OfType().ToList(); - var usingStatements = codeItems.OfType().ToList(); - var namespaces = codeItems.OfType().ToList(); - var classes = codeItems.OfType().ToList(); - var delegates = codeItems.OfType().ToList(); - var enumerations = codeItems.OfType().ToList(); - var events = codeItems.OfType().ToList(); - var fields = codeItems.OfType().ToList(); - var interfaces = codeItems.OfType().ToList(); - var methods = codeItems.OfType().ToList(); - var properties = codeItems.OfType().ToList(); - var structs = codeItems.OfType().ToList(); - - // Build up more complicated collections. - var usingStatementBlocks = CodeModelHelper.GetCodeItemBlocks(usingStatements).ToList(); - var usingStatementsThatStartBlocks = (from IEnumerable block in usingStatementBlocks select block.First()).ToList(); - var usingStatementsThatEndBlocks = (from IEnumerable block in usingStatementBlocks select block.Last()).ToList(); - - // Perform file header cleanup. - _fileHeaderLogic.UpdateFileHeader(textDocument); - - // Perform removal cleanup. - _removeRegionLogic.RemoveRegionsPerSettings(regions); - _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); - _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAfterAttributes(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesBetweenChainedStatements(textDocument); - _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); - - // Perform insertion of blank line padding cleanup. - _insertBlankLinePaddingLogic.InsertPaddingBeforeRegionTags(regions); - _insertBlankLinePaddingLogic.InsertPaddingAfterRegionTags(regions); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeEndRegionTags(regions); - _insertBlankLinePaddingLogic.InsertPaddingAfterEndRegionTags(regions); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(usingStatementsThatStartBlocks); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(usingStatementsThatEndBlocks); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(namespaces); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(namespaces); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(classes); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(classes); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(delegates); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(delegates); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(enumerations); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(enumerations); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(events); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(events); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(fields); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(fields); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(interfaces); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(interfaces); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(methods); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(methods); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(properties); - _insertBlankLinePaddingLogic.InsertPaddingBetweenMultiLinePropertyAccessors(properties); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(properties); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCodeElements(structs); - _insertBlankLinePaddingLogic.InsertPaddingAfterCodeElements(structs); - - _insertBlankLinePaddingLogic.InsertPaddingBeforeCaseStatements(textDocument); - _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); - - // Perform insertion of whitespace cleanup. - _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); - - // Perform update cleanup. - _updateLogic.UpdateEndRegionDirectives(textDocument); - - // Perform comment cleaning. - _commentFormatLogic.FormatComments(textDocument); - } - - /// - /// Attempts to run code cleanup on the specified C/C++ document. - /// - /// The document for cleanup. - private void RunCodeCleanupC(Document document) - { - var textDocument = document.GetTextDocument(); - - RunExternalFormatting(textDocument); - - // Perform file header cleanup. - _fileHeaderLogic.UpdateFileHeader(textDocument); - - // Perform removal cleanup. - _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); - _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAfterOpeningBrace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesBeforeClosingBrace(textDocument); - _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); - - // Perform insertion of blank line padding cleanup. - _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); - - // Perform insertion of whitespace cleanup. - _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); - } - - /// - /// Attempts to run code cleanup on the specified markup document. - /// - /// The document for cleanup. - private void RunCodeCleanupMarkup(Document document) - { - var textDocument = document.GetTextDocument(); - - RunExternalFormatting(textDocument); - - // Perform file header cleanup. - _fileHeaderLogic.UpdateFileHeader(textDocument); - - // Perform removal cleanup. - _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); - _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesBeforeClosingTag(textDocument); - _removeWhitespaceLogic.RemoveBlankSpacesBeforeClosingAngleBracket(textDocument); - _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); - - // Perform insertion cleanup. - _insertWhitespaceLogic.InsertBlankSpaceBeforeSelfClosingAngleBracket(textDocument); - _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); - } - - /// - /// Attempts to run code cleanup on the specified generic document. - /// - /// The document for cleanup. - private void RunCodeCleanupGeneric(Document document) - { - var textDocument = document.GetTextDocument(); - - RunExternalFormatting(textDocument); - - // Perform file header cleanup. - _fileHeaderLogic.UpdateFileHeader(textDocument); - - // Perform removal cleanup. - _removeWhitespaceLogic.RemoveEOLWhitespace(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtTop(textDocument); - _removeWhitespaceLogic.RemoveBlankLinesAtBottom(textDocument); - _removeWhitespaceLogic.RemoveEOFTrailingNewLine(textDocument); - _removeWhitespaceLogic.RemoveMultipleConsecutiveBlankLines(textDocument); - - // Perform insertion cleanup. - _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); - } - - #endregion Private Language Methods - - #region Private Cleanup Methods - - /// - /// Runs external formatting tools (e.g. Visual Studio, JetBrains ReSharper, Telerik JustCode). - /// - /// The text document to cleanup. - private void RunExternalFormatting(TextDocument textDocument) - { - RunVisualStudioFormatDocument(textDocument); - RunJetBrainsReSharperCleanup(textDocument); - RunTelerikJustCodeCleanup(textDocument); - RunXAMLStylerCleanup(textDocument); - RunOtherCleanupCommands(textDocument); - } - - /// - /// Runs the Visual Studio built-in format document command. - /// - /// The text document to cleanup. - private void RunVisualStudioFormatDocument(TextDocument textDocument) - { - if (!Settings.Default.Cleaning_RunVisualStudioFormatDocumentCommand) return; - - _commandHelper.ExecuteCommand(textDocument, "Edit.FormatDocument"); - } - - /// - /// Runs the JetBrains ReSharper cleanup command. - /// - /// The text document to cleanup. - private void RunJetBrainsReSharperCleanup(TextDocument textDocument) - { - if (!Settings.Default.ThirdParty_UseJetBrainsReSharperCleanup) return; - - // This command changed to include the leading 'ReSharper.' in version 2016.1. - // Execute both commands for backwards compatibility. - _commandHelper.ExecuteCommand(textDocument, "ReSharper_SilentCleanupCode", "ReSharper.ReSharper_SilentCleanupCode"); - } - - /// - /// Runs the Telerik JustCode cleanup command. - /// - /// The text document to cleanup. - private void RunTelerikJustCodeCleanup(TextDocument textDocument) - { - if (!Settings.Default.ThirdParty_UseTelerikJustCodeCleanup) return; - - _commandHelper.ExecuteCommand(textDocument, "JustCode.JustCode_CleanCodeWithDefaultProfile"); - } - - /// - /// Runs the XAML Styler cleanup command. - /// - /// The text document to cleanup. - private void RunXAMLStylerCleanup(TextDocument textDocument) - { - if (!Settings.Default.ThirdParty_UseXAMLStylerCleanup) return; - - _commandHelper.ExecuteCommand(textDocument, "EditorContextMenus.XAMLEditor.BeautifyXaml", "EditorContextMenus.XAMLEditor.FormatXAML"); - } - - /// - /// Runs the other cleanup commands. - /// - /// The text document to cleanup. - private void RunOtherCleanupCommands(TextDocument textDocument) - { - if (!_otherCleaningCommands.Value.Any()) return; - - foreach (var commandName in _otherCleaningCommands.Value) - { - _commandHelper.ExecuteCommand(textDocument, commandName); - } - } - - #endregion Private Cleanup Methods - } -======= /// /// A manager class for cleaning up code. /// @@ -1028,17 +434,6 @@ private void RunCodeCleanupVB(Document document) _insertBlankLinePaddingLogic.InsertPaddingBeforeCaseStatements(textDocument); _insertBlankLinePaddingLogic.InsertPaddingBeforeSingleLineComments(textDocument); - // Perform insertion of explicit access modifier cleanup. - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnClasses(classes); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnDelegates(delegates); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEnumerations(enumerations); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnEvents(events); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnFields(fields); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnInterfaces(interfaces); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnMethods(methods); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnProperties(properties); - //_insertExplicitAccessModifierLogic.InsertExplicitAccessModifiersOnStructs(structs); - // Perform insertion of whitespace cleanup. _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); @@ -1208,5 +603,4 @@ private void RunOtherCleanupCommands(TextDocument textDocument) #endregion Private Cleanup Methods } ->>>>>>> 93baa8419a1a377f7caaa6f91af3ccd85f0a03d1 } \ No newline at end of file From d3257fdc206860e50fc684ec1f03ffc67f7026c8 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sun, 7 May 2017 10:59:26 +0000 Subject: [PATCH 12/14] Remove UpdateEndRegionDirectives from VB, not supported. --- CodeMaid/Logic/Cleaning/CodeCleanupManager.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs index 439e7978..a036f048 100644 --- a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs +++ b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs @@ -212,7 +212,6 @@ private Action FindCodeCleanupMethod(Document document) return RunCodeCleanupMarkup; case CodeLanguage.FSharp: - //case CodeLanguage.VisualBasic: case CodeLanguage.Unknown: return RunCodeCleanupGeneric; @@ -437,9 +436,6 @@ private void RunCodeCleanupVB(Document document) // Perform insertion of whitespace cleanup. _insertWhitespaceLogic.InsertEOFTrailingNewLine(textDocument); - // Perform update cleanup. - _updateLogic.UpdateEndRegionDirectives(textDocument); - // Perform comment cleaning. _commentFormatLogic.FormatComments(textDocument); } From 490b2952e3c95c7d0f68312be4c9b63db105f476 Mon Sep 17 00:00:00 2001 From: Iouri Simernitski Date: Tue, 16 May 2017 10:37:02 -0700 Subject: [PATCH 13/14] Undo any special logic for not showing CodeMaid in FullScreen because it would not allow the window to be shown even when the user specifically requested it. Instead, just close the window when it shows up in FullScreen and VS will remember your preference next time you go full screen and won't bring up CodeMaid. This fixes #304 --- CodeMaid/CodeMaidPackage.cs | 42 +------------------------------------ 1 file changed, 1 insertion(+), 41 deletions(-) diff --git a/CodeMaid/CodeMaidPackage.cs b/CodeMaid/CodeMaidPackage.cs index dba550fb..72881ab4 100644 --- a/CodeMaid/CodeMaidPackage.cs +++ b/CodeMaid/CodeMaidPackage.cs @@ -44,7 +44,7 @@ namespace SteveCadwallader.CodeMaid [ProvideToolWindow(typeof(SpadeToolWindow), MultiInstances = false, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Left, Window = EnvDTE.Constants.vsWindowKindSolutionExplorer)] [ProvideToolWindowVisibility(typeof(SpadeToolWindow), "{F1536EF8-92EC-443C-9ED7-FDADF150DA82}")] [Guid(PackageGuids.GuidCodeMaidPackageString)] // Package unique GUID. - public sealed class CodeMaidPackage : Package, IVsInstalledProduct, IVsPackageDynamicToolOwner + public sealed class CodeMaidPackage : Package, IVsInstalledProduct { #region Fields @@ -307,46 +307,6 @@ public string GetResourceString(string resourceName) #endregion IVsInstalledProduct Members - #region IVsPackageDynamicToolOwner members - - /// - /// Allows the package to control whether the tool window should be shown or hidden. This - /// method is called by the shell when the user switches to a different window view or - /// context, for example Design, Debugging, Full Screen, etc. - /// - /// - /// If the method succeeds, it returns . If it fails, it returns an error code. - /// - /// [in] The GUID of the window. - /// [out] true to show the window, otherwise false. - public int QueryShowTool(ref Guid rguidPersistenceSlot, out int pfShowTool) - { - pfShowTool = 1; - - if (rguidPersistenceSlot == PackageGuids.GuidCodeMaidToolWindowSpade) - { - var monitorSelection = GetService(typeof(IVsMonitorSelection)) as IVsMonitorSelection; - if (monitorSelection != null) - { - var guidCmdUI = VSConstants.UICONTEXT_FullScreenMode; - uint dwCmdUICookie; - monitorSelection.GetCmdUIContextCookie(ref guidCmdUI, out dwCmdUICookie); - - int fActive; - monitorSelection.IsCmdUIContextActive(dwCmdUICookie, out fActive); - if (fActive == 1) - { - pfShowTool = 0; - } - } - } - - return VSConstants.S_OK; - } - - #endregion IVsPackageDynamicToolOwner members - #region Private Methods /// From c1d7d7ad21ecefe9bbaf23f135e78d61f4a58d4b Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 20 May 2017 11:42:17 +0000 Subject: [PATCH 14/14] Update to v10.4 label. --- CHANGELOG.md | 15 +++++++++++++-- CodeMaid/Integration/Images/about.png | Bin 50399 -> 50210 bytes CodeMaid/Integration/Images/about.xcf | Bin 109055 -> 109056 bytes CodeMaid/source.extension.cs | 2 +- CodeMaid/source.extension.vsixmanifest | 2 +- README.md | 2 +- appveyor.yml | 2 +- 7 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd7e1f30..b04acd44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,18 +1,29 @@ # Changelog -## vNext (10.4) +## vNext (10.5) These changes have not been released to the Visual Studio marketplace, but (if checked) are available in preview within the [CI build](http://vsixgallery.com/extension/4c82e17d-927e-42d2-8460-b473ac7df316/). - [x] Features - [x] Fixes - - [x] [#440](https://github.com/codecadwallader/codemaid/issues/440) - Cleaning: Exclude *.min.css and *.min.js files by default ## Previous Releases These are the changes to each version that has been released to the Visual Studio marketplace. +## 10.4 + +**2017-03-26** + +- [x] Features + - [x] [#444](https://github.com/codecadwallader/codemaid/pull/444) - Cleaning: VB now supports many of the same cleanups as C# - thanks [thehutman](https://github.com/thehutman)! + - [x] [#449](https://github.com/codecadwallader/codemaid/pull/449) - Undo a previous pull request for hiding Spade during full screen mode (inconsistent with other extensions) - thanks [iouri-s](https://github.com/iouri-s)! + +- [x] Fixes + - [x] [#333](https://github.com/codecadwallader/codemaid/issues/333) - Reorganizing: VB now moves attributes - thanks [thehutman](https://github.com/thehutman)! + - [x] [#440](https://github.com/codecadwallader/codemaid/issues/440) - Cleaning: Exclude *.min.css and *.min.js files by default + ## 10.3 **2017-03-26** diff --git a/CodeMaid/Integration/Images/about.png b/CodeMaid/Integration/Images/about.png index 127d831e2a31582050184560f00546d899de9618..921de4ec8d208e1a2610973c7860553d97a07967 100644 GIT binary patch literal 50210 zcmb5Vby!wi*FAdE-5t{1AOh0eEh5q(igb4)-L29kB@)uzh?I19cbC*}-Ou}c-|zkB zT<4t2EneKh-g~Vz*PLUFIaav3svHI?DJld4!BCKw)`URdY#|UBWMo9}38Psd3it=n zR7p-6@&x^p-BOqcK0&dUf9nK+py5IP!a%;J6N3+toE21LkX8}!(I{R9$hv^vq=G0& zOK7>z9b|a8t$yfC!Bd+Ya zSQ+XD20nkw__yye&olGnm6h@BGveZ~vEe2Dz3M1`&a#Po_(lG|pDdE$+Wy~f$h9B4 z4BQrF2&s_+ss6ck5by7npHebeH@p_As;Yho{@)+=ude3ZZP4px|F}un|KFdB&pPq1 zUX?TYDop*?eb{CaHVx`8v2tA@|MwmkB`ga6`+A+x|9K|#>#FSk+sASCwEy#x|NYbd zA3m0^$N8T(`0tnR!sKij;QZIl>J`%LiWW#E-p^&6tjL22T}AN1f?fRyPe=N`6lW~It4KNI<5S@VuJkg9o@eoZPzyGEi7kP;KpP_d~*T3y> z&7q>4MQ9Mv)(=~sR<1x6CiNg9hm9?xzpeM$vG10ai9baSJb77uB8-)+82sHV^fVMr zZnbJI#|-~Zki`8pjC=%Xm;#(Bx9uva;3&+aUkJD_MPYb+z)pSU--Og_dNp$zwmTggB@c}eFw3KrxKHN9h?f|bH%B)b z-Y!RUs(e#xB`dJ_sN&d=OgMN53qc?OI-zv0*(w}~dg-KXu{!w8vzM~?wwR%C51n^w zhh9g0d+BV}KVJuYAa36bOg1sz%&0fzUcZ?oy=T2fKZ<=85-J*Lg_||HWj+3*P>Wj(FsC}B~b(l;$-}nTWBt>QQyVYB6JZ=wtTxY>&`W!?$ zDXoNoRJufV9I0sF*&04~Ysnv<$GiWfn@ZkTOVEW8NQd;npdyeaqYpQIXA<-yPdgtr zQN6bx%;H5b$;o-A{Lju@b=?+FhqRvyxAVCk`yZBtY5UJX%Km`9A zO`Qq65OE01K$X1!d4+D-iU-95Eo~)NJ7q}F^14!Kg9jyhUnC3Gioi^gBDoXq%2>R} zFOI>U@(;rP9S?Vj4k%zEa?_*;xNOy{!|#-JQhI6{t!^HAYuwjYI5y5)>jj8boINA> zqDf7JgQk(9dj~g~vbBp>oCQ0$(6v~SH=^P#XpuY9EZ`s^CfQmnIhw`oRcsTMHP!sJ z#l-SynvV@F4sR74xsLbr?%TrA0`iUkQJ z3b^p2CGL1c?%o2WGzl~a)xJ;=w*ZLtv5d7Gxnl}x9N-26Bwwa{E!-23Kf)Og26DOVanL;5jnktM8 z$8OD#U!(bBjjlp72|D7<-JOy~{lqG5C6xdoB8-2zD=i0+Kq{Wmr1r`t=XBopwFq9M zeLS! zll{A@SDh*xb38xW`usKzq+fKwxfUK1m1u=+5H|}t(#SHRC(_smW?)*@=+2GH=7OOO zW7|2xFv?!`gmxIml}xFUa3eZBbY_2oJ$a2BZbxVrdVt|>elDy3B2A(BpE`(AcND4f zse98=qCj)C`^)p2p^l8A_rY88X`DKQFp$URw&)B|q!<#|`S=Vqy6h-?B@_zS(jOxE zxf9B@OACt9n3lScpT2V|xW{3@Yq70Zt%eanLgAXe4&EFRkr}%QSj30_XPI2=pxa(u z<8Aoz(O**fh^TzW7EK+5q|_tdEl(EC7kGnHI*Hn}=xdfpFwi+N5*sxmamtXjuKO);-kNVg z#1x-n>vLsBB_u{0mGfo#FU^USp9VrF6W@_QxZ(8NT>vJ@_9Wjmd(o?h0B>d0DXuAA$U2D+fiovS( zEKmtscX_(EDr^hioy9yt%Ujw|B!QeX5E2m)QSq)HHz_q$3ItN#sCeF}yvD~$Qd2!9 zfT*@GQ0umKOB!(MWb+&bI4rEKr7h%2*KL>SK)H<5sDvti;LM$~-l=GLr5w4b+Uy%FkEKRbjhR1H0arj)q1O7t6E*Jy{U} zT>nY&HM)y?Qc+_#{ESQg6k7FSEzMYk%D-ib1)b?Lt0!(}Wkf8i9ur)!d3d!}&wIs6{Bk$YP|3FxPdh zycPv8dlZo{GhPOhFc&9r{6jgw1~jY=XHEd|c8P%@p!ES3U*F0QiwY9k7aP)H>`#TP z74?Z~u6<+#3k3y5US8hfTqmf*UnPyNK_*zf-sOiqobSSMuLF6tE_=EvBe)P{WlT&T zUwRi-RJTs6#J>(6m&wLU(BCD1>i3lQjp8|6N zdRN@KBzA`X_^$M;S9l;atog{mJq2QDyPT`s@m?|XXxTY%Qg?CH3t2*lW2_8|&Jg-m zvx{N*nlgAWkg>pToSmH+^QH9@m#tU~E&oHJwm9abR~e9DIg*k)dulZt^^3cs{xHEK zAt|Y1B{MUIsXD(S$5g0(Nsd{s&vDYKc@>sMXva1nS*9&jItkq_*zoAlB>pDNs1`P& z8}9fo%b3dRX@-j7sWo+VBZvsuJ5Sg9`ia@?8}(4-Y9F{GeKez`;9-KRQNKAonLX*4 zfQmp&6v}+s1rd*^4OhjMz~+y2SK~paCE%de_~X)9W}d8;Vs64k%*D)wFQ!wXnNy!D@4}57YvZ=Xwc>r`+v@fpeq+^n^adc0e z7gmZ~BTdZO7?U9A-$xJG93RXF*m0!yj1@oUu6&|mf~5ao>(Xm_j1HntJ=sR0XeoP~ zq`b10+X^I#Z{2#@8DIpvCF6Nz7{MXDgt*x&TF0_W$n@{uqFq$l#a(|Sf(oJ^l4umL z4V?TEbedkQsSJ|G6)MkJ^F>8P1zdF!%;>Ue!mb=7YYKZl2<_WAnYg<0Eg4jHu3!Ir z&QoE(Dp|Meb2a;6rqMjIud)Ba*wckjWQ`Lnlm=|aJe5*@^3 zBvMAgfK%@4Z>#H%mbYk!Iu<@FlU>lE*Zlj5nu!S+gy!pGC<7jS6`Xd19h|0E5IFQ+ zDt|OgT{S>6xwFn54_-?zE&sNRy*kY3=x7R4mEq1{w1Ow27S9&|@SJQU zsx4KTv5JaPd=YXRQ*q6hE?fu&f8EBni)(mS>%Qp4H>}X}k22sEO|E8%`QT!G*9%6% zll2n$#_G_huM?jU9v#b(&6z>f=r80L3(8I6)BK+aWHf>7*V|I<6&01b&d=#$obRu5Q*JodqqIcu5vdoYY$~SG1J$@QR4k5m= zLcqpHEfRpKjMu=156A^T?}Bu7s;V>phWH&aWbX4Co2y>AnoV>>grvT{eiNziuJbo~MlprjV#WGgjm)<`$RNO zpYy^-@82`D&NUL;-rm}_Wo5(%AW?c(sH~=b`4XPUs46d}rm7;NsE7)o;^f5A<$Lur%LCs$9__oI_f1aUG1%caj*gBe z{k_o?(}^i5AyF@#ynP98UAlYv%!bon3b>rniQb<`)j5$w%L1Q{BZXeAuHvj?Zyl>8viuXjqgzK_C)jf={KHHuScr%%hK`P)nt7(V z<6SqM3df3wU3iw`ZGN zUz9(K`ZTJoew*Ge*vE-CdLtKSG*V&GMd!7>xw-l$N6Ot~lqTy6r+j@Q9Pii2fD~97 zQQfAg!=G=i6tl*;_-}#Xs zk`|&VrW{_r7MGHgi~}o0D;INvZwoM-gs$#aH3vAz)Ai#W#NY47+x1ZfC{HyeeqKkemH4#dg) z!a}ole;6>-+^HwgJ!gthRuAclyj+{x2m%V%nAli3Z*O5lEQ+Y*w#$?^rwnZ|Zg0M~ z?~WIW3>S>=#w8>K{`sTcTw#IJ8%w!-G%+A%_iB$2 zP*TR`Z@fzv^UGuiNXy>P#i&9(=Mp>R;6a3jxF@`X|5rfRnRFM!IRDb)+t7kk7b&38 z>_CoXINC@xUOeG8=q+&M$+7~%Rpe3aezBf#H_-9w!w0jYW{)!24e9qoUxUAYXG=;> zuGyap3=EvZ7cL90s|2llgazo=@k=pd)2fI#q_>S-uSNl^57ScC9?HOXdvVQ?%3Bu>9dw}?5wP4 zpx7-Om4tv)Dd6|$-SlZt>gR{$iVEFUQ-l;Y!>BU7T99%~!ApgOMM*EW`fwY!`)fyj zb!NEx`Ll8-m}t)D{!=)fhPt}F+zWv>%t;l38Gj6xYgf^l1`sgDFFBSPN?7aNYfwum zJ<}P~fZFW3|0yl2!=Eb{^+gokNeU4MauE_%XqQB=0vJPbph}Epv2;d{V@qrrmc}@(@^2x@dYJa^aJ$FjbJN;hGB{Hnf*^7JD@s5X@xBB6s?eEp0m(<;kCy#`n$Y6@B zGy-CcXZq||n5dvns?iALwRh;#SHVQWYLviFdecJ8XGwBpvO$lQ>>OvJ=~$U^7+pE{ zmM_3f=4r2;!pg9^t%$BG|9ra3^SRldl^h(0HE{h1Kjol-cbNl6a z-@l_bxgGZ&FMFa5q;ejgS=BjbqnewUtv}=MLr05k-;Jo^3!ZP-V3shgZ_~9=Cu7!yw2Ups|z`(e6#r3!s_;U7uQbVB^+DplZ8Msy5oRi9IvHwor~7s z`{x`+t>_?cMns?jBG+YE(`j4Rwd>ru=@_u>QM~#CU=rOj0NKTjjj8@#?uUY`@+ml& zT2QcYfIn~9vaqqancUpmJR!r<(vt2DAYEolDn6Pi3to_nkkQelot=3*J3If>*%?X8 z$pszC+};OLWmi|@7Zel}eg7`);K04Nw?{W`PY#sJg@d*2ZRiuaySu4`g~>HEG@j|Q z9~Zmg92%XqL1T+b+?WE#l-?nSJrg|wo3pv zbSA2ahJ(ATbzzBhmrRy64gdJ~v0h7S!uF0_$QAw7H|2)B`_zkilbP4{Fh4_LtS{>a zo6$b=6z#v#k4(AGQ5ki;Y+ItYOM^~(vpe3Ku4F}eAWPFczy-~BXciO}a@YbLRjr)Eo;VopB~ z8VDDM^F&}iPgc8d$jKMhk6@Y>V2YxmP%_5{0|&!^VEYmET7^yVBccIC%si4AHzAi*EeFKl26jhqu>lOjsZ%JAOq zz1?s$d82~B!orH7*oU-(esIrJWxR z>>p1nx0dO3^zn5R0Y1L*<=*74k&#fK zAIwymot7Fsp!)p1XfVHe>9U6pvQDU3UrbI(3F`ZwB;a>w4);rv}7OBVu8JRbJTQfe{*7zl$6x|j>lt0wsf*_w&2CQK!&OS zIVLYJFLXcl#ZvawE&E2!%;?b3)31WJ3g|H2ad7G$&67KQxL#fddP}|MB@5W*`BT)n z8DNmT8cM5MXh5wk91rj9l?8iqb)!G=SAV~Rx;l0U7G(^;fy(Iurzxn^8WrJBRcw)H zJ*gT)u=aoDDL)W@dQMu*vYdhMfQEu1q3Os2Mu-HFS5&o4#g2@P?K_AY=Y?HFUerme^jnIyD*fPX`}2SHHRaUvM;t3fIB zz0^C4gQov$TpPz#M2Lw*2l6I?g=sQqybL+XMWYIwbbY+9wp*TeJnV~k)&-p~I3!Fk zs~xNM;su%k=5LA75qDpDwT$UmY1Gz|zig2D!1D!kj-#J{7&g8>S|sMTB|mDtvyByb zCOopf=(gPR!=Q<-uomQd**u&Pu_y1;xsYv-gXK2LFJHb0IBtZcQQ^=^IXXDzUB%D$ zg1iB`Ct#QY_A3xvTwEwbQ%GcxD4ldIb?|$<_wc?utea``6NAR%&sk_2fGO@q-^a{lkM@u{$2ZLckc!i85~+8=9%LA>;dQ6#K$T z4N+X+f4l(Gf1B+#rpGh)&uS>`cgG5JYOP69*!4mRvwY{)>(kT8zw0*O0xT5%(rL@R zdC8iu%bG8*stOl8>DRzOkYV{X_P4bc1LddMuSc5SQjqc?_6;aioRq4atmS{)S!RT{ z43W?%LwQR3N%jB>d-|)Wn=A{>odWb|USTAD{>&7d0vh>8pRtA=$brBF(kUq^>7PG; zAgKev*RI|{cEPgkM<XEMym2ikFIX_2vFkHn#v&m>)3YLZ;(zrBdS zEFk`9MM8~}7vwm)s`97yzRtV@Rsy@-ft)x*!rq=MAu*BL>&hCac8Y$yg=$%tO^X~d zwm>hV0gXP_!#R%m=WYix+|~>AIE-qU(%`-u?;>k8Kz}wK*KRkC{gB4*Xn=36E!V(3 zQ%+nQ0?kKR_Zy7$`#6U!&4mo~~UoZQ`LWkJU&`?xd zd}>L1D>C&}{oEzXL&(rK_IF=AKo|fj9JM|9Du3ZAP}(NVwEOYds%{=cv3)@muG+m9 z-VYXmLks&vG`{nadnKg9JpW{)M8K42o z0BjTrJ5c@!b{Ce|S=dNY$Kc?g>zl%Kz`ldgi2mL`_4z$Iv3af{9E=P@3HRFC8a5u@ zx~m8P$Tve|b~jPKT{b+Wr@kBPpL>JAH1a-00CC4z!-(yJpEnv-xIJ<`3kyx&P%UZx z7?f+#+3MmUE8D}bf7{Z4aD5=uf-7B z3Xec>nr&TPWu?X(QSG5R=F$rzL~_wjWL;E&lg8J6_oUR**LlvHEKUF@@YybevFp`l z*VoUeeE-Nx${(s3MMa8^2oDcW#mkGIlaupj*Lkc`jBjd_?$okwesp329>7A-PnejV z&dbT^Fl&ps(WhVrV)Db^ODSDlQVRDK7*PIAroO)gge1X!8~{FKD?PQ3+ zaTw86SC7;BBvU@!6#c9ri1XXu*V@{-wY7whjOKOS!96~6v!d6_a#E>;#O=pcLqAI>9>X_v1XeEj$f`-NZy(nVA5 z@&9nM@r~S*$kNftqbX?FRIjgbUa!e$8MUxH9BE&vSSh@HOA-+oIZ9W0AYeUH!C}{Y zhz1q_;4{T(JVMe4YN=3H9XgPbF9=s%<*pqPh0YWUa9x|8(dPc8t>447Bt|?*;b=cE z!cG@ROpW~Lrm{D-m#{sY(dBjA5{k#D+73!o>7?RtzP<(M&j5&RywV;3q<3*;WptqB z<*#q%%5d;Vf6&Eu;7h{*mx_u?QBhGlme{?2XQ!loqce(X;W+ykRjh!1gCjzg-{VUl zibE?}Yr53Mv zpy`1CBOd>z(qwMd1d^2B!@g0a)3z!vAD<$PHaXrIQ<`>Z&q_xS_q$)%baZr7Y;5SH z(TIW>!|al?JdI4U-^;XF0f>P-Bm`39)%x5$)+E#!z#Gw zn0S9_2>Qq^;-lB5iv&Q|ylVgM{(R&#*6&^_qADD-fJwQ#Bo>HbePKAX0JDqV+}=`C zQLThLTk_wRL4;6IQ^WN4_gh$4h0Rd)qbF%uG+YFI~m9-#{EI2rr z;*JB*Er41?A8*X`TfIrZ{JY>?)#bj?2Rh!8-;hi5GJZ=4AUGMn zt+a*)&el-cwriVfhy|XW=w~ZS`|4su(KK5){{#t7cXTK+vWjQ;w~ZT$3Oo@iT(VS! zwe>GH{nO_Z0rYnET!mzApI)~;J+qqnE+HiqgijwYmk9JDF7w~``QN_L@bFX(L=XY; z)di9a;7-t@3IM&R_tV4mOskI&0AvM8JRVxI&Vk8_1si`{zFGX#VbiHJMX0r&g>70q zdQa(LsRwjE%~!ADlaf9GdR;WRr}{HeHc!IcT>y+bJ}%C`>9~~)N&#Y?2`#{JdG5Dw5=PF0m=gz)dfJk4TkQqqXxSA{e$Uc6Q; zI79~ypLeMMVA8O&V}LyXhzt@73(EqkH%K{Pi<;hD9fJDb@q9#>Ho5ZyvFzX0MoDZS zJgj5+-N0QP%+eaT4R}SFzeOkGLw8$rAxcO{zy@5k*bEs0d@JArRfEfMLq5NtU=?ig znHno1M<=J2qtc(V)<8G}wS%3IO^51`z2)sF!*Y|SpcqyG`gYUTd`Xy;b#9v-YoFy?a@$}&5h+=LTt0r~}i+75QxVS%lIIsqQtef~1BT}`N znEB(|FY0C5>#cW3O~s0lmzS4-(J(_-CT6{Pj!{5>7!)@5gUUXx_k+Zs7CV0=CFA&2Xa+JMie;mS zVL%-dIw=3s%pJW2Ev}eP^Rc7{eLhUN=ca#l)irb@yhD%#j)x<& zHK`4AI&Mt5gjDL;jatbmeJ*g)RSWSEfYzj`IA<0s5+X zU-87e7T7>2LH;>=u%-X|?rr$UYnDkBl)AY&-TNcAwys*6c{*yQ2wd)H=gvvEv=RCrlCUuQ?@d)>4QZ87Dl zlus*NpGCXmgQK(Loc&;9*=W+>063)F>}+wCN={Uq0?lv$m7wVg znuq|w0??fvg`d01>u2ZTSb>sGvpctHy1?q|8B1Q$!Oz@qY9g2TfZO}M`q;-G0owEc zx0+E^Zlp=FR`#Y7YL<*`+IL7gDbe6OoiRN|CF|9+h^x@rw65` z33$tz)#mTst(^8z_W8rW*?wUdGN;-)I$;j$y^GF~ zpB5JMo6ml;7L}AFz_;ngp+6JE2SizzLHV=&d`Ts6nRWN}LiK7U78Xebh49eq7NAoA z0*pgU90n?%(x@)CITtVQMM$uoxjDU|--8Qi6)vb$hsS~?hQ5g$z-=I}*m}M70?Pqf z9#Iq`x}Z48y}*2B;&UT>;`PFpQC?#-;?KZ!!-#h$twN;WJd-UTM_X zwca8gH=ko3xHhF(Kmjx=YG)*8Ygm6G!d%%F!V{fD=KuGBGntI69tT z6teNXc(J;fY6OtZ4>^2=!f_KYx|>Z-zwnMABsa7^K{`5kQ2y#&4@p7o+ooOu8C+dc z6E$60WYbydlzeVQ93R%_p!xugm1vfA0Qsor#Z+5ZcfJ z6>VNWPm4w4_3Pk}5JWJV#Xo_`0^6W(C?%HOQ9Fm4^#xJAH0}phZ*%eU{5xI4uu!PI zBJ2mAt=qlPd+R+ z$U^Jj`CUMrY`nB|ZS#FN=_RwHqM?BW!4EF*#vG|iC0cHI-k|e;b1|+~a4ZY7*1K8X z(?}yK5s?20C_Dm@cOSC64ivFI(6wAR zpcTc%!#iDY8gVH-TY_NY-~^-^`I3N5G3H)5Yd!W@SNf)0akt`ZFNWU}3)B$54j}mC zJ4IZL?m9!U4OngWE}T-m7ct*dGa?FiqjvelB`pLmz9}-cX-d4YVHlU59nkRza?rY(UabLgA(H;=v;RU4{dMfPgoBy26f9<_AZTN)`G=+qh ze69_E)kj9LJ1k$du*+#gBox$m*EHM*OigE`W5V)*P;yTmRJ>9aC0UoM}ag7#Y^ls>DvG z-UnnNO*-)-_fjnuOch&r$oRqF; z(`PQz_wUF2{QL{zJLS(@Fm}zSAsbYYs{DNp0OHToJJ9a!@6Y?Rg0N|RxS9uk$+6D_ z!8Y&S(ft!)Y;524=IKDqFK@Xb1$qlrIKRVS*slMX^L)(MpFjQttlIUn@=K&99f1e{ z=DmykS_-Y<{7ddqmZ+RDw3*uu083jhH8(77;~pzGnDo5kqaB&u5K%d6e8`HTL<#D! zA72J$QjmjylR~FH+$W(sEREQuNr(@o0~1r-lbc{9Z_p$F^avz#cH#sYz!ujo)1_~5 zQ|j|tYWAorbKJndVhHK@{`M!Za)ZUqcUIuuo5Hy}SZKgQ!X&r9Q%ni404#|94Il(7g2AUyC12x^q7 z`(M$+WS8_tS;20%Frk!ob6Ie)J2d0lAJ<(3BnQKb97LBIbSY1#-9QCcJ+5M>tWT1*yAZyzv$Wx z4s8u!+6NkZ3ZT!@>~StkQ^WsL4C*cfSS4PLQ=mpSS|SK>wX%<5e>B%@G*^aL(79-y z#=qY9tlaOR)L=XA&G@DV#kUa86ZCb1dTw-zX9CieKdB@5{yqEBc~~39Z>Pa8fo;DW zx4N^w(jvRKXMp+H(o*Qc5U2rJ-e=)@4NkzLm}1TipqcVl-r~NwN}$yNK~6JRwNgBM z)WX^=Z{?Yg>k6P`wgoFPCOmda!te+PmpXSqC277GQ!*y*RRO(kq_m-s@87@kjl=_o z3g|<6MNI;3Cw%scR%Gl;rkJ0oshOEc-8_9-7;_>&&64Z!QuNuGBi3qf6`Swh@hn%* z^K(5FfCmZLb?GjR5@YiK#;IwTR;ey!T7qOZ|CsX9t=9~HY{nh$dm%Spw95A%$8po) zui&)Lo`?_)AKJKlUI_cZDH<#}gp^Gs;rRpwu(AXJgi(js1x)^I18X^<6nmp&j}H$I z+#rUETLM4xcmQrxC!~0_TbSjk^;fG{i&(_dIX05P!)&5R1EhD*Buk=EUK1?>f{Nt--- zypz9vjR08=i2w3t@==Y?M7`^WrUzcpdt}PVm<3(Ky``r>kCk}0+&TtJ^ctA)|6>8g z;69XF5>nJJ_&|)v9M7%p*j%mfB!|XgTr&^W5MW6=-;Zd0j=$ol|9S1Y%>mA~sA)ql zjE^5bLK&|wkUY%xCW;R|Z6qXMR5JuO;}L&Vu>k|Zq*ckx!&z$EC(yDT-*r~P;QgWu z?IDazXNdVxKsOq3DGUq@|3Z3W6Bn2)(8={Uh(9Q@XJujO1eimlqz80qpqN#JZ)j>> zay$?Lt^K^YPe2e*u2NSk5(hwT_=Y!aOg~XFQu%BMAP25YeGT~ZubsZBY^}_kPU>H4 zV}t}Uqx<20uYsHU+`2IzA0N&0=i^e<%*l!%=ho=)%^ooUQ5Fhkeb3XDR{$XC1!-r_ zz+w|LC_y5pxC)Pn=>-G!9MSOR^)bNVrX<>&j_n z34!Vive89_f?S?0C__nCTEF|^X4qQ!xdD*|YM1-W!P({jXkl5Vl@sOJkoN^#Yb3p6 zD(zZ%d;sTc2~Zvf9Pb%`XijlbpN5nORx8l3Cy6n=-B40UZkn zi9e=iG@O%we`oFi9L=h5J2s59!0qCaS5ZmUeB*^SUZ|FO1sega4A8zpkLl^(uOQgq z{L_5Ei6Urkj@25P@)YEM1?$Oq!eom2%pHmnQs&7<@41-C7igONPGYw8QZ(Qo0!;+f zOySwB2ZqP}SH#cJ89qq^-|PsxOv3-n`#vG`7{kWhNH2V-hqgW*e9_z2p;vYN<2*fb zp!NWYe{3;t1l-(=s_FK4HEV9%mJ>yW*B*?@pCQmg2mBiO6B85A-XOVMrH;C~`UIcseInYsYqbW~e-BoB0uUXMhna=M^L)uc$1^fnOj7-vNo8AH(}ovoHU?ric$ zJ_lToJU)~04=!hpp9WG^msR8&;p_ALm@boccz@5vM} znw*@JC>&RCiVz6(zDYDU^P9<6?A6M!;QN_32eg5A4o`Zt}vr8^Y+}fHA z;6kCKw}13xx>APHe6)KqgzPAwd-U*NBCT~EWYhIU0#*nFZ0Z)*9L0@NGo(|>`L>Ij zhd}B)E*>7zQy*GxQCExd`vcJL)8X=Ky*Mw8B%&1&S=?^91-6*6kr9z6Vc<_&cO7hW z*{?8p@PrKM8Gz6G8$LrHqId>{O1Tg3V6enf`;f^o1u;EZCWw0wt-+Ef`4&VbAH2Tw-nXpb0SgN z2X*r-+bqY>E2ThkDU9!h*1dBjV$@U>!x46D@BBVH%}Zmip!3B&aG=RhJjn0D+g6#4o@cdn4X-1%yMT8)(KEK?V- z?DN>c%RqYeK2GS$B28(d=?|wZ5UhC)QITUKE(NnR=#vAWp$g51>gwB#Duta z&mI-C-J|6Nq;GY3Q^tMRGFZE`WqrFS9FLJkRMb#+kq@+p>+G`V41wz#7Aj%_tY`PP z1vvJUM)dSF+TPmomH^`|bHSVNPPs>@jW8aFK2QTQXypmGw&)&}B(sjT`90YZ$uuV~ zvyV1(hkjbkp}T%ee=C;WS=fhVY^6Y5n}WXb_|2AhOq%1H+#w@kBefxvoD*l1Hdj|&F6KQym1~@XQ6x46KN~P$iVQQc^nGG zqZ5n*ht7aKfHJf-G#sY=G#3fEMXB8l7n!p%D*Ky zUl1hXzB<;K({k5n7EYQvsvC(j-~C)!I|(X9IeyrGUc#^&4D>^&xzuXvNARcx{2%h1 z-Kd>GJg4nW3tn)og*P}gZTwvZIh?uV8jx*ynjh>S=|hdQg%*i;1O&lQM$5sW>d5n^ z+|WnPuTFY8kc``vqk8$>Px=BFYg=oUR4+jCA+6k!`1YC0En` z@d7wiT8>~IR7}I3A=a=EFj)OHwy-7#G;+eyrHRJ&YzOA0#8QUB?FcvuPTqGpH*&!G zb;HKm{imAM_6`Q$$KxeF9B`DgK$E#ZECR^a#gI7n;iZbYp?PvzBJ;9KHT>XACgVd_ zAqMoAKE_Zb^*k-u>0_a#p4F}hZ)CEmwbbW+ffd-aD%ytK{p07`N9eB zi084k>a9(kI`26j47T|{d{e~NAwAW&;$TaE^uKsQD->I~a*}%)=SK15wfDz{B=yY4 zcGB>#tD&_VFS{70ny0AAnlvdF-GXO~julBi6AN?iR?yw4iUJJBiS`LO)=A*bsW>}C zEjDdO+op`2IOKF!{_?%Un4xz;r04wcq#o#sTr-Oc+iFv4%+`*rdXm2XIV;s%M->LY5d*t0d+DEj{rLGf2ETVt-b1lXIOonp(GWjLx*ba6ojdG zeyk&XtCvq$SQwN+NV4=aYnXOMV+r821F(OWRvWzob5izga&vQ2qI`O}HmL*fG8*QW zBuc3q2oT|mm7v36+Z)?E*WFv-W0fi#uetpSY?gHNj7rRjz!q`Dos1=Pwy0aCos^P7 z18gMYJq91r!Rb3-{GbH};{9ue)=+t1J%Bjx_<&ObK-LhxdbLQ{CYjfRR{XrePsvI5 zI1TA~CH}M+83Xy?)M*%059`G$1pjO2J9Xg8N950qd4^)&SL4^n(tQXY$L+YcWK3=gUpMtFrf@C7; zlanj1ROG=B#rnjmjgU+I&UTM_aV4{sEg&r;U2Sz*Qg{C6U{>?pR@33UNV*qTyTkdq z^#RUS`$!!TZ~}p1k`TJ>`-?&UsmrRo?MP$JYqR7v)CCB3KOsY6|8_(7_3-d;Z$BQR zx}!)L3j;X6Om+^eS#?&Fi@-&_I94uL#rPiJ+ywjiMsqaa3<4k`aGBj80?<3+XjwL+ z%1)KR-%3}J<|F)eOKdWzYisM=ABM?`8w-GEwkuY6P2;S&v`r7R$wx%*lpXVXj<5Lb znyGy<|26tZNJ!YW5gj&yQ;Lvw;3xwIl?thC+eonUye~%O5*`A!@TcV{Ji3QaIKf#$ zGBesO)=tmv^6{up;|>j%m2Poa>`iBYX9iGd9277tyF5unro{I(zS`o5eXYH52~H$#q;uH)~pBjn(FDJ9VexQ ztJRti;mc9IfCNCK6-HWQ#?Ri3@& zeOrZB7;(om@dH9tM!HPqSBD7k#xl}6Qjdv+Ju%`%w79c$ z_p=5&H*l_D%n3Mrz*;iz0VT2$sN($FNERGoZSVRMw6DW&bIp%=PxaG8A0}*)8-c-2 ziI6iT{TMicfDw`k7~w&G($GujwpmP%4d3P63w>KkhsP%G+p3M7G-ZbS-B`cw627bU zO(V7QB%w%C931d4fJtGX8{a-GLlHi)Y;FKPnjX{;^nf>u}J@E^8D+g zxVr0wviQWrAn4JGzT+M~jIxaNyc(<1lS{1`aGQXORzHJ=vBRd+YuLo|IxJCfGqXJ2 zT6V(7c{l$5*jST9mn(t!@^ad!31xbCQ~&ol(|ek2aI{S!jvYcbipYDM ze0P~?^I16G$4{yI{CmGhP`q54Om=$drAvZEn)SiF?I>dXv6I!?>}~+shF%aD-oty8 z`U6y1u2CHmlX10_w#1b-WNWswdwbr*RyCdXAfgk@u%JZhk@6F(1t25=n>jRQ?eXIml)21auCmxWaT&0080;2{_o7{E*8HvfT6^m@wP8#MGOdX(KW`zA}@ zv=Bbu4F{MQ7*F^|r$)bx0CTG=D;M37Io{n0PTZ$Tof+wW4pJ(vv(oUQkI)sY5Cv!; zqMi!0Mi$@;A3!kn;Q@krF(yopqO-?t3 zdcU#1>e`4I1qM`lx!>UE12{h9{%Q-`MyGAb4B`Lq^c~<>zU}`{va(n9-eg8L31x(c z$jB}udvD6#D2#it+pcO!#|P-`k<})*XXUGI?Bbm$gX z*DZ+2$WqYTDb)<$YB~(PC*=@*=A4w)&6+l)Y-WFxojoaSYSt<--AYb)_E*Gx;STBQ zoydifO*FJGqQcXEF3zrQRD7_`(bLD6T|HPMR2zKcFkDm>c~HNavHD5B;f-P4n>W>XkI6)s>uGXs}GjNk}7m0^BoM@bu}-%kH-84V)h@?Q(> z86(7M>W{nVuY2#D(sA)_4pgT6ykF)r^Kjr93iZao)pM1KihbPg0snT>l0fhf2(^WL(}xT04lS~*BrWaj7$gzFoNKi|u6uGjq5I$FBxiai!$>mm zWwWlYXXNloOlb}tyJ6MuvZ@-)v{C-K^Fgdq&x51KUjsz{Y;hXO-~j8F;cxl%S>HWh zIkbCm^lBNVsIKnr%>n;G4pmu1mPSe<7A0-l@*>Y8PYTb}LQ;OP;6an9$bGhbe{&$c zGiK}LYC*axU_HRv#=$zbJbS)9BQvpPIyTu=88rmZA<908hxF`%jfe zEKUg#Qy#iCxNp6gK2J$bW@2Hvic7)AihIq5!;(>uD=BtvGCgHibwMc_JFX)vX`5F- zc*B5bb2;b*w|$$Jm5G4YcSF|H*RLXl9~kc+C3zXP#HS}8mH4#g^z&uo8Z2bfRaDs3 z;|G4#Fp<2p&6{r!^r&@qn7B9TExDi)VZgv>59mI7(lxnUBCOtw*4fWlcS`QYNqjsh z`DSY4CWhBBa((GA7$;axm5g&Yr7S6)NIE$GQi+v>nPn!~su@g#6AG%JOI_*Y7$Q z-TJMBY3K1)=w1HEM8(8}sIo6AOv8`W*VjLd$@EUD7c5EyI4K@PJx@idWGF~mS$0?Y ziLpg-QMow{VfGs?LngL8Is(+D*ReI8-&(A#!C+X-wiv?)!GMdKkU-}T4pbJPiOGu(=4T^gIu_CDvciLa_6FSUvYRtnmtQl>`RGcR!bSDcn_cE)xf_L26hyDTCN}I zu1FTY_WNvH>a~KJlBfo&Xz$BdX{NN9RLR(x^i8Wt0KEp}M^_U_L^+Z~D!&zg=uWmI zaNq~lv2U}A)aw!5!Yuq8vdH=6c_5WAbai#%E`=*Ft9z&Cg@=a+e*Ac&bFcC-4}8)9 z{I0XyW&(lJeP*^ztMB7qEzcg+0!q{d5@)5MAhm~PW@Zz`gw!C=533gZ3;^y?lHgg8l4+P2)CgS~1rmJ`XvgAnTXzdVpaNtplFo64+ ze)5C7TFmW(OPcTD!j(a^#mSvUA1m4;HqCEhP5kKs*GG-~C_X=vTHckpcX#IF-N|f^ z^Q`j^JMq6~Usf;K(=pWb#;A3VMWJ>3nk$Zt=}8VF1D`g$ZyRb<)r@f}~sd9g@O_JPSBg0rive8qha z=^4y!5Z=KDOVaBG0}qFP;%fWzR2WT? z2~WOycc}lRG$B6KYE*nP!p}DE#^FF^EgB(VoDsz>tDUj&U+e{$av}zX9tapr%D^fU2f2_EVL$EVaR=P1o`GTZZPF4Y( z=@}?JSc}VYasqujjm+&Wd+2>w{mM5)894ETVE zOG--oPHF#oOE;dbe;lFF;ACAOf*K62GZirPoAPQUcP8pA{&oD}(;mO`?fi z&X9vu@nHAUXev8qY+ITMlI%m)ak}ZFpbqE&#JBjQq^0)&8k5@fVXCT(tY=vAzl?jj z-jDv4{(Cu#NtZ>n>YV|>x~uNDs|FHDdNZig5?@-4WYoHz+(b5Q%`YYKHkLt}wSYIg z=HC%&pyzVhz~BfzAG8&b|2+Cltw_OEffY;#Oz0ARxYX(C3A&oGKkWF6=rx}K{6B9>_N5HWIoqi6^W zN~kdxriOu-K}%rkdz0!o#~jpn3>RyL+fdip+(-`FzS`O-6zv~;3JJ3GnOXEU^( zW63ck$+IVugs2o4sY9p=5BbrVk;A5T{`Ls#UlEY+?`88hD70xJ4ZlB#@;TNTV`n!8@qzH@>kUb2?ZjJi-(dM_H7cmyiGmvh1-^J8C-S~Hu z`-gz$teifEtEgJy6`!)I54CUd$i;a?$m!|nVVgpdcGR;aLSRcu;?(nrsoCL3l}QE& z_;U90f}hF$qi(S`=L#X4{ZT@_ppA9(qJsdX(g%XL&L9oWU^&JxIrgv=8&s%u1*M)7 zO&xcnV=qQv*4>#;BRY3TQ*+4E_U_*0YyEm?s^fhxyx%;bV$C<(!? zmNClg%>~nqb>^QtE z+9YOX;)PYh5JPo+uU${6L>zko%I3wrF5k^wIbGvBC2E&%xwH!6k2YQJ=2Z9xmqpmA z#Am!)7&S2QF8BMpoFe9N$n$z^D7C)Iw`RIvdTT!7d(ySF$ws?$`L^OupQ6pP8~@<# z{GPZ;AlUz5U@e?C{~_0S$=mvj{L%>#=t3U{?HFZhv17Y|9as`4GU z<-lY*zN)}B{VaHN{zmd}JBmukGSR2Fpa2uRZ*i{VZ>0a!EkE$NMMDySelrcvxrP?L z;12*-KP)0+PQaFZ{-QDcVMJRvCr^xW2WwRME&Q&mY*T?dmN(}e#5pu(`}=tf43R`d~RGkiTP5P*8*&R=BP`gj*svMR^7|tJ$|u ze7_%jh|~rI<@cE5p^pu2cH>Y>Jby4ZtZN)HY-4B60h1JXu@oDnQ3fwkIv1H%e_a3f z@le>plz-)DNnd7@6Nvf! zqZyW_!ootAhrVDn7n`*ljT<9BR8%}_)G8WWBcdj0CB}uvtoa`XZmH>F2VWtJTH4K! z!8lteX_>K?7$1w=q36w3ezCqeLGbil;iT67bB` zVCb#@1g0SJcBl0rF7^DFh{_l$p@REdv7mKHz4e^j@B+*`XPh96xCsgfRi&^sTzudb$?1+xXqWN1)CW!ZB!QOj(FsK8MI>%}W_ zGAmv6WhR@8yN7>Rqs&2?YHx23*=ZWw$rdlV5B1&O70VmTf{Y(p8@`VuLX<2@lBlML|#$Dg$ChZ#ZyHByL4I@Lrs@E8O$N>!jAdl zp-tL&LQ>XdI==hoM#%KopN1wpmQx|}YHt-U7cQh4z+l(e(&W61vnpv&W#0}Dl_O|q z&%Dojmu8#OZ~Mm`snfG&+hvsH7$lz2-C>%4Rz;>e+j8i_QTFGIf5KPv*22u&?pYW8 z>?;A`57rXTbSE&u|%m|nJdC)i!CJrWcm`}cqogDa*!n>= z2I~5@E8T$Pi_ZGWGrJJh1^okAr#V=zgUglm++@L8;CXSfTBq>PQ;OcmYxz2o#00_& ziwgnG7^;2@Cy?bKLM>$2sl9*czJng2Rh0pO}1yVWN1*E9p4@mp`)COQ^Tpv zb=`5XCTGuXBEKSgo8%RUgJTa`#STGTt)8y^v|#V%*MW0Dr8GFny1pv6q&tbeE0Z)K zeF5+>@^%sTp0zdCs#ss9bW}1!fU5ryZ0rF2r3@y3$w5O;Px&Ex)9LFG{u`%gE=8`2k58~@eKRuuJoVT+4C=(FGaS86l~ql?Q!YEiq1U|6T^fo z!^c`fV`#)D1wXv9B_=eebM=_DjiwU9Oq=yn>^K20Njw;IdUz%a3Ja@z&I8W>>Uw&5 zHh=pTw5ZT$TpBpGa68L~V29tB05w)`O^S5Efq^K%nn-dJPjJb_cz?VxFbLuIKgXzA z*N?!EZ0%sTTNB)CkU1>PA?n>}nyn{D*2jmsRIj7o%@lc);@SmKwww|TDjIt&Q}|mi zIog<;{igV|rrzBLtLh#mb)UO;8oz-Wiz(^*ZaUk24J|Esn*~m%jj*MdE!MH;-aSL6 z0)L;{hJi1TNkR;L@2;qmLXLyo$aH9Rn&aJ%_q?8Bp#8&guNhI}OIa+23@1=K1AvCr zVAMx!K332op)3YP)2v_IO47A?@tBOc-rxl;fj zjrkLl5M6sS^c9GBQoy8H-WnH-15M{!4v7ACEx8?A1V8{VBl75dK{panv5Rf~`4iWn z;V(I&{3j^8j*Sk2j5b(?givEmeO_RN0EmcK@!72NY?*LZj4Za_WpNXK(B}S+T$|zY zSP|R|PS}`Qy0xGlLrl(y!{lpUJs8a9p$Y?rtq4x4XMI`t3=G)>5i|$?z=6fd&3pIV z@Koc{?Lf<`Eb}`XSV`Z9*zpt9hQ|7gSH51LDpRp&KwFhL!Z^+%VGBKpR~#*)!PDxa z6n+FzCZ?i_xP7tqfEKG;r{gm0??&Cbxk|{bgDZ391J`1PFpmhO+Z~?@SLh;@9z5Xa zY~S1gM7C)1=HH`(iHno1DrJjp_;+QNNA?6<=}jhgXq;_)iYGswZ1gtTQQ*s*{L%Un z=VICCY-__G+0{{*?av$;vibab$$|Ns8<(a2(jZMKwScWcdH2tsw#B&H+vU$aJ{2Ug z$h3AaENBVvKjnGZ;G1!?GUX%9h-y{{g}VcLXKV9hak24DW>z#4Vo`Up5{}ZCkqHBA zll3Xe()4Ue^KDm(ZbP$`lQ#~HEzxO0;(h!oQ>TKqbeJM9zUmh%w8w6FqKZ{sq2dLa zX%vUpw!CDlzP!=&UnM~MSGT$gE(k~tFm8tqQ&(;()x1ocJP8d|aZ6J;WX`Av2 zfxI`k{1KHK7=)xwmXZi#p14C(`{4FDD3`C>DWyLwYU@g1aRLbqL5(Fke{B>DugI@& zx;)?cH8rIgPJ@y|cBe96u0$?T4DR3zG+FG38T;}S7qDXJaUJ2`f*;njJ@UGHHqE9L zO_G^`_LK36$pKsAcm=acMlPPje8rm;;hR>}XT!5FNfX=-2*8VqaeF*wKHnNbNlp_5 zF?7s8du3&1d7AB8AU6BXANH_#JRMG)KN(fv$UYDF+|{L&s9$ciXJ#lCKu?^I0Ob;a zDaQ}DxvP6J#7PAO1&^&aM%>S8dyGqS23;&@Wjpu)ckY1Xk4d7bu)PUzl+R^<)G_T5 zoduFDiuA5Qxu;WIew>=lxV2qFnZu;tr}IMt+llgPg%2|2pbrMv9weHt)GsM6_Z|ea z9@b2nnB_*{Cc}| zpT5S)^wPKWv?{u~Qs;jL!M@HIyd4*CN=pB97fe;^^|>V?gPVjVg=*lG2Yr*UsHl9N z_153lev8x>XCv=)lx=;8qIRGBAWfC9mr5Ai=7wDv1oa_c50_(4N}$O5z(IsfL_-sW zflL0UTCnIV*oI532ia}MzhJ?|X*cy1HvpH2!|6$H1jIOEAy!osQLnkm;{1!KHdejd9rg=%kY3%bl*P?CJ$H_MVg$n`l@D(zC$rBMqJNs ze1c4Jh&sVO$rKxwqURp|D=mQu+sf?4VHJQ52vT9$uFpe$6$RQ=B)SEJ(V)7_^u5UW z1ttyX2RCOLXj1r|ywv%~))vg$%tVF*F#&jqcAebxBa&(8W0r!pqwJsq;z&}AKG~#F1aYDdQ*9sNL0jVoM0TH(8Wah&3 z8Aiy^0Y)$<$SQ*92YFVKgp>9X$&K*$LPd$H#h)ko2fpW(B+CjN8G86^YEIoYtoKYf zsM~5ahNhTf{TorqHmFb*6C6@+B&%ey8*g{}9kJ7QTsRZr?(b-8uxR|jma}>3a|@ga zRC$h;;36v5*B>5|kWEs*Pn)|f2c1I2s8LW<6fQ(ojIl2(F%r$eECA~JtDyP*kC?l& z^R_@?5fWMi89ZR8($LmM2g3uXPMJgS^h`I!eUBZHluYT&hpA2ih#00^O z(lj=XLm)=DeXUTk5Fzwg<%Fd$H4WOCfe z&I6WgB-hCK3=wOeJR?!gyLTAS1qWA`v3zWJ(Mj)v2b0hZolmmRges>$V|G9=@i_W+ zNV*h+t3lvX$N(VxL-q7#n&a}1>lspBBygkd0m2LsVbDg^tlFm6K>swjHL^K==pdBd zBcLbY>91F8^(FO}SwGyyzcghD7qRR#?L&~bCeml}m*v9;l{T`I>j{tc@-TCA z+KQ{NY2_DGhW-Z1nizwlo|bsR5go95{-%F7rKF@vp>8mHfJi(XTh_%zs5kp|9GHe7 zg9iNH*C7D_208Vr2jD1%yAlfc-yHbpV41yy5)vGfSPTQiujC-Xh_69o)m80;zgna0GLFg z1VD8n*Ct|n?GxYv+1U(G;lcoqDpXJfq3$kt3e0rsr%LVs0^4@Bkq%0y zlDhgm8=DVW0}i0>aYWLLAOi%b1y=m9ak*P&Wt2!c1OqiV*%Yx0#%a9hS^4;PUL5kFfRN8gAu3hrA!KoZjXemSJjADpL_>g3-S6YA z;-VrZn^X`%B7SR#*^W5oeT%zClKZ7K)!NjuaJn>RS9-`UOAaa?i&Ka z-U1+~WV7=_RmL>M(MkV^2wz@Vac;w;AJO*3iEP9!Zp45_zWkKjkc+qD^+938!qaNi z7eo%mHmo=*Q{HkoW3ku=GF3&5@&TAA!!|xz#V;HLF~E$0DF;0uAOHXWOsFaO1aT22 zdndlIE6hXQLN&~`fak|UGyt?p;1g+?o^I$o1e5^4VtKd(B>DrkX;9(aDb~pY7Eo*m zC*&pRJBt~Rw}Lz06f&K#2?*HLy&M=J3jkcyk0Gp>fI&u;*1kgq?F9-#Ibh$o&c2(t5M;1ri(L zMvVjLW@cu_>b-=Z4NOZ>RZASVy$A0Q=vgH7tgW-te0Qz|d{$O*wpzNnVTkg6p*>2> z_gKJwwh_Nr=Vuvi`k11kqB%g`c0;=m)dnqLm!Oc`9S|KJL$&!rSN9;L#i_wYo@EFWAj%SB<8R9OO;L%6S<4_R4 zH;mArcL2xI*hmlfGI+;3iw&xjs4bp6p@U4bbe~wiCc%nlaB+}FPzWu<W4C-%w zJ#S?tdsQu+Sn6hS>?>olzV6sQgx5UqD|GkO4e!5?+sp(Jw`pmq03^*^fuPCIaod%6 zQFiVzNc{ne+S|9xFlK<}_4xFZnUN876%#KoEDQ@gQFH6-I5md7%6&rAF;@2W_aIpV z7PBUd$KiUWrcCf>2o4H{J{ZFO1_&P%X*&<7P~GGr!d4QpE`VqcZ*y<~FFx35MnA>*ogsZfp+^4^JN-(lY^Krkq>r5Nz5HHVxP^ zwISUHHY+6e5PZ#QYWU#1G`*QNAvS0mrk|@ZS5%nQdc3!|V=$cw@7&0D?=BK40nuil z#$eOD9xA-&DFs|E(&QsSn=q@x5jAs*i$O5hSJ%~jgJgPOMgWz9Euc-$!P@!`a;YCa zfD!s7;Ga;~^GZugpVXCV9Rm)^KKp3kYswEuLl?(++kHMhFwiPaQIIB*7uf~I7!&}B zfTlOYz#vf${3OL|9=(^r!RSa63|knB`48!eDB6FWM!SWHV-*@n!gR_X4%FN9AJy;H7yRas1= z=j~mqWzoRJ$yuFBPZl~#AMj(XBLgL4v{FF z`ooFm;W07oFh@be&4aFMq{JpRY9MHU4GM0K=Htgo8ItV#-%2Xb^z*2JZK93|9U=qY zHp%zWDLd}o=v)oX@WHO_!j2(&Fp06UvzsB=4N{)Fe#+B-4i7uvfkIkognokjW&oqx z_MS0tpcaH-EL+?h|Jo*Fn~UeJpQZD0xgNG~_);!<8q7F`{#yDOKPw9 zOR~xyJVq=K4TLaWkhlN`&dA%EO9ns%p{AkH)Yc9LC5!Vz>L-SVj7i_Sq~8wPe6P2* zv3Uv34d}DZ%*cetm$J(4YipCStGx*ZYl&=bY13Q_HhP63&e*~Y&vHrwE(2_$TcBhn>;+_&u`pogCvxQsprwooGh5F|14|{Qcs2k2IN+VT|PrXH#`u~ zq^jrH)EKJId_BAWB@TFS6KI1VHCq8}PH_(tAe2X& z19;EDd}KCN?Q{&y5`eWBP%_ku>CU9amb#%%mX#%#GgM}dRhov=`xx6=z8OD?XOc(K zMj+McPqnDl13{~PMr2w?{QA&^IsH3!GNYL+IOyI12^Xv{=&#!NDi6Zw?1-_^;YrS* z)-@ZoOPx8wymg%HL507^e>n9l%m1e*o}mjvR`JKUOmfd2~@`*6SIhh=tQ zXiiRBPg;JAQziUDr?Mh~Qhf_^J@@tQXJ55^s6v8+5dQMT8uIe?P7Lo3YK7bl0snuVkjD$IJyfB3 zCSv{6G%%QCUyf0$9#gO2H7!-N9VZYu^MGSYU~MBIQSn-P8t&73R_350TsAZiepfOOu-r5tYR!Afw>7CfT%VQQW!lXU((p02yur2Ot7lGg-p z1Ssd=swz?FN4MWjq0lZr z@1r|}AIL$<8aRuIh=@?4qE%t;v5-9gtqBX5%OL>>X}6GR6GBgb$2sZ}i6-R-f)xTx zV2_5Y4kn5z`STG}V(s8J7uW1A`GcngL3#uPp`SlH#BEnVZ3%`20U!Zb^^gR!5~GGl zBrjP?N-@Qas%ib<-RE<51GVn#%Ax4_&Guk39 zMJ+9@x}p+LS0Jxf)#AzJf@|t{PIX4!xN2zr8#t~$0BUe2$n&L0@;>?^^fD1p>(f&t zBN&v`IS^3`$ukhLAOdT5a_Cc;?r~Zz^*yPVMdN1J5zwcDBo5xl{WeN^SBoCa>e|}Y z;o<9G*`$Q{Fr@mz=_lZ;fR8X~#>Mspu85$?<~L#5*GjAaMj^aBoIL_lmLP>;2qM(%fK6%zpJV(yvq}n7k_XvmO1v zt*G4)t1P_Qwp!vvD?c4Ce{g<`Q6C%i_e6^I7(K9Wl~i%dU!FMuIU5Js$MD$LP~hUh z(0wlt5_uV0S-PWu13G|9k9hM|fte|riwq|=(Zm=7>J9L`pf(|V*KP zu`YIYY(hX$J-xh`SXqPfwP7r}83(&99;Q6a!q1^^g6HR{ zp_{53cn~61r0s3IWtl$mL7P)h0VHehs06BJs|I+MSPD5A!sR$e%N*KMG_Wh-%W{{+IbKNXaghKFpSJ%e4b#C!&BqMoULt$C7B2Jc(QK5I- zT@Y9*n~I|+-JvmX*>6)Po-E{Pa7s+g7~#)+D}UcI^zCLsmE$`cE8A_?$*=F)JqgNt zWB&7d7aC8?hS2B28Bwx&PuXyKcmu}=5>ldwUZCf`xTBDo|5;36=-1mruYUJ&2%Nn* z9c_ZN@r4(eeE`6eg7NZ9E|y+rpks*drkU`(Q6mvePca(XR*UT&b#p|mr_5FG-`frM zyD?tGJ%$El*x-lDo|_~8^cME9lG_o}TJX?#VU8m$44nW#R_~l|jr})`dyhq}ZM=aR zc6qc0zqzOLZc~`;w)bA#iTV=hd^+{tWmFyKxunIGHX%~*IR#=+->v_M)y*&vRWNI2 zjJ>LmNr{8gi5xHi=`2_uRJ()=0)~`n1}_sj7h4_`wV9OBR^>i#>g}<)8x0KQAX2iLvuZm}g2- zQd(G-JPc<$R$0csVL8`i6evH`(D6b2@_8 zIdlJeC)#>WOqlIeFGYYhigJ4-YuQlFOCF7f$MkXdRXH4M@aOJAM{G5m(6xKw+qLYB ze(gzM?3*73SERG!?%%~&(o+Ff5%P*i*NUJawFA}y;gi%dF-ub=_uUx<(ukLq&oz#$ zAmS^>@m2l!NDan!L%N9z!*O041!%_Lr81TAU}CHo1^6zGLrQL<<#u&r3_QO57&G+6 z_$6s8705mCORg^4m_jkS1}b*;-9ZT$I5y@|^Lk7BVZy~CuZ0!g{SN#3OkGWaBqfyV ztG_IBERR`3!s;ZGTj0b0O|cXMKCT0U_VRr@n(h%mR#q=6!hfzj^Q z%re;-LuUto5n#1l4xikbf6jkXHBmoAor>Rry~Q zu%r1x3LeBew8O|K9`Nzgr#8@QK|&cmfTXaniCX~`V}v<(=w;t33nXa4c|GA#Q7mhg znUI!9V%eL~0$3hg93jfW|E9S>Y=s6Vn5a0RjD#K^9~-5Ijea&(ghQ%ed4Te!>qL*I z_y}Wh?rNYRpCZ^3p?4N|9~FCcaegQ1!MiGfjcuW18A2}atNfcY z-6wv^wAyh5R9h=y*yK+K4Qn%kDMEA$l0`K< zEU1YD`yoKUy}V!Z=2Bk!td$P41YrFItP+nwh88}|_@B$c{oo-5!~l9zP&h3BHi+=e zaKcj*XwFPvWN>}!Av;GYslrBr9?4p5dh6=%oRJ>0yAk(#yb2y_{2_bJ-q#w@YDmk) ztI()3__^W< zkXQ0|3nCl?hbVYxkhKUvMmwaVAZeHY)40E3P6e10X`BE!1y=ePv_XP?r>=mu=Jt3z z2k8r(@t2dIj}Cl`A}kDOq3Gz50RXwfNPZE*J|OWUr?-FNQj|ixD>gbB!ivEJE&#o( zgqjd7M2`Xl;t0$D!ZD4OJo$E?zabdLIQNUWn&;+<+YI0ng-vlD*v|ijCL;YN05~4i ze&BsUpd#q*02MWd@MI)a0y2_nGqc9CS7qu()Humn@AF*w)00{3o>P4{2nY`dLVt8y|X<*rN9ftF>>kJvrN z*7AS*9Ka#~rK~xC!AMj3n(s*@U@u`CBaq#Qbl8wy45N@ad4B%X#=W_EMa7P%vETw^B!Qjn1??N)-U z$vSH#$U{SGMal-5G7SK`rK6F2n+1Pe+qZp2{G34fYS#VcTCW?kE(uAMEke9ck zzj@BRssWU%|0J)YP$3GDrgsodb;Gruv}SZ7dKnw3mn`##li+0%=4`ueIfK6UuA z$+h$+9^5(cN(uC&gn&Yy@f)L1$3>VX3ZCWDdjLq2J$jVrvT4dciyO!QNgAq*?*fgJgR{B4E<_ z(`U~X4ja7~6aP;Our=uk@nt@*R)9m0<iI4ZkUCSv?>I=m`m7V(>p^0s;Gte@6kAqO2s!ai2RI{mx3^Xs7>BxXk&LP?wR! zT&83dgl2^UAtfJ8z2krRB=7s;9wSB66}43=>>lzP>qGe18(|_v#l?5w?6JtGNFoqY z!eI_fGE6PoXkDNxPe@J2V?~D;Cpg<6ZF=$4dP4`s zE))tDwvET-lMtQRm)&_y3k^wFTNlzjgA|=M+rmy(O_@7OC z99y;H;Kf8BX~R(TW%SF?ShOA@@;vvWGPeyK+nMrf4^*@85R(51oE(Cf$0m6M1YD?4 z@S!+j2c~DfI-_{a_m1loa=;TSfS(8rVQar#UXPDbkh+pj!ljnHSx6Msj+{LLiL-Fv z!wAbj2lN!CK#oJ5L_T2T=(`L!*9|fOK#gDj3;71V6eNP}IQ#O1!2(tZz|xxs6`4f*ba;;K?u&A`I^rMC8QTdW$>dDy@0LHWhyW621U zS?e6!>#~alJ=@3C(M0LJ9cPt6WX+#$h^L+np1NOVeIA|*nND}A%dNz3vB-u}cP_n3 zb}v|gQJS3|r7`?|dp9+9Sleu-mfvyz?~%{b?Z0g@aANH}Oc1`s!xD_s`DFE#QNU~8 z0_i%${Qp%?*VMrKK{Zb}G%XXAgX_%=#k~@wU9o%DrGT*k32OyB5CSz1C;TCB12GeL%y?k| zt=$avtpDM9sc~D*Ub?aXkp}En^$w+uMn(` zPh>ZL+8-SmNjw4xKJufX#)p%7L#GFecx}%eMFiQ%kii`5lHrnjD<*DBDO<)3C+_x) z;pp#)4kG$37!y z@&37ulKUR~`y#S<&Lo3z@UVk<>?fAKAFle!bhGi{g@vwXUah8@5{(eOB;A4P1-`G# zKU8Hh8FJ4P$Y^7qk`|a5YU6cSUL@I8t&F#0?;W=1Jh-Tv?i(w5+hQd1SjbCf!^7?& zOI5aH1SqubHR_m)CcmP}zT!d~YZO;9R#>$Qwmti#89)^FHaEvXmghjT@EVRJ0SwFp z^hR5Wa&R0wG;rXj2$G;7Bb#nx(OYWCSNsxTkk`J{zy75kEj(Db{X-0Ah?$t@r zxP=tlOwd<8KG-y?>#R9?C_?4%t@Wu=T*PX=Ni29*FMFT7T)R{Jz0ROF+rELE=jPv$ zY7PNmfmB*cpX_ln?Ij}Nir>2@FP`k4&bjTMF0Y65u4;h2)$OmhYr9NC$l*%zr_A|6`=u;_Jx>uo@`YTsCuA@?gF+2ZQX>gB1ovA`=z{PL#FAmsfNHh07@c{ z9ulPMmW_-S&>36rpM%E=kzsgYYLs8+nm?f1xQz||Fkb!MgNi0;ns48}MaW)7+0Itt z@9-MOW=eV_ioZ!oM{Es;KipxzLhKhO=RnFK@-yvMDJ-k47;PM^$mvr+dp0=x+s;Q@ zl1v(Rdzl(yh8|;>zz4KHKI@`>1!Y7pUh-r>NKoWTHBE7y=SQNRPf9vIi}?6>9bk$R zDS8Qp@+;*9^6UYBl?zu7w|eeB9>*2oE@=$%+Gs4LSzhOC7}6WflRlH;gkQV}s>rpV zS1((?ds;jl2EJF%ZnWZezlEUWD{|Jk1KAV(OLluu_Y;WrY;(7^>g&E(Tv*6hnd<25 z1QY{~f#}+vg@ziGd(o!fLdAPx;dp?%pu_+Gtf~^C`8XoudjnzG0Xe@lmYiu^vv_07 zh}rh&ub{RB((9~W&=;T(viKtYWiE)XfKo4g_mmLtu{Nl-LCeE2Y4B+7xDJHRU#A_NLzLhb^4yihdB!xAWGZ1Oet+|o6KIEXEwq-Q5&aN+Y!U$z>9hH&od!LM+<{MEN+#7?A3b?*ly)#aU;`oW@TeV z>yH~78^L##ac{x){SJ<@s{*9BM*_zWb2@&ex*~QgxQz_?!hlVMhIV2a`2&o3t`eEw z?8wG|g$x7>#^AQl3t1F^gD@vD**~eXMiu{R*2CLyz{bOCYmcJ1g7P`qZikRv6bk(3 zoiI5dd^QW0c+F_#)xhvBrC4EaU_+qNlz9(xBgs>6R4!%mn~58%6bpVkG8f{jwuR1@ z$?KTR6MJFDWdC3%)5(^JE`Oiv{^+_;+=a?aCq7PyXw-3qsFBlOx;ix4JUNy?A_^H-GAgK z2aH}_L&uDwdKMKzBD!Afo-P3P;=t=Z_!10gZxy|Hvrm zE5iV~J3z=37}eNG;d6q{2aqc$fQY05R4N2_%qO@ZN!vaXoQ)nT)Eukx9ApFE?S)qD z0wf~I^U911GgaO_L=Ox8&q?=OTui-dFo*B`*zw0g94TwV)6)bfIe9t9g(YRk&vUT} z%Sx4^0(Fa+`yWo^)Y^HcRYWZ)W39&FyBH%n;r8JvA4z@oDdmi$7g0c;c! zLLC`y?`NvGUA5PFoiOq7tBgM~TMh1gKlbV6N~}GG)=?om@8NW_H8J9AV$$E-qjuG| zz>5g_Y_RcmJj4J(sB&#ZMCi^lKs^b{gJJ=cj?b7#pD!0tD-h5PKFMC&>jxQx; z0kQSNO{*8+3mU}QQZVIPn_cO$v@JcWTAnRx=GWzSRGOSm*NqP-L?bmPWpqg>Uu)@L z3J$5U!)DZC8GCXz#^QAY4v|8P9uFSuXe^g=PzpW6^Z#mb4W1VX?GTHozyHC-M(og5 zIiq!OquE*5?9YAG#e8Ou%%czIV6K8KLY}>jLje35PRJYwdpr~$Py~fGHQfey0;E(4 z;iAxDQsN={26(CwDg|5&2HhZZs-h0KE9h$$8882Ww{qE3)B@N2Lc)m z(Y0n|J$HSPw?k4zo<#hF%XK5}Eo&t%J&b2|-Z-%;YV9CdZ_T+A1VVgfwDsMo&7U`|iuj%sO-}eq-5{adUSXgF>%UGfije2zEi(tvi`S zulx6kPlo1~SK<5A$L-wfADjH=wV*ZTd?CEA7reaIHKJrxnnLJrbc$sw;Zi<*;WQZ3 zD!|7>ofL}i5aYRAE=}Q(uHO(VGg<0L)hJaRCZEsKOwnU>k_T=3~P(Tu({t7W35 zKoRpQtixmJGD6EMi~>Y}_=5!C1+X@7RL&$_z;vyff(fhnfH8_5d?F%3lGBS$ADvl%BpI9bk?n^zgc=Yal zhQVVk@{p;d%=+@}4qzvX039j7kzYoh^B9HE2$+V5h5@kafD=>KUI{{RLtquKxtQ%Q zeW&yH0Bi%%u0QKeeSsWLSfuU#yc?h?MDPL?3K@TLbv`18crAh>#40KA8VWq8&EPMc zJU@do(NQSG8=T?ZFbhHSfWgKMp60d@}lFy?%Wk}3Lug_oIM7pXw` zJ;~(f^8n1aP8V-(fxDy4;W@4qcCv1H)Q{GE+`cf)G}5Uoe{Ffs>|KZN__!;-`jh~o zXX5YYKPfRVuf*st-l}^}q4@6H=c;sBoO+==q!pwqy%uVT{>~%k$|jxIuyro=3}}z* zKvhHHdUClw6A2E}%3f~Bb-Ixny<&lVul{w{{LrwMZ$B@96cM?8#34^5^z4t4^5Eno z4RUA&d{PK_00OyR)L&!>ihs>Hw#D$7NZ0?i&lcs^t+M~9=pNSpC)jqH@I~TG>HP=& zNiLALqOKh0I+9Ab;K{{#ibH>LSqa$3!w7Vo#(pM_cJ4X(;^Bcb`Co;m0+fgi0U#== zgKnXQfeTqsLWwq=;DfFO!d<|*lh-Hz?9PYpIUb&p*KYi{M^TP|-|%wUxGo?anR*02 zmxO}ieKQuV-mR4br;n9yBsj_Zs8{>46(MUH@#^r_TpZ4UI0>#RCpY)S41-^Mx!`TU zbh+_(i_afO1iY8yBXToHNc<1I_VOi3mHIW>11(U&ekVo69@FUL%<(zp<^2AL=t!VN zUwY;G3c~&%6f9L$yRDEvL1d+Uaj*Z=@LSo>Yt<_$QmR)x%G#{eHb9Pqyy%@4I^sp> z<3>Mx;UE*&=`*c(YdG2Ftf^R<7zR&D=fJ74}MNTncWX7n5ByxcWL*H6v<9y4wd zKAfklhEEIzU*10`XJ;2zc?5?LJ$jTp*p>dvO5xF?>(_@+q7#^?;fjjtx1%U_ zEM_Y?rqHfOj*qyNU%g5M1`m0G;xw}!WTe2I?RrYVqs!WbDKGr&)xjUfOw%g_#-A+5@msNNWtE$&k%omIqT~zeK){-%50Hp|>_S0;~wYT+^#p1^T0ZBPF$6#P~|R8+fIRil~)G z4o%tWPF?Nr@DsO7qG9{37+zCi>1-EYo{IeSst>dF>$*D!jmeQu^%B-Gn1YGqlpHq( z=bnX$!jU%L=4Br}B3W2W+fYN34kcA*=^mNDQTf5ARFhx50{Q5%>Grh|5F+KF{pjyB z{xU8uF5s8Az&%_J>_osMKuQqiwN){C>N91_7a>KILkoZg5g{f%SgOwIoUsyd#+3mBdh7y*Fz@zwauGwxJgT+)~|dp#Q^6xv+8p*lLXq?#UUN|`XnKCgz& z6dXS{^0}pF-Z5uGBJ!;OJ8z7`Z~11bZ~rnh!bgAfIyTm;-kWZ_#lgiD0cLC$VaDAD5S~_)X8voX3*%ya^37X9}tFq`~L9uEcX`L5iA+m^^C>vDl03$02||fHaY7I zyW;-e&jEfKvmQL&cSwB7?G7#)XgRPOLi8|%ap|)%)O-yM>jqr@ce9S>R$L{1xzYXn zQf)UN9E$O+VKz{Nwm|>Z$!9eNr3WOV`B24ogBbn=0-A=LWwyVP?(h(_(+9KJ;x3`! zV%mq3ZIA>EfA}sirz$WK{Z2Zxe$xTIpdP!b=?+ln_w~U6s=$NM9K7ZBZ_0*5n6F?0 z0&QX3oEDy)8ijye5;gS9QwLGHxWA5VL-Pi^AS26MaUu)kPkL4To|7*!g zLLw`B?=35ZWM(GWd+)u9$cm7JkiD|UZI8$%y6xM{-WehDIqu*1Ja7Ilo)>?w`p`YD z>pIWlJjQplN+S8NY^5-%+caiLzTBr2`wov5ymOUuVkPfMK3{X#q7q5;w-%bI`f8%g z$on8Lo-@U;CHkR{?{RNuLquDpCl47e#!015zhC4z?u~=TPre*VCh?e}Jv**KpJNeH zlsO3i1V4#G7hd z-81YO&gylQ9BQ7GnP35U*k-CW4u$}4p*i^m0JX5c(GJR+ZW;M3*_H&DS96PsvNJPZ zgPhsGuWQ`4{H_bDx!@kJO7Tg`>B*9;m3W(Aor(v<>%QiO@>!(iN& zMJLyqw*WumQ>0~Qw;k|Z8b8!!EzX_ggjOitb3cns!}HIVt6xlRDlO$nAI|M~fbK7N z47upWYtRSbONID3fxD8tL%4V}08mJRU(Iai+@KYrn>Uw zgnhRAzy0WWjeljUyq~Y{v4ypb)z7Y(^F;SEetf=KPAn}Vhq`B<+xOgYwoQ&o)YUcU z0i61#m73P>@7;!N7kI9ZT9JMNo6QbE2JkUJ1@S2|m_{xZw<{RE!2eZUJM+$x0GCYk zZ2ZCWSf#F40=|)CkiZE|T(;%WnV;Xmo0(lZc|}xTRUM9PKDH7g&XC7Bga4&G=GGE6 zR-POcBp<0IA$(X7L5+f!aQ!&F0Y^M5!K5hVO)#f%o%A@jI#o9#y<0tH%gC#X6;xwV zv5VBD+Fg^?S!l+l#!$C#u6e;Hz+busMEJtSFSdF*?%`uX}r{p~mTTfW8Es{@B1_hfI6U$EjhWF5o5H>Rd&Q3VcAQtZ5qWx3V z(fTnq=!^B2%>GTQqyZ{jvrHy~*SRCNQ^b5<$2Jw2d@BqmNlM|ku8rw9d^xEBKeTAw zBC-9A_hHG>Jo^TYK-Jr_pju4ZM2y- zJA^c>G81WvPv~I9!ew7!sh5tbA7^AdmJ9Xk1(TBM@u#|12}*H;mj2&dC~UTzQ) zoxJ|07tKzB8}mWrQ(Z8w>G3zG1AQh#Eo+Kp*9P_q(zL3AiEOOGLiKe#y(X6wF&&nK za(lsW^W}FEzQlG29lTonpYqoPkbF-yZfj^TH+e+6M^Y}dD&O46Yf6#7YwJ87;eawH ze3?;5M?l-=BEP&e#BCCl-2CxrhNDO_Q&<3OA~+A$y)q|NrO?5Qy2Vy9Sg?+q>Dc=u z-x-7;@iD=-9K9ZmgQHB`q)Fefb|3K#G-J^#49o|-!0za9u-L;s;YiW zOoX8pjn=BM6iE0J>nB9|HT4%HZErJLWIy6=$w0(01)*f-o=^~HDQb|TYF{5n1H4QC!N5$LAiEF~c6ACqVGo`R9``Ding;5X}V2h_$WhZttxu(J` zd!&%or?(_Qj<< ocmM%F{tpWvOdWMairT>#DM-F+mIoFI!x6 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 JfH^V<_#duIEH3~6 literal 50399 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 diff --git a/CodeMaid/Integration/Images/about.xcf b/CodeMaid/Integration/Images/about.xcf index 8bcd93d03a3879d5f942a6fbcbb32e4fa2e8aec1..c64e4c83205f674aafd3840bae20860f9a860880 100644 GIT binary patch delta 2133 zcmbW2U1%It7>3`oJ7;#Y$u8PRvf2Et8mx^?6r0f8l%^M@Z9)-+h|&_0-7yy_O-N?^ z19hrKDj1&la$LuCo^Oc3CyMDBENH`IxM83LWevr_h#5XKQt-6_14=iCvxKY*GztBLfhPFO z4RMtVWhAIZGL58!RxvaVllhG(8~hkD&JyrVjfOCCiB@tNBr;WrtgviY{W4e|c2K<> zxic(D%IYgLgmqy)Pan0EWJ`Y10I?AlQzC2%j%#95C%q|Si^_Um7`bdMQaTB(t8s~r z(WW#Hivv~Dn3QJ(NRb)7-)Y;UK|xlK?ut2#VxX^%Z7_BrJOawrWrW8#&p_>;C& zb0*1UUPL0HEjC)mS$Y+61ewlK|Bmf-o824vB|7{P7986d z>9w7(Tic-zHt42APuj|k+VdHtoD6*1@#f4{akSw5XlBJx%L~jb9rdlEIA^hu(qM5& zJhdvG@>6BSFIv($#~hdGkA(YHflw92eulDgLI7!2MB$*fAwtBB7v+|==C%xlIxs(2VN5!W=99;8T8w`~4 zKh?;s)Zeu&t@sbVB2B$9F1K=YMvg5B{)bxy-~X}P%Ieeg%l!Nr;kV3_`;R{*hDmt& zqWGBkTYS9XOoqgbcn~Gh#{=WySQuP^yqEd!%`2(@+HUzZhixoYNx8%Vy(x8msh0VC zi}0rN;_$oM#mcDby9M{np^gXtBQS!b_g2-mrmQUUZcZP*tt!6u$TQOMxj+TwbEx%N zQ_XG~{^tSQ*k;_$AG(G-P_#TG{`+7crujIFUnQGV_e%wb6>LW~j|O*TdMz{V;}}c1 zs}h8V`&-<9$dZ+78~6ZO9mpfded7^U({Q)SQlFe6V3n>ws{EgUI|b#prAUDK%k~J@ zK0}|^Uh|Rr3;)jeijM&*$%z4^Gf+prqE1skQ-6jb%Q2Zdf$L|0+;QqJpm810d=PaKn-?5 z4fjBea&A8h_2?O>C%=Vyj)$7wL_L6hHT^s%A5dI8xCr(70jM`$q%J_s(ur9n&)!2h d)C_fu`hhCZnHH*-Do|5TcVy-|GV1F?{{RRtK~w+$ delta 2205 zcmaJ?eTWog82`OHGrMzp>t0#WeRydpr&oStCtZPLLZWFF5*wI$?d}W3 z-g)@bXzfJwwTG1IE&8fM^%VE0_f^juYa$mZ|0>k4WxQPh7~6sPa)Erc9Tmg0kU-V2 z4674W(^8g!fMCQ*;Jjr<>0p{@Lpf@h1`Jd!Ghzm?5JzB{FrlnAD3c-TP?S&*Gci+u zChqt#sA&6S&svFb8meqvE4g@SR_P;h0T*e*)%SLMyfo+b*46G@aqsST@^dGPhwWvnnmb>1kQb7$p_#KaSC;X<8Qi$fDvLtIhAgXtv;a z8VXfUD;@Djm!}K)oPcc@>DRjd?liZR9`y=3?J-70ds#$K$$JH~a)YFK)v zvqrX@#7;M2E6vcXX>4EF^2|oNiaL73O19wX6q+Sbv(Vt>Zq#0wUVCgyvxX80@$~wB z_8*r@3M5VX<7Y&B<;5|Q6ANAZF*-G**Ku8k{FT;a9mjQCMpo`fHl0d4ju1>Jd#4a= zI4WIr8Av%Kko1Z{D*}46B3B6RbJ9YvTPIkcfC1SdHCqY+H%mY{{4`w%y>6cvWE%!m zN9avC4SL0kw(P|vy%LI?{}Uv^YbRojY;}Sg(WP3Z%hZ9SR9Hu(fZ}!bO*UuA;d^Z^ zK4`Zm$fvN9Nu>}e?y@^$Y%)hiibM7^za68A+`GU1DdfeMy)axGt;uWIdSYcua`Djt zA@A1V*Oy$t!9?kiW4m(;Vm0|X`;I1rzLp~yq3`p&&{q@sCJ)abeU)iHB!n%2f-TQW zxqCM^fP+f}Sp5#V{4tZ$lLhHIGj38nCj=%-LY9gMF%pT24AulZUi%MFwN3=bOBiXA z__6cj@q;s$2{7g2(+%X{DnXVHk-|&kOKlsK<4;+n@UD1B;gWAoZR~EgN#T9*PQLRI z^Y)j%KL5K6Ip*=0vQXjl^Q^0%bfPUeg?Pe+N1q%^BrL`Q!U)Zk#Ust)dB?2WtJ{Sx z<9=8myi2TGFwYOi-9)({vt*!>;&d=V-V@ESrsf1vYmZ*#yw-W%BOYD) zJ+AqN3f>0Zl*bY@tKR5Iy`c|1S)%5|t1yGiVMP}_tYD{slZEM{>^e?8v*Su0evFdY z5uFvSTm$8d!(pPc>#UQIPT;QP79ab>!eLr|xb(Q$k>qtZ?q}#Fv&zPt?7A>*<%mlJ z<=(gVMPT@-MBdsgp7T$NZYqhM`@QJ>Pcvir@_|z=lDYQrCE~XFgZ-^?R}XwPS&a5R zCizZ zfk~5~_8p^qNjXC~`)`}%d`8#_v>&4U0d&j)I){Mi-N3AcK=-wj4=E+!%Gs1O(Oxzk=F&66#4d zwPPX0#R|1!2Nwq@+#D!Dz5EQ+D@DpLP=jP*kj{gvDE#vc?xYM+zMz!JOebX#B}3V^ NZEkXCZc-iJ^B0WeS55!` diff --git a/CodeMaid/source.extension.cs b/CodeMaid/source.extension.cs index aca89bd2..b2640377 100644 --- a/CodeMaid/source.extension.cs +++ b/CodeMaid/source.extension.cs @@ -6,7 +6,7 @@ static class Vsix public const string Name = "CodeMaid"; public const string Description = "CodeMaid is an open source Visual Studio extension to cleanup and simplify our C#, C++, F#, VB, PHP, PowerShell, R, JSON, XAML, XML, ASP, HTML, CSS, LESS, SCSS, JavaScript and TypeScript coding."; public const string Language = "en-US"; - public const string Version = "10.3"; + public const string Version = "10.4"; public const string Author = "Steve Cadwallader"; public const string Tags = "build, code, c#, beautify, cleanup, cleaning, digging, reorganizing, formatting"; } diff --git a/CodeMaid/source.extension.vsixmanifest b/CodeMaid/source.extension.vsixmanifest index c8d0d937..a3ef1d74 100644 --- a/CodeMaid/source.extension.vsixmanifest +++ b/CodeMaid/source.extension.vsixmanifest @@ -1,7 +1,7 @@  - + CodeMaid CodeMaid is an open source Visual Studio extension to cleanup and simplify our C#, C++, F#, VB, PHP, PowerShell, R, JSON, XAML, XML, ASP, HTML, CSS, LESS, SCSS, JavaScript and TypeScript coding. http://www.codemaid.net/ diff --git a/README.md b/README.md index 34110b26..e976b058 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ - +
codemaid.net
For more details, please visit: http://www.codemaid.net

Currently supports VS2012, VS2013, VS2015 and VS2017.

For Visual Studio 2010, the last supported version is v0.8.1.

diff --git a/appveyor.yml b/appveyor.yml index a475c219..85db7a76 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 10.3.{build} +version: 10.4.{build} image: Visual Studio 2017 install:
codemaid.net