public static System.Reflection.Assembly GenerateCode(ITextTemplatingEngineHost host, ParsedTemplate pt, TemplateSettings settings, CodeCompileUnit ccu) { CompilerParameters pars = new CompilerParameters (); pars.GenerateExecutable = false; if (settings.Debug) { pars.GenerateInMemory = false; pars.IncludeDebugInformation = true; pars.TempFiles.KeepFiles = true; } else { pars.GenerateInMemory = true; pars.IncludeDebugInformation = false; } //resolve and add assembly references HashSet<string> assemblies = new HashSet<string> (); assemblies.UnionWith (settings.Assemblies); assemblies.UnionWith (host.StandardAssemblyReferences); foreach (string assem in assemblies) { string resolvedAssem = host.ResolveAssemblyReference (assem); if (!String.IsNullOrEmpty (resolvedAssem)) { pars.ReferencedAssemblies.Add (resolvedAssem); } else { pt.LogError ("Could not resolve assembly reference '" + assem + "'"); return null; } } CompilerResults results = settings.Provider.CompileAssemblyFromDom (pars, ccu); pt.Errors.AddRange (results.Errors); if (pt.Errors.HasErrors) return null; return results.CompiledAssembly; }
public override ParsedDocument Parse (bool storeAst, string fileName, TextReader content, Project project = null) { ParsedTemplate template = new ParsedTemplate (fileName); try { var tk = new Tokeniser (fileName, content.ReadToEnd ()); template.ParseWithoutIncludes (tk); } catch (ParserException ex) { template.LogError (ex.Message, ex.Location); } T4ParsedDocument doc = new T4ParsedDocument (fileName, template.RawSegments); doc.Flags |= ParsedDocumentFlags.NonSerializable; foreach (System.CodeDom.Compiler.CompilerError err in template.Errors) doc.Errors.Add (new Error (err.IsWarning? ErrorType.Warning : ErrorType.Error, err.ErrorText, err.Line, err.Column)); return doc; }
public override System.Threading.Tasks.Task<ParsedDocument> Parse (ParseOptions parseOptions, System.Threading.CancellationToken cancellationToken) { var fileName = parseOptions.FileName; ParsedTemplate template = new ParsedTemplate (fileName); var readOnlyDoc = TextEditorFactory.CreateNewReadonlyDocument (parseOptions.Content, fileName); try { var tk = new Tokeniser (fileName, readOnlyDoc.Text); template.ParseWithoutIncludes (tk); } catch (ParserException ex) { template.LogError (ex.Message, ex.Location); } var errors = new List<Error> (); foreach (System.CodeDom.Compiler.CompilerError err in template.Errors) { errors.Add (new Error (err.IsWarning ? ErrorType.Warning : ErrorType.Error, err.ErrorText, new DocumentLocation (err.Line, err.Column))); } var doc = new T4ParsedDocument (fileName, template.RawSegments, errors); doc.Flags |= ParsedDocumentFlags.NonSerializable; return System.Threading.Tasks.Task.FromResult((ParsedDocument)doc); }
public override ParsedDocument Parse(ProjectDom dom, string fileName, string content) { ParsedTemplate template = new ParsedTemplate(fileName); try { Tokeniser tk = new Tokeniser(fileName, content); template.ParseWithoutIncludes(tk); } catch (ParserException ex) { template.LogError(ex.Message, ex.Location); } T4ParsedDocument doc = new T4ParsedDocument(fileName, template.RawSegments); doc.Flags |= ParsedDocumentFlags.NonSerializable; foreach (System.CodeDom.Compiler.CompilerError err in template.Errors) { doc.Errors.Add(new Error(err.IsWarning? ErrorType.Warning : ErrorType.Error, err.Line, err.Column, err.ErrorText)); } return(doc); }
public override ParsedDocument Parse(bool storeAst, string fileName, TextReader content, Project project = null) { ParsedTemplate template = new ParsedTemplate(fileName); try { var tk = new Tokeniser(fileName, content.ReadToEnd()); template.ParseWithoutIncludes(tk); } catch (ParserException ex) { template.LogError(ex.Message, ex.Location); } var errors = new List <Error> (); foreach (System.CodeDom.Compiler.CompilerError err in template.Errors) { errors.Add(new Error(err.IsWarning ? ErrorType.Warning : ErrorType.Error, err.ErrorText, err.Line, err.Column)); } var doc = new T4ParsedDocument(fileName, template.RawSegments, errors); doc.Flags |= ParsedDocumentFlags.NonSerializable; return(doc); }
public override System.Threading.Tasks.Task <ParsedDocument> Parse(ParseOptions parseOptions, System.Threading.CancellationToken cancellationToken) { var fileName = parseOptions.FileName; ParsedTemplate template = new ParsedTemplate(fileName); var readOnlyDoc = TextEditorFactory.CreateNewReadonlyDocument(parseOptions.Content, fileName); try { var tk = new Tokeniser(fileName, readOnlyDoc.Text); template.ParseWithoutIncludes(tk); } catch (ParserException ex) { template.LogError(ex.Message, ex.Location); } var errors = new List <Error> (); foreach (System.CodeDom.Compiler.CompilerError err in template.Errors) { errors.Add(new Error(err.IsWarning ? ErrorType.Warning : ErrorType.Error, err.ErrorText, new DocumentLocation(err.Line, err.Column))); } var doc = new T4ParsedDocument(fileName, template.RawSegments, errors); doc.Flags |= ParsedDocumentFlags.NonSerializable; return(System.Threading.Tasks.Task.FromResult((ParsedDocument)doc)); }
public static TemplateSettings GetSettings(ITextTemplatingEngineHost host, ParsedTemplate pt) { string language = null; TemplateSettings settings = new TemplateSettings (); foreach (Directive dt in pt.Directives) { switch (dt.Name) { case "template": string val = dt.Extract ("language"); if (val != null) language = val; val = dt.Extract ("debug"); if (val != null) settings.Debug = string.Compare (val, "true", StringComparison.OrdinalIgnoreCase) == 0; val = dt.Extract ("inherits"); if (val != null) settings.Inherits = val; val = dt.Extract ("culture"); if (val != null) { System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.GetCultureInfo (val); if (culture == null) pt.LogWarning ("Could not find culture '" + val + "'", dt.StartLocation); else settings.Culture = culture; } val = dt.Extract ("hostspecific"); if (val != null) { settings.HostSpecific = string.Compare (val, "true", StringComparison.OrdinalIgnoreCase) == 0; } break; case "assembly": string name = dt.Extract ("name"); if (name == null) pt.LogError ("Missing name attribute in assembly directive", dt.StartLocation); else settings.Assemblies.Add (name); break; case "import": string namespac = dt.Extract ("namespace"); if (namespac == null) pt.LogError ("Missing namespace attribute in import directive", dt.StartLocation); else settings.Imports.Add (namespac); break; case "output": settings.Extension = dt.Extract ("extension"); string encoding = dt.Extract ("encoding"); if (encoding != null) settings.Encoding = Encoding.GetEncoding ("encoding"); break; case "include": throw new InvalidOperationException ("Include is handled in the parser"); default: throw new NotImplementedException ("Custom directives are not supported yet"); } ComplainExcessAttributes (dt, pt); } if (settings.Name == null) settings.Name = string.Format ("GeneratedTextTransformation{0:x}", new System.Random ().Next ()); if (settings.Namespace == null) settings.Namespace = typeof (TextTransformation).Namespace; //resolve the CodeDOM provider if (String.IsNullOrEmpty (language)) { pt.LogError ("No language was specified for the template"); return settings; } if (language == "C#v3.5") { Dictionary<string, string> providerOptions = new Dictionary<string, string> (); providerOptions.Add ("CompilerVersion", "v3.5"); settings.Provider = new CSharpCodeProvider (providerOptions); } else { settings.Provider = CodeDomProvider.CreateProvider (language); } if (settings.Provider == null) { pt.LogError ("A provider could not be found for the language '" + language + "'"); return settings; } return settings; }