diff --git a/Rubberduck.CodeAnalysis/Inspections/Abstract/ImplicitSheetReferenceInspectionBase.cs b/Rubberduck.CodeAnalysis/Inspections/Abstract/ImplicitSheetReferenceInspectionBase.cs index e4fbe04a03..a87572a5cf 100644 --- a/Rubberduck.CodeAnalysis/Inspections/Abstract/ImplicitSheetReferenceInspectionBase.cs +++ b/Rubberduck.CodeAnalysis/Inspections/Abstract/ImplicitSheetReferenceInspectionBase.cs @@ -34,13 +34,13 @@ protected override IEnumerable ObjectionableDeclarations(Declaratio && declaration.AsTypeName == "Range"); } - private static readonly string[] GlobalObjectClassNames = + protected virtual string[] GlobalObjectClassNames => new[] { "Global", "_Global", "Worksheet", "_Worksheet" }; - private static readonly string[] TargetMemberNames = + protected virtual string[] TargetMemberNames => new[] { "Cells", "Range", "Columns", "Rows" }; diff --git a/Rubberduck.CodeAnalysis/Inspections/Concrete/ImplicitActiveSheetReferenceInspection.cs b/Rubberduck.CodeAnalysis/Inspections/Concrete/ImplicitActiveSheetReferenceInspection.cs index b7026a6ea7..9072ab0190 100644 --- a/Rubberduck.CodeAnalysis/Inspections/Concrete/ImplicitActiveSheetReferenceInspection.cs +++ b/Rubberduck.CodeAnalysis/Inspections/Concrete/ImplicitActiveSheetReferenceInspection.cs @@ -47,10 +47,13 @@ public ImplicitActiveSheetReferenceInspection(IDeclarationFinderProvider declara : base(declarationFinderProvider) {} + protected override string[] GlobalObjectClassNames => new[] { "Global", "_Global", }; + protected override bool IsResultReference(IdentifierReference reference, DeclarationFinder finder) { - return !(Declaration.GetModuleParent(reference.ParentNonScoping) is DocumentModuleDeclaration document) + var result = !(Declaration.GetModuleParent(reference.ParentNonScoping) is DocumentModuleDeclaration document) || !document.SupertypeNames.Contains("Worksheet"); + return result; } protected override string ResultDescription(IdentifierReference reference) diff --git a/Rubberduck.CodeAnalysis/Inspections/Concrete/SheetAccessedUsingStringInspection.cs b/Rubberduck.CodeAnalysis/Inspections/Concrete/SheetAccessedUsingStringInspection.cs index 59a3a97468..8e0c3fdbc6 100644 --- a/Rubberduck.CodeAnalysis/Inspections/Concrete/SheetAccessedUsingStringInspection.cs +++ b/Rubberduck.CodeAnalysis/Inspections/Concrete/SheetAccessedUsingStringInspection.cs @@ -3,6 +3,7 @@ using Rubberduck.CodeAnalysis.Inspections.Abstract; using Rubberduck.CodeAnalysis.Inspections.Attributes; using Rubberduck.Common; +using Rubberduck.Parsing; using Rubberduck.Parsing.Grammar; using Rubberduck.Parsing.Symbols; using Rubberduck.Parsing.VBA; @@ -59,41 +60,104 @@ public SheetAccessedUsingStringInspection(IDeclarationFinderProvider declaration _projectsProvider = projectsProvider; } - private static readonly string[] InterestingMembers = + /// + /// We're interested in both explicitly and implicitly bound retrievals from a Sheets collection. + /// + private static readonly string[] InterestingProperties = { - "Worksheets", // gets a Sheets object containing Worksheet objects. - "Sheets", // gets a Sheets object containing all sheets (not just Worksheet sheets) in the qualifying workbook. - }; - - private static readonly string[] InterestingClasses = - { - "Workbook", // unqualified member call - "_Workbook", // qualified member call + "Item", // explicit member call + "_Default", // default member call (usually implicit) }; protected override IEnumerable ObjectionableDeclarations(DeclarationFinder finder) { if (!finder.TryFindProjectDeclaration("Excel", out var excel)) { - return Enumerable.Empty(); + // [RequiredHost] attribute puts this in "should not happen" territory. + yield break; + } + var sheetsClass = (ModuleDeclaration)finder.FindClassModule("Sheets", excel, true); + if (sheetsClass == null) + { + // [RequiredHost] attribute puts this in "should not happen" territory. + yield break; } - var relevantClasses = InterestingClasses - .Select(className => finder.FindClassModule(className, excel, true)) - .OfType(); + if (sheetsClass != null) + { + foreach (var property in sheetsClass.Members.OfType()) + { + if (InterestingProperties.Any(name => name.Equals(property.IdentifierName, System.StringComparison.InvariantCultureIgnoreCase))) + { + yield return property; + } + } + } + } - var relevantProperties = relevantClasses - .SelectMany(classDeclaration => classDeclaration.Members) - .OfType() - .Where(member => InterestingMembers.Contains(member.IdentifierName)); + private static ClassModuleDeclaration GetHostWorkbookDeclaration(DeclarationFinder finder) + { + var documentModuleQMNs = finder.AllModules.Where(m => m.ComponentType == ComponentType.Document); + ClassModuleDeclaration result = null; + foreach (var qmn in documentModuleQMNs) + { + var declaration = finder.ModuleDeclaration(qmn) as ClassModuleDeclaration; + if (declaration.Supertypes.Any(t => t.IdentifierName.Equals("Workbook") && t.ProjectName == "Excel" && !t.IsUserDefined)) + { + result = declaration; + break; + } + } + + return result ?? throw new System.InvalidOperationException("Failed to find the host Workbook declaration."); + } - return relevantProperties; + private static ClassModuleDeclaration GetHostApplicationDeclaration(DeclarationFinder finder) + { + var result = finder.MatchName("Application").OfType().FirstOrDefault(t => t.ProjectName == "Excel" && !t.IsUserDefined) as ClassModuleDeclaration; + return result ?? throw new System.InvalidOperationException("Failed to find the host Application declaration."); } protected override (bool isResult, string properties) IsResultReferenceWithAdditionalProperties(IdentifierReference reference, DeclarationFinder finder) { - var sheetNameArgumentLiteralExpressionContext = SheetNameArgumentLiteralExpressionContext(reference); + if (reference.IdentifierName.Equals(Tokens.Me, System.StringComparison.InvariantCultureIgnoreCase)) + { + // if Me is a worksheet module, + return (false, null); + } + var hostWorkbookDeclaration = GetHostWorkbookDeclaration(finder); + + var context = reference.Context as VBAParser.MemberAccessExprContext + ?? reference.Context.Parent as VBAParser.MemberAccessExprContext + ?? reference.Context.Parent.Parent as VBAParser.MemberAccessExprContext; + + if (context is VBAParser.MemberAccessExprContext memberAccess) + { + var appObjectDeclaration = GetHostApplicationDeclaration(finder); + var isApplicationQualifier = appObjectDeclaration.References.Any(appRef => + context.GetSelection().Contains(appRef.Selection) + && appRef.QualifiedModuleName.Equals(reference.QualifiedModuleName)); + + if (isApplicationQualifier) + { + // Application.Sheets(...) is referring to the ActiveWorkbook, not necessarily ThisWorkbook. + return (false, null); + } + } + + var isHostWorkbookQualifier = hostWorkbookDeclaration.References.Any(thisWorkbookRef => + context.GetSelection().Contains(thisWorkbookRef.Selection) + && thisWorkbookRef.QualifiedModuleName.Equals(reference.QualifiedModuleName)); + + var parentModule = finder.ModuleDeclaration(reference.QualifiedModuleName); + if (!isHostWorkbookQualifier && parentModule is ProceduralModuleDeclaration) + { + // in a standard module the reference is against ActiveWorkbook unless it's explicitly against ThisWorkbook. + return (false, null); + } + + var sheetNameArgumentLiteralExpressionContext = SheetNameArgumentLiteralExpressionContext(reference); if (sheetNameArgumentLiteralExpressionContext?.STRINGLITERAL() == null) { return (false, null); diff --git a/Rubberduck.Core/Properties/Resources.Designer.cs b/Rubberduck.Core/Properties/Resources.Designer.cs index 8ecdabc672..f4729e7dcb 100644 --- a/Rubberduck.Core/Properties/Resources.Designer.cs +++ b/Rubberduck.Core/Properties/Resources.Designer.cs @@ -59,5 +59,15 @@ internal class Resources { resourceCulture = value; } } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Splash2021f { + get { + object obj = ResourceManager.GetObject("Splash2021f", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/Rubberduck.Core/Properties/Resources.resx b/Rubberduck.Core/Properties/Resources.resx index 1af7de150c..1839428130 100644 --- a/Rubberduck.Core/Properties/Resources.resx +++ b/Rubberduck.Core/Properties/Resources.resx @@ -117,4 +117,8 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\Splash2021f.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/Rubberduck.Core/Resources/Splash2021f.png b/Rubberduck.Core/Resources/Splash2021f.png new file mode 100644 index 0000000000..ea2020316c Binary files /dev/null and b/Rubberduck.Core/Resources/Splash2021f.png differ diff --git a/Rubberduck.Core/Rubberduck.Core.csproj b/Rubberduck.Core/Rubberduck.Core.csproj index 664a4da9f3..d4fdf5229b 100644 --- a/Rubberduck.Core/Rubberduck.Core.csproj +++ b/Rubberduck.Core/Rubberduck.Core.csproj @@ -5,7 +5,7 @@ Rubberduck.Core Rubberduck.Core Rubberduck.Core - Copyright © 2014-2019 + Copyright © 2014-2021 {A1587EAC-7B54-407E-853F-4C7493D0323E} bin\Debug\Rubberduck.Core.xml @@ -92,6 +92,17 @@ + + True + True + Resources.resx + + + + + ResXFileCodeGenerator + Resources.Designer.cs + True True diff --git a/Rubberduck.Core/UI/Splash.cs b/Rubberduck.Core/UI/Splash.cs deleted file mode 100644 index 5f8db3af5d..0000000000 --- a/Rubberduck.Core/UI/Splash.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Windows.Forms; - -namespace Rubberduck.UI -{ - public partial class Splash : Form - { - public Splash() - { - InitializeComponent(); - } - - public string Version - { - get => VersionLabel.Text; - set => VersionLabel.Text = value; - } - } -} diff --git a/Rubberduck.Core/UI/Splash.resx b/Rubberduck.Core/UI/Splash.resx deleted file mode 100644 index d7d0b6cd90..0000000000 --- a/Rubberduck.Core/UI/Splash.resx +++ /dev/null @@ -1,1340 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - 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 - AAAASUVORK5CYII= - - - - - AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAAAwMAAAAQAgAKglAABGFQAAKAAAABAA - AAAgAAAAAQAgAAAAAAAABAAAww4AAMMOAAAAAAAAAAAAAAAAAAAAAAAARVhaAENbXQRJUVEoSVNUWElV - V3lJV1mGSVZYfUlVVltIU1QmQGJmA0NdYAAAAAAAAAAAAAAAAAA9cXgATklIAEdYWiZHXmOWQHqF3zmV - p/g1pr3+M63F/zWov/85lqj5QHiD3UdeYpBHWFolWi0mADd+iAAAAAAATkpJAEhVVi1Ea3LLM6zE/yrU - 9v8o3f//J93//yfd//8n3f//KN3//yrT9f80qsH/Q2520kZbXkBZLygAMoyaAENeYhJFZWu0MbTO/yfd - //8o2///KNv//yjb//8o2///KNv//yjb//8o3P//J93//y++2v9DbnbPRltdHkRhZgBIVlhfOpGi9yjb - /v8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8n3f//OJuu/UhWWFxLUVIARl9kqTG3 - 0f8n3f//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///J97//zSpv/9JVlluTU5OAEVm - bMYuxOL/KNz//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjc//86lKX6SVRVUEtT - VABFZWvBLsLg/yjc//8o3P//J93//yja/f8p2Pv/KNv+/yjb//8o2///KNv//yjd//8uwNz/RGpyxUZY - WhVEY2cAR19jqDC50/8n3v//Lcfm/zaiuP49iJfvP3+L6TuQof4q0/X/KNz//yjc//8syur/QHqG6ERl - a0xNTU0AMZiqAEhYWnU4mKv9N5+0/ENsdMpIWFtwSVFSNUlVV5M7jZ3/Kdj7/yjb//8o3P//LcTi+z6E - j3U+f2cDPIqJAAAAAABGXWA6SF1g1UdcX4BFWVsWS1FTAEdWWDBAe4fkKtHx/yjc//8o2///KNz//zSo - wPs/YXvPRVZkmUZiYCZRSUIAP210CEZcYCNDYGQEQmNnAE1OTgBJVlhmNqK3/yfe//8o2///KdX3/yrS - 9P84ma3/MFmh/yVcw/9BV3HDRmNhIgAAAAAAAAAAAAAAAAAAAABOS0sASFlccDWnvf8n3v//KN3//zSr - wv85lab/K8/t/z9pgP41VpTyQVRv6kdeX1UAAAAAAAAAAAAAAAAAAAAASFhbAEhXWT0+gI3uKtDx/yfe - //8q0/P/LMrq/zWnvv9GYWWyTFdPO0deXC9Aa3IOAAAAAAAAAAAAAAAAAAAAAD1zewA6dn8ER1pdbj98 - iOc1p73/MrDJ/zuOn/ZFY2inRGBkHkdZXAAgtbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQGhtADxx - eQNHVlg6SVdZgUlXWZBIVlhZQmJmDkhUVQAM4fYAAAAAAAAAAADgDwAAwAcAAIADAAAAAQAAAAEAAAAB - AAAAAQAAAAEAAAADAAAAAwAACAEAABgAAAD4AAAA+AAAAPgHAAD8DwAAKAAAACAAAABAAAAAAQAgAAAA - AAAAEAAAww4AAMMOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAhs8kADt3pAi+SoAk9c3sQRGJmFDh+iR1DZGkRMouYDBfJ1gP/AAAAAP//AAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHb3KAAXz - /wE7dn4SQWhuQUZdYHJIWFqdSlNUuUtRUclNTUzNSlJT2ExOTstKU1TASFhbo0RhZXZBaXA9N3+KDwD/ - /wAS1d8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJaq+AAD/ - /wE/bnUiRl1hfUpTVMxLUVH0SVha/0ZmbP9CdX//PoGO/zyIl/88ipn/PYSS/0F4g/9FZ27/SVha/0tR - UfNJVVbFRGFmbzt3fxoA//8AFszZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADWE - kAAwkJ8HQmZsY0pTVNlKVVf+QXaA/zagtf8uv9z/KtDw/ynX+v8o2/7/J9z//yfc//8o2///KNj8/yrR - 8v8uvtv/N5yw/0NweP9LU1T8SVVX0EJnbVwxjZkHOXyGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABBaW8APXJ7BkhZXHpLUVL2QnF6/zG0zv8p1vn/J93//yjd//8o3P//KNv//yjb//8o2///KNv//yjb - //8o2///KNz//yjd//8n3f//KdP1/zOsxP9DbHT/S1FR9UZdYJA2go4UQGtyAAby/wAAAAAAAAAAAAAA - AAAAAAAAMY2aAB660gRFX2N4TFBQ9j2Ekf8qz+//J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o3P//J93//yrO7v87ipr/S1NU/kVeYqs0hpIWOHyHAAAA - AAAAAAAAAAAAACmfsgBPSUgAQWpwUUtRUvA+f4v/KdPz/yjc//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNz//yjY+v85l6n/S1NV/0Vg - ZJEjrsAGMJGdAAAAAAAAAAAAOniCADh+iRhJVlfIRWhu/yvJ6P8o3P//KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNz//yjY - +v88iJf/S1JT8T9tdERFYGUAAP//AAAAAABWOTUAQmZra0tTVP00qL7/J93//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KN3//y3F4v9IXWH/R1tek/8AAAAoorQAAAAAADaBjQxKVFa5RGx0/yrS8v8o3P//KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNj6/0F2gP9JVVfCLpSkCzCRoAAAAAAAPm93NUtRUek5lKb/J93//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///PoOQ/0tQUc0+cHcPPnB4AAAAAABCZWtiSlNV+jGy - y/8n3f//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yja/v8/f4v/S1FSyjp5gg46eYMAAAAAAEZe - YX5JWVv/LsHe/yjd//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o3P//KdP0/0Rsc/9JVVavJqi8BTGO - nAAAAAAASVVXf0lbXv8txeP/KNz//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yfd//8xtM7/SlVX/0Vf - Y3NYNC8AD9v1AAAAAABFYGR/SVlc/y7B3v8o3f//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o3P//KdX2/0B5 - g/9KUlPdPnB4Jj9scwAAAAAAAAAAAEZdYGlKVVf8L7vW/yjd//8o2///KNv//yjb//8o2///KNv//yjc - //8o3f//J93//yfd//8n3f//J93//yjc//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - /v83nK//S1FS/EVgZHX/AAAALJmqAAAAAAAAAAAAQ2NoV0tTVPgysMn/J93//yjb//8o2///KNv//yjd - //8o2/3/K83t/zC30v81pLr/OJqt/zebr/80qL//LcLg/yja/v8o2///KNv//yjb//8o2///KNv//yjb - //8o3P//M6zD/0lYWv9EZmvAMputFzaPnwAAAAAAAAAAAAAAAABAanE5S1BR7Decr/8n3f//KNv//yjd - //8p1vf/MbXP/z2GlP9GY2n/SlVX/ktQUfJMT1DoS1BR7U1NTf5FZ23/K8zs/yjc//8o2///KNv//yjb - //8o2///KNz//zGxy/9IW17/R11g0DSYqDZgAAcAE/v/ACjb/wAAAAAAAAAAADp5ghdKUlPPPn+M/yjb - /v8o2vz/MLfR/0B4g/9KVVf+SlJT40hZW6NEYGVjQ2VqOT9scypFYGSeTE9Q/zqOnv8o1/r/KNv//yjb - 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 - UfpNS0v/TE5O/0deYv9Ad4L/OZKk/zOqwf8vu9f/LMbl/yvN7f8p0fL/KdP1/ynT9P8pz/D/LMrp/y6/ - 3P8yrcb/OJSm/0B2gP9IW1//TU1N/01MS/9LU1T1Rl5itTt3gE4jrsIIKp2wAAD//wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+4zwA+b3cAM4mWKENk - aapLUlP5TktL/0pWWP8/eoX/NKe+/yzH5v8o1/r/J93//yfd//8o3f//KNz//yjc//8o3P//KNv//yjc - //8o3P//KNz//yjd//8n3f//J93//yjX+v8sxOL/Np6z/0JweP9MUVH/TUtL/0pVV/VCZmyeNYSQJERj - ZwAsmKkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJaa8AEpU - VgBBaXAsR1teyE1OTv9MT1D/P3qF/y+40v8o1/n/J93//yjc//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o3P//J93//ynT9P8yq8P/Qm93/01N - Tv9NTk7/R1te0Dx0fEYA//8BKKGpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAT09sATUxOAEBrcStJVljITUxM/0lYWv82nbH/KNX2/yjd//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjc - //8n3f//KdDx/zeYqv9JWVz/TUtL/0lWWOc7d4FoE9PuBCaouwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAA3gIsAM4iVJUZdYMdNTEz/SFte/zGsxP8o2/7/KNz//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNz//yfb/v8vtc//RGdt/05LS/9JVljyOniBbAD//wIhsccAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6VowAmprcNQ2Rpp01OTv9KV1n/MavC/yfc//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8n3f//LcLf/0Rtdf9OS0v/SFha6zp4 - gklRRUQAC+f/AAAAAAAAAAAAAAAAAAAAAAAAAAAAJau2AFc2NAA+b3ZnS1JT+kxPT/82m67/KNv+/yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KN3//y3D - 4P9EaG7/TktL/0VfY8svk6IbMoyaAAAAAAAAAAAAAAAAAAAAAAAAAAAANYSRADGMmiNHWl3WTktK/z97 - h/8p1fb/KNz//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yfd//8wssv/SlZY/0xQUf4+b3ZyWTAqACWovAAAAAAAAAAAAAAAAAAWzOgA/wAAAD5v - doBMT0//SVlc/y692P8o3f//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2fv/PYKO/05LSv9GXWDBKaGzDSyZqgAAAAAAAAAAAAAA - AAAziJUAMoyZF0ZcX9JOS0r/O4iW/yja/f8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8n3f//Ma7F/0xQUP9JVVfqOXyGLDl6 - hAAAAAAAAAAAAAAAAABFXmIAQGpxTEtQUfhKVVf/L7rU/yjd//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o3P//LMXi/0la - Xf9LUlP6OniCTj9udQAAAAAAAAAAAAAAAAD/AAAAQ2NokE1MTP9CcHn/KdT2/yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o3P//K8zs/0ZiZ/9MT0/9Q2VqVEVfYwAAAAAAAAAAAAAAAAAmp7sQRl5ixU5LSv85kKH/J9z//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o3P//Ks7u/0Zkaf9MTk79RV9jVEdbXgAAAAAAAAAAAAAAAAA1hZEkSVdZ3kxO - Tv8yqsH/J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o3P//LMno/0hdYf9LUFH8Pm92UkJmbAAAAAAAAAAAAAAA - AAA4fYc8SVVX8EtTVf8vutX/KN3//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o3f//L7jS/0tTVP9LUlPvPnB4Mz9s - cwAAAAAAAAAAAAAAAABDZGk8S1BR8ElYWv8twd7/KN3//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8n3P//OJSl/01L - S/9HWl3SMY2bFjKMmgAAAAAAAAAAAAAAAABDYmc8TFBR8ElYW/8twt//KN3//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjc - //8rzOv/RWZs/01NTf9DZGmPAP//ABy/2AAAAAAAAAAAAAAAAAA9cns8SlNV8EpVV/8vvdr/KN3//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yfc//83maz/TU1N/0pVVu06eIE7P210AAAAAAAAAAAAAAAAAAAAAAA0h5Q5SVdZ7UxR - Uv8wt9L/J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KN3//y2+2v9HXWH/TU1N/0Jla50Yx+IFLJmqAAAAAAAAAAAAAAAAAAAA - AABBaG4eS1FR2UxQUP8xsMj/J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNz//yjc//8o3f//KN3//yjd//8o3P//KNz//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o3P//Ks7u/0Fzff9OS0r/SFda2Dh9hilAanIAAAAAAAAA - AAAAAAAAAAAAAAAAAAA1hZEZSFlb1U1NTf81pbv/J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o3P//KN3//yfd//8o1/r/K83u/yzD4f8vu9f/MLjT/y692f8sxuT/KdHz/yjb/v8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjc//8p1PX/PISR/01MS/9JV1n7OoKNcP8A - AAAh0uYAAAAAAAAAAAAAAAAAAAAAAAAAAAAmqLwMR1tevk1LSv84lKX/J93//yjb//8o2///KNv//yjb - //8o2///KNz//yfd//8p0/T/L7jS/ziVp/9Ad4H/RmNp/0lZW/9KVFb/S1NU/0pVV/9IW1//RGlw/ziW - qP8p1vj/KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNz//yjW+P85jZ3/TU5O/0tS - U/47go6pJNz2HCuCngAo4P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8BRGJnnk1LS/8/fIf/KNn8/yjb - //8o2///KNv//yjc//8n3P7/K8jn/zadsP9Cb3f/SlRV/01LS/9NS0v/TE9P/kxQUPVLUVLsSlVW7EtS - U/JNTU3/TkpJ/0laXv8tx+X/KNz//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNj7/ziR - ov9MT0//TE9Q/j9yeq4lw9kfNIakABf//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU0AQ2Vqak1O - Tv9FZWr/Ks7u/yjc//8o2///J93//yrM6/83lqj/RmFm/01MTP9NTEz/S1JT90daXdFFYGSWP210aUBq - cT9DZGorOH2ILkJmbKdMT1D/TE5O/ziPn/8o2Pv/KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o3P//K8vq/0deY/9NTU3/Q2xztC6svx46hpsAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA9cnoAOniCQEpTVPRLU1X/L7nT/yfe//8o1/n/M6nA/0Rob/9NTEz/TU1O/0hYW+pDZWqjPHV+TjCR - nxYK6PgBG7/PACKxugB+AAAAO3Z/YUpUVfFNTEz/PYGO/ynU9P8o3P//KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///Kdj7/zWkuv85kqPULrnSNjyKqAAV//8AAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAA2g44ANoOPFUhXWtFNTEv/N5qt/yvI5/89g5D/S1FS/01MS/9KVVbrQGtxmzOI - lTceutIFJ6W5AAAAAAAAAAAAEdj2AEFpbwA2g485SFpc4k5LSv9Bcnv/Ks3s/yjc//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjd//om4f+OH/j/CCHy/wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAisccAAP//AkRiZ6FNTEz/RWRq/0VmbP9NS0v/S1FS/ERh - Zrw8dX4+HrjQBCmfsgAA//8AAAAAAAAAAAAAAAAAMouYACqdrg1EYmeyTUxM/0dhZf8twNz/KN3//yjb - //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///J93//ynS8/YzpLqjQGtxe0Bq - cX0+cHhaNoKOIBy/1wErna4AAAAAAAAAAAAAAAAAAAAAAAAAAAAO3v4ATU1NAD9tdGJMUFH+TUxL/01M - TP9JVljoPnB3eyqdrRM+cH4AAP//AAAAAAAAAAAAAAAAAAAAAAAZxd8AVDw5ADxzfGFLUlP5TFBR/zSk - uv8n3f//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2v3/MbDJ/0Jw - eP5LU1P9TU9N/01PTf9MUVH8SFha2T5vdnctmKgPMI+eAAAAAAAAAAAAAAAAAAAAAAAAAAAANoKOADSF - ki5HWl3pTE9P/0ZdYMY8dH0+BPb/AiOttgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtlqYAJqa6CUVf - Y7lNS0v/P3mD/ynV9v8o3P//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjc - //8rxuT/R15h/05KSv9JTln/QFJ0/z9Sdf9IT1z/TkxL/0tSUvtCZmumLZemHzaBjwAA//8AAAAAAAAA - AAAAAAAAIrDFABrD3QY+b3ddRGFldTWEkB5PSkkAD9z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA3gIsAN4CMJklWWOVMTk//MqnA/yfd//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjc//8qyur/RmJn/05LSf83VY3/FWPz/xRk9/8dYNz/N1WN/0xNT/9MUE//Q2RquTGN - myA6eIIAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABDZGkAQmVrN0tQUfJJV1n/LcDc/yjd//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNv//yjc//8o3P//KNv//yjb//8n2///N5iq/01NTf9JTln/JF3G/xBk//8QZP//E2P3/y5Z - p/9LTlP/TU9O/0JnbbUrnKsVMY6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCZWsAO3eBVUtQUfxIXWH/LMno/yjc//8o2///KNv//yjb - //8o2///KNv//yjb//8o2///KNz//ynR8v8sxeP/KNb4/yjc//8o3P//KdLy/z96hP9OS0n/Q1Fq/xph - 5P8QZP//EGT//xFk/P8sWq3/S01S/0xRUf5AbHJ5pQAAAB660gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDZGkAPXN7YEtQUf9HYmf/K83t/yjc - //8o2///KNv//yjb//8o2///KNv//yjb//8o3P//LMno/0F0ff9JWVz/OoiW/yjV9/8o2///KN3//yzE - 4f9GY2j/TkxJ/zFXnv8SZPz/FWLy/xdh7P8YYej/OFWK/05MS/9HXF/QLJipFi2XpwAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDY2gAPXJ7YEtQ - Uf9HYWb/K83t/yjc//8o2///KNv//yjb//8o2///KNv//yjb//8n3f//NaW7/01MS/9OS0v/SlZY/y3B - 3v8o3f//KNv//yfd//82m67/TUxL/0dPYP86VIT/QlFu/0VQZf9EUGn/RVBk/01MTP9HWl3mL5OjJi6V - pQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABAanAAO3Z/RktSU/dKVln/Lr7a/yjd//8o2///KNv//yjb//8o2///KNv//yjb//8o3f//L7nU/0la - Xf9OSkr/Q2tz/yrN7f8o3P//KNv//yfd//83mKr/TUxM/01MTP9OTUv/TU9N/k1PTvpNT078TE9P/0tR - Uv9DZGmmJ6a5CC6UpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAA4fYgAOH6JHElWWdhNTEz/N5Wm/yfc//8o2///KNv//yjb//8o2///KNv//yjb - //8o2///KNr9/zC30f83nrL/LcPg/yjb//8o2///KN3//yvI5v9FZm3/TUxL/0lXWe5DZGmsQmdsbUdb - XklCZ21aP210eTx0fGwwkZ8ePnB5AAzk/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoo7cAAP//AUFobZZNTk7/R15i/y6+2f8n3f//KNv//yjb - //8o2///KNv//yjb//8o2///KNv//yjd//8n3f//KNz//yjb//8o3f//K8zs/0B4g/9NTEv/SVZY6zl7 - hlMP3PYFNYShAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOXyGADOKlzJGXGDgTktL/0Ns - dP8swt//J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yfd//8sxeP/QXaA/01M - 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 - AAD///gAP/8AAP///gD//wAA////////AAA= - - - \ No newline at end of file diff --git a/Rubberduck.Core/UI/Splash.Designer.cs b/Rubberduck.Core/UI/Splash2021.Designer.cs similarity index 56% rename from Rubberduck.Core/UI/Splash.Designer.cs rename to Rubberduck.Core/UI/Splash2021.Designer.cs index 27470ed7a8..a9ad169bad 100644 --- a/Rubberduck.Core/UI/Splash.Designer.cs +++ b/Rubberduck.Core/UI/Splash2021.Designer.cs @@ -1,6 +1,7 @@ -namespace Rubberduck.UI + +namespace Rubberduck.UI { - partial class Splash + partial class Splash2021 { /// /// Required designer variable. @@ -28,52 +29,59 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Splash)); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Splash2021)); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.VersionLabel = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); // + // pictureBox1 + // + this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.pictureBox1.Image = global::Rubberduck.Properties.Resources.Splash2021f; + this.pictureBox1.Location = new System.Drawing.Point(0, 0); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(320, 360); + this.pictureBox1.TabIndex = 3; + this.pictureBox1.TabStop = false; + // // VersionLabel // - this.VersionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.VersionLabel.BackColor = System.Drawing.Color.Transparent; - this.VersionLabel.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.VersionLabel.ForeColor = System.Drawing.Color.Black; + this.VersionLabel.AutoSize = true; this.VersionLabel.Location = new System.Drawing.Point(12, 9); this.VersionLabel.Name = "VersionLabel"; - this.VersionLabel.Size = new System.Drawing.Size(296, 23); - this.VersionLabel.TabIndex = 0; - this.VersionLabel.Text = "version 2.5.0"; - this.VersionLabel.UseWaitCursor = true; + this.VersionLabel.Padding = new System.Windows.Forms.Padding(2); + this.VersionLabel.Size = new System.Drawing.Size(76, 17); + this.VersionLabel.TabIndex = 2; + this.VersionLabel.Text = "VersionLabel"; + this.VersionLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.VersionLabel.UseMnemonic = false; // - // Splash + // Splash2021 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.AutoValidate = System.Windows.Forms.AutoValidate.Disable; - this.BackColor = System.Drawing.Color.Black; - this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage"))); - this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; this.ClientSize = new System.Drawing.Size(320, 360); this.ControlBox = false; this.Controls.Add(this.VersionLabel); - this.DoubleBuffered = true; + this.Controls.Add(this.pictureBox1); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.MinimizeBox = false; - this.Name = "Splash"; - this.ShowInTaskbar = false; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Name = "Splash2021"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.UseWaitCursor = true; + this.Text = "Rubberduck"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.ResumeLayout(false); + this.PerformLayout(); } #endregion - - //private System.Windows.Forms.Label StatusLabel; + private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.Label VersionLabel; } } \ No newline at end of file diff --git a/Rubberduck.Core/UI/Splash2021.cs b/Rubberduck.Core/UI/Splash2021.cs new file mode 100644 index 0000000000..9e2e94498e --- /dev/null +++ b/Rubberduck.Core/UI/Splash2021.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Rubberduck.UI +{ + public partial class Splash2021 : Form + { + public Splash2021() + { + InitializeComponent(); +#if DEBUG + VersionLabel.Text = $"Version {GetType().Assembly.GetName().Version} (debug)"; +#else + VersionLabel.Text = $"Version {GetType().Assembly.GetName().Version}"; +#endif + VersionLabel.Parent = pictureBox1; + VersionLabel.BackColor = Color.Transparent; + } + } +} diff --git a/Rubberduck.Core/UI/Splash2021.resx b/Rubberduck.Core/UI/Splash2021.resx new file mode 100644 index 0000000000..634185d01a --- /dev/null +++ b/Rubberduck.Core/UI/Splash2021.resx @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAAAwMAAAAQAgAKglAABGFQAAKAAAABAA + AAAgAAAAAQAgAAAAAAAABAAAww4AAMMOAAAAAAAAAAAAAAAAAAAAAAAARVhaAENbXQRJUVEoSVNUWElV + V3lJV1mGSVZYfUlVVltIU1QmQGJmA0NdYAAAAAAAAAAAAAAAAAA9cXgATklIAEdYWiZHXmOWQHqF3zmV + p/g1pr3+M63F/zWov/85lqj5QHiD3UdeYpBHWFolWi0mADd+iAAAAAAATkpJAEhVVi1Ea3LLM6zE/yrU + 9v8o3f//J93//yfd//8n3f//KN3//yrT9f80qsH/Q2520kZbXkBZLygAMoyaAENeYhJFZWu0MbTO/yfd + //8o2///KNv//yjb//8o2///KNv//yjb//8o3P//J93//y++2v9DbnbPRltdHkRhZgBIVlhfOpGi9yjb + /v8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8n3f//OJuu/UhWWFxLUVIARl9kqTG3 + 0f8n3f//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///J97//zSpv/9JVlluTU5OAEVm + bMYuxOL/KNz//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjc//86lKX6SVRVUEtT + VABFZWvBLsLg/yjc//8o3P//J93//yja/f8p2Pv/KNv+/yjb//8o2///KNv//yjd//8uwNz/RGpyxUZY + WhVEY2cAR19jqDC50/8n3v//Lcfm/zaiuP49iJfvP3+L6TuQof4q0/X/KNz//yjc//8syur/QHqG6ERl + a0xNTU0AMZiqAEhYWnU4mKv9N5+0/ENsdMpIWFtwSVFSNUlVV5M7jZ3/Kdj7/yjb//8o3P//LcTi+z6E + j3U+f2cDPIqJAAAAAABGXWA6SF1g1UdcX4BFWVsWS1FTAEdWWDBAe4fkKtHx/yjc//8o2///KNz//zSo + wPs/YXvPRVZkmUZiYCZRSUIAP210CEZcYCNDYGQEQmNnAE1OTgBJVlhmNqK3/yfe//8o2///KdX3/yrS + 9P84ma3/MFmh/yVcw/9BV3HDRmNhIgAAAAAAAAAAAAAAAAAAAABOS0sASFlccDWnvf8n3v//KN3//zSr + wv85lab/K8/t/z9pgP41VpTyQVRv6kdeX1UAAAAAAAAAAAAAAAAAAAAASFhbAEhXWT0+gI3uKtDx/yfe + //8q0/P/LMrq/zWnvv9GYWWyTFdPO0deXC9Aa3IOAAAAAAAAAAAAAAAAAAAAAD1zewA6dn8ER1pdbj98 + iOc1p73/MrDJ/zuOn/ZFY2inRGBkHkdZXAAgtbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQGhtADxx + eQNHVlg6SVdZgUlXWZBIVlhZQmJmDkhUVQAM4fYAAAAAAAAAAADgDwAAwAcAAIADAAAAAQAAAAEAAAAB + AAAAAQAAAAEAAAADAAAAAwAACAEAABgAAAD4AAAA+AAAAPgHAAD8DwAAKAAAACAAAABAAAAAAQAgAAAA + AAAAEAAAww4AAMMOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAhs8kADt3pAi+SoAk9c3sQRGJmFDh+iR1DZGkRMouYDBfJ1gP/AAAAAP//AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHb3KAAXz + /wE7dn4SQWhuQUZdYHJIWFqdSlNUuUtRUclNTUzNSlJT2ExOTstKU1TASFhbo0RhZXZBaXA9N3+KDwD/ + /wAS1d8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJaq+AAD/ + /wE/bnUiRl1hfUpTVMxLUVH0SVha/0ZmbP9CdX//PoGO/zyIl/88ipn/PYSS/0F4g/9FZ27/SVha/0tR + UfNJVVbFRGFmbzt3fxoA//8AFszZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADWE + kAAwkJ8HQmZsY0pTVNlKVVf+QXaA/zagtf8uv9z/KtDw/ynX+v8o2/7/J9z//yfc//8o2///KNj8/yrR + 8v8uvtv/N5yw/0NweP9LU1T8SVVX0EJnbVwxjZkHOXyGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABBaW8APXJ7BkhZXHpLUVL2QnF6/zG0zv8p1vn/J93//yjd//8o3P//KNv//yjb//8o2///KNv//yjb + //8o2///KNz//yjd//8n3f//KdP1/zOsxP9DbHT/S1FR9UZdYJA2go4UQGtyAAby/wAAAAAAAAAAAAAA + AAAAAAAAMY2aAB660gRFX2N4TFBQ9j2Ekf8qz+//J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o3P//J93//yrO7v87ipr/S1NU/kVeYqs0hpIWOHyHAAAA + AAAAAAAAAAAAACmfsgBPSUgAQWpwUUtRUvA+f4v/KdPz/yjc//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNz//yjY+v85l6n/S1NV/0Vg + ZJEjrsAGMJGdAAAAAAAAAAAAOniCADh+iRhJVlfIRWhu/yvJ6P8o3P//KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNz//yjY + +v88iJf/S1JT8T9tdERFYGUAAP//AAAAAABWOTUAQmZra0tTVP00qL7/J93//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KN3//y3F4v9IXWH/R1tek/8AAAAoorQAAAAAADaBjQxKVFa5RGx0/yrS8v8o3P//KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNj6/0F2gP9JVVfCLpSkCzCRoAAAAAAAPm93NUtRUek5lKb/J93//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///PoOQ/0tQUc0+cHcPPnB4AAAAAABCZWtiSlNV+jGy + y/8n3f//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yja/v8/f4v/S1FSyjp5gg46eYMAAAAAAEZe + YX5JWVv/LsHe/yjd//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o3P//KdP0/0Rsc/9JVVavJqi8BTGO + nAAAAAAASVVXf0lbXv8txeP/KNz//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yfd//8xtM7/SlVX/0Vf + Y3NYNC8AD9v1AAAAAABFYGR/SVlc/y7B3v8o3f//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o3P//KdX2/0B5 + g/9KUlPdPnB4Jj9scwAAAAAAAAAAAEZdYGlKVVf8L7vW/yjd//8o2///KNv//yjb//8o2///KNv//yjc + //8o3f//J93//yfd//8n3f//J93//yjc//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + /v83nK//S1FS/EVgZHX/AAAALJmqAAAAAAAAAAAAQ2NoV0tTVPgysMn/J93//yjb//8o2///KNv//yjd + //8o2/3/K83t/zC30v81pLr/OJqt/zebr/80qL//LcLg/yja/v8o2///KNv//yjb//8o2///KNv//yjb + //8o3P//M6zD/0lYWv9EZmvAMputFzaPnwAAAAAAAAAAAAAAAABAanE5S1BR7Decr/8n3f//KNv//yjd + //8p1vf/MbXP/z2GlP9GY2n/SlVX/ktQUfJMT1DoS1BR7U1NTf5FZ23/K8zs/yjc//8o2///KNv//yjb + //8o2///KNz//zGxy/9IW17/R11g0DSYqDZgAAcAE/v/ACjb/wAAAAAAAAAAADp5ghdKUlPPPn+M/yjb + /v8o2vz/MLfR/0B4g/9KVVf+SlJT40hZW6NEYGVjQ2VqOT9scypFYGSeTE9Q/zqOnv8o1/r/KNv//yjb + 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 + UfpNS0v/TE5O/0deYv9Ad4L/OZKk/zOqwf8vu9f/LMbl/yvN7f8p0fL/KdP1/ynT9P8pz/D/LMrp/y6/ + 3P8yrcb/OJSm/0B2gP9IW1//TU1N/01MS/9LU1T1Rl5itTt3gE4jrsIIKp2wAAD//wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+4zwA+b3cAM4mWKENk + aapLUlP5TktL/0pWWP8/eoX/NKe+/yzH5v8o1/r/J93//yfd//8o3f//KNz//yjc//8o3P//KNv//yjc + //8o3P//KNz//yjd//8n3f//J93//yjX+v8sxOL/Np6z/0JweP9MUVH/TUtL/0pVV/VCZmyeNYSQJERj + ZwAsmKkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJaa8AEpU + VgBBaXAsR1teyE1OTv9MT1D/P3qF/y+40v8o1/n/J93//yjc//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o3P//J93//ynT9P8yq8P/Qm93/01N + Tv9NTk7/R1te0Dx0fEYA//8BKKGpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAT09sATUxOAEBrcStJVljITUxM/0lYWv82nbH/KNX2/yjd//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjc + //8n3f//KdDx/zeYqv9JWVz/TUtL/0lWWOc7d4FoE9PuBCaouwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA3gIsAM4iVJUZdYMdNTEz/SFte/zGsxP8o2/7/KNz//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNz//yfb/v8vtc//RGdt/05LS/9JVljyOniBbAD//wIhsccAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6VowAmprcNQ2Rpp01OTv9KV1n/MavC/yfc//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8n3f//LcLf/0Rtdf9OS0v/SFha6zp4 + gklRRUQAC+f/AAAAAAAAAAAAAAAAAAAAAAAAAAAAJau2AFc2NAA+b3ZnS1JT+kxPT/82m67/KNv+/yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KN3//y3D + 4P9EaG7/TktL/0VfY8svk6IbMoyaAAAAAAAAAAAAAAAAAAAAAAAAAAAANYSRADGMmiNHWl3WTktK/z97 + h/8p1fb/KNz//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yfd//8wssv/SlZY/0xQUf4+b3ZyWTAqACWovAAAAAAAAAAAAAAAAAAWzOgA/wAAAD5v + doBMT0//SVlc/y692P8o3f//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2fv/PYKO/05LSv9GXWDBKaGzDSyZqgAAAAAAAAAAAAAA + AAAziJUAMoyZF0ZcX9JOS0r/O4iW/yja/f8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8n3f//Ma7F/0xQUP9JVVfqOXyGLDl6 + hAAAAAAAAAAAAAAAAABFXmIAQGpxTEtQUfhKVVf/L7rU/yjd//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o3P//LMXi/0la + Xf9LUlP6OniCTj9udQAAAAAAAAAAAAAAAAD/AAAAQ2NokE1MTP9CcHn/KdT2/yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o3P//K8zs/0ZiZ/9MT0/9Q2VqVEVfYwAAAAAAAAAAAAAAAAAmp7sQRl5ixU5LSv85kKH/J9z//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o3P//Ks7u/0Zkaf9MTk79RV9jVEdbXgAAAAAAAAAAAAAAAAA1hZEkSVdZ3kxO + Tv8yqsH/J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o3P//LMno/0hdYf9LUFH8Pm92UkJmbAAAAAAAAAAAAAAA + AAA4fYc8SVVX8EtTVf8vutX/KN3//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o3f//L7jS/0tTVP9LUlPvPnB4Mz9s + cwAAAAAAAAAAAAAAAABDZGk8S1BR8ElYWv8twd7/KN3//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8n3P//OJSl/01L + S/9HWl3SMY2bFjKMmgAAAAAAAAAAAAAAAABDYmc8TFBR8ElYW/8twt//KN3//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjc + //8rzOv/RWZs/01NTf9DZGmPAP//ABy/2AAAAAAAAAAAAAAAAAA9cns8SlNV8EpVV/8vvdr/KN3//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yfc//83maz/TU1N/0pVVu06eIE7P210AAAAAAAAAAAAAAAAAAAAAAA0h5Q5SVdZ7UxR + Uv8wt9L/J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KN3//y2+2v9HXWH/TU1N/0Jla50Yx+IFLJmqAAAAAAAAAAAAAAAAAAAA + AABBaG4eS1FR2UxQUP8xsMj/J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNz//yjc//8o3f//KN3//yjd//8o3P//KNz//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o3P//Ks7u/0Fzff9OS0r/SFda2Dh9hilAanIAAAAAAAAA + AAAAAAAAAAAAAAAAAAA1hZEZSFlb1U1NTf81pbv/J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o3P//KN3//yfd//8o1/r/K83u/yzD4f8vu9f/MLjT/y692f8sxuT/KdHz/yjb/v8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjc//8p1PX/PISR/01MS/9JV1n7OoKNcP8A + AAAh0uYAAAAAAAAAAAAAAAAAAAAAAAAAAAAmqLwMR1tevk1LSv84lKX/J93//yjb//8o2///KNv//yjb + //8o2///KNz//yfd//8p0/T/L7jS/ziVp/9Ad4H/RmNp/0lZW/9KVFb/S1NU/0pVV/9IW1//RGlw/ziW + qP8p1vj/KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNz//yjW+P85jZ3/TU5O/0tS + U/47go6pJNz2HCuCngAo4P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8BRGJnnk1LS/8/fIf/KNn8/yjb + //8o2///KNv//yjc//8n3P7/K8jn/zadsP9Cb3f/SlRV/01LS/9NS0v/TE9P/kxQUPVLUVLsSlVW7EtS + U/JNTU3/TkpJ/0laXv8tx+X/KNz//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNj7/ziR + ov9MT0//TE9Q/j9yeq4lw9kfNIakABf//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNTU0AQ2Vqak1O + Tv9FZWr/Ks7u/yjc//8o2///J93//yrM6/83lqj/RmFm/01MTP9NTEz/S1JT90daXdFFYGSWP210aUBq + cT9DZGorOH2ILkJmbKdMT1D/TE5O/ziPn/8o2Pv/KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o3P//K8vq/0deY/9NTU3/Q2xztC6svx46hpsAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAA9cnoAOniCQEpTVPRLU1X/L7nT/yfe//8o1/n/M6nA/0Rob/9NTEz/TU1O/0hYW+pDZWqjPHV+TjCR + nxYK6PgBG7/PACKxugB+AAAAO3Z/YUpUVfFNTEz/PYGO/ynU9P8o3P//KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///Kdj7/zWkuv85kqPULrnSNjyKqAAV//8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA2g44ANoOPFUhXWtFNTEv/N5qt/yvI5/89g5D/S1FS/01MS/9KVVbrQGtxmzOI + lTceutIFJ6W5AAAAAAAAAAAAEdj2AEFpbwA2g485SFpc4k5LSv9Bcnv/Ks3s/yjc//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjd//om4f+OH/j/CCHy/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAisccAAP//AkRiZ6FNTEz/RWRq/0VmbP9NS0v/S1FS/ERh + Zrw8dX4+HrjQBCmfsgAA//8AAAAAAAAAAAAAAAAAMouYACqdrg1EYmeyTUxM/0dhZf8twNz/KN3//yjb + //8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///J93//ynS8/YzpLqjQGtxe0Bq + cX0+cHhaNoKOIBy/1wErna4AAAAAAAAAAAAAAAAAAAAAAAAAAAAO3v4ATU1NAD9tdGJMUFH+TUxL/01M + TP9JVljoPnB3eyqdrRM+cH4AAP//AAAAAAAAAAAAAAAAAAAAAAAZxd8AVDw5ADxzfGFLUlP5TFBR/zSk + uv8n3f//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2v3/MbDJ/0Jw + eP5LU1P9TU9N/01PTf9MUVH8SFha2T5vdnctmKgPMI+eAAAAAAAAAAAAAAAAAAAAAAAAAAAANoKOADSF + ki5HWl3pTE9P/0ZdYMY8dH0+BPb/AiOttgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtlqYAJqa6CUVf + Y7lNS0v/P3mD/ynV9v8o3P//KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjc + //8rxuT/R15h/05KSv9JTln/QFJ0/z9Sdf9IT1z/TkxL/0tSUvtCZmumLZemHzaBjwAA//8AAAAAAAAA + AAAAAAAAIrDFABrD3QY+b3ddRGFldTWEkB5PSkkAD9z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAA3gIsAN4CMJklWWOVMTk//MqnA/yfd//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjc//8qyur/RmJn/05LSf83VY3/FWPz/xRk9/8dYNz/N1WN/0xNT/9MUE//Q2RquTGN + myA6eIIAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABDZGkAQmVrN0tQUfJJV1n/LcDc/yjd//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNv//yjc//8o3P//KNv//yjb//8n2///N5iq/01NTf9JTln/JF3G/xBk//8QZP//E2P3/y5Z + p/9LTlP/TU9O/0JnbbUrnKsVMY6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCZWsAO3eBVUtQUfxIXWH/LMno/yjc//8o2///KNv//yjb + //8o2///KNv//yjb//8o2///KNz//ynR8v8sxeP/KNb4/yjc//8o3P//KdLy/z96hP9OS0n/Q1Fq/xph + 5P8QZP//EGT//xFk/P8sWq3/S01S/0xRUf5AbHJ5pQAAAB660gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDZGkAPXN7YEtQUf9HYmf/K83t/yjc + //8o2///KNv//yjb//8o2///KNv//yjb//8o3P//LMno/0F0ff9JWVz/OoiW/yjV9/8o2///KN3//yzE + 4f9GY2j/TkxJ/zFXnv8SZPz/FWLy/xdh7P8YYej/OFWK/05MS/9HXF/QLJipFi2XpwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDY2gAPXJ7YEtQ + Uf9HYWb/K83t/yjc//8o2///KNv//yjb//8o2///KNv//yjb//8n3f//NaW7/01MS/9OS0v/SlZY/y3B + 3v8o3f//KNv//yfd//82m67/TUxL/0dPYP86VIT/QlFu/0VQZf9EUGn/RVBk/01MTP9HWl3mL5OjJi6V + pQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABAanAAO3Z/RktSU/dKVln/Lr7a/yjd//8o2///KNv//yjb//8o2///KNv//yjb//8o3f//L7nU/0la + Xf9OSkr/Q2tz/yrN7f8o3P//KNv//yfd//83mKr/TUxM/01MTP9OTUv/TU9N/k1PTvpNT078TE9P/0tR + Uv9DZGmmJ6a5CC6UpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA4fYgAOH6JHElWWdhNTEz/N5Wm/yfc//8o2///KNv//yjb//8o2///KNv//yjb + //8o2///KNr9/zC30f83nrL/LcPg/yjb//8o2///KN3//yvI5v9FZm3/TUxL/0lXWe5DZGmsQmdsbUdb + XklCZ21aP210eTx0fGwwkZ8ePnB5AAzk/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoo7cAAP//AUFobZZNTk7/R15i/y6+2f8n3f//KNv//yjb + //8o2///KNv//yjb//8o2///KNv//yjd//8n3f//KNz//yjb//8o3f//K8zs/0B4g/9NTEv/SVZY6zl7 + hlMP3PYFNYShAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOXyGADOKlzJGXGDgTktL/0Ns + dP8swt//J93//yjb//8o2///KNv//yjb//8o2///KNv//yjb//8o2///KNv//yfd//8sxeP/QXaA/01M + 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 + AAD///gAP/8AAP///gD//wAA////////AAA= + + + \ No newline at end of file diff --git a/Rubberduck.Main/Ducky.ico b/Rubberduck.Main/Ducky.ico index 3c1251f05b..7f989a7f36 100644 Binary files a/Rubberduck.Main/Ducky.ico and b/Rubberduck.Main/Ducky.ico differ diff --git a/Rubberduck.Main/Extension.cs b/Rubberduck.Main/Extension.cs index 9c9d63dd83..e131d1ceb4 100644 --- a/Rubberduck.Main/Extension.cs +++ b/Rubberduck.Main/Extension.cs @@ -147,7 +147,7 @@ public void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom) private void InitializeAddIn() { - Splash splash = null; + Splash2021 splash = null; try { if (_isInitialized) @@ -193,11 +193,7 @@ private void InitializeAddIn() if (_initialSettings?.CanShowSplash ?? false) { - splash = new Splash - { - // note: IVersionCheck.CurrentVersion could return this string. - Version = $"version {Assembly.GetExecutingAssembly().GetName().Version}" - }; + splash = new Splash2021(); splash.Show(); splash.Refresh(); } diff --git a/Rubberduck.Parsing/VBA/DeclarationResolving/SynchronousDeclarationResolveRunner.cs b/Rubberduck.Parsing/VBA/DeclarationResolving/SynchronousDeclarationResolveRunner.cs index 961f435ef8..4421fceff3 100644 --- a/Rubberduck.Parsing/VBA/DeclarationResolving/SynchronousDeclarationResolveRunner.cs +++ b/Rubberduck.Parsing/VBA/DeclarationResolving/SynchronousDeclarationResolveRunner.cs @@ -35,6 +35,20 @@ protected override void ResolveDeclarations(IReadOnlyCollection s.Key == module).Value, projects, token); + var declaration = _state.DeclarationFinder.ModuleDeclaration(module); + if (declaration is DocumentModuleDeclaration document) + { + if (document.IdentifierName.Equals("ThisWorkbook", StringComparison.InvariantCultureIgnoreCase)) + { + document.AddSupertypeName("Workbook"); + document.AddSupertypeName("_Workbook"); + } + else if (document.IdentifierName.ToLowerInvariant().Contains("sheet")) + { + document.AddSupertypeName("Worksheet"); + document.AddSupertypeName("_Worksheet"); + } + } } } catch(OperationCanceledException) diff --git a/Rubberduck.Parsing/VBA/ReferenceManagement/DocumentModuleSuperTypeNamesProvider.cs b/Rubberduck.Parsing/VBA/ReferenceManagement/DocumentModuleSuperTypeNamesProvider.cs new file mode 100644 index 0000000000..4b564e65ef --- /dev/null +++ b/Rubberduck.Parsing/VBA/ReferenceManagement/DocumentModuleSuperTypeNamesProvider.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using Antlr4.Runtime.Tree; +using NLog; +using Rubberduck.Parsing.Common; +using Rubberduck.Parsing.ComReflection; +using Rubberduck.Parsing.Symbols; +using Rubberduck.Parsing.VBA.DeclarationCaching; +using Rubberduck.Parsing.VBA.Extensions; +using Rubberduck.Parsing.VBA.Parsing; +using Rubberduck.Parsing.VBA.ReferenceManagement.CompilationPasses; +using Rubberduck.VBEditor; +using Rubberduck.VBEditor.Extensions; + +namespace Rubberduck.Parsing.VBA.ReferenceManagement +{ + /// + /// An abstraction responsible for getting the SuperType names for a document module. + /// + public interface IDocumentModuleSuperTypeNamesProvider + { + IEnumerable GetSuperTypeNamesFor(DocumentModuleDeclaration document); + } + + /// + /// Gets the SuperType names for a document module using IComObject. + /// + public class DocumentModuleSuperTypeNamesProvider : IDocumentModuleSuperTypeNamesProvider + { + private readonly IUserComProjectProvider _userComProjectProvider; + + public DocumentModuleSuperTypeNamesProvider(IUserComProjectProvider userComProjectProvider) + { + _userComProjectProvider = userComProjectProvider; + } + + // skip IDispatch.. just about everything implements it and RD doesn't need to care about it; don't care about IUnknown either + private static readonly HashSet IgnoredComInterfaces = new HashSet(new[] { "IDispatch", "IUnknown" }); + + public IEnumerable GetSuperTypeNamesFor(DocumentModuleDeclaration document) + { + var userComProject = _userComProjectProvider.UserProject(document.ProjectId); + if (userComProject == null) + { + return Enumerable.Empty(); + } + + var comModule = userComProject.Members.SingleOrDefault(m => m.Name == document.ComponentName); + if (comModule == null) + { + return Enumerable.Empty(); + } + + var inheritedInterfaces = comModule is ComCoClass documentCoClass + ? documentCoClass.ImplementedInterfaces.ToList() + : (comModule as ComInterface)?.InheritedInterfaces.ToList(); + + if (inheritedInterfaces == null) + { + return Enumerable.Empty(); + } + + var relevantInterfaces = inheritedInterfaces + .Where(i => !i.IsRestricted && !IgnoredComInterfaces.Contains(i.Name)) + .ToList(); + + //todo: Find a way to deal with the VBE's document type assignment and interface behaviour not relying on an assumption about an interface naming conventions. + + //Some hosts like Access chose to have a separate hidden interface for each document module and only let that inherit the built-in base interface. + //Since we do not have a declaration for the hidden interface, we have to go one more step up the hierarchy. + var additionalInterfaces = relevantInterfaces + .Where(i => i.Name.Equals("_" + comModule.Name)) + .SelectMany(i => i.InheritedInterfaces) + .ToList(); + + relevantInterfaces.AddRange(additionalInterfaces); + + var superTypeNames = relevantInterfaces + .Select(i => i.Name) + .ToList(); + + //This emulates the VBE's behaviour to allow assignment to the coclass type instead on the interface. + var additionalSuperTypeNames = superTypeNames + .Where(name => name.StartsWith("_")) + .Select(name => name.Substring(1)) + .Where(name => !name.Equals(comModule.Name)) + .ToList(); + + superTypeNames.AddRange(additionalSuperTypeNames); + return superTypeNames.Distinct(); + } + } +} diff --git a/Rubberduck.Parsing/VBA/ReferenceManagement/ReferenceResolveRunner.cs b/Rubberduck.Parsing/VBA/ReferenceManagement/ReferenceResolveRunner.cs index b37aa0b666..413f31111a 100644 --- a/Rubberduck.Parsing/VBA/ReferenceManagement/ReferenceResolveRunner.cs +++ b/Rubberduck.Parsing/VBA/ReferenceManagement/ReferenceResolveRunner.cs @@ -20,12 +20,12 @@ public class ReferenceResolveRunner : ReferenceResolveRunnerBase IParserStateManager parserStateManager, IModuleToModuleReferenceManager moduleToModuleReferenceManager, IReferenceRemover referenceRemover, - IUserComProjectProvider userComProjectProvider) + IDocumentModuleSuperTypeNamesProvider documentModuleSuperTypeNamesProvider) :base(state, parserStateManager, moduleToModuleReferenceManager, referenceRemover, - userComProjectProvider) + documentModuleSuperTypeNamesProvider) {} diff --git a/Rubberduck.Parsing/VBA/ReferenceManagement/ReferenceResolveRunnerBase.cs b/Rubberduck.Parsing/VBA/ReferenceManagement/ReferenceResolveRunnerBase.cs index a609757a6b..f9a178036a 100644 --- a/Rubberduck.Parsing/VBA/ReferenceManagement/ReferenceResolveRunnerBase.cs +++ b/Rubberduck.Parsing/VBA/ReferenceManagement/ReferenceResolveRunnerBase.cs @@ -29,14 +29,14 @@ public abstract class ReferenceResolveRunnerBase : IReferenceResolveRunner protected readonly IParserStateManager _parserStateManager; private readonly IModuleToModuleReferenceManager _moduleToModuleReferenceManager; private readonly IReferenceRemover _referenceRemover; - private readonly IUserComProjectProvider _userComProjectProvider; + private readonly IDocumentModuleSuperTypeNamesProvider _superTypeNamesProvider; public ReferenceResolveRunnerBase( RubberduckParserState state, IParserStateManager parserStateManager, IModuleToModuleReferenceManager moduleToModuleReferenceManager, IReferenceRemover referenceRemover, - IUserComProjectProvider userComProjectProvider) + IDocumentModuleSuperTypeNamesProvider superTypeNamesProvider) { if (state == null) { @@ -54,16 +54,16 @@ public abstract class ReferenceResolveRunnerBase : IReferenceResolveRunner { throw new ArgumentNullException(nameof(referenceRemover)); } - if (userComProjectProvider == null) + if (superTypeNamesProvider == null) { - throw new ArgumentNullException(nameof(userComProjectProvider)); + throw new ArgumentNullException(nameof(superTypeNamesProvider)); } _state = state; _parserStateManager = parserStateManager; _moduleToModuleReferenceManager = moduleToModuleReferenceManager; _referenceRemover = referenceRemover; - _userComProjectProvider = userComProjectProvider; + _superTypeNamesProvider = superTypeNamesProvider; } @@ -88,7 +88,7 @@ public void ResolveReferences(IReadOnlyCollection toResolve var parsingStageTimer = ParsingStageTimer.StartNew(); - AddSuperTypeNamesForDocumentModules(_toResolve.AsReadOnly(), _state, _userComProjectProvider); + AddSuperTypeNamesForDocumentModules(_toResolve.AsReadOnly(), _state); token.ThrowIfCancellationRequested(); parsingStageTimer.Stop(); @@ -158,13 +158,8 @@ private void ExecuteCompilationPasses(IReadOnlyCollection m } } - // skip IDispatch.. just about everything implements it and RD doesn't need to care about it; don't care about IUnknown either - private static readonly HashSet IgnoredComInterfaces = new HashSet(new[] { "IDispatch", "IUnknown" }); - - private void AddSuperTypeNamesForDocumentModules(IReadOnlyCollection modules, RubberduckParserState state, IUserComProjectProvider userComProjectProvider) + private void AddSuperTypeNamesForDocumentModules(IReadOnlyCollection modules, RubberduckParserState state) { - //todo: Figure out how to unit test this. - var documentModuleDeclarationsByProject = state.DeclarationFinder.UserDeclarations(DeclarationType.Document) .OfType() .Where(declaration => modules.Contains(declaration.QualifiedName.QualifiedModuleName)) @@ -172,77 +167,17 @@ private void AddSuperTypeNamesForDocumentModules(IReadOnlyCollection module.IdentifierName); - foreach (var comModule in userComProject.Members) + foreach (var document in projectGroup.AsEnumerable()) { - if (!(documents.TryGetValue(comModule.Name, out var document))) - { - continue; - } - - var superTypeNames = SuperTypeNamesForDocumentFromComType(comModule); - + var superTypeNames = _superTypeNamesProvider.GetSuperTypeNamesFor(document); foreach (var superTypeName in superTypeNames) { - if (document.SupertypeNames.Contains(superTypeName)) - { - continue; - } - document.AddSupertypeName(superTypeName); } } } } - private static IEnumerable SuperTypeNamesForDocumentFromComType(IComType comModule) - { - var inheritedInterfaces = comModule is ComCoClass documentCoClass - ? documentCoClass.ImplementedInterfaces.ToList() - : (comModule as ComInterface)?.InheritedInterfaces.ToList(); - - if (inheritedInterfaces == null) - { - return Enumerable.Empty(); - } - - var relevantInterfaces = inheritedInterfaces - .Where(i => !i.IsRestricted && !IgnoredComInterfaces.Contains(i.Name)) - .ToList(); - - //todo: Find a way to deal with the VBE's document type assignment and interface behaviour not relying on an assumption about an interface naming conventions. - - //Some hosts like Access chose to have a separate hidden interface for each document module and only let that inherit the built-in base interface. - //Since we do not have a declaration for the hidden interface, we have to go one more step up the hierarchy. - var additionalInterfaces = relevantInterfaces - .Where(i => i.Name.Equals("_" + comModule.Name)) - .SelectMany(i => i.InheritedInterfaces) - .ToList(); - - relevantInterfaces.AddRange(additionalInterfaces); - - var superTypeNames = relevantInterfaces - .Select(i => i.Name) - .ToList(); - - //This emulates the VBE's behaviour to allow assignment to the coclass type instead on the interface. - var additionalSuperTypeNames = superTypeNames - .Where(name => name.StartsWith("_")) - .Select(name => name.Substring(1)) - .Where(name => !name.Equals(comModule.Name)) - .ToList(); - - superTypeNames.AddRange(additionalSuperTypeNames); - return superTypeNames; - } - protected void ResolveReferences(DeclarationFinder finder, QualifiedModuleName module, IParseTree tree, CancellationToken token) { token.ThrowIfCancellationRequested(); diff --git a/Rubberduck.Parsing/VBA/ReferenceManagement/SynchronousReferenceResolveRunner.cs b/Rubberduck.Parsing/VBA/ReferenceManagement/SynchronousReferenceResolveRunner.cs index 04ff280f64..e5572ba259 100644 --- a/Rubberduck.Parsing/VBA/ReferenceManagement/SynchronousReferenceResolveRunner.cs +++ b/Rubberduck.Parsing/VBA/ReferenceManagement/SynchronousReferenceResolveRunner.cs @@ -15,12 +15,12 @@ public class SynchronousReferenceResolveRunner : ReferenceResolveRunnerBase IParserStateManager parserStateManager, IModuleToModuleReferenceManager moduleToModuleReferenceManager, IReferenceRemover referenceRemover, - IUserComProjectProvider userComProjectProvider) + IDocumentModuleSuperTypeNamesProvider documentModuleSuperTypeNamesProvider) : base(state, parserStateManager, moduleToModuleReferenceManager, referenceRemover, - userComProjectProvider) + documentModuleSuperTypeNamesProvider) {} diff --git a/RubberduckBaseProject.csproj b/RubberduckBaseProject.csproj index a4b0d5d179..e69b3fd496 100644 --- a/RubberduckBaseProject.csproj +++ b/RubberduckBaseProject.csproj @@ -20,7 +20,7 @@ $(DisabledWarnings);4011;1001;1591 - 2.5.1 + 2.5.2 diff --git a/RubberduckTests/Inspections/ImplicitActiveSheetReferenceInspectionTests.cs b/RubberduckTests/Inspections/ImplicitActiveSheetReferenceInspectionTests.cs index b450db962f..e70b802e7d 100644 --- a/RubberduckTests/Inspections/ImplicitActiveSheetReferenceInspectionTests.cs +++ b/RubberduckTests/Inspections/ImplicitActiveSheetReferenceInspectionTests.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using System.Threading; using NUnit.Framework; @@ -13,6 +14,12 @@ namespace RubberduckTests.Inspections [TestFixture] public class ImplicitActiveSheetReferenceInspectionTests : InspectionTestsBase { + private static readonly IDictionary> DefaultDocumentModuleSupertypeNames = new Dictionary> + { + ["ThisWorkbook"] = new[] { "Workbook", "_Workbook" }, + ["Sheet1"] = new[] { "Worksheet", "_Worksheet" } + }; + [Test] [Category("Inspections")] public void ImplicitActiveSheetReference_ReportsRange() @@ -23,8 +30,13 @@ public void ImplicitActiveSheetReference_ReportsRange() arr1 = Range(""A1:B2"") End Sub "; - var modules = new(string, string, ComponentType)[] { ("Class1", inputCode, ComponentType.ClassModule) }; - Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel).Count()); + var modules = new(string, string, ComponentType)[] + { + ("ThisWorkbook", string.Empty, ComponentType.Document), + ("Sheet1", string.Empty, ComponentType.Document), + ("Class1", inputCode, ComponentType.ClassModule) + }; + Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count()); } [Test] @@ -37,8 +49,13 @@ public void ImplicitActiveSheetReference_ReportsCells() arr1 = Cells(1,2) End Sub "; - var modules = new (string, string, ComponentType)[] { ("Class1", inputCode, ComponentType.ClassModule) }; - Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel).Count()); + var modules = new (string, string, ComponentType)[] + { + ("ThisWorkbook", string.Empty, ComponentType.Document), + ("Sheet1", string.Empty, ComponentType.Document), + ("Class1", inputCode, ComponentType.ClassModule) + }; + Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count()); } [Test] @@ -51,8 +68,13 @@ public void ImplicitActiveSheetReference_ReportsColumns() arr1 = Columns(3) End Sub "; - var modules = new (string, string, ComponentType)[] { ("Class1", inputCode, ComponentType.ClassModule) }; - Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel).Count()); + var modules = new (string, string, ComponentType)[] + { + ("ThisWorkbook", string.Empty, ComponentType.Document), + ("Sheet1", string.Empty, ComponentType.Document), + ("Class1", inputCode, ComponentType.ClassModule) + }; + Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count()); } [Test] @@ -65,8 +87,13 @@ public void ImplicitActiveSheetReference_ReportsRows() arr1 = Rows(3) End Sub "; - var modules = new (string, string, ComponentType)[] { ("Class1", inputCode, ComponentType.ClassModule) }; - Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel).Count()); + var modules = new (string, string, ComponentType)[] + { + ("ThisWorkbook", string.Empty, ComponentType.Document), + ("Sheet1", string.Empty, ComponentType.Document), + ("Class1", inputCode, ComponentType.ClassModule) + }; + Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count()); } [Test] @@ -79,21 +106,13 @@ public void ImplicitActiveSheetReference_DoesNotReportInWorkSheetModules() arr1 = Cells(1,2) End Sub "; - var module = ("Sheet1", inputCode, ComponentType.Document); - var vbe = MockVbeBuilder.BuildFromModules(module, ReferenceLibrary.Excel).Object; - - using (var state = MockParser.CreateAndParse(vbe)) + var modules = new (string, string, ComponentType)[] { - var documentModule = state.DeclarationFinder.UserDeclarations(DeclarationType.Document) - .OfType() - .Single(); - documentModule.AddSupertypeName("Worksheet"); - - var inspection = InspectionUnderTest(state); - var inspectionResults = inspection.GetInspectionResults(CancellationToken.None); - - Assert.AreEqual(0, inspectionResults.Count()); - } + ("ThisWorkbook", string.Empty, ComponentType.Document), + ("Sheet1", inputCode, ComponentType.Document), + ("Class1", string.Empty, ComponentType.ClassModule) + }; + Assert.AreEqual(0, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count()); } [Test] @@ -106,21 +125,33 @@ public void ImplicitActiveSheetReference_ReportsInWorkbookModules() arr1 = Cells(1,2) End Sub "; - var module = ("Sheet1", inputCode, ComponentType.Document); - var vbe = MockVbeBuilder.BuildFromModules(module, ReferenceLibrary.Excel).Object; - - using (var state = MockParser.CreateAndParse(vbe)) + var modules = new (string, string, ComponentType)[] { - var documentModule = state.DeclarationFinder.UserDeclarations(DeclarationType.Document) - .OfType() - .Single(); - documentModule.AddSupertypeName("Workbook"); - - var inspection = InspectionUnderTest(state); - var inspectionResults = inspection.GetInspectionResults(CancellationToken.None); + ("ThisWorkbook", inputCode, ComponentType.Document), + ("Sheet1", string.Empty, ComponentType.Document), + ("Class1", string.Empty, ComponentType.ClassModule) + }; + Assert.AreEqual(1, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count()); + } - Assert.AreEqual(1, inspectionResults.Count()); - } + [Test] + [Category("Inspections")] + public void ImplicitActiveSheetReference_NoResultForWorksheetVariable() + { + const string inputCode = + @"Sub foo() + Dim sh As Worksheet + Set sh = Sheet1 + Debug.Print sh.Cells(1, 1) +End Sub +"; + var modules = new (string, string, ComponentType)[] + { + ("ThisWorkbook", string.Empty, ComponentType.Document), + ("Sheet1", string.Empty, ComponentType.Document), + ("Module1", inputCode, ComponentType.StandardModule) + }; + Assert.AreEqual(0, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count()); } [Test] @@ -135,9 +166,14 @@ public void ImplicitActiveSheetReference_Ignored_DoesNotReportRange() arr1 = Range(""A1:B2"") End Sub "; + var modules = new (string, string, ComponentType)[] + { + ("ThisWorkbook", string.Empty, ComponentType.Document), + ("Sheet1", string.Empty, ComponentType.Document), + ("Class1", inputCode, ComponentType.ClassModule) + }; - var modules = new(string, string, ComponentType)[] { ("Class1", inputCode, ComponentType.ClassModule) }; - Assert.AreEqual(0, InspectionResultsForModules(modules, ReferenceLibrary.Excel).Count()); + Assert.AreEqual(0, InspectionResultsForModules(modules, ReferenceLibrary.Excel, DefaultDocumentModuleSupertypeNames).Count()); } [Test] diff --git a/RubberduckTests/Inspections/InspectionTestsBase.cs b/RubberduckTests/Inspections/InspectionTestsBase.cs index 2b4fc058e8..c25f4672c6 100644 --- a/RubberduckTests/Inspections/InspectionTestsBase.cs +++ b/RubberduckTests/Inspections/InspectionTestsBase.cs @@ -29,27 +29,27 @@ public IEnumerable InspectionResultsForModules(params (string return InspectionResults(vbe); } - public IEnumerable InspectionResultsForModules(IEnumerable<(string name, string content, ComponentType componentType)> modules) + public IEnumerable InspectionResultsForModules(IEnumerable<(string name, string content, ComponentType componentType)> modules, IDictionary> documentModuleSupertypeNames = null) { var vbe = MockVbeBuilder.BuildFromModules(modules).Object; - return InspectionResults(vbe); + return InspectionResults(vbe, documentModuleSupertypeNames); } public IEnumerable InspectionResultsForModules((string name, string content, ComponentType componentType) module, params ReferenceLibrary[] libraries) => InspectionResultsForModules(new (string, string, ComponentType)[] { module }, libraries); - public IEnumerable InspectionResultsForModules(IEnumerable<(string name, string content, ComponentType componentType)> modules, ReferenceLibrary library) - => InspectionResultsForModules(modules, new ReferenceLibrary[] { library }); + public IEnumerable InspectionResultsForModules(IEnumerable<(string name, string content, ComponentType componentType)> modules, ReferenceLibrary library, IDictionary> documentModuleSupertypeNames = null) + => InspectionResultsForModules(modules, new ReferenceLibrary[] { library }, documentModuleSupertypeNames); - public IEnumerable InspectionResultsForModules(IEnumerable<(string name, string content, ComponentType componentType)> modules, IEnumerable libraries) + public IEnumerable InspectionResultsForModules(IEnumerable<(string name, string content, ComponentType componentType)> modules, IEnumerable libraries, IDictionary> documentModuleSupertypeNames = null) { var vbe = MockVbeBuilder.BuildFromModules(modules, libraries).Object; - return InspectionResults(vbe); + return InspectionResults(vbe, documentModuleSupertypeNames); } - public IEnumerable InspectionResults(IVBE vbe) + public IEnumerable InspectionResults(IVBE vbe, IDictionary> documentModuleSupertypeNames = null) { - using (var state = MockParser.CreateAndParse(vbe)) + using (var state = MockParser.CreateAndParse(vbe, documentModuleSupertypeNames:documentModuleSupertypeNames)) { var inspection = InspectionUnderTest(state); return InspectionResults(inspection, state); diff --git a/RubberduckTests/Inspections/SheetAccessedUsingStringInspectionTests.cs b/RubberduckTests/Inspections/SheetAccessedUsingStringInspectionTests.cs index df237582a3..2123eb16b7 100644 --- a/RubberduckTests/Inspections/SheetAccessedUsingStringInspectionTests.cs +++ b/RubberduckTests/Inspections/SheetAccessedUsingStringInspectionTests.cs @@ -14,6 +14,13 @@ namespace RubberduckTests.Inspections [TestFixture] public class SheetAccessedUsingStringInspectionTests : InspectionTestsBase { + private static readonly IDictionary> DefaultDocumentModuleSupertypeNames = new Dictionary> + { + ["ThisWorkbook"] = new[] { "Workbook", "_Workbook" }, + ["Sheet1"] = new[] { "Worksheet", "_Worksheet" } + }; + + [Test] [Category("Inspections")] public void SheetAccessedUsingString_ReturnsResult_AccessingUsingWorkbookModule() @@ -24,7 +31,20 @@ public void SheetAccessedUsingString_ReturnsResult_AccessingUsingWorkbookModule( ThisWorkbook.Sheets(""Sheet1"").Range(""A1"") = ""Foo"" End Sub"; - Assert.AreEqual(2, ArrangeParserAndGetResults(inputCode).Count()); + Assert.AreEqual(2, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); + } + + [Test] + [Category("Inspections")] + public void SheetAccessedUsingString_ReturnsResult_InThisWorkbookModule() + { + const string inputCode = + @"Public Sub Foo() + Me.Worksheets(""Sheet1"").Range(""A1"") = ""Foo"" + Sheets(""Sheet1"").Range(""A1"") = ""Foo"" +End Sub"; + var results = ArrangeParserAndGetResults(inputCode, sheetName: "Sheet1", componentType: ComponentType.Document, workbookModule: true).ToList(); + Assert.AreEqual(2, results.Count); } [Test] @@ -50,7 +70,7 @@ public void SheetAccessedUsingString_ReturnsResult_CodeNameAndSheetNameDifferent ThisWorkbook.Sheets(""NotSheet1"").Range(""A1"") = ""Foo"" End Sub"; - Assert.AreEqual(2, ArrangeParserAndGetResults(inputCode, "NotSheet1").Count()); + Assert.AreEqual(2, ArrangeParserAndGetResults(inputCode, "NotSheet1", codeName:"Sheet1").Count()); } [Test] @@ -63,7 +83,7 @@ public void SheetAccessedUsingString_ReturnsResult_SheetNameContainsDoubleQuotes ThisWorkbook.Sheets(""She""""et1"").Range(""A1"") = ""Foo"" End Sub"; - Assert.AreEqual(2, ArrangeParserAndGetResults(inputCode, "She\"et1").Count()); + Assert.AreEqual(2, ArrangeParserAndGetResults(inputCode, "She\"et1", codeName:"Sheet1").Count()); } [Test] @@ -77,7 +97,7 @@ public void SheetAccessedUsingString_ReturnsNoResult_AccessingUsingApplicationMo Application.Sheets(""Sheet1"").Range(""A1"") = ""Foo"" End Sub"; - Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode).Count()); + Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); } [Test] @@ -91,11 +111,11 @@ public void SheetAccessedUsingString_ReturnsNoResult_AccessingUsingGlobalModule( Sheets(""Sheet1"").Range(""A1"") = ""Foo"" End Sub"; - Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode).Count()); + Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); } [Test] - [Ignore("Ref #4329")] + //[Ignore("Ref #4329")] [Category("Inspections")] public void SheetAccessedUsingString_DoesNotReturnResult_AccessingUsingActiveWorkbookProperty() { @@ -104,11 +124,11 @@ public void SheetAccessedUsingString_DoesNotReturnResult_AccessingUsingActiveWor ActiveWorkbook.Worksheets(""Sheet1"").Range(""A1"") = ""Foo"" ActiveWorkbook.Sheets(""Sheet1"").Range(""A1"") = ""Foo"" End Sub"; - Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode).Count()); + Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); } [Test] - [Ignore("Ref #4329")] + //[Ignore("Ref #4329")] [Category("Inspections")] public void SheetAccessedUsingString_DoesNotReturnResult_AccessingUsingWorkbooksProperty() { @@ -117,11 +137,11 @@ public void SheetAccessedUsingString_DoesNotReturnResult_AccessingUsingWorkbooks Workbooks(""Foo"").Worksheets(""Sheet1"").Range(""A1"") = ""Foo"" Workbooks(""Foo"").Sheets(""Sheet1"").Range(""A1"") = ""Foo"" End Sub"; - Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode).Count()); + Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); } [Test] - [Ignore("Ref #4329")] + //[Ignore("Ref #4329")] [Category("Inspections")] public void SheetAccessedUsingString_DoesNotReturnResult_AccessingUsingWorkbookVariable() { @@ -132,11 +152,11 @@ public void SheetAccessedUsingString_DoesNotReturnResult_AccessingUsingWorkbookV wkb.Worksheets(""Sheet1"").Range(""A1"") = ""Foo"" wkb.Sheets(""Sheet1"").Range(""A1"") = ""Foo"" End Sub"; - Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode).Count()); + Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); } [Test] - [Ignore("Ref #4329")] + //[Ignore("Ref #4329")] [Category("Inspections")] public void SheetAccessedUsingString_DoesNotReturnResult_AccessingUsingWorkbookProperty() { @@ -150,11 +170,11 @@ End Property MyWorkbook.Worksheets(""Sheet1"").Range(""A1"") = ""Foo"" MyWorkbook.Sheets(""Sheet1"").Range(""A1"") = ""Foo"" End Sub"; - Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode).Count()); + Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); } [Test] - [Ignore("Ref #4329")] + //[Ignore("Ref #4329")] [Category("Inspections")] public void SheetAccessedUsingString_DoesNotReturnResult_AccessingUsingWithBlockVariable() { @@ -165,7 +185,7 @@ With Workbooks(""Foo"") .Sheets(""Sheet1"").Range(""A1"") = ""Foo"" End With End Sub"; - Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode).Count()); + Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); } [Test] @@ -178,7 +198,7 @@ public void SheetAccessedUsingString_DoesNotReturnResult_NoSheetWithGivenNameExi ThisWorkbook.Sheets(""BadName"").Range(""A1"") = ""Foo"" End Sub"; - Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode).Count()); + Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); } [Test] @@ -192,7 +212,21 @@ public void SheetAccessedUsingString_DoesNotReturnResult_SheetWithGivenNameExist End Sub"; // Referenced project is created inside helper method - Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode).Count()); + Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); + } + + [Test] + [Category("Inspections")] + public void SheetAccessedUsingString_DoesNotReturnResult_ReferencedProjectQualified() + { + const string inputCode = + @"Public Sub Foo() + ReferencedProject.ThisWorkbook.Worksheets(""SheetFromOtherProject"").Range(""A1"") = ""Foo"" + ReferencedProject.ThisWorkbook.Sheets(""SheetFromOtherProject"").Range(""A1"") = ""Foo"" +End Sub"; + + // Referenced project is created inside helper method + Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); } [Test] @@ -208,15 +242,20 @@ public void SheetAccessedUsingString_DoesNotReturnResult_AccessingUsingVariable( ThisWorkbook.Sheets(s).Range(""A1"") = ""Foo"" End Sub"; - Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode).Count()); + Assert.AreEqual(0, ArrangeParserAndGetResults(inputCode, "Sheet1").Count()); } - private IEnumerable ArrangeParserAndGetResults(string inputCode, string sheetName = "Sheet1") + private IEnumerable ArrangeParserAndGetResults(string inputCode, string sheetName = "Sheet1", string codeName = null, ComponentType componentType = ComponentType.StandardModule, bool workbookModule = false) { var builder = new MockVbeBuilder(); var referencedProject = builder.ProjectBuilder("ReferencedProject", ProjectProtection.Unprotected) - .AddComponent("SheetFromOtherProject", ComponentType.Document, "", + .AddComponent("ThisWorkbook", ComponentType.Document, string.Empty, + properties: new[] + { + CreateVBComponentPropertyMock("Name", "ThisWorkbook").Object, + }) + .AddComponent("SheetFromOtherProject", ComponentType.Document, string.Empty, properties: new[] { CreateVBComponentPropertyMock("Name", "SheetFromOtherProject").Object, @@ -224,21 +263,29 @@ private IEnumerable ArrangeParserAndGetResults(string inputCo }) .Build(); - var project = builder.ProjectBuilder("VBAProject", ProjectProtection.Unprotected) - .AddComponent("Module1", ComponentType.StandardModule, inputCode) - .AddComponent("Sheet1", ComponentType.Document, "", + var projectBuilder = builder.ProjectBuilder("VBAProject", ProjectProtection.Unprotected) + .AddComponent("ThisWorkbook", ComponentType.Document, componentType == ComponentType.Document && workbookModule ? inputCode : string.Empty, + properties: new[] + { + CreateVBComponentPropertyMock("Name", "ThisWorkbook").Object, + }) + .AddComponent(sheetName, ComponentType.Document, componentType == ComponentType.Document && !workbookModule ? inputCode : string.Empty, properties: new[] { CreateVBComponentPropertyMock("Name", sheetName).Object, - CreateVBComponentPropertyMock("CodeName", "Sheet1").Object + CreateVBComponentPropertyMock("CodeName", codeName ?? sheetName).Object }) .AddReference("ReferencedProject", string.Empty, 0, 0) - .AddReference(ReferenceLibrary.Excel) - .Build(); + .AddReference(ReferenceLibrary.Excel); + if (componentType == ComponentType.StandardModule) + { + projectBuilder.AddComponent("Module1", ComponentType.StandardModule, inputCode); + } + var project = projectBuilder.Build(); var vbe = builder.AddProject(referencedProject).AddProject(project).Build(); - return InspectionResults(vbe.Object); + return InspectionResults(vbe.Object, DefaultDocumentModuleSupertypeNames); } // ReSharper disable once InconsistentNaming diff --git a/RubberduckTests/Mocks/MockParser.cs b/RubberduckTests/Mocks/MockParser.cs index ad56b93ad6..237b9240aa 100644 --- a/RubberduckTests/Mocks/MockParser.cs +++ b/RubberduckTests/Mocks/MockParser.cs @@ -47,25 +47,26 @@ public static RubberduckParserState ParseString(string inputCode, out QualifiedM return parser.State; } - public static (SynchronousParseCoordinator parser, IRewritingManager rewritingManager) CreateWithRewriteManager(IVBE vbe, string serializedComProjectsPath = null, Mock vbeEvents = null) + public static (SynchronousParseCoordinator parser, IRewritingManager rewritingManager) CreateWithRewriteManager(IVBE vbe, string serializedComProjectsPath = null, Mock vbeEvents = null, IDictionary> documentModuleSupertypeNames = null) { var declarationFinderFactory = new DeclarationFinderFactory(); var projectRepository = new ProjectsRepository(vbe); var state = new RubberduckParserState(vbe, projectRepository, declarationFinderFactory, vbeEvents?.Object ?? MockVbeEvents.CreateMockVbeEvents(new Mock()).Object); - return CreateWithRewriteManager(vbe, state, projectRepository, serializedComProjectsPath); + return CreateWithRewriteManager(vbe, state, projectRepository, serializedComProjectsPath, documentModuleSupertypeNames); } - public static SynchronousParseCoordinator Create(IVBE vbe, string serializedDeclarationsPath = null, Mock vbeEvents = null) + public static SynchronousParseCoordinator Create(IVBE vbe, string serializedDeclarationsPath = null, Mock vbeEvents = null, IDictionary> documentModuleSupertypeNames = null) { - return CreateWithRewriteManager(vbe, serializedDeclarationsPath, vbeEvents).parser; + return CreateWithRewriteManager(vbe, serializedDeclarationsPath, vbeEvents, documentModuleSupertypeNames).parser; } - public static (SynchronousParseCoordinator parser, IRewritingManager rewritingManager) CreateWithRewriteManager(IVBE vbe, RubberduckParserState state, IProjectsRepository projectRepository, string serializedComProjectsPath = null) + public static (SynchronousParseCoordinator parser, IRewritingManager rewritingManager) CreateWithRewriteManager(IVBE vbe, RubberduckParserState state, IProjectsRepository projectRepository, string serializedComProjectsPath = null, IDictionary> documentModuleSupertypeNames = null) { var vbeVersion = double.Parse(vbe.Version, CultureInfo.InvariantCulture); var compilationArgumentsProvider = MockCompilationArgumentsProvider(vbeVersion); var compilationsArgumentsCache = new CompilationArgumentsCache(compilationArgumentsProvider); var userComProjectsRepository = MockUserComProjectRepository(); + var documentSuperTypesProvider = MockDocumentSuperTypeNamesProvider(documentModuleSupertypeNames); var ignoredProjectsSettingsProvider = MockIgnoredProjectsSettingsProviderMock(); var projectsToBeLoadedFromComSelector = new ProjectsToResolveFromComProjectsSelector(projectRepository, ignoredProjectsSettingsProvider); @@ -125,7 +126,7 @@ public static (SynchronousParseCoordinator parser, IRewritingManager rewritingMa parserStateManager, moduleToModuleReferenceManager, referenceRemover, - userComProjectsRepository); + documentSuperTypesProvider); var parsingStageService = new ParsingStageService( comSynchronizer, builtInDeclarationLoader, @@ -179,6 +180,30 @@ public static SynchronousParseCoordinator Create(IVBE vbe, RubberduckParserState return CreateWithRewriteManager(vbe, state, projectRepository, serializedComProjectsPath).parser; } + private static IDocumentModuleSuperTypeNamesProvider MockDocumentSuperTypeNamesProvider(IDictionary> documentModuleSupertypeNames = null) + { + var mock = new Mock(); + if (documentModuleSupertypeNames == null) + { + return mock.Object; + } + + mock.Setup(m => m.GetSuperTypeNamesFor(It.IsAny())) + .Returns(declaration => + { + if (documentModuleSupertypeNames.TryGetValue(declaration.IdentifierName, out var superTypeNames)) + { + return superTypeNames; + } + else + { + return Enumerable.Empty(); + } + }); + + return mock.Object; + } + private static IUserComProjectRepository MockUserComProjectRepository() { var userComProjectsRepository = new Mock(); @@ -209,9 +234,9 @@ private static ICompilationArgumentsProvider MockCompilationArgumentsProvider(do return compilationArgumentsProvider; } - public static (RubberduckParserState state, IRewritingManager rewritingManager) CreateAndParseWithRewritingManager(IVBE vbe, string serializedComProjectsPath = null) + public static (RubberduckParserState state, IRewritingManager rewritingManager) CreateAndParseWithRewritingManager(IVBE vbe, string serializedComProjectsPath = null, IDictionary> documentModuleSupertypeNames = null) { - var (parser, rewritingManager) = CreateWithRewriteManager(vbe, serializedComProjectsPath); + var (parser, rewritingManager) = CreateWithRewriteManager(vbe, serializedComProjectsPath, documentModuleSupertypeNames:documentModuleSupertypeNames); parser.Parse(new CancellationTokenSource()); if (parser.State.Status >= ParserState.Error) { @@ -221,16 +246,8 @@ public static (RubberduckParserState state, IRewritingManager rewritingManager) return (parser.State, rewritingManager); } - public static RubberduckParserState CreateAndParse(IVBE vbe, string serializedComProjectsPath = null) - { - return CreateAndParseWithRewritingManager(vbe, serializedComProjectsPath).state; - } - - private static readonly HashSet ProceduralTypes = - new HashSet(new[] - { - DeclarationType.Procedure, DeclarationType.Function, DeclarationType.PropertyGet, - DeclarationType.PropertyLet, DeclarationType.PropertySet - }); + public static RubberduckParserState CreateAndParse(IVBE vbe, string serializedComProjectsPath = null, IDictionary> documentModuleSupertypeNames = null) => + CreateAndParseWithRewritingManager(vbe, serializedComProjectsPath, documentModuleSupertypeNames:documentModuleSupertypeNames).state; + } } diff --git a/RubberduckTests/QuickFixes/AccessSheetUsingCodeNameQuickFixTests.cs b/RubberduckTests/QuickFixes/AccessSheetUsingCodeNameQuickFixTests.cs index 276d638f67..97b1564101 100644 --- a/RubberduckTests/QuickFixes/AccessSheetUsingCodeNameQuickFixTests.cs +++ b/RubberduckTests/QuickFixes/AccessSheetUsingCodeNameQuickFixTests.cs @@ -180,7 +180,7 @@ public void SheetAccessedUsingString_QuickFixWorks_SheetNameDifferentThanSheetCo const string inputCode = @" Public Sub Foo() Dim ws As Worksheet - Set ws = ThisWorkbook.Worksheets(""Name"") + Set ws = ThisWorkbook.Worksheets(""Sheet2"") ws.Cells(1, 1) = ""foo"" End Sub @@ -216,26 +216,30 @@ protected override IVBE TestVbe(string code, out IVBComponent component) private IVBE TestVbe(string code, string sheetName, out IVBComponent component) { var builder = new MockVbeBuilder(); - var project = builder.ProjectBuilder("VBAProject", ProjectProtection.Unprotected) - .AddComponent("Module1", ComponentType.StandardModule, code) - .AddComponent("Sheet1", ComponentType.Document, "", - properties: new[] - { + var projectBuilder = builder + .ProjectBuilder("VBAProject", ProjectProtection.Unprotected) + .AddComponent("ThisWorkbook", ComponentType.Document, string.Empty, + properties: new[] { + CreateVBComponentPropertyMock("Name", "ThisWorkbook").Object, + }) + .AddComponent("Sheet1", ComponentType.Document, string.Empty, + properties: new[] { CreateVBComponentPropertyMock("Name", sheetName).Object, CreateVBComponentPropertyMock("CodeName", "Sheet1").Object }) - .AddComponent("SheetWithDifferentCodeName", ComponentType.Document, "", - properties: new[] - { - CreateVBComponentPropertyMock("Name", "Name").Object, + .AddComponent("CodeName", ComponentType.Document, string.Empty, + properties: new[] { + CreateVBComponentPropertyMock("Name", "Sheet2").Object, CreateVBComponentPropertyMock("CodeName", "CodeName").Object }) .AddReference(ReferenceLibrary.Excel) - .Build(); - - component = project.Object.VBComponents[0]; + .AddComponent("Module1", ComponentType.StandardModule, code); - return builder.AddProject(project).Build().Object; + var mockProject = projectBuilder.Build().Object; + component = mockProject.VBComponents["Module1"]; + var project = projectBuilder.Build(); + var vbe = builder.AddProject(project).Build(); + return vbe.Object; } private static Mock CreateVBComponentPropertyMock(string propertyName, string propertyValue) diff --git a/RubberduckTests/QuickFixes/QuickFixTestBase.cs b/RubberduckTests/QuickFixes/QuickFixTestBase.cs index 5a0ac8167b..a8d3a1bf86 100644 --- a/RubberduckTests/QuickFixes/QuickFixTestBase.cs +++ b/RubberduckTests/QuickFixes/QuickFixTestBase.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading; using Antlr4.Runtime.Tree; +using Moq; using Rubberduck.CodeAnalysis.Inspections; using Rubberduck.CodeAnalysis.QuickFixes; using Rubberduck.Parsing.Rewriter; @@ -18,11 +19,51 @@ namespace RubberduckTests.QuickFixes { public abstract class QuickFixTestBase { + private static readonly IDictionary> DefaultDocumentModuleSupertypeNames = new Dictionary> + { + ["ThisWorkbook"] = new[] { "Workbook", "_Workbook" }, + ["Sheet1"] = new[] { "Worksheet", "_Worksheet" }, + ["CodeName"] = new[] { "Worksheet", "_Worksheet" }, + }; + protected abstract IQuickFix QuickFix(RubberduckParserState state); protected virtual IVBE TestVbe(string code, out IVBComponent component) { - return MockVbeBuilder.BuildFromSingleStandardModule(code, out component).Object; + var builder = new MockVbeBuilder(); + var projectBuilder = builder + .ProjectBuilder("VBAProject", ProjectProtection.Unprotected) + .AddComponent("ThisWorkbook", ComponentType.Document, string.Empty, + properties: new[] { + CreateVBComponentPropertyMock("Name", "ThisWorkbook").Object, + }) + .AddComponent("Sheet1", ComponentType.Document, string.Empty, + properties: new[] { + CreateVBComponentPropertyMock("Name", "Sheet1").Object, + CreateVBComponentPropertyMock("CodeName", "Sheet1").Object + }) + .AddComponent("CodeName", ComponentType.Document, string.Empty, + properties: new[] { + CreateVBComponentPropertyMock("Name", "Sheet2").Object, + CreateVBComponentPropertyMock("CodeName", "CodeName").Object + }) + .AddReference(ReferenceLibrary.Excel) + .AddComponent("Module1", ComponentType.StandardModule, code); + + var mockProject = projectBuilder.Build().Object; + component = mockProject.VBComponents["Module1"]; + var project = projectBuilder.Build(); + var vbe = builder.AddProject(project).Build(); + return vbe.Object; + } + + private static Mock CreateVBComponentPropertyMock(string propertyName, string propertyValue) + { + var propertyMock = new Mock(); + propertyMock.SetupGet(m => m.Name).Returns(propertyName); + propertyMock.SetupGet(m => m.Value).Returns(propertyValue); + + return propertyMock; } protected string ApplyQuickFixToFirstInspectionResult(string inputCode, @@ -71,7 +112,7 @@ protected virtual IVBE TestVbe(string code, out IVBComponent component) Action, IRewriteSession> applyQuickFix, CodeKind codeKind) { - var (state, rewriteManager) = MockParser.CreateAndParseWithRewritingManager(vbe); + var (state, rewriteManager) = MockParser.CreateAndParseWithRewritingManager(vbe, documentModuleSupertypeNames: DefaultDocumentModuleSupertypeNames); using (state) { var inspection = inspectionFactory(state); diff --git a/appveyor.yml b/appveyor.yml index e3e11eb06f..54b3aef213 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: '2.5.1.{build}' +version: '2.5.2.{build}' # enforce crlf fixing init: