コード例 #1
0
        public CodeTypeReference GenerateDefinedTypeReferenceImpl(NativeDefinedType definedNt, ref string comment)
        {
            ThrowIfNull(definedNt);

            comment += definedNt.Name;
            return(new CodeTypeReference(definedNt.Name));
        }
コード例 #2
0
        private void VerifyMembers(NativeDefinedType container, string name, params string[] args)
        {
            if (container.IsAnonymous)
            {
                Assert.True(string.IsNullOrEmpty(name));
            }
            else
            {
                Assert.Equal(name, container.Name);
            }

            int index = 0;
            foreach (NativeMember cur in container.Members)
            {
                NativeDefinedType definedType = cur.NativeType as NativeDefinedType;
                if (definedType != null && definedType.IsAnonymous)
                {
                    Assert.True(string.IsNullOrEmpty(args[index]));
                }
                else
                {
                    Assert.Equal(args[index], cur.NativeType.DisplayName);
                }
                Assert.Equal(args[index + 1], cur.Name);
                index += 2;
            }
        }
コード例 #3
0
        /// <summary>
        /// Generate the members of the container
        /// </summary>
        /// <param name="nt"></param>
        /// <param name="ctd"></param>
        /// <remarks></remarks>
        private void GenerateContainerMembers(NativeDefinedType nt, CodeTypeDeclaration ctd)
        {
            ThrowIfNull(nt);
            ThrowIfNull(ctd);

            int bitVectorCount = 0;

            for (int i = 0; i <= nt.Members.Count - 1; i++)
            {
                NativeMember member = nt.Members[i];

                // Don't process unnamed container members
                if (string.IsNullOrEmpty(member.Name))
                {
                    continue;
                }


                if (IsBitVector(member.NativeType))
                {
                    // Get the list of bitvectors that will fit into the next int
                    int bitCount                  = 0;
                    List <NativeMember> list      = new List <NativeMember>();
                    NativeBitVector     bitVector = null;

                    while ((i < nt.Members.Count && IsBitVector(nt.Members[i].NativeType, ref bitVector) && bitCount + bitVector.Size <= 32))
                    {
                        list.Add(nt.Members[i]);
                        i += 1;
                    }
                    i -= 1;

                    // Generate the int for the list of bit vectors
                    bitVectorCount += 1;

                    CodeMemberField cMember = GenerateContainerMember(new NativeMember("bitvector" + bitVectorCount, new NativeBuiltinType(BuiltinType.NativeInt32, true)), ctd);
                    cMember.Comments.Clear();

                    CodeComment comment = new CodeComment(string.Empty, true);
                    int         offset  = 0;
                    for (int j = 0; j <= list.Count - 1; j++)
                    {
                        if (j > 0)
                        {
                            comment.Text += Environment.NewLine;
                        }

                        IsBitVector(list[j].NativeType, ref bitVector);
                        comment.Text += list[j].Name + " : " + bitVector.Size;
                        GenerateBitVectorProperty(list[j], offset, ctd, cMember);
                        offset += bitVector.Size;
                    }
                    cMember.Comments.Add(new CodeCommentStatement(comment));
                }
                else
                {
                    GenerateContainerMember(member, ctd);
                }
            }
        }
コード例 #4
0
        public CodeTypeDeclarationCollection ConvertToCodeDom(NativeDefinedType definedNt, ErrorProvider ep)
        {
            NativeSymbolBag bag = new NativeSymbolBag(_storage);

            bag.AddDefinedType(definedNt);
            return(ConvertBagToCodeDom(bag, ep));
        }
コード例 #5
0
        public string ConvertToPInvokeCode(NativeDefinedType definedNt)
        {
            ErrorProvider ep = new ErrorProvider();
            CodeTypeDeclarationCollection col = ConvertToCodeDom(definedNt, ep);

            return(ConvertCodeDomToPInvokeCodeImpl(col, ep));
        }
コード例 #6
0
        /// <summary>
        /// Run all of the marshaling hueristiscs on the type and it's members
        /// </summary>
        /// <param name="ctd"></param>
        /// <remarks></remarks>

        public void Process(CodeTypeDeclaration ctd)
        {
            // First check and see if it is a delegate type, if so run the delegate hueristics
            CodeTypeDelegate ctdDel = ctd as CodeTypeDelegate;

            if (ctdDel != null && ctdDel.UserData.Contains(TransformConstants.DefinedType))
            {
                ProcessDelegate(ctdDel);
                return;
            }

            // Now run the hueristics over the actual members of the type
            if (ctd.UserData.Contains(TransformConstants.DefinedType))
            {
                NativeDefinedType nt = ctd.UserData[TransformConstants.DefinedType] as NativeDefinedType;
                if (nt != null)
                {
                    switch (nt.Kind)
                    {
                    case NativeSymbolKind.StructType:
                        ProcessStruct(ctd);
                        break;

                    case NativeSymbolKind.UnionType:
                        RunPluginUnionMembers(ctd);
                        break;

                    case NativeSymbolKind.EnumType:
                        RunPluginEnumMembers(ctd);
                        break;
                    }
                }
            }

            // Now process the methods on the type.  First step is to convert all of them into
            // best PInvoke signature.  Then create wrapper methods for them
            CodeTypeMemberCollection col  = new CodeTypeMemberCollection(ctd.Members);
            List <CodeMemberMethod>  list = new List <CodeMemberMethod>();

            foreach (CodeTypeMember mem in col)
            {
                // Look at procedures
                CodeMemberMethod codeProc = mem as CodeMemberMethod;
                if (codeProc != null && codeProc.UserData.Contains(TransformConstants.Procedure))
                {
                    list.Add(codeProc);
                }
            }

            foreach (CodeMemberMethod codeProc in list)
            {
                ProcessParameters(codeProc);
                ProcessReturnType(codeProc);
            }

            foreach (CodeMemberMethod codeProc in list)
            {
                ProcessWrapperMethods(ctd, codeProc);
            }
        }
コード例 #7
0
        public void PerformRename(CodeTypeDeclarationCollection col)
        {
            if (col == null)
            {
                throw new ArgumentNullException("col");
            }

            Dictionary <string, string> map = new Dictionary <string, string>(StringComparer.Ordinal);

            map.Add("tagPOINT", "Point");

            CodeDomIterator it   = new CodeDomIterator();
            List <object>   list = it.Iterate(col);

            // Use the iterator so we make sure to reach nested types
            foreach (CodeTypeDeclaration ctd in FindUnmodifiedTypes(list))
            {
                NativeDefinedType definedNt = GetDefined(ctd);
                if (IsBadName(ctd.Name))
                {
                    foreach (NativeTypeDef possible in FindTypeDefsTargeting(definedNt))
                    {
                        if (!IsBadName(possible.Name))
                        {
                            map[ctd.Name] = possible.Name;
                        }
                    }
                }
            }

            SmartTypeRename(map, list);
            ResetCustomExpressions(list);
        }
コード例 #8
0
        public void SaveAndLoad6()
        {
            NativeFunctionPointer fptr = new NativeFunctionPointer("f1");

            Assert.Equal(NativeCallingConvention.WinApi, fptr.CallingConvention);
            fptr.CallingConvention    = NativeCallingConvention.Pascal;
            fptr.Signature.ReturnType = new NativeBuiltinType(BuiltinType.NativeChar);

            NativeProcedure proc = new NativeProcedure("p1");

            Assert.Equal(NativeCallingConvention.WinApi, proc.CallingConvention);
            proc.CallingConvention    = NativeCallingConvention.CDeclaration;
            proc.Signature.ReturnType = new NativeBuiltinType(BuiltinType.NativeChar);

            var ns = new BasicSymbolStorage();

            ns.AddProcedure(proc);
            ns.AddDefinedType(fptr);

            NativeDefinedType     temp   = null;
            NativeFunctionPointer retPtr = null;

            Assert.True(ns.TryGetGlobalSymbol(fptr.Name, out temp));
            retPtr = (NativeFunctionPointer)temp;
            Assert.Equal(NativeCallingConvention.Pascal, retPtr.CallingConvention);

            NativeProcedure retProc = null;

            Assert.True(ns.TryGetGlobalSymbol(proc.Name, out retProc));
            Assert.Equal(NativeCallingConvention.CDeclaration, retProc.CallingConvention);
        }
コード例 #9
0
        public void FindOrLoad1()
        {
            var ns = new BasicSymbolStorage();

            ns.AddDefinedType(new NativeStruct("s1"));
            NativeSymbolBag bag = new NativeSymbolBag(ns);

            NativeDefinedType s1 = null;

            Assert.False(bag.Storage.TryGetGlobalSymbol("s1", out s1));
            Assert.True(bag.TryGetGlobalSymbol("s1", out s1));
            Assert.True(bag.TryGetGlobalSymbol("s1", out s1));
        }
コード例 #10
0
        private void WriteDefined(NativeDefinedType nt)
        {
            Contract.Requires(nt.Kind == NativeSymbolKind.StructType || nt.Kind == NativeSymbolKind.UnionType);
            _writer.WriteNameKind(nt.NameKind);
            _writer.WriteString(nt.Name);

            // Write out the members as a unit.
            _writer.WriteInt32(nt.Members.Count);

            foreach (var member in nt.Members)
            {
                _writer.WriteString(member.Name);
                WriteTypeReference(member.NativeType);
            }
        }
コード例 #11
0
        public void ResolveLoad1()
        {
            var ns = new BasicSymbolStorage();

            ns.AddDefinedType(new NativeStruct("s1"));

            NativeSymbolBag bag = new NativeSymbolBag(ns);

            bag.AddTypeDef(new NativeTypeDef("S1", "s1"));
            Assert.True(bag.TryResolveSymbolsAndValues());

            NativeDefinedType td = null;

            Assert.True(bag.TryGetGlobalSymbol("s1", out td));
        }
コード例 #12
0
        /// <summary>
        /// Make sure that any NativeDefinedType referenced is in the bag.  That way if we
        /// have structures which point to other NativeDefinedType instances, they are automagically
        /// put into the bag
        /// </summary>
        /// <param name="bag"></param>
        /// <remarks></remarks>
        private void ChaseReferencedDefinedTypes(NativeSymbolBag bag)
        {
            bag.TryResolveSymbolsAndValues();

            foreach (NativeSymbol sym in bag.FindAllReachableNativeSymbols())
            {
                if (NativeSymbolCategory.Defined == sym.Category)
                {
                    NativeDefinedType defined = null;
                    if (!bag.TryGetGlobalSymbol(sym.Name, out defined))
                    {
                        bag.AddDefinedType((NativeDefinedType)sym);
                    }
                }
            }
        }
コード例 #13
0
        public void FuncPtr1()
        {
            NativeFunctionPointer fptr = new NativeFunctionPointer("f1");

            fptr.Signature.ReturnType = new NativeBuiltinType(BuiltinType.NativeChar);
            fptr.Signature.Parameters.Add(new NativeParameter("f", new NativeBuiltinType(BuiltinType.NativeFloat)));

            var ns = new BasicSymbolStorage();

            ns.AddDefinedType(fptr);

            NativeDefinedType retFptr = null;

            Assert.True(ns.TryGetGlobalSymbol(fptr.Name, out retFptr));
            Assert.Equal("char (*f1)(float f)", ((NativeFunctionPointer)retFptr).DisplayName);
        }
コード例 #14
0
        private bool EqualsRecursive(NativeType left, NativeType right)
        {
            // Quick sanity check
            if (!EqualsTopLevel(left, right))
            {
                return(false);
            }

            NativeSymbolIterator it = new NativeSymbolIterator();

            Dictionary <string, NativeDefinedType> leftMap  = new Dictionary <string, NativeDefinedType>();
            Dictionary <string, NativeDefinedType> rightMap = new Dictionary <string, NativeDefinedType>();

            foreach (NativeDefinedType nt in it.FindAllReachableDefinedTypes(left))
            {
                if (!leftMap.ContainsKey(nt.Name))
                {
                    leftMap.Add(nt.Name, nt);
                }
            }

            foreach (NativeDefinedType nt in it.FindAllReachableDefinedTypes(right))
            {
                if (!rightMap.ContainsKey(nt.Name))
                {
                    rightMap.Add(nt.Name, nt);
                }
            }

            if (leftMap.Count != rightMap.Count)
            {
                return(false);
            }

            foreach (NativeDefinedType leftDefined in leftMap.Values)
            {
                NativeDefinedType rightDefined = null;
                if (!rightMap.TryGetValue(leftDefined.Name, out rightDefined) || !EqualsTopLevel(leftDefined, rightDefined))
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #15
0
        private List <CodeTypeDeclaration> FindUnmodifiedTypes(List <object> col)
        {
            List <CodeTypeDeclaration> list = new List <CodeTypeDeclaration>();

            // Use the iterator so we make sure to reach nested types
            foreach (object obj in col)
            {
                CodeTypeDeclaration ctd = obj as CodeTypeDeclaration;
                if (ctd != null)
                {
                    NativeDefinedType definedNt = GetDefined(ctd);
                    if (definedNt != null && 0 == string.CompareOrdinal(definedNt.Name, ctd.Name))
                    {
                        list.Add(ctd);
                    }
                }
            }

            return(list);
        }
コード例 #16
0
        internal SyntaxNode GenerateDeclaration(NativeDefinedType decl)
        {
            switch (decl.Kind)
            {
            case NativeSymbolKind.StructType:
                return(GenerateStruct((NativeStruct)decl));

            case NativeSymbolKind.UnionType:
                return(GenerateUnion((NativeUnion)decl));

            case NativeSymbolKind.EnumType:
                return(GenerateEnum((NativeEnum)decl));

            case NativeSymbolKind.FunctionPointer:
                return(GenerateFunctionPointer((NativeFunctionPointer)decl));

            default:
                throw Contract.InvalidEnum(decl.Kind);
            }
        }
コード例 #17
0
        public void SaveAndLoad1()
        {
            NativeStruct s1 = new NativeStruct("s1");

            s1.Members.Add(new NativeMember("m1", new NativeBuiltinType(BuiltinType.NativeFloat)));

            NativeStruct s2 = new NativeStruct("s2");

            s2.Members.Add(new NativeMember("m1", s1));

            var ns = new BasicSymbolStorage();

            ns.AddDefinedType(s2);

            NativeDefinedType rets2 = null;

            Assert.True(ns.TryGetGlobalSymbol(s2.Name, out rets2));
            Assert.NotNull(rets2);
            Assert.True(NativeTypeEqualityComparer.AreEqualRecursive(s2, rets2));
            Assert.True(NativeTypeEqualityComparer.AreEqualTopLevel(s2, rets2));
        }
コード例 #18
0
        /// <summary>
        /// Top level takes a very shallow look at the type.  When it encounters a nested defined type, it will only compare the
        /// name's.  In that case NativeNamedType instances and NativeDefinedType instances will compare true if they match on name
        /// </summary>
        /// <param name="left"></param>
        /// <param name="right"></param>
        /// <returns></returns>
        /// <remarks></remarks>
        private bool EqualsTopLevel(NativeType left, NativeType right)
        {
            left  = DigThroughNamedType(left);
            right = DigThroughNamedType(right);

            if (left.Kind != right.Kind)
            {
                return(false);
            }

            if (!EqualsCore(left, right))
            {
                return(false);
            }

            // If this is a defined type then make sure the members compare
            if (left.Category == NativeSymbolCategory.Defined)
            {
                NativeDefinedType leftDefined  = (NativeDefinedType)left;
                NativeDefinedType rightDefined = (NativeDefinedType)right;

                if (leftDefined.Members.Count != rightDefined.Members.Count)
                {
                    return(false);
                }

                for (int i = 0; i <= leftDefined.Members.Count - 1; i++)
                {
                    NativeMember leftMember  = leftDefined.Members[i];
                    NativeMember rightMember = rightDefined.Members[i];

                    if (0 != string.CompareOrdinal(leftMember.Name, rightMember.Name) || !EqualsCore(leftMember.NativeType, rightMember.NativeType))
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
コード例 #19
0
        private void VerifyReachable(NativeType nt, params string[] names)
        {
            NativeSymbolBag bag = new NativeSymbolBag();

            NativeDefinedType definedNt = nt as NativeDefinedType;
            NativeTypeDef     typedefNt = nt as NativeTypeDef;

            if (definedNt != null)
            {
                bag.AddDefinedType((NativeDefinedType)nt);
            }
            else if (typedefNt != null)
            {
                bag.AddTypeDef((NativeTypeDef)nt);
            }
            else
            {
                throw new Exception("Not a searchable type");
            }

            VerifyReachable(bag, names);
        }
コード例 #20
0
    public static void Main(string[] args)
    {
        NativeStorage ns = NativeStorage.LoadFromAssemblyPath;

        NativeSymbolBag bag = new NativeSymbolBag(ns);

        NativeProcedure ntProc = null;

        bag.TryFindOrLoadProcedure("FindFirstFileW", ntProc);
        bag.TryFindOrLoadProcedure("FindNextFileW", ntProc);
        bag.TryFindOrLoadProcedure("FindClose", ntProc);
        bag.TryFindOrLoadProcedure("GetSystemDirectoryW", ntProc);
        bag.TryFindOrLoadProcedure("GetWindowTextW", ntProc);
        bag.TryFindOrLoadProcedure("EnumWindows", ntProc);
        bag.TryFindOrLoadProcedure("GetComputerNameW", ntProc);
        bag.TryFindOrLoadProcedure("CreateWellKnownSid", ntProc);
        bag.TryFindOrLoadProcedure("CopySid", ntProc);
        bag.TryFindOrLoadProcedure("IsEqualSid", ntProc);
        bag.TryFindOrLoadProcedure("SHGetFileInfoW", ntProc);
        bag.TryFindOrLoadProcedure("GetEnvironmentVariableW", ntProc);
        bag.TryFindOrLoadProcedure("atoi", ntProc);

        NativeDefinedType ntDefined = null;
        NativeTypeDef     ntTypedef = null;

        bag.TryFindOrLoadDefinedType("WNDPROC", ntDefined);
        bag.TryFindOrLoadDefinedType("WNDENUMPROC", ntDefined);
        bag.TryFindOrLoadDefinedType("COMSTAT", ntDefined);
        bag.TryFindOrLoadDefinedType("_DCB", ntDefined);
        bag.TryFindOrLoadDefinedType("_IMAGE_LINENUMBER", ntDefined);


        BasicConverter convert = new BasicConverter(LanguageType.VisualBasic, ns);
        string         code    = convert.ConvertToPInvokeCode(bag);

        code = "' Generated File ... Re-Run PInvokeTestGen to regenerate this file" + Constants.vbCrLf + "Namespace Generated" + Constants.vbCrLf + code + Constants.vbCrLf + "End Namespace";
        IO.File.WriteAllText(args(0), code);
    }
コード例 #21
0
        public void Proc4()
        {
            NativeStruct s1 = new NativeStruct("s1");

            s1.Members.Add(new NativeMember("m1", new NativeBuiltinType(BuiltinType.NativeByte)));

            NativeProcedure p1 = new NativeProcedure("p1");

            p1.Signature.ReturnType = s1;

            var ns = new BasicSymbolStorage();

            ns.AddProcedure(p1);

            NativeProcedure retp1 = null;

            Assert.True(ns.TryGetGlobalSymbol(p1.Name, out retp1));
            Assert.Equal(p1.DisplayName, retp1.DisplayName);

            NativeDefinedType rets1 = null;

            Assert.False(ns.TryGetGlobalSymbol(s1.Name, out rets1));
        }
コード例 #22
0
        /// <summary>
        /// Convert the defined type into a CodeTypeDeclaration
        /// </summary>
        /// <param name="nt"></param>
        /// <returns></returns>
        /// <remarks></remarks>
        public CodeTypeDeclaration GenerateDeclaration(NativeDefinedType nt)
        {
            if (nt == null)
            {
                throw new ArgumentNullException("nt");
            }

            CodeTypeDeclaration ctd = default(CodeTypeDeclaration);

            switch (nt.Kind)
            {
            case NativeSymbolKind.StructType:
                ctd = GenerateStruct((NativeStruct)nt);
                break;

            case NativeSymbolKind.UnionType:
                ctd = GenerateUnion((NativeUnion)nt);
                break;

            case NativeSymbolKind.EnumType:
                ctd = GenerateEnum((NativeEnum)nt);
                break;

            case NativeSymbolKind.FunctionPointer:
                ctd = GenerateDelegate((NativeFunctionPointer)nt);
                break;

            default:
                Contract.ThrowInvalidEnumValue(nt.Kind);
                return(null);
            }

            ThrowIfFalse(ctd.UserData.Contains(TransformConstants.DefinedType));
            ctd.UserData[TransformConstants.Type] = nt;
            return(ctd);
        }
コード例 #23
0
        private bool EqualsDefinedCore(NativeDefinedType left, NativeDefinedType right)
        {
            if (left.IsAnonymous && right.IsAnonymous)
            {
                // don't compare names when both types are anonymous
            }
            else if (0 != string.CompareOrdinal(left.Name, right.Name))
            {
                return(false);
            }

            // If this is an enum, compare the values
            if (left.Kind == NativeSymbolKind.EnumType)
            {
                NativeEnum leftEnum  = (NativeEnum)left;
                NativeEnum rightEnum = (NativeEnum)right;

                if (rightEnum.Values.Count != leftEnum.Values.Count)
                {
                    return(false);
                }

                for (int i = 0; i <= leftEnum.Values.Count - 1; i++)
                {
                    NativeEnumValue e1 = leftEnum.Values[i];
                    NativeEnumValue e2 = rightEnum.Values[i];

                    if (0 != string.CompareOrdinal(e1.Name, e2.Name) || 0 != string.CompareOrdinal(e1.Value.Expression, e2.Value.Expression))
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
コード例 #24
0
 /// <summary>
 /// Inspect the type name and determine if there is a better name for it
 /// </summary>
 /// <param name="definedNt"></param>
 /// <remarks></remarks>
 public void RunTypeNameHeuristics(NativeDefinedType definedNt)
 {
     ThrowIfNull(definedNt);
 }
コード例 #25
0
 public NativeGlobalSymbol(NativeDefinedType definedType) : this(definedType.NativeName, definedType)
 {
 }
コード例 #26
0
 public static void AddDefinedType(this INativeSymbolStorage storage, NativeDefinedType definedType) => storage.Add(new NativeGlobalSymbol(definedType));