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);
        }
Ejemplo n.º 3
0
 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);
     }
 }
Ejemplo n.º 4
0
 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;
             }
         }
     }
 }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 9
0
        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;
                }
            }
        }