Inheritance: System.MarshalByRefObject, ITextTemplatingEngineHost
コード例 #1
0
ファイル: TextTransform.cs プロジェクト: vdimensions/mono-t4
 static void LogErrors(TemplateGenerator generator)
 {
     foreach (System.CodeDom.Compiler.CompilerError err in generator.Errors)
     {
         var oldColor = Console.ForegroundColor;
         Console.ForegroundColor = err.IsWarning? ConsoleColor.Yellow : ConsoleColor.Red;
         if (!string.IsNullOrEmpty(err.FileName))
         {
             Console.Error.Write(err.FileName);
         }
         if (err.Line > 0)
         {
             Console.Error.Write("(");
             Console.Error.Write(err.Line);
             if (err.Column > 0)
             {
                 Console.Error.Write(",");
                 Console.Error.Write(err.Column);
             }
             Console.Error.Write(")");
         }
         if (!string.IsNullOrEmpty(err.FileName) || err.Line > 0)
         {
             Console.Error.Write(": ");
         }
         Console.Error.Write(err.IsWarning ? "WARNING: " : "ERROR: ");
         Console.Error.WriteLine(err.ErrorText);
         Console.ForegroundColor = oldColor;
     }
 }
コード例 #2
0
ファイル: TextTransform.cs プロジェクト: vdimensions/mono-t4
        static bool AddDirectiveProcessors(TemplateGenerator generator, List <string> directives)
        {
            foreach (var dir in directives)
            {
                var split = dir.Split('!');

                if (split.Length != 3)
                {
                    Console.Error.WriteLine("Directive must have 3 values: {0}", dir);
                    return(false);
                }

                for (int i = 0; i < 3; i++)
                {
                    string s = split [i];
                    if (string.IsNullOrEmpty(s))
                    {
                        string kind = i == 0 ? "name" : (i == 1 ? "class" : "assembly");
                        Console.Error.WriteLine("Directive has missing {0} value: {1}", kind, dir);
                        return(false);
                    }
                }

                generator.AddDirectiveProcessor(split [0], split [1], split [2]);
            }
            return(true);
        }
コード例 #3
0
ファイル: Main.cs プロジェクト: abock/obs-tree-analyzer
        public static int Main(string[] args)
        {
            if (args.Length == 0) {
                ShowHelp (true);
            }

            TemplateGenerator generator = new TemplateGenerator ();
            string outputFile = null, inputFile = null;

            optionSet = new OptionSet () {
                { "o=|out=", "The name of the output {file}", s => outputFile = s },
                { "r=", "Assemblies to reference", s => generator.Refs.Add (s) },
                { "u=", "Namespaces to import <{0:namespace}>", s => generator.Imports.Add (s) },
                { "I=", "Paths to search for included files", s => generator.IncludePaths.Add (s) },
                { "P=", "Paths to search for referenced assemblies", s => generator.ReferencePaths.Add (s) },
                { "dp=", "Directive processor (name!class!assembly)", s => generator.DirectiveProcessors.Add (s) },
                { "a=", "Key value pairs for directive processors (key:value)", s => {
                    var parts = s.Split (new char [] { ':' }, 2);
                    if (parts == null || parts.Length < 2) {
                        throw new OptionException ("directive processor key value pairs must be specified as -a=key:value", "a");
                    }
                    generator.ProcessorValues[parts[0]] = parts[1];
                } },
                { "h|?|help", "Show help", s => ShowHelp (false) }
            };

            List<string> remainingArgs = optionSet.Parse (args);

            if (String.IsNullOrEmpty (outputFile)) {
                Console.WriteLine ("No output file specified.");
                return -1;
            }

            if (remainingArgs.Count < 1) {
                Console.WriteLine ("No input file specified.");
                return -1;
            }
            inputFile = remainingArgs [0];

            if (!File.Exists (inputFile)) {
                Console.WriteLine ("Input file '{0}' does not exist.", inputFile);
                return -1;
            }

            System.Console.Write("Processing '{0}'... ", inputFile);
            generator.ProcessTemplate (inputFile, outputFile);

            if (generator.Errors.HasErrors) {
                System.Console.WriteLine("failed.");
            } else {
                System.Console.WriteLine("completed successfully.");
            }

            foreach (System.CodeDom.Compiler.CompilerError err in generator.Errors)
                Console.WriteLine ("{0}({1},{2}): {3} {4}", err.FileName, err.Line, err.Column,
                                   err.IsWarning? "WARNING" : "ERROR", err.ErrorText);

            return generator.Errors.HasErrors? -1 : 0;
        }
コード例 #4
0
        public void ProcessT4File(string inputFile, string outputFile)
        {
            var templateGenerator = new TemplateGenerator();
            templateGenerator.ProcessTemplate(inputFile, outputFile);

            foreach (CompilerError item in templateGenerator.Errors)
            {
                errors.Add(item.ErrorText + ": " + item.FileName + " at line: " + item.Line);
            }
        }
コード例 #5
0
ファイル: EntryPoint.cs プロジェクト: ByronMayne/VSCodeT4
        /// <summary>
        ///
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        private static int Main(string[] args)
        {
            TemplateResults results = new TemplateResults();

            if (args.Length == 0)
            {
                ShowHelp();
                results.wasSuccssful = false;
            }
            else if (args[0] == HELP_ARG)
            {
                ShowHelp();
                results.wasSuccssful = true;
            }
            else if (args.Length < 2)
            {
                ShowHelp();
                results.wasSuccssful = false;
            }
            else
            {
                string input  = args.First();
                string output = args.Last();
                results.inputPath  = input;
                results.outputPath = output;

                // Create our generator
                TemplateGenerator geneator = new TemplateGenerator();
                // run it
                geneator.ProcessTemplate(input, output);

                if (geneator.Errors.HasErrors)
                {
                    foreach (CompilerError error in geneator.Errors)
                    {
                        results.compileErrors.Add(error);
                    }
                    results.wasSuccssful = false;
                }
                else
                {
                    results.wasSuccssful = true;
                }
            }

            // Write our output
            string outputJson = JSONWriter.ToJson(results);

            // Write it out
            Console.WriteLine(outputJson);

            return(results.wasSuccssful ? 0 : 1);
        }
コード例 #6
0
		static void Generate (TemplateGenerator host, ProjectFile file, out string outputFile)
		{
			outputFile = null;

			string content;
			try {
				content = File.ReadAllText (file.FilePath);
			}
			catch (IOException ex) {
				host.Errors.Add (new CompilerError {
					ErrorText = GettextCatalog.GetString ("Could not read input file '{0}':\n{1}", file.FilePath, ex)
				});
				return;
			}

			var pt = ParsedTemplate.FromText (content, host);
			if (pt.Errors.HasErrors) {
				host.Errors.AddRange (pt.Errors);
				return;
			}

			var settings = TemplatingEngine.GetSettings (host, pt);
			if (pt.Errors.HasErrors) {
				host.Errors.AddRange (pt.Errors);
				return;
			}

			outputFile = file.FilePath.ChangeExtension (settings.Provider.FileExtension);
			settings.Name = settings.Provider.CreateValidIdentifier (file.FilePath.FileNameWithoutExtension);
			settings.Namespace = CustomToolService.GetFileNamespace (file, outputFile);
			settings.IncludePreprocessingHelpers = string.IsNullOrEmpty (settings.Inherits);
			settings.IsPreprocessed = true;

			var ccu = TemplatingEngine.GenerateCompileUnit (host, content, pt, settings);
			host.Errors.AddRange (pt.Errors);
			if (pt.Errors.HasErrors) {
				return;
			}

			try {
				using (var writer = new StreamWriter (outputFile, false, System.Text.Encoding.UTF8)) {
					settings.Provider.GenerateCodeFromCompileUnit (ccu, writer, new CodeGeneratorOptions ());
				}
			}
			catch (IOException ex) {
				host.Errors.Add (new CompilerError {
					ErrorText = GettextCatalog.GetString ("Could not write output file '{0}':\n{1}", outputFile, ex)
				});
			}
		}
コード例 #7
0
ファイル: TextSubstitutionStrategy.cs プロジェクト: rh/poplar
        private static void Stub(FileSystemInfo source, FileSystemInfo destination)
        {
            if (source.FullName.EndsWith(".spark"))
            {
                // At this time the destination is already copied and processed by
                // 'simple' text substitution, so destination should be processed.
                var settings = new SparkSettings();
                settings.AddNamespace("System");

                var engine = new SparkViewEngine(settings) {DefaultPageBaseType = typeof(Template).FullName};
                var folder = new InMemoryViewFolder {{source.Name, File.ReadAllText(destination.FullName)}};
                engine.ViewFolder = folder;

                var descriptor = new SparkViewDescriptor();
                descriptor.AddTemplate(source.Name);

                var view = (Template) engine.CreateInstance(descriptor);
                var builder = new StringBuilder();
                using (var output = new StringWriter(builder))
                {
                    view.RenderView(output);
                    File.WriteAllText(destination.FullName, output.ToString());
                }

                engine.ReleaseInstance(view);
            }
            else if (source.FullName.EndsWith(".tt"))
            {
                var generator = new TemplateGenerator();
                if (!generator.ProcessTemplate(source.FullName, destination.FullName))
                {
                    var exception = new TemplateException(source.FullName);
                    foreach (CompilerError error in generator.Errors)
                    {
                        exception.AddError(error.ErrorText);
                    }
                    throw exception;
                }
            }
        }
コード例 #8
0
		private static int MainInternal (string[] args)
		{
			if (args.Length == 0) {
				ShowHelp (true);
			}
			
			var generator = new TemplateGenerator ();
			string outputFile = null, inputFile = null;
			var directives = new List<string> ();
			var parameters = new List<string> ();
		//	var session = new Microsoft.VisualStudio.TextTemplating.TextTemplatingSession ();
			string preprocess = null;
			
			optionSet = new OptionSet () {
				{ "o=|out=", "The name of the output {file}", s => outputFile = s },
				{ "r=", "Assemblies to reference", s => generator.Refs.Add (s) },
				{ "u=", "Namespaces to import <{0:namespace}>", s => generator.Imports.Add (s) },
				{ "I=", "Paths to search for included files", s => generator.IncludePaths.Add (s) },
				{ "P=", "Paths to search for referenced assemblies", s => generator.ReferencePaths.Add (s) },
				{ "dp=", "Directive processor (name!class!assembly)", s => directives.Add (s) },
				{ "a=", "Parameters ([processorName]![directiveName]!name!value)", s => parameters.Add (s) },
				{ "h|?|help", "Show help", s => ShowHelp (false) },
		//		{ "k=,", "Session {key},{value} pairs", (s, t) => session.Add (s, t) },
				{ "c=", "Preprocess the template into {0:class}", (s) => preprocess = s },
			};
			
			var remainingArgs = optionSet.Parse (args);
			
			if (remainingArgs.Count != 1) {
				Console.Error.WriteLine ("No input file specified.");
				return -1;
			}
			inputFile = remainingArgs [0];
			
			if (!File.Exists (inputFile)) {
				Console.Error.WriteLine ("Input file '{0}' does not exist.");
				return -1;
			}
			
			if (string.IsNullOrEmpty (outputFile)) {
				outputFile = inputFile;
				if (Path.HasExtension (outputFile)) {
					var dir = Path.GetDirectoryName (outputFile);
					var fn = Path.GetFileNameWithoutExtension (outputFile);
					outputFile = Path.Combine (dir, fn + ".txt");
				} else {
					outputFile = outputFile + ".txt";
				}
			}

			//FIXME: implement quoting and escaping for values
			foreach (var par in parameters) {
				var split = par.Split ('!');
				if (split.Length < 2) {
					Console.Error.WriteLine ("Parameter does not have enough values: {0}", par);
					return -1;
				}
				if (split.Length > 2) {
					Console.Error.WriteLine ("Parameter has too many values: {0}", par);
					return -1;
				}
				string name = split[split.Length-2];
				string val  = split[split.Length-1];
				if (string.IsNullOrEmpty (name)) {
					Console.Error.WriteLine ("Parameter has no name: {0}", par);
					return -1;
				}
				generator.AddParameter (split.Length > 3? split[0] : null, split.Length > 2? split[split.Length-3] : null, name, val);
			}
			
			foreach (var dir in directives) {
				var split = dir.Split ('!');
				if (split.Length != 3) {
					Console.Error.WriteLine ("Directive does not have correct number of values: {0}", dir);
					return -1;
				}
				foreach (var s in split) {
					if (string.IsNullOrEmpty (s)) {
						Console.Error.WriteLine ("Directive has missing value: {0}", dir);
						return -1;
					}
				}
				generator.AddDirectiveProcessor (split[0], split[1], split[2]);
			}
			
			if (preprocess == null) {
				generator.ProcessTemplate (inputFile, outputFile);
				if (generator.Errors.HasErrors) {
					Console.WriteLine ("Processing '{0}' failed.", inputFile);
				}
			} else {
				string className = preprocess;
				string classNamespace = null;
				int s = preprocess.LastIndexOf ('.');
				if (s > 0) {
					classNamespace = preprocess.Substring (0, s);
					className = preprocess.Substring (s + 1);
				}
				
				string language;
				string[] references;
				generator.PreprocessTemplate (inputFile, className, classNamespace, outputFile, System.Text.Encoding.UTF8,
					out language, out references);
				if (generator.Errors.HasErrors) {
					Console.Write ("Preprocessing '{0}' into class '{1}.{2}' failed.", inputFile, classNamespace, className);
				}
			}
			
			foreach (System.CodeDom.Compiler.CompilerError err in generator.Errors)
				Console.Error.WriteLine ("{0}({1},{2}): {3} {4}", err.FileName, err.Line, err.Column,
				                   err.IsWarning? "WARNING" : "ERROR", err.ErrorText);
			
			return generator.Errors.HasErrors? -1 : 0;
		}
コード例 #9
0
        static int MainInternal(string[] args)
        {
            if (args.Length == 0)
            {
                ShowHelp(true);
            }

            var generator = new TemplateGenerator();

            string outputFile = null, inputFile = null;
            var    directives = new List <string> ();
            var    parameters = new List <string> ();
            string preprocess = null;

            optionSet = new OptionSet()
            {
                { "o=|out=", "The name of the output {file}", s => outputFile = s },
                { "r=", "Assemblies to reference", s => generator.Refs.Add(s) },
                { "u=", "Namespaces to import <{0:namespace}>", s => generator.Imports.Add(s) },
                { "I=", "Paths to search for included files", s => generator.IncludePaths.Add(s) },
                { "P=", "Paths to search for referenced assemblies", s => generator.ReferencePaths.Add(s) },
                { "dp=", "Directive processor (name!class!assembly)", s => directives.Add(s) },
                { "a=", "Parameters (name=value) or ([processorName!][directiveName!]name!value)", s => parameters.Add(s) },
#if NET5
                { "roslyn", "Use Roslyn", s => generator.UseInProcessCompiler() },
#endif
                { "h|?|help", "Show help", s => ShowHelp(false) },
                //		{ "k=,", "Session {key},{value} pairs", (s, t) => session.Add (s, t) },
                { "c=", "Preprocess the template into {0:class}", (s) => preprocess = s },
            };

            var remainingArgs = optionSet.Parse(args);

            if (remainingArgs.Count != 1)
            {
                Console.Error.WriteLine("No input file specified.");
                return(-1);
            }
            inputFile = remainingArgs [0];

            if (!File.Exists(inputFile))
            {
                Console.Error.WriteLine("Input file '{0}' does not exist.", inputFile);
                return(-1);
            }

            if (string.IsNullOrEmpty(outputFile))
            {
                outputFile = inputFile;
                if (Path.HasExtension(outputFile))
                {
                    var dir = Path.GetDirectoryName(outputFile);
                    var fn  = Path.GetFileNameWithoutExtension(outputFile);
                    outputFile = Path.Combine(dir, fn + ".txt");
                }
                else
                {
                    outputFile = outputFile + ".txt";
                }
            }

            foreach (var par in parameters)
            {
                if (!generator.TryAddParameter(par))
                {
                    Console.Error.WriteLine("Parameter has incorrect format: {0}", par);
                    return(-1);
                }
            }

            foreach (var dir in directives)
            {
                var split = dir.Split('!');

                if (split.Length != 3)
                {
                    Console.Error.WriteLine("Directive must have 3 values: {0}", dir);
                    return(-1);
                }

                for (int i = 0; i < 3; i++)
                {
                    string s = split [i];
                    if (string.IsNullOrEmpty(s))
                    {
                        string kind = i == 0? "name" : (i == 1 ? "class" : "assembly");
                        Console.Error.WriteLine("Directive has missing {0} value: {1}", kind, dir);
                        return(-1);
                    }
                }

                generator.AddDirectiveProcessor(split[0], split[1], split[2]);
            }

            if (preprocess == null)
            {
                generator.ProcessTemplate(inputFile, outputFile);
                if (generator.Errors.HasErrors)
                {
                    Console.WriteLine("Processing '{0}' failed.", inputFile);
                }
            }
            else
            {
                string className      = preprocess;
                string classNamespace = null;
                int    s = preprocess.LastIndexOf('.');
                if (s > 0)
                {
                    classNamespace = preprocess.Substring(0, s);
                    className      = preprocess.Substring(s + 1);
                }

                generator.PreprocessTemplate(inputFile, className, classNamespace, outputFile, new System.Text.UTF8Encoding(encoderShouldEmitUTF8Identifier: false),
                                             out string language, out string[] references);
                if (generator.Errors.HasErrors)
                {
                    Console.Write("Preprocessing '{0}' into class '{1}.{2}' failed.", inputFile, classNamespace, className);
                }
            }

            foreach (TemplateError err in generator.Errors)
            {
                Console.Error.WriteLine("{0}({1},{2}): {3} {4}", err.Location.FileName, err.Location.Line, err.Location.Column,
                                        err.IsWarning ? "WARNING" : "ERROR", err.Message);
            }

            return(generator.Errors.HasErrors? -1 : 0);
        }
コード例 #10
0
        public static int Main(string[] args)
        {
            if (args.Length == 0)
            {
                ShowHelp(true);
            }

            var    generator = new TemplateGenerator();
            string outputFile = null, inputFile = null;
            var    directives = new List <string> ();
            var    parameters = new List <string> ();
            var    session    = new Microsoft.VisualStudio.TextTemplating.TextTemplatingSession();
            string preprocess = null;

            optionSet = new OptionSet()
            {
                { "o=|out=", "The name of the output {file}", s => outputFile = s },
                { "r=", "Assemblies to reference", s => generator.Refs.Add(s) },
                { "u=", "Namespaces to import <{0:namespace}>", s => generator.Imports.Add(s) },
                { "I=", "Paths to search for included files", s => generator.IncludePaths.Add(s) },
                { "P=", "Paths to search for referenced assemblies", s => generator.ReferencePaths.Add(s) },
                { "dp=", "Directive processor (name!class!assembly)", s => directives.Add(s) },
                { "a=", "Parameters ([processorName]![directiveName]!name!value)", s => parameters.Add(s) },
                { "h|?|help", "Show help", s => ShowHelp(false) },
                //		{ "k=,", "Session {key},{value} pairs", (s, t) => session.Add (s, t) },
                { "c=", "Preprocess the template into {0:class}", (s) => preprocess = s },
            };

            var remainingArgs = optionSet.Parse(args);

            if (string.IsNullOrEmpty(outputFile))
            {
                Console.Error.WriteLine("No output file specified.");
                return(-1);
            }

            if (remainingArgs.Count != 1)
            {
                Console.Error.WriteLine("No input file specified.");
                return(-1);
            }
            inputFile = remainingArgs [0];

            if (!File.Exists(inputFile))
            {
                Console.Error.WriteLine("Input file '{0}' does not exist.");
                return(-1);
            }

            //FIXME: implement quoting and escaping for values
            foreach (var par in parameters)
            {
                var split = par.Split('!');
                if (split.Length < 2)
                {
                    Console.Error.WriteLine("Parameter does not have enough values: {0}", par);
                    return(-1);
                }
                if (split.Length > 2)
                {
                    Console.Error.WriteLine("Parameter has too many values: {0}", par);
                    return(-1);
                }
                string name = split[split.Length - 2];
                string val  = split[split.Length - 1];
                if (string.IsNullOrEmpty(name))
                {
                    Console.Error.WriteLine("Parameter has no name: {0}", par);
                    return(-1);
                }
                generator.AddParameter(split.Length > 3? split[0] : null, split.Length > 2? split[split.Length - 3] : null, name, val);
            }

            foreach (var dir in directives)
            {
                var split = dir.Split('!');
                if (split.Length != 3)
                {
                    Console.Error.WriteLine("Directive does not have correct number of values: {0}", dir);
                    return(-1);
                }
                foreach (var s in split)
                {
                    if (string.IsNullOrEmpty(s))
                    {
                        Console.Error.WriteLine("Directive has missing value: {0}", dir);
                        return(-1);
                    }
                }
                generator.AddDirectiveProcessor(split[0], split[1], split[2]);
            }

            if (preprocess == null)
            {
                Console.Write("Processing '{0}'... ", inputFile);
                generator.ProcessTemplate(inputFile, outputFile);
                if (generator.Errors.HasErrors)
                {
                    Console.WriteLine("failed.");
                }
                else
                {
                    Console.WriteLine("completed successfully.");
                }
            }
            else
            {
                string className      = preprocess;
                string classNamespace = null;
                int    s = preprocess.LastIndexOf('.');
                if (s > 0)
                {
                    classNamespace = preprocess.Substring(0, s);
                    className      = preprocess.Substring(s + 1);
                }

                Console.Write("Preprocessing '{0}' into class '{1}.{2}'... ", inputFile, classNamespace, className);
                string   language;
                string[] references;
                generator.PreprocessTemplate(inputFile, className, classNamespace, outputFile, System.Text.Encoding.UTF8,
                                             out language, out references);
                if (generator.Errors.HasErrors)
                {
                    Console.WriteLine("failed.");
                }
                else
                {
                    Console.WriteLine("completed successfully:");
                    Console.WriteLine("    Language: {0}", language);
                    if (references != null && references.Length > 0)
                    {
                        Console.WriteLine(" References:");
                        foreach (string r in references)
                        {
                            Console.WriteLine("    {0}", r);
                        }
                    }
                }
            }

            foreach (System.CodeDom.Compiler.CompilerError err in generator.Errors)
            {
                Console.Error.WriteLine("{0}({1},{2}): {3} {4}", err.FileName, err.Line, err.Column,
                                        err.IsWarning? "WARNING" : "ERROR", err.ErrorText);
            }

            return(generator.Errors.HasErrors? -1 : 0);
        }
コード例 #11
0
        public static int Main(string[] args)
        {
            if (args.Length == 0)
            {
                ShowHelp(true);
            }

            TemplateGenerator generator = new TemplateGenerator();
            string            outputFile = null, inputFile = null;

            optionSet = new OptionSet()
            {
                { "o=|out=", "The name of the output {file}", s => outputFile = s },
                { "r=", "Assemblies to reference", s => generator.Refs.Add(s) },
                { "u=", "Namespaces to import <{0:namespace}>", s => generator.Imports.Add(s) },
                { "I=", "Paths to search for included files", s => generator.IncludePaths.Add(s) },
                { "P=", "Paths to search for referenced assemblies", s => generator.ReferencePaths.Add(s) },
                { "dp=", "Directive processor name!class!assembly", s => generator.DirectiveProcessors.Add(s) },
                { "a=", "Key value pairs for directive processors", (s, p) => generator.ProcessorValues[s] = p },
                { "h|?|help", "Show help", s => ShowHelp(false) }
            };

            List <string> remainingArgs = optionSet.Parse(args);

            if (String.IsNullOrEmpty(outputFile))
            {
                Console.WriteLine("No output file specified.");
                return(-1);
            }

            if (remainingArgs.Count != 1)
            {
                Console.WriteLine("No input file specified.");
                return(-1);
            }
            inputFile = remainingArgs [0];

            if (!File.Exists(inputFile))
            {
                Console.WriteLine("Input file '{0}' does not exist.");
                return(-1);
            }

            System.Console.Write("Processing '{0}'... ", inputFile);
            generator.ProcessTemplate(inputFile, outputFile);

            if (generator.Errors.HasErrors)
            {
                System.Console.WriteLine("failed.");
            }
            else
            {
                System.Console.WriteLine("completed successfully.");
            }

            foreach (System.CodeDom.Compiler.CompilerError err in generator.Errors)
            {
                Console.WriteLine("{0}({1},{2}): {3} {4}", err.FileName, err.Line, err.Column,
                                  err.IsWarning? "WARNING" : "ERROR", err.ErrorText);
            }

            return(generator.Errors.HasErrors? -1 : 0);
        }
コード例 #12
0
ファイル: TextTransform.cs プロジェクト: pgoron/monodevelop
		public static int Main (string[] args)
		{
			if (args.Length == 0) {
				ShowHelp (true);
			}
			
			var generator = new TemplateGenerator ();
			string outputFile = null, inputFile = null;
			var directives = new List<string> ();
			var parameters = new List<string> ();
			
			optionSet = new OptionSet () {
				{ "o=|out=", "The name of the output {file}", s => outputFile = s },
				{ "r=", "Assemblies to reference", s => generator.Refs.Add (s) },
				{ "u=", "Namespaces to import <{0:namespace}>", s => generator.Imports.Add (s) },
				{ "I=", "Paths to search for included files", s => generator.IncludePaths.Add (s) },
				{ "P=", "Paths to search for referenced assemblies", s => generator.ReferencePaths.Add (s) },
				{ "dp=", "Directive processor (name!class!assembly)", s => directives.Add (s) },
				{ "a=", "Parameters ([processorName]![directiveName]!name!value)", s => parameters.Add (s) },
				{ "h|?|help", "Show help", s => ShowHelp (false) }
			};
			
			var remainingArgs = optionSet.Parse (args);
			
			if (string.IsNullOrEmpty (outputFile)) {
				Console.Error.WriteLine ("No output file specified.");
				return -1;
			}
			
			if (remainingArgs.Count != 1) {
				Console.Error.WriteLine ("No input file specified.");
				return -1;
			}
			inputFile = remainingArgs [0];
			
			if (!File.Exists (inputFile)) {
				Console.Error.WriteLine ("Input file '{0}' does not exist.");
				return -1;
			}
			
			//FIXME: implement quoting and escaping for values
			foreach (var par in parameters) {
				var split = par.Split ('!');
				if (split.Length < 2) {
					Console.Error.WriteLine ("Parameter does not have enough values: {0}", par);
					return -1;
				}
				if (split.Length > 2) {
					Console.Error.WriteLine ("Parameter has too many values: {0}", par);
					return -1;
				}
				string name = split[split.Length-2];
				string val  = split[split.Length-1];
				if (string.IsNullOrEmpty (name)) {
					Console.Error.WriteLine ("Parameter has no name: {0}", par);
					return -1;
				}
				generator.AddParameter (split.Length > 3? split[0] : null, split.Length > 2? split[split.Length-3] : null, name, val);
			}
			
			foreach (var dir in directives) {
				var split = dir.Split ('!');
				if (split.Length != 3) {
					Console.Error.WriteLine ("Directive does not have correct number of values: {0}", dir);
					return -1;
				}
				foreach (var s in split) {
					if (string.IsNullOrEmpty (s)) {
						Console.Error.WriteLine ("Directive has missing value: {0}", dir);
						return -1;
					}
				}
				generator.AddDirectiveProcessor (split[0], split[1], split[2]);
			}
			
			Console.Write("Processing '{0}'... ", inputFile);
			generator.ProcessTemplate (inputFile, outputFile);
			
			if (generator.Errors.HasErrors) {
				Console.WriteLine("failed.");
			} else {
				Console.WriteLine("completed successfully.");
			}
			
			foreach (System.CodeDom.Compiler.CompilerError err in generator.Errors)
				Console.Error.WriteLine ("{0}({1},{2}): {3} {4}", err.FileName, err.Line, err.Column,
				                   err.IsWarning? "WARNING" : "ERROR", err.ErrorText);
			
			return generator.Errors.HasErrors? -1 : 0;
		}
コード例 #13
0
 public static void UseInProcessCompiler(this TemplateGenerator generator)
 {
     generator.Engine.UseInProcessCompiler();
 }
コード例 #14
0
				static void generateCSharpStatesEnum (string namespaceName, string enumName, string fileName, StringBuilder statesStringBuilder)
				{

						//Create template generator
						TemplateGenerator generator = new TemplateGenerator ();
						generator.Session.Add ("Namespace", namespaceName);
						//generator.Session.Add ("ClassName", controller.name.Replace (" ", "") + "Class");
						generator.Session.Add ("EnumName", enumName);		
						generator.Session.Add ("Values", statesStringBuilder.ToString ());
		
						

						string generated;



						generated = Path.Combine (Application.dataPath, "Scripts");
						
						//if Scripts doesn't exist
						if (!Directory.Exists (generated))
								Directory.CreateDirectory (generated);


						//string[] filesFound=Directory.GetFiles (Path.Combine (generated, fileName));

						//if (filesFound.Length == 0) {
						generated = namespaceToDirectory (generated, namespaceName);
						generated = Path.GetFullPath (Path.Combine (generated, fileName));
						//} else {
						//		generated=filesFound[0];
						//}
								

		
						try {

								///!!! OSX : error !Error running gmcs : Cannot find the specified file.! happen here cos of unity bug
								/// Download and install MRE(Mono Runtime Envi)
								/// http://www.mono-project.com/download/
								/// saving doesn't work still cos of unknown
								fileName = Path.Combine (Path.Combine (Application.dataPath, "Editor"), "StatesEnumTemplate.tpl");
								UnityEngine.Debug.Log ("Generating " + generated + " from template:" + fileName);
								generator.ProcessTemplate (fileName, generated);
			
								
						} catch (Exception e) {
								UnityEngine.Debug.LogError (e.Message);
						}
		
						AssetDatabase.Refresh ();

				}