示例#1
0
        internal SyntaxTree Generate(NativeSymbolBag bag, ErrorProvider ep)
        {
            // Make sure than all of the referenced NativeDefinedType instances are in the correct
            // portion of the bag
            ChaseReferencedDefinedTypes(bag);

            // First step is to resolve the symbols
            bag.TryResolveSymbolsAndValues(ep);

            // Create the codedom transform
            var transform   = new CodeTransform(_langaugeType, bag);
            var marshalUtil = new MarshalTransform(_langaugeType, bag, TransformKindFlags.All);
            var col         = new CodeTypeDeclarationCollection();

            // Only output the constants if there are actually any
            var constList = bag.FindResolvedConstants().ToList();

            if (constList.Count > 0)
            {
                var constCtd = transform.GenerateConstants(constList);
                if (constCtd.Members.Count > 0)
                {
                    col.Add(constCtd);
                }
            }

            foreach (var definedNt in bag.FindResolvedDefinedTypes())
            {
                var ctd = transform.GenerateDeclaration(definedNt);
                marshalUtil.Process(ctd);
                col.Add(ctd);
            }

            var procList = bag.FindResolvedProcedures().ToList();

            if (procList.Count > 0)
            {
                var procType = transform.GenerateProcedures(procList);
                marshalUtil.Process(procType);
                col.Add(procType);
            }

            // Add the helper types that we need
            AddHelperTypes(col);

            // Next step is to run the pretty lister on it
            var prettyLister = new CodeDomPrettyList(bag);

            prettyLister.PerformRename(col);

            var code = BasicConverter.ConvertCodeDomToPInvokeCodeImpl(_langaugeType, col, ep);

            return(CSharpSyntaxTree.ParseText(code));
        }
示例#2
0
        public static void VerifyExpression(LanguageType lang, string nativeExpr, string managedExpr, string managedType, NativeSymbolBag bag)
        {
            bag = bag ?? new NativeSymbolBag();
            CodeTransform         trans    = new CodeTransform(lang, bag);
            NativeValueExpression nExpr    = new NativeValueExpression(nativeExpr);
            CodeExpression        cExpr    = null;
            CodeTypeReference     codeType = null;
            Exception             ex       = null;

            Assert.True(trans.TryGenerateValueExpression(nExpr, out cExpr, out codeType, out ex));

            var provider = default(System.CodeDom.Compiler.CodeDomProvider);

            switch (lang)
            {
            case LanguageType.CSharp:
                provider = new Microsoft.CSharp.CSharpCodeProvider();
                break;

            case LanguageType.VisualBasic:
                provider = new Microsoft.VisualBasic.VBCodeProvider();
                break;

            default:
                provider = null;
                break;
            }

            Assert.NotNull(provider);
            using (var writer = new StringWriter())
            {
                provider.GenerateCodeFromExpression(cExpr, writer, new System.CodeDom.Compiler.CodeGeneratorOptions());
                Assert.Equal(managedExpr, writer.ToString());
            }

            if (managedType != null)
            {
                Assert.Equal(managedType, CodeDomPrinter.Convert(codeType));
            }
        }