Skip to content

Commit 5c636bf

Browse files
committed
Merge remote-tracking branch 'upstream/next' into Issue5109_Consolidate_copy_command_logic
2 parents 6713c2d + 5b12624 commit 5c636bf

File tree

90 files changed

+1673
-5455
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+1673
-5455
lines changed

Rubberduck.CodeAnalysis/Inspections/Concrete/ImplicitDefaultMemberAccessInspection.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ namespace Rubberduck.Inspections.Concrete
4545
/// arg.ConnectionString = bar
4646
/// End Sub
4747
/// ]]>
48+
/// </example>
4849
public sealed class ImplicitDefaultMemberAccessInspection : IdentifierReferenceInspectionBase
4950
{
5051
public ImplicitDefaultMemberAccessInspection(RubberduckParserState state)

Rubberduck.CodeAnalysis/Inspections/Concrete/ImplicitUnboundDefaultMemberAccessInspection.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ namespace Rubberduck.Inspections.Concrete
2424
/// bar = arg
2525
/// End Sub
2626
/// ]]>
27+
/// </example>
2728
/// <example hasresult="true">
2829
/// <![CDATA[
2930
/// Public Sub DoSomething(ByVal arg As Object)
@@ -39,6 +40,7 @@ namespace Rubberduck.Inspections.Concrete
3940
/// bar = arg.SomeValueReturningMember
4041
/// End Sub
4142
/// ]]>
43+
/// </example>
4244
/// <example hasresult="false">
4345
/// <![CDATA[
4446
/// Public Sub DoSomething(ByVal arg As Object)

Rubberduck.Core/UI/Inspections/InspectionResultsControl.xaml

Lines changed: 190 additions & 187 deletions
Large diffs are not rendered by default.

Rubberduck.Core/UI/Inspections/InspectionResultsControl.xaml.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,10 @@ public InspectionResultsControl()
1111
{
1212
InitializeComponent();
1313
}
14+
15+
private void InspectionResultsGrid_RequestBringIntoView(object sender, System.Windows.RequestBringIntoViewEventArgs e)
16+
{
17+
e.Handled = true;
18+
}
1419
}
1520
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System.Runtime.InteropServices.ComTypes;
2+
3+
namespace Rubberduck.JunkDrawer.Hacks
4+
{
5+
public static class VarDescExtensions
6+
{
7+
/// <remarks>
8+
/// Use only with VBA-supplied <see cref="ITypeInfo"/> which may return a <see cref="VARDESC"/> that do not conform to
9+
/// the MS-OAUT in describing the constants. See section 2.2.43 at: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-oaut/ae7791d2-4399-4dff-b7c6-b0d4f3dce982
10+
///
11+
/// To further complicate the situation, on 64-bit platform, the <see cref="VARDESC.DESCUNION.oInst"/> is a 32-bit integer whereas
12+
/// the <see cref="VARDESC.DESCUNION.lpvarValue"/> is a pointer. On 32-bit platform, the sizes of 2 members are exactly same so no
13+
/// problem. But on 64-bit platform, setting the <c>oInst</c>to 0 does not necessarily zero-initialize the entire region. Thus, the
14+
/// upper 32-bit part of the <c>lpvarValue</c> can contain garbage which will confound the simple null pointer check. Thus to guard
15+
/// against this, we will check the <c>oInst</c> value to see if it's zero.
16+
///
17+
/// There is a small but non-zero chance that there might be a valid pointer that happens to be only in high half of the address...
18+
/// in that case, it'll be wrong but since VBA is always writing <see cref="VARKIND.VAR_STATIC"/> to the <see cref="VARDESC.varkind"/>
19+
/// field, we're kind of stuck...
20+
/// </remarks>
21+
/// <param name="varDesc">The <see cref="VARDESC"/> from a VBA <see cref="ITypeInfo"/></param>
22+
/// <returns>True if this is most likely a constant. False when it's definitely not.</returns>
23+
public static bool IsValidVBAConstant(this VARDESC varDesc)
24+
{
25+
return varDesc.varkind == VARKIND.VAR_STATIC && varDesc.desc.oInst != 0;
26+
}
27+
}
28+
}

Rubberduck.Parsing/ComReflection/ComModule.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
using TYPEATTR = System.Runtime.InteropServices.ComTypes.TYPEATTR;
1212
using VARDESC = System.Runtime.InteropServices.ComTypes.VARDESC;
1313
using CALLCONV = System.Runtime.InteropServices.ComTypes.CALLCONV;
14+
using Rubberduck.VBEditor.ComManagement.TypeLibs.Abstract;
15+
using Rubberduck.JunkDrawer.Hacks;
1416

1517
namespace Rubberduck.Parsing.ComReflection
1618
{
@@ -58,7 +60,15 @@ private void GetComFields(ITypeInfo info, TYPEATTR attrib)
5860
info.GetNames(desc.memid, names, names.Length, out int length);
5961
Debug.Assert(length == 1);
6062

61-
var type = desc.desc.lpvarValue == IntPtr.Zero ? DeclarationType.Variable : DeclarationType.Constant;
63+
DeclarationType type;
64+
if(info is ITypeInfoWrapper wrapped && wrapped.HasVBEExtensions)
65+
{
66+
type = desc.IsValidVBAConstant() ? DeclarationType.Constant : DeclarationType.Variable;
67+
}
68+
else
69+
{
70+
type = desc.varkind == VARKIND.VAR_CONST ? DeclarationType.Constant : DeclarationType.Variable;
71+
}
6272

6373
_fields.Add(new ComField(this, info, names[0], desc, index, type));
6474
}

Rubberduck.VBEEditor/ComManagement/TypeLibs/TypeInfoConstantsCollection.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
using System;
2-
using System.Collections.Generic;
1+
using System.Collections.Generic;
32
using System.Runtime.InteropServices.ComTypes;
3+
using Rubberduck.JunkDrawer.Hacks;
44
using Rubberduck.VBEditor.ComManagement.TypeLibs.Abstract;
55
using Rubberduck.VBEditor.ComManagement.TypeLibs.Unmanaged;
66
using TYPEATTR = System.Runtime.InteropServices.ComTypes.TYPEATTR;
@@ -45,9 +45,8 @@ public TypeInfoConstantsCollection(ITypeInfo parent, TYPEATTR attributes) :
4545
parent.GetVarDesc(i, out var ppVarDesc);
4646
var varDesc = StructHelper.ReadStructureUnsafe<VARDESC>(ppVarDesc);
4747

48-
// VBA constants are "static".... go figure. We can still infer it is a
49-
// constant rather than a field by checking the lpvarValue
50-
if (varDesc.varkind == VARKIND.VAR_STATIC && varDesc.desc.lpvarValue != IntPtr.Zero)
48+
// VBA constants are "static".... go figure.
49+
if (varDesc.IsValidVBAConstant())
5150
{
5251
_mapper.Add(_mapper.Count, i);
5352
}

Rubberduck.VBEEditor/Rubberduck.VBEditor.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<Reference Include="System.Windows.Forms" />
2323
</ItemGroup>
2424
<ItemGroup>
25+
<ProjectReference Include="..\Rubberduck.JunkDrawer\Rubberduck.JunkDrawer.csproj" />
2526
<ProjectReference Include="..\Rubberduck.Resources\Rubberduck.Resources.csproj" />
2627
</ItemGroup>
2728
<ItemGroup>

RubberduckTests/Inspections/ApplicationWorksheetFunctionInspectionTests.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,18 @@
11
using System.Collections.Generic;
22
using System.Linq;
3-
using System.Threading;
43
using NUnit.Framework;
54
using Rubberduck.Inspections.Concrete;
65
using Rubberduck.Parsing.Inspections.Abstract;
76
using Rubberduck.Parsing.VBA;
87
using Rubberduck.VBEditor.SafeComWrappers;
9-
using RubberduckTests.Mocks;
108

119
namespace RubberduckTests.Inspections
1210
{
1311
[TestFixture]
1412
public class ApplicationWorksheetFunctionInspectionTests : InspectionTestsBase
1513
{
1614
private IEnumerable<IInspectionResult> GetInspectionResultsUsingExcelLibrary(string inputCode)
17-
{
18-
var builder = new MockVbeBuilder();
19-
var project = builder.ProjectBuilder("VBAProject", ProjectProtection.Unprotected)
20-
.AddComponent("Module1", ComponentType.StandardModule, inputCode)
21-
.AddReference("Excel", MockVbeBuilder.LibraryPathMsExcel, 1, 8, true)
22-
.Build();
23-
24-
var vbe = builder.AddProject(project).Build().Object;
25-
return InspectionResults(vbe);
26-
}
15+
=> InspectionResultsForModules(("Module1", inputCode, ComponentType.StandardModule), "Excel");
2716

2817
[Test]
2918
[Category("Inspections")]

RubberduckTests/Inspections/AssignedByValParameterInspectionTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using System.Linq;
2-
using System.Threading;
32
using NUnit.Framework;
4-
using RubberduckTests.Mocks;
53
using Rubberduck.Inspections.Concrete;
64
using Rubberduck.VBEditor.SafeComWrappers;
75
using Rubberduck.Parsing.Inspections.Abstract;

0 commit comments

Comments
 (0)