@@ -70,6 +70,7 @@ private enum REGKIND
70
70
{ VarEnum . VT_INT , "Long" } , // same as I4
71
71
{ VarEnum . VT_UINT , "Variant" } , // same as UI4
72
72
{ VarEnum . VT_DATE , "Date" } ,
73
+ { VarEnum . VT_CY , "Currency" } ,
73
74
{ VarEnum . VT_DECIMAL , "Currency" } , // best match?
74
75
{ VarEnum . VT_EMPTY , "Empty" } ,
75
76
{ VarEnum . VT_R4 , "Single" } ,
@@ -89,9 +90,9 @@ private string GetTypeName(TYPEDESC desc, ITypeInfo info)
89
90
case VarEnum . VT_USERDEFINED :
90
91
unchecked
91
92
{
92
- var href = desc . lpValue . ToInt64 ( ) ;
93
+ var href = ( int ) desc . lpValue . ToInt64 ( ) ; // todo: verify this also works on 32-bit
93
94
ITypeInfo refTypeInfo ;
94
- info . GetRefTypeInfo ( ( int ) href , out refTypeInfo ) ;
95
+ info . GetRefTypeInfo ( href , out refTypeInfo ) ;
95
96
return GetTypeName ( refTypeInfo ) ;
96
97
}
97
98
case VarEnum . VT_CARRAY :
@@ -105,7 +106,6 @@ private string GetTypeName(TYPEDESC desc, ITypeInfo info)
105
106
}
106
107
break ;
107
108
}
108
-
109
109
return "UNKNOWN" ;
110
110
}
111
111
@@ -238,7 +238,7 @@ public IEnumerable<Declaration> GetDeclarationsForReference(Reference reference)
238
238
var parameterCount = memberDescriptor . cParams - 1 ;
239
239
for ( var paramIndex = 0 ; paramIndex < parameterCount ; paramIndex ++ )
240
240
{
241
- var parameter = CreateParameterDeclaration ( memberNames , paramIndex , memberDescriptor , typeQualifiedModuleName , memberDeclaration ) ;
241
+ var parameter = CreateParameterDeclaration ( memberNames , paramIndex , memberDescriptor , typeQualifiedModuleName , memberDeclaration , info ) ;
242
242
if ( memberDeclaration is IDeclarationWithParameter )
243
243
{
244
244
( ( IDeclarationWithParameter ) memberDeclaration ) . AddParameter ( parameter ) ;
@@ -278,24 +278,9 @@ private Declaration CreateMemberDeclaration(out FUNCDESC memberDescriptor, TYPEK
278
278
var memberDeclarationType = GetDeclarationType ( memberDescriptor , funcValueType , typeKind ) ;
279
279
280
280
var asTypeName = string . Empty ;
281
- if ( memberDeclarationType != DeclarationType . Procedure && ! TypeNames . TryGetValue ( funcValueType , out asTypeName ) )
281
+ if ( memberDeclarationType != DeclarationType . Procedure )
282
282
{
283
- if ( funcValueType == VarEnum . VT_PTR )
284
- {
285
- try
286
- {
287
- var asTypeDesc = ( TYPEDESC ) Marshal . PtrToStructure ( memberDescriptor . elemdescFunc . tdesc . lpValue , typeof ( TYPEDESC ) ) ;
288
- asTypeName = GetTypeName ( asTypeDesc , info ) ;
289
- }
290
- catch
291
- {
292
- asTypeName = funcValueType . ToString ( ) ; //TypeNames[VarEnum.VT_VARIANT];
293
- }
294
- }
295
- else
296
- {
297
- asTypeName = funcValueType . ToString ( ) ; //TypeNames[VarEnum.VT_VARIANT];
298
- }
283
+ asTypeName = GetTypeName ( memberDescriptor . elemdescFunc . tdesc , info ) ;
299
284
}
300
285
var attributes = new Attributes ( ) ;
301
286
if ( memberName == "_NewEnum" && ( ( FUNCFLAGS ) memberDescriptor . wFuncFlags ) . HasFlag ( FUNCFLAGS . FUNCFLAG_FNONBROWSABLE ) )
@@ -305,7 +290,6 @@ private Declaration CreateMemberDeclaration(out FUNCDESC memberDescriptor, TYPEK
305
290
else if ( memberDescriptor . memid == 0 )
306
291
{
307
292
attributes . AddDefaultMemberAttribute ( memberName ) ;
308
- //Debug.WriteLine("Default member found: {0}.{1} ({2} / {3})", moduleDeclaration.IdentifierName, memberName, memberDeclarationType, (VarEnum)memberDescriptor.elemdescFunc.tdesc.vt);
309
293
}
310
294
else if ( ( ( FUNCFLAGS ) memberDescriptor . wFuncFlags ) . HasFlag ( FUNCFLAGS . FUNCFLAG_FHIDDEN ) )
311
295
{
@@ -426,54 +410,36 @@ private Declaration CreateFieldDeclaration(ITypeInfo info, int fieldIndex, Decla
426
410
info . GetNames ( varDesc . memid , names , 255 , out namesArrayLength ) ;
427
411
428
412
var fieldName = names [ 0 ] ;
429
- var fieldValueType = ( VarEnum ) varDesc . elemdescVar . tdesc . vt ;
430
413
var memberType = GetDeclarationType ( varDesc , typeDeclarationType ) ;
431
414
432
- string asTypeName ;
433
- if ( ! TypeNames . TryGetValue ( fieldValueType , out asTypeName ) )
434
- {
435
- asTypeName = TypeNames [ VarEnum . VT_VARIANT ] ;
436
- }
415
+ var asTypeName = GetTypeName ( varDesc . elemdescVar . tdesc , info ) ;
416
+
437
417
return new Declaration ( new QualifiedMemberName ( typeQualifiedModuleName , fieldName ) ,
438
418
moduleDeclaration , moduleDeclaration , asTypeName , null , false , false , Accessibility . Global , memberType , null ,
439
419
Selection . Home , false , null ) ;
440
420
}
441
421
442
- private static ParameterDeclaration CreateParameterDeclaration ( IReadOnlyList < string > memberNames , int paramIndex ,
443
- FUNCDESC memberDescriptor , QualifiedModuleName typeQualifiedModuleName , Declaration memberDeclaration )
422
+ private ParameterDeclaration CreateParameterDeclaration ( IReadOnlyList < string > memberNames , int paramIndex ,
423
+ FUNCDESC memberDescriptor , QualifiedModuleName typeQualifiedModuleName , Declaration memberDeclaration , ITypeInfo info )
444
424
{
445
425
var paramName = memberNames [ paramIndex + 1 ] ;
446
426
447
427
var paramPointer = new IntPtr ( memberDescriptor . lprgelemdescParam . ToInt64 ( ) + Marshal . SizeOf ( typeof ( ELEMDESC ) ) * paramIndex ) ;
448
428
var elementDesc = ( ELEMDESC ) Marshal . PtrToStructure ( paramPointer , typeof ( ELEMDESC ) ) ;
449
429
var isOptional = elementDesc . desc . paramdesc . wParamFlags . HasFlag ( PARAMFLAG . PARAMFLAG_FOPT ) ;
450
- var asParamTypeName = string . Empty ;
451
430
452
- var isByRef = false ;
431
+ var isByRef = elementDesc . desc . paramdesc . wParamFlags . HasFlag ( PARAMFLAG . PARAMFLAG_FOUT ) ;
453
432
var isArray = false ;
454
433
var paramDesc = elementDesc . tdesc ;
455
434
var valueType = ( VarEnum ) paramDesc . vt ;
456
- if ( valueType == VarEnum . VT_PTR || valueType == VarEnum . VT_BYREF )
457
- {
458
- //var paramTypeDesc = (TYPEDESC) Marshal.PtrToStructure(paramDesc.lpValue, typeof (TYPEDESC));
459
- isByRef = true ;
460
- var paramValueType = ( VarEnum ) paramDesc . vt ;
461
- if ( ! TypeNames . TryGetValue ( paramValueType , out asParamTypeName ) )
462
- {
463
- asParamTypeName = TypeNames [ VarEnum . VT_VARIANT ] ;
464
- }
465
- //var href = paramDesc.lpValue.ToInt32();
466
- //ITypeInfo refTypeInfo;
467
- //info.GetRefTypeInfo(href, out refTypeInfo);
468
-
469
- // todo: get type info?
470
- }
471
435
if ( valueType == VarEnum . VT_CARRAY || valueType == VarEnum . VT_ARRAY || valueType == VarEnum . VT_SAFEARRAY )
472
436
{
473
437
// todo: tell ParamArray arrays from normal arrays
474
438
isArray = true ;
475
439
}
476
440
441
+ var asParamTypeName = GetTypeName ( paramDesc , info ) ;
442
+
477
443
return new ParameterDeclaration ( new QualifiedMemberName ( typeQualifiedModuleName , paramName ) , memberDeclaration , asParamTypeName , null , null , isOptional , isByRef , isArray ) ;
478
444
}
479
445
0 commit comments