/// <summary> /// Builds the source code for the CompilerMetadata class. /// </summary> private static String WriteCompilerMetadataFile(Boolean debug) { var writer = new DataSourceWrapperWriter(); var applicationAsm = Assembly.GetEntryAssembly(); var applicationVersion = applicationAsm == null ? "1.0.0.0" : FileVersionInfo.GetVersionInfo(applicationAsm.Location).FileVersion; var compilerVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; writer.WriteLine("using System;"); writer.WriteLine("using System.Reflection;"); writer.WriteLine("using System.Runtime.Versioning;"); writer.WriteLine(); writer.WriteLine("[assembly: TargetFramework(\".NETStandard,Version=v2.0\", FrameworkDisplayName = \"\")]"); writer.WriteLine("[assembly: AssemblyCompany(\"Ultraviolet Framework\")]"); writer.WriteLine("[assembly: AssemblyConfiguration(\"" + (debug ? "Debug" : "Release") + "\")]"); writer.WriteLine("[assembly: AssemblyFileVersion(\"{0}\")]", applicationVersion); writer.WriteLine("[assembly: AssemblyInformationalVersion(\"{0}\")]", applicationVersion); writer.WriteLine("[assembly: AssemblyProduct(\"Compiled Binding Expressions\")]"); writer.WriteLine("[assembly: AssemblyTitle(\"Compiled Binding Expressions\")]"); writer.WriteLine("[assembly: AssemblyVersion(\"{0}\")]", applicationVersion); writer.WriteLine(); writer.WriteLine("namespace " + PresentationFoundationView.DataSourceWrapperNamespaceForViews); writer.WriteLine("{"); writer.WriteLine("#pragma warning disable 1591"); writer.WriteLine("#pragma warning disable 0184"); writer.WriteLine("// Generated by the UPF Binding Expression Compiler, version {0}", compilerVersion); writer.WriteLine("[System.CLSCompliant(false)]"); writer.WriteLine("public sealed class CompilerMetadata"); writer.WriteLine("{"); writer.WriteLine("public static String Version {{ get {{ return \"{0}\"; }} }}", compilerVersion); writer.WriteLine("}"); writer.WriteLine("#pragma warning restore 1591"); writer.WriteLine("#pragma warning restore 0184"); writer.WriteLine("}"); return(writer.ToString()); }
/// <summary> /// Builds the source code for the CompilerMetadata class and writes it to a file. /// </summary> private static String WriteCompilerMetadataFile() { var writer = new DataSourceWrapperWriter(); var version = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; writer.WriteLine("using System;"); writer.WriteLine(); writer.WriteLine("namespace " + PresentationFoundationView.DataSourceWrapperNamespaceForViews); writer.WriteLine("{"); writer.WriteLine("#pragma warning disable 1591"); writer.WriteLine("#pragma warning disable 0184"); writer.WriteLine("[System.CLSCompliant(false)]"); writer.WriteLine("// Generated by the UPF Binding Expression Compiler, version {0}", FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion); writer.WriteLine("public sealed class CompilerMetadata"); writer.WriteLine("{"); writer.WriteLine("public static String Version {{ get {{ return \"{0}\"; }} }}", version); writer.WriteLine("}"); writer.WriteLine("#pragma warning restore 1591"); writer.WriteLine("#pragma warning restore 0184"); writer.WriteLine("}"); var path = Path.Combine(Path.GetTempPath(), "CompilerMetadata.cs"); File.WriteAllText(path, writer.ToString()); return(path); }
/// <summary> /// Writes the source code for the specified data source wrapper. /// </summary> private static void WriteSourceCodeForDataSourceWrapper(RoslynExpressionCompilerState state, DataSourceWrapperInfo dataSourceWrapperInfo) { using (var writer = new DataSourceWrapperWriter()) { // Using statements var imports = Enumerable.Union(new[] { "System" }, dataSourceWrapperInfo.Imports).Distinct().OrderBy(x => x); foreach (var import in imports) { writer.WriteLine("using {0};", import); } writer.WriteLine(); // Namespace declaration var @namespace = dataSourceWrapperInfo.DataSourceDefinition.DataSourceWrapperNamespace; writer.WriteLine("namespace " + @namespace); writer.WriteLine("{"); writer.WriteLine("#pragma warning disable 1591"); writer.WriteLine("#pragma warning disable 0184"); // Data source wrapper class - main WriteSourceCodeForDataSourceWrapperClass(state, dataSourceWrapperInfo, writer); // Data source wrapper class - dependent foreach (var dependentWrapperInfo in dataSourceWrapperInfo.DependentWrapperInfos) { WriteSourceCodeForDataSourceWrapperClass(state, dependentWrapperInfo, writer); } // Namespace complete writer.WriteLine("#pragma warning restore 0184"); writer.WriteLine("#pragma warning restore 1591"); writer.WriteLine("}"); dataSourceWrapperInfo.DataSourceWrapperSourceCode = writer.ToString(); } }
/// <summary> /// Writes the source code for an individual data source wrapper class. /// </summary> private static void WriteSourceCodeForDataSourceWrapperClass(RoslynExpressionCompilerState state, DataSourceWrapperInfo dataSourceWrapperInfo, DataSourceWrapperWriter writer) { // Class declaration writer.WriteLine("// Generated by the UPF Binding Expression Compiler, version {0}", FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion); writer.WriteLine("[System.CLSCompliant(false)]"); writer.WriteLine("[Ultraviolet.Presentation.WrappedDataSource(typeof({0}))]", CSharpLanguage.GetCSharpTypeName(dataSourceWrapperInfo.DataSourceType)); writer.WriteLine("public sealed partial class {0} : {1}", dataSourceWrapperInfo.DataSourceWrapperName, CSharpLanguage.GetCSharpTypeName(typeof(CompiledDataSourceWrapper))); writer.WriteLine("{"); // Constructors writer.WriteLine("#region Constructors"); writer.WriteConstructor(dataSourceWrapperInfo); writer.WriteLine("#endregion"); writer.WriteLine(); // IDataSourceWrapper writer.WriteLine("#region IDataSourceWrapper"); writer.WriteIDataSourceWrapperImplementation(dataSourceWrapperInfo); writer.WriteLine("#endregion"); writer.WriteLine(); // Methods writer.WriteLine("#region Methods"); var methods = dataSourceWrapperInfo.DataSourceType.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); foreach (var method in methods) { if (!ExpressionUtil.NeedsWrapper(method)) { continue; } writer.WriteWrapperMethod(method); } writer.WriteLine("#endregion"); writer.WriteLine(); // Properties writer.WriteLine("#region Properties"); var properties = dataSourceWrapperInfo.DataSourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); foreach (var property in properties) { if (!ExpressionUtil.NeedsWrapper(property)) { continue; } writer.WriteWrapperProperty(property); } writer.WriteLine("#endregion"); writer.WriteLine(); // Fields writer.WriteLine("#region Fields"); var fields = dataSourceWrapperInfo.DataSourceType.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); foreach (var field in fields) { if (!ExpressionUtil.NeedsWrapper(field)) { continue; } writer.WriteWrapperProperty(field); } writer.WriteLine("#endregion"); writer.WriteLine(); // Expressions writer.WriteLine("#region Expressions"); for (int i = 0; i < dataSourceWrapperInfo.Expressions.Count; i++) { var expressionInfo = dataSourceWrapperInfo.Expressions[i]; writer.WriteExpressionProperty(state, dataSourceWrapperInfo, expressionInfo, i); } writer.WriteLine("#endregion"); writer.WriteLine(); // Special-case binding delegates writer.WriteLine("#region Binding Delegates"); if (typeof(Controls.ContentControl).IsAssignableFrom(dataSourceWrapperInfo.DataSourceType)) { // ContentControl writer.WriteLine("public static readonly DataBindingGetter<System.Object> __GetContent = " + "new DataBindingGetter<System.Object>(vm => (({0})vm).Content);", dataSourceWrapperInfo.DataSourceWrapperName); writer.WriteLine("public static readonly DataBindingGetter<System.String> __GetContentStringFormat = " + "new DataBindingGetter<System.String>(vm => (({0})vm).ContentStringFormat);", dataSourceWrapperInfo.DataSourceWrapperName); writer.WriteLine("public static readonly DataBindingSetter<System.Object> __SetContent = " + "new DataBindingSetter<System.Object>((vm, value) => (({0})vm).Content = value);", dataSourceWrapperInfo.DataSourceWrapperName); writer.WriteLine("public static readonly DataBindingSetter<System.String> __SetContentStringFormat = " + "new DataBindingSetter<System.String>((vm, value) => (({0})vm).ContentStringFormat = value);", dataSourceWrapperInfo.DataSourceWrapperName); } writer.WriteLine("#endregion"); // Class complete writer.WriteLine("}"); }