protected override void Visit(MacroChunk chunk) { _source.Write(string.Format("\r\n object {0}(", chunk.Name)); string delimiter = ""; foreach (var parameter in chunk.Parameters) { _source.Write(delimiter).WriteCode(parameter.Type).Write(" ").Write(parameter.Name); delimiter = ", "; } _source.WriteLine(")"); CodeIndent(chunk).WriteLine("{"); CodeHidden(); _source.WriteLine(" using(OutputScope(new System.IO.StringWriter()))"); _source.WriteLine(" {"); CodeDefault(); var variables = new Dictionary <string, object>(); foreach (var param in chunk.Parameters) { variables.Add(param.Name, null); } var generator = new GeneratedCodeVisitor(_source, variables, _nullBehaviour); generator.Accept(chunk.Body); CodeHidden(); _source.WriteLine(" return HTML(Output);"); _source.WriteLine(" }"); _source.WriteLine(" }"); CodeDefault(); }
public void VisitChunk(IChunkVisitor visitor, OutputLocation location, IList<Chunk> body, StringBuilder output) { if (location == OutputLocation.ClassMembers) { foreach (var snippet in body.OfType<CodeStatementChunk>().SelectMany(chunk => chunk.Code)) { snippet.Value = snippet.Value.Replace("@class", "class"); } var source = new SourceWriter(new StringWriter(output)); var generator = new GeneratedCodeVisitor(source, new Dictionary<string, object>(), NullBehaviour.Strict); generator.Accept(body); } }
public override void GenerateSourceCode(IEnumerable<IList<Chunk>> viewTemplates, IEnumerable<IList<Chunk>> allResources) { var globalSymbols = new Dictionary<string, object>(); var writer = new StringWriter(); var source = new SourceWriter(writer); var usingGenerator = new UsingNamespaceVisitor(source); var baseClassGenerator = new BaseClassVisitor { BaseClass = BaseClass }; var globalsGenerator = new GlobalMembersVisitor(source, globalSymbols, NullBehaviour); // using <namespaces>; foreach (var ns in UseNamespaces ?? new string[0]) usingGenerator.UsingNamespace(ns); foreach (var assembly in UseAssemblies ?? new string[0]) usingGenerator.UsingAssembly(assembly); foreach (var resource in allResources) usingGenerator.Accept(resource); foreach (var resource in allResources) baseClassGenerator.Accept(resource); var viewClassName = "View" + GeneratedViewId.ToString("n"); if (string.IsNullOrEmpty(TargetNamespace)) { ViewClassFullName = viewClassName; } else { ViewClassFullName = TargetNamespace + "." + viewClassName; source .WriteLine() .WriteLine(string.Format("namespace {0}", TargetNamespace)) .WriteLine("{").AddIndent(); } source.WriteLine(); if (Descriptor != null) { // [SparkView] attribute source.WriteLine("[global::Spark.SparkViewAttribute("); if (TargetNamespace != null) source.WriteFormat(" TargetNamespace=\"{0}\",", TargetNamespace).WriteLine(); source.WriteLine(" Templates = new string[] {"); source.Write(" ").WriteLine(string.Join(",\r\n ", Descriptor.Templates.Select( t => "\"" + t.Replace("\\", "\\\\") + "\"").ToArray())); source.WriteLine(" })]"); } // public class ViewName : BasePageType source .Write("public class ") .Write(viewClassName) .Write(" : ") .WriteCode(baseClassGenerator.BaseClassTypeName) .WriteLine(); source.WriteLine("{").AddIndent(); source.WriteLine(); EditorBrowsableStateNever(source, 4); source.WriteLine("private static System.Guid _generatedViewId = new System.Guid(\"{0:n}\");", GeneratedViewId); source.WriteLine("public override System.Guid GeneratedViewId"); source.WriteLine("{ get { return _generatedViewId; } }"); if (Descriptor != null && Descriptor.Accessors != null) { foreach (var accessor in Descriptor.Accessors) { source.WriteLine(); source.Write("public ").WriteLine(accessor.Property); source.Write("{ get { return ").Write(accessor.GetValue).WriteLine("; } }"); } } // properties and macros foreach (var resource in allResources) globalsGenerator.Accept(resource); // public void RenderViewLevelx() int renderLevel = 0; foreach (var viewTemplate in viewTemplates) { source.WriteLine(); EditorBrowsableStateNever(source, 4); source.WriteLine(string.Format("private void RenderViewLevel{0}()", renderLevel)); source.WriteLine("{").AddIndent(); var viewGenerator = new GeneratedCodeVisitor(source, globalSymbols, NullBehaviour); viewGenerator.Accept(viewTemplate); source.RemoveIndent().WriteLine("}"); ++renderLevel; } // public void RenderView() source.WriteLine(); EditorBrowsableStateNever(source, 4); source.WriteLine("public override void Render()"); source.WriteLine("{").AddIndent(); for (var invokeLevel = 0; invokeLevel != renderLevel; ++invokeLevel) { if (invokeLevel != renderLevel - 1) { source.WriteLine("using (OutputScope()) {{RenderViewLevel{0}(); Content[\"view\"] = Output;}}", invokeLevel); } else { source.WriteLine(" RenderViewLevel{0}();", invokeLevel); } } source.RemoveIndent().WriteLine("}"); // end class source.RemoveIndent().WriteLine("}"); if (!string.IsNullOrEmpty(TargetNamespace)) { source.RemoveIndent().WriteLine("}"); } SourceCode = source.ToString(); SourceMappings = source.Mappings; }
protected override void Visit(MacroChunk chunk) { _source.Write(string.Format("\r\n object {0}(", chunk.Name)); string delimiter = ""; foreach (var parameter in chunk.Parameters) { _source.Write(delimiter).WriteCode(parameter.Type).Write(" ").Write(parameter.Name); delimiter = ", "; } _source.WriteLine(")"); CodeIndent(chunk).WriteLine("{"); CodeHidden(); _source.WriteLine(" using(OutputScope(new System.IO.StringWriter()))"); _source.WriteLine(" {"); CodeDefault(); var variables = new Dictionary<string, object>(); foreach (var param in chunk.Parameters) { variables.Add(param.Name, null); } var generator = new GeneratedCodeVisitor(_source, variables, _nullBehaviour); generator.Accept(chunk.Body); CodeHidden(); _source.WriteLine(" return HTML(Output);"); _source.WriteLine(" }"); _source.WriteLine(" }"); CodeDefault(); }