Skip to content

Commit 2786f1e

Browse files
committed
Merge branch 'next' into FixRefactoringExtensionsForRedimArrays
2 parents 62cb673 + e86108c commit 2786f1e

File tree

92 files changed

+1989
-5762
lines changed

Some content is hidden

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

92 files changed

+1989
-5762
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
}

Rubberduck.Core/UI/UnitTesting/TestExplorerControl.xaml

Lines changed: 311 additions & 307 deletions
Large diffs are not rendered by default.

Rubberduck.Core/UI/UnitTesting/TestExplorerControl.xaml.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,10 @@ public TestExplorerControl()
99
{
1010
InitializeComponent();
1111
}
12+
13+
private void TestGrid_RequestBringIntoView(object sender, System.Windows.RequestBringIntoViewEventArgs e)
14+
{
15+
e.Handled = true;
16+
}
1217
}
1318
}
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>

0 commit comments

Comments
 (0)