Skip to content

Commit 41dfa6d

Browse files
committed
Resolve type names for property lets and sets.
1 parent a1b22cb commit 41dfa6d

18 files changed

+36
-33
lines changed

Rubberduck.Parsing/ComReflection/ComMember.cs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ public class ComMember : ComBase
3636
public bool IsEnumerator { get; }
3737
//This member is called on an interface when a bracketed expression is dereferenced.
3838
public bool IsEvaluateFunction { get; }
39-
public ComParameter ReturnType { get; private set; } = ComParameter.Void;
39+
public ComParameter AsTypeName { get; private set; } = ComParameter.Void;
4040

41-
private readonly List<ComParameter> _parameters = new List<ComParameter>();
41+
private List<ComParameter> _parameters = new List<ComParameter>();
4242

4343
//See https://docs.microsoft.com/en-us/windows/desktop/midl/retval
4444
//"Parameters with the [retval] attribute are not displayed in user-oriented browsers."
@@ -88,12 +88,12 @@ private void SetDeclarationType(FUNCDESC funcDesc, ITypeInfo info)
8888
var returnType = new ComParameter(this, funcDesc.elemdescFunc, info, string.Empty);
8989
if (!_parameters.Any())
9090
{
91-
ReturnType = returnType;
91+
AsTypeName = returnType;
9292
}
9393
else
9494
{
9595
var retval = _parameters.FirstOrDefault(x => x.IsReturnValue);
96-
ReturnType = retval ?? returnType;
96+
AsTypeName = retval ?? returnType;
9797
}
9898
}
9999
}
@@ -103,21 +103,24 @@ private void LoadParameters(FUNCDESC funcDesc, ITypeInfo info)
103103
var names = new string[255];
104104
info.GetNames(Index, names, names.Length, out int count);
105105

106+
for (var index = 0; index < funcDesc.cParams; index++)
107+
{
108+
var paramPtr = new IntPtr(funcDesc.lprgelemdescParam.ToInt64() + Marshal.SizeOf(typeof(ELEMDESC)) * index);
109+
var elemDesc = Marshal.PtrToStructure<ELEMDESC>(paramPtr);
110+
var param = new ComParameter(this, elemDesc, info, names[index + 1] ?? $"{index}unnamedParameter");
111+
_parameters.Add(param);
112+
}
113+
106114
// See https://docs.microsoft.com/en-us/windows/desktop/midl/propput
107115
// "A function that has the [propput] attribute must also have, as its last parameter, a parameter that has the [in] attribute."
108116
if (funcDesc.invkind.HasFlag(INVOKEKIND.INVOKE_PROPERTYPUTREF) ||
109117
funcDesc.invkind.HasFlag(INVOKEKIND.INVOKE_PROPERTYPUT))
110118
{
111-
count--;
119+
AsTypeName = _parameters.Last();
120+
_parameters = _parameters.Take(funcDesc.cParams - 1).ToList();
121+
return;
112122
}
113123

114-
for (var index = 0; index < count - 1; index++)
115-
{
116-
var paramPtr = new IntPtr(funcDesc.lprgelemdescParam.ToInt64() + Marshal.SizeOf(typeof(ELEMDESC)) * index);
117-
var elemDesc = Marshal.PtrToStructure<ELEMDESC>(paramPtr);
118-
var param = new ComParameter(this, elemDesc, info, names[index + 1] ?? $"{index}unnamedParameter");
119-
_parameters.Add(param);
120-
}
121124
if (Parameters.Any() && funcDesc.cParamsOpt == -1)
122125
{
123126
Parameters.Last().IsParamArray = true;
@@ -151,7 +154,7 @@ private string MemberDeclaration
151154
type = "Event";
152155
break;
153156
}
154-
return $"{(IsHidden || IsRestricted ? "Private" : "Public")} {type} {Name}{(ReturnType == null ? string.Empty : $" As {ReturnType.TypeName}")}";
157+
return $"{(IsHidden || IsRestricted ? "Private" : "Public")} {type} {Name}{(AsTypeName == null ? string.Empty : $" As {AsTypeName.TypeName}")}";
155158
}
156159
}
157160
#endif

Rubberduck.Parsing/Symbols/EventDeclaration.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ public EventDeclaration(ComMember member, Declaration parent, QualifiedModuleNam
5353
module.QualifyMemberName(member.Name),
5454
parent,
5555
parent,
56-
member.ReturnType.TypeName,
56+
member.AsTypeName.TypeName,
5757
null,
5858
null,
5959
Accessibility.Global,
6060
null,
6161
Selection.Home,
62-
member.ReturnType.IsArray,
62+
member.AsTypeName.IsArray,
6363
false,
6464
null,
6565
attributes)

Rubberduck.Parsing/Symbols/FunctionDeclaration.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ public FunctionDeclaration(ComMember member, Declaration parent, QualifiedModule
5353
module.QualifyMemberName(member.Name),
5454
parent,
5555
parent,
56-
member.ReturnType.TypeName,
56+
member.AsTypeName.TypeName,
5757
null,
5858
null,
5959
Accessibility.Global,
6060
null,
6161
Selection.Home,
62-
member.ReturnType.IsArray,
62+
member.AsTypeName.IsArray,
6363
false,
6464
null,
6565
attributes)

Rubberduck.Parsing/Symbols/PropertyGetDeclaration.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ public PropertyGetDeclaration(ComMember member, Declaration parent, QualifiedMod
5454
module.QualifyMemberName(member.Name),
5555
parent,
5656
parent,
57-
member.ReturnType.TypeName,
57+
member.AsTypeName.TypeName,
5858
null,
5959
null,
6060
Accessibility.Global,
6161
null,
6262
Selection.Home,
63-
member.ReturnType.IsArray,
63+
member.AsTypeName.IsArray,
6464
false,
6565
null,
6666
attributes)

Rubberduck.Parsing/Symbols/PropertyLetDeclaration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public PropertyLetDeclaration(ComMember member, Declaration parent, QualifiedMod
5050
module.QualifyMemberName(member.Name),
5151
parent,
5252
parent,
53-
string.Empty, //TODO: Need to get the types for these.
53+
member.AsTypeName.TypeName,
5454
Accessibility.Global,
5555
null,
5656
Selection.Home,

Rubberduck.Parsing/Symbols/PropertySetDeclaration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public PropertySetDeclaration(ComMember member, Declaration parent, QualifiedMod
5050
module.QualifyMemberName(member.Name),
5151
parent,
5252
parent,
53-
string.Empty, //TODO: Need to get the types for these.
53+
member.AsTypeName.TypeName,
5454
Accessibility.Global,
5555
null,
5656
Selection.Home,

RubberduckTests/Testfiles/Resolver/ADODB.6.1.xml

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

RubberduckTests/Testfiles/Resolver/ADOR.6.0.xml

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

RubberduckTests/Testfiles/Resolver/Excel.1.8.xml

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

RubberduckTests/Testfiles/Resolver/MSForms.2.0.xml

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)