private static Declaration CreateMemberDeclaration(ComMember member, QualifiedModuleName module, Declaration parent, bool handler) { var attributes = GetMemberAttibutes(member); switch (member.Type) { case DeclarationType.Procedure: return(new SubroutineDeclaration(member, parent, module, attributes, handler)); case DeclarationType.Function: return(new FunctionDeclaration(member, parent, module, attributes)); case DeclarationType.Event: return(new EventDeclaration(member, parent, module, attributes)); case DeclarationType.PropertyGet: return(new PropertyGetDeclaration(member, parent, module, attributes)); case DeclarationType.PropertySet: return(new PropertySetDeclaration(member, parent, module, attributes)); case DeclarationType.PropertyLet: return(new PropertyLetDeclaration(member, parent, module, attributes)); default: throw new InvalidEnumArgumentException($"Unexpected DeclarationType {member.Type} encountered."); } }
private static Attributes GetMemberAttibutes(ComMember member) { var attributes = new Attributes(); if (member.IsEnumerator) { attributes.AddEnumeratorMemberAttribute(member.Name); } else if (member.IsDefault) { attributes.AddDefaultMemberAttribute(member.Name); } else if (member.IsHidden) { attributes.AddHiddenMemberAttribute(member.Name); } else if (member.IsEvaluateFunction) { attributes.AddEvaluateMemberAttribute(member.Name); } else if (!string.IsNullOrEmpty(member.Documentation.DocString)) { attributes.AddMemberDescriptionAttribute(member.Name, member.Documentation.DocString); } return(attributes); }
private void GetComMembers(ITypeInfo info, TYPEATTR attrib) { for (var index = 0; index < attrib.cFuncs; index++) { IntPtr memberPtr; info.GetFuncDesc(index, out memberPtr); var member = (FUNCDESC)Marshal.PtrToStructure(memberPtr, typeof(FUNCDESC)); if (member.callconv != CALLCONV.CC_STDCALL) { continue; } var comMember = new ComMember(info, member); _members.Add(comMember); if (comMember.IsDefault) { _defaultMember = comMember; } info.ReleaseFuncDesc(memberPtr); } }
private void GetComMembers(ITypeInfo info, TYPEATTR attrib) { for (var index = 0; index < attrib.cFuncs; index++) { info.GetFuncDesc(index, out IntPtr memberPtr); using (DisposalActionContainer.Create(memberPtr, info.ReleaseFuncDesc)) { var member = Marshal.PtrToStructure <FUNCDESC>(memberPtr); if (member.callconv != CALLCONV.CC_STDCALL) { continue; } var comMember = new ComMember(this, info, member); _members.Add(comMember); if (comMember.IsDefault) { DefaultMember = comMember; } } } }
public ComParameter(ComMember parent, ELEMDESC elemDesc, ITypeInfo info, string name) { Debug.Assert(name != null, "Parameter name is null"); Parent = parent; Name = name; var paramDesc = elemDesc.desc.paramdesc; GetParameterType(elemDesc.tdesc, info); IsOptional = paramDesc.wParamFlags.HasFlag(PARAMFLAG.PARAMFLAG_FOPT); IsReturnValue = paramDesc.wParamFlags.HasFlag(PARAMFLAG.PARAMFLAG_FRETVAL); if (!paramDesc.wParamFlags.HasFlag(PARAMFLAG.PARAMFLAG_FHASDEFAULT) || string.IsNullOrEmpty(name)) { return; } //lpVarValue points to a PARAMDESCEX structure, but we don't care about the cBytes here at all. //Offset and dereference the VARIANTARG directly. var defValue = new ComVariant(paramDesc.lpVarValue + Marshal.SizeOf(typeof(ulong))); DefaultValue = defValue.Value; }
private static Attributes GetMemberAttibutes(ComMember member) { var attributes = new Attributes(); if (member.IsEnumerator) { attributes.AddEnumeratorMemberAttribute(member.Name); } else if (member.IsDefault) { attributes.AddDefaultMemberAttribute(member.Name); } else if (member.IsHidden) { attributes.AddHiddenMemberAttribute(member.Name); } else if (member.IsEvaluateFunction) { attributes.AddEvaluateMemberAttribute(member.Name); } return(attributes); }
private static (Declaration memberDeclaration, List <Declaration> parameterDeclarations) GetDeclarationsForMember(QualifiedModuleName moduleName, Declaration parentDeclaration, bool eventHandlers, ComMember item) { var memberDeclaration = CreateMemberDeclaration(item, moduleName, parentDeclaration, eventHandlers); var parameterDeclarations = new List <Declaration>(); if (memberDeclaration is IParameterizedDeclaration hasParams) { parameterDeclarations.AddRange(hasParams.Parameters); } return(memberDeclaration, parameterDeclarations); }
private static (ICollection <Declaration> memberDeclarations, Declaration defaultMemberDeclaration) GetDeclarationsForMembers(IEnumerable <ComMember> members, QualifiedModuleName moduleName, Declaration moduleDeclaration, ComMember defaultMember, bool eventHandlers = false) { var memberDeclarations = new List <Declaration>(); Declaration defaultMemberDeclaration = null; foreach (var item in members.Where(m => !m.IsRestricted && !IgnoredInterfaceMembers.Contains(m.Name))) { var(memberDeclaration, parameterDeclarations) = GetDeclarationsForMember(moduleName, moduleDeclaration, eventHandlers, item); memberDeclarations.Add(memberDeclaration); memberDeclarations.AddRange(parameterDeclarations); if (moduleDeclaration is ClassModuleDeclaration && item == defaultMember) { defaultMemberDeclaration = memberDeclaration; } } return(memberDeclarations, defaultMemberDeclaration); }
private void CreateMemberDeclarations(IEnumerable <ComMember> members, QualifiedModuleName moduleName, Declaration declaration, SerializableDeclarationTree moduleTree, ComMember defaultMember, bool eventHandlers = false) { foreach (var item in members.Where(m => !m.IsRestricted && !IgnoredInterfaceMembers.Contains(m.Name))) { var memberDeclaration = CreateMemberDeclaration(item, moduleName, declaration, eventHandlers); _declarations.Add(memberDeclaration); var memberTree = new SerializableDeclarationTree(memberDeclaration); moduleTree.AddChildTree(memberTree); var hasParams = memberDeclaration as IParameterizedDeclaration; if (hasParams != null) { _declarations.AddRange(hasParams.Parameters); memberTree.AddChildren(hasParams.Parameters); } var coClass = memberDeclaration as ClassModuleDeclaration; if (coClass != null && item == defaultMember) { coClass.DefaultMember = memberDeclaration; } } }