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)); }
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)); } }