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;
        }
Ejemplo n.º 2
0
		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;
		}
Ejemplo n.º 3
0
		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);
		}
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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;
        }