private void GenerateTemplates(List <GeneratorOutput> outputs, IEnumerable <TranslationUnit> units) { foreach (var unit in units) { var includeDir = Path.GetDirectoryName(unit.FilePath); var templates = Generate(new[] { unit }); if (templates.Count == 0) { return; } CurrentOutputNamespace = unit.Module.OutputNamespace; foreach (var template in templates) { template.Process(); } var output = new GeneratorOutput { TranslationUnit = unit, Templates = templates }; outputs.Add(output); OnUnitGenerated(output); } }
private void GenerateTemplates(List <GeneratorOutput> outputs, IEnumerable <TranslationUnit> units) { foreach (var unit in units) { var templates = Generate(new[] { unit }); if (templates.Count == 0) { return; } foreach (var template in templates) { template.Process(); } var output = new GeneratorOutput { TranslationUnit = unit, Outputs = templates }; outputs.Add(output); OnUnitGenerated(output); } }
private void OnUnitGenerated(GeneratorOutput output) { needsStreamInclude = false; foreach (var template in output.Templates) { foreach (var block in template.FindBlocks(CLIBlockKind.MethodBody)) { var method = block.Declaration as Method; VisitMethod(method, block); } if (needsStreamInclude) { var sourcesTemplate = template as CLISources; if (sourcesTemplate != null) { foreach (var block in sourcesTemplate.FindBlocks(CLIBlockKind.Includes)) { block.WriteLine("#include <sstream>"); block.WriteLine(""); break; } break; } } } }
public virtual GeneratorOutput GenerateModule(Module module) { var output = new GeneratorOutput { TranslationUnit = new TranslationUnit { FilePath = $"{module.LibraryName}", Module = module }, Outputs = Generate(module.Units.GetGenerated()) }; output.Outputs[0].Process(); return(output); }
private void GenerateSingleTemplate(IEnumerable <TranslationUnit> units, ICollection <GeneratorOutput> outputs) { var output = new GeneratorOutput { TranslationUnit = new TranslationUnit { FilePath = string.Format("{0}.cs", Driver.Options.OutputNamespace ?? Driver.Options.LibraryName) }, Templates = Generate(units) }; output.Templates[0].Process(); outputs.Add(output); OnUnitGenerated(output); }
private GeneratorOutput GenerateModuleTemplate(Module module) { var output = new GeneratorOutput { TranslationUnit = new TranslationUnit { FilePath = $"{module.LibraryName}.cs", Module = module }, Outputs = Generate(module.Units.GetGenerated()) }; output.Outputs[0].Process(); OnUnitGenerated(output); return(output); }
private void GenerateSingleTemplate(ICollection <GeneratorOutput> outputs) { foreach (var module in Context.Options.Modules) { var output = new GeneratorOutput { TranslationUnit = new TranslationUnit { FilePath = $"{module.LibraryName}.cs", Module = module }, Outputs = Generate(module.Units.GetGenerated()) }; output.Outputs[0].Process(); outputs.Add(output); OnUnitGenerated(output); } }
private void GenerateSingleTemplate(ICollection <GeneratorOutput> outputs) { foreach (var module in Context.Options.Modules) { CurrentOutputNamespace = module.OutputNamespace; var output = new GeneratorOutput { TranslationUnit = new TranslationUnit { FilePath = string.Format("{0}.cs", module.LibraryName), Module = module }, Templates = Generate(module.Units.GetGenerated()) }; output.Templates[0].Process(); outputs.Add(output); OnUnitGenerated(output); } }
private void OnUnitGenerated(GeneratorOutput generatorOutput) { var blocks = (from template in generatorOutput.Templates from block in template.FindBlocks(CSharpBlockKind.Method) where this.events.Contains(block.Declaration) select block).ToList(); foreach (var block in blocks) { var method = (Function) block.Declaration; string @event; if (((Class) method.Namespace).Methods.Any(m => m != method && m.OriginalName == method.OriginalName)) { @event = method.OriginalName; } else { @event = char.ToUpperInvariant(method.OriginalName[0]) + method.OriginalName.Substring(1); } var blockIndex = block.Parent.Blocks.IndexOf(block); var eventBlock = new Block(CSharpBlockKind.Event); eventBlock.WriteLine("public event global::System.Action<object, {0}> {1};", method.Parameters[0].Type, @event); eventBlock.NewLine(); const string eventHandler = @"__eventHandler"; var raiseEvent = string.Format( @"var {0} = {1}; if ({0} != null) {0}(this, {2}); if ({2}.Handled) return{3}; ", eventHandler, @event, method.Parameters[0].Name, method.OriginalReturnType.Type.IsPrimitiveType(PrimitiveType.Void) ? string.Empty : " true"); if (block.Blocks.Count > 0 && block.Blocks[0].Kind == BlockKind.BlockComment) { eventBlock.Blocks.Add(block.Blocks[0]); } block.Parent.Blocks.Insert(blockIndex, eventBlock); block.Text.StringBuilder.Replace("var __slot", raiseEvent + " var __slot"); } }
public virtual GeneratorOutput GenerateUnit(TranslationUnit unit) { var codeGenerators = Generate(new[] { unit }); if (codeGenerators.Count == 0) { return(null); } foreach (var codeGen in codeGenerators) { codeGen.Process(); } var output = new GeneratorOutput { TranslationUnit = unit, Outputs = codeGenerators }; return(output); }
/// <summary> /// Generates the outputs. /// </summary> public virtual List <GeneratorOutput> Generate() { var outputs = new List <GeneratorOutput>(); foreach (var unit in Driver.Library.TranslationUnits) { if (unit.Ignore || !unit.HasDeclarations) { continue; } if (unit.IsSystemHeader) { continue; } var templates = Generate(unit); if (templates.Count == 0) { continue; } foreach (var template in templates) { template.Process(); } var output = new GeneratorOutput { TranslationUnit = unit, Templates = templates }; outputs.Add(output); OnUnitGenerated(output); } return(outputs); }
private void OnUnitGenerated(GeneratorOutput generatorOutput) { var blocks = (from template in generatorOutput.Templates from block in template.FindBlocks(CSharpBlockKind.Method) where this.events.Contains(block.Declaration) select block).ToList(); foreach (var block in blocks) { var method = (Function) block.Declaration; var @event = char.ToUpperInvariant(method.OriginalName[0]) + method.OriginalName.Substring(1); var blockIndex = block.Parent.Blocks.IndexOf(block); var eventBlock = new Block(CSharpBlockKind.Event); eventBlock.WriteLine("public event global::System.Action<object, {0}> {1};", method.Parameters[0].Type, @event); eventBlock.NewLine(); const string eventHandler = @"__eventHandler"; var raiseEvent = string.Format( @" var {0} = {1}; if ({0} != null) {0}(this, {2}); ", eventHandler, @event, method.Parameters[0].Name); if (block.Blocks.Count > 0 && block.Blocks[0].Kind == BlockKind.BlockComment) { eventBlock.Blocks.Add(block.Blocks[0]); } block.Parent.Blocks.Insert(blockIndex, eventBlock); var stringBuilder = block.Text.StringBuilder; if (method.OriginalReturnType.Type.IsPrimitiveType(PrimitiveType.Void)) { stringBuilder.Insert(stringBuilder.Length - 1 - Environment.NewLine.Length, raiseEvent); } else { const string @return = " return "; stringBuilder.Replace(@return, raiseEvent + @return); } } }
public virtual GeneratorOutput GenerateModule(Module module) { var generatedUnits = module.Units.GetGenerated().ToList(); if (generatedUnits.Count == 0) { return(null); } var output = new GeneratorOutput { TranslationUnit = new TranslationUnit { FilePath = $"{module.LibraryName}.h", Module = module }, Outputs = Generate(generatedUnits) }; output.Outputs[0].Process(); return(output); }
private void GenerateTemplate(TranslationUnit unit, ICollection <GeneratorOutput> outputs) { var templates = Generate(new[] { unit }); if (templates.Count == 0) { return; } foreach (var template in templates) { template.Process(); } var output = new GeneratorOutput { TranslationUnit = unit, Templates = templates }; outputs.Add(output); OnUnitGenerated(output); }
public override void VisitGeneratorOutput(GeneratorOutput output) { foreach (var template in output.Templates) { var blocks = template.FindBlocks(CLIBlockKind.MethodBody); foreach (var block in blocks) VisitMethodBody(block); } }
private void OnUnitGenerated(GeneratorOutput generatorOutput) { foreach (Block block in from template in generatorOutput.Templates from block in template.FindBlocks(CSharpBlockKind.Event) select block) { Event @event = (Event) block.Declaration; if (this.events.Contains(@event)) { block.Text.StringBuilder.Clear(); Class @class = (Class) @event.Namespace; if (!this.addedEventHandlers && @class.Name == "QObject") { block.WriteLine("protected readonly System.Collections.Generic.List<QEventHandler> " + "eventFilters = new System.Collections.Generic.List<QEventHandler>();"); block.NewLine(); this.addedEventHandlers = true; } bool isQAbstractScrollArea = @class.Name != "QAbstractScrollArea"; if (@event.OriginalDeclaration.Comment != null) { block.WriteLine("/// <summary>"); foreach (string line in HtmlEncoder.HtmlEncode(@event.OriginalDeclaration.Comment.BriefText).Split( Environment.NewLine.ToCharArray())) { block.WriteLine("/// <para>{0}</para>", line); } block.WriteLine("/// </summary>"); } block.WriteLine(@"public {0} event EventHandler<QEventArgs<{1}>> {2} {{ add {{ QEventArgs<{1}> qEventArgs = new QEventArgs<{1}>(new System.Collections.Generic.List<QEvent.Type> {{ {3} }}); QEventHandler<{1}> qEventHandler = new QEventHandler<{1}>(this{4}, qEventArgs, value); foreach (QEventHandler eventFilter in eventFilters) {{ this{4}.RemoveEventFilter(eventFilter); }} eventFilters.Add(qEventHandler); for (int i = eventFilters.Count - 1; i >= 0; i--) {{ this{4}.InstallEventFilter(eventFilters[i]); }} }} remove {{ for (int i = eventFilters.Count - 1; i >= 0; i--) {{ QEventHandler eventFilter = eventFilters[i]; if (eventFilter.Handler == value) {{ this{4}.RemoveEventFilter(eventFilter); eventFilters.RemoveAt(i); break; }} }} }} }}", isQAbstractScrollArea ? "virtual" : "override", @event.Parameters[0].Type, @event.Name, this.GetEventTypes(@event), isQAbstractScrollArea ? string.Empty : ".Viewport"); } } }
public virtual void VisitGeneratorOutput(GeneratorOutput output) { }
private void GenerateTemplates(List<GeneratorOutput> outputs, IEnumerable<TranslationUnit> units) { foreach (var unit in units) { var includeDir = Path.GetDirectoryName(unit.FilePath); var templates = Generate(new[] { unit }); if (templates.Count == 0) return; CurrentOutputNamespace = unit.Module.OutputNamespace; foreach (var template in templates) { template.Process(); } var output = new GeneratorOutput { TranslationUnit = unit, Templates = templates }; outputs.Add(output); OnUnitGenerated(output); } }
private void GenerateSignalEvents(GeneratorOutput generatorOutput) { foreach (Block block in from template in generatorOutput.Templates from block in template.FindBlocks(CSharpBlockKind.Event) select block) { Event @event = (Event) block.Declaration; if (this.events.Contains(@event)) { block.Text.StringBuilder.Clear(); Class @class = (Class) @event.Namespace; int argNum = 1; StringBuilder fullNameBuilder = new StringBuilder("global::System.Action"); foreach (Parameter parameter in @event.Parameters) { argNum++; if (argNum == 2) { fullNameBuilder.Append('<'); } fullNameBuilder.Append(parameter.Type); fullNameBuilder.Append(','); } if (fullNameBuilder[fullNameBuilder.Length - 1] == ',') { fullNameBuilder[fullNameBuilder.Length - 1] = '>'; } string signature = string.Format("{0}({1})", @event.OriginalName, string.Join(", ", from e in @event.Parameters select GetOriginalParameterType(e))); Event existing = @class.Events.FirstOrDefault(e => e.Name == @event.Name); if (existing != null && existing != @event) { if (@event.Parameters.Count > 0) { @event.Name += GetSignalEventSuffix(@event); } else { existing.Name += GetSignalEventSuffix(@event); } } else { if (@event.Parameters.Count > 0 && (@class.Methods.Any(m => m.IsGenerated && m.OriginalName == @event.Name) || @class.Properties.Any(p => p.IsGenerated && p.OriginalName == @event.Name))) { @event.Name += GetSignalEventSuffix(@event); } } if (@event.OriginalDeclaration.Comment != null) { block.WriteLine("/// <summary>"); foreach (string line in HtmlEncoder.HtmlEncode(@event.OriginalDeclaration.Comment.BriefText).Split( Environment.NewLine.ToCharArray())) { block.WriteLine("/// <para>{0}</para>", line); } block.WriteLine("/// </summary>"); } var finalName = char.ToUpperInvariant(@event.Name[0]) + @event.Name.Substring(1); if (@event.Namespace.Declarations.Exists(d => d != @event && d.Name == finalName)) { finalName += "Signal"; } block.WriteLine(string.Format(@"public event {0} {1} {{ add {{ ConnectDynamicSlot(this, ""{2}"", value); }} remove {{ DisconnectDynamicSlot(this, ""{2}"", value); }} }}", fullNameBuilder, finalName, signature)); } } var qtMetacall = ( from template in generatorOutput.Templates from block in template.FindBlocks(CSharpBlockKind.Method) where block.Declaration != null && block.Declaration.Name == "QtMetacall" && block.Declaration.Namespace.Name == "QObject" select block).FirstOrDefault(); if (qtMetacall != null) { qtMetacall.Text.StringBuilder.Replace("return __ret;", "return HandleQtMetacall(__ret, _0, _2);"); } }
private void OnUnitGenerated(GeneratorOutput generatorOutput) { this.GenerateSignalEvents(generatorOutput); }
private void GenerateSingleTemplate(ICollection<GeneratorOutput> outputs) { foreach (var module in Context.Options.Modules) { CurrentOutputNamespace = module.OutputNamespace; var output = new GeneratorOutput { TranslationUnit = new TranslationUnit { FilePath = string.Format("{0}.cs", module.LibraryName), Module = module }, Templates = Generate(module.Units.GetGenerated()) }; output.Templates[0].Process(); outputs.Add(output); OnUnitGenerated(output); } }
private void OnUnitGenerated(GeneratorOutput generatorOutput) { foreach (Block block in from template in generatorOutput.Templates from block in template.FindBlocks(CSharpBlockKind.Event) select block) { Event @event = (Event) block.Declaration; if (this.events.Contains(@event)) { block.Text.StringBuilder.Clear(); Class @class = (Class) @event.Namespace; if (!this.addedEventHandlers && (@class.Name == "QObject" || @class.Name == "QGraphicsItem")) { block.WriteLine("protected readonly System.Collections.Generic.List<{0}> " + "eventFilters = new System.Collections.Generic.List<{0}>();", @class.Name == "QObject" ? "QtCore.QEventHandler" : "QtWidgets.QSceneEventHandler"); block.NewLine(); this.addedEventHandlers = true; } if (@event.OriginalDeclaration.Comment != null) { block.WriteLine("/// <summary>"); foreach (string line in HtmlEncoder.HtmlEncode(@event.OriginalDeclaration.Comment.BriefText).Split( Environment.NewLine.ToCharArray())) { block.WriteLine("/// <para>{0}</para>", line); } block.WriteLine("/// </summary>"); } var @base = @class.GetNonIgnoredRootBase(); block.WriteLine(@"public virtual event EventHandler<QtCore.QEventArgs<{0}>> {1} {{ add {{ var qEventArgs = new QtCore.QEventArgs<{0}>(new System.Collections.Generic.List<QtCore.QEvent.Type> {{ {2} }}); var qEventHandler = new {4}<{0}>(this, qEventArgs, value); foreach (var eventFilter in eventFilters) {{ this.Remove{3}EventFilter(eventFilter); }} eventFilters.Add(qEventHandler); for (int i = eventFilters.Count - 1; i >= 0; i--) {{ this.Install{3}EventFilter(eventFilters[i]); }} }} remove {{ for (int i = eventFilters.Count - 1; i >= 0; i--) {{ var eventFilter = eventFilters[i]; if (eventFilter.Handler == value) {{ this.Remove{3}EventFilter(eventFilter); eventFilters.RemoveAt(i); break; }} }} }} }}", @event.Parameters[0].Type, @event.Name, this.GetEventTypes(@event), @base.Name == "QObject" ? string.Empty : "Scene", @base.Name == "QObject" ? "QtCore.QEventHandler" : "QtWidgets.QSceneEventHandler"); } } }
private void GenerateSignalEvents(GeneratorOutput generatorOutput) { foreach (Block block in from template in generatorOutput.Templates from block in template.FindBlocks(CSharpBlockKind.Event) select block) { Event @event = (Event) block.Declaration; if (this.events.Contains(@event)) { block.Text.StringBuilder.Clear(); Class @class = (Class) @event.Namespace; if (!this.addedDynamicQObject && @class.Name == "QObject") { block.WriteLine(@"protected DynamicQObject dynamicQObject;"); block.NewLine(); block.WriteLine("protected DynamicQObject __DynamicQObject"); block.WriteStartBraceIndent(); block.WriteLine("get"); block.WriteStartBraceIndent(); block.WriteLine("if (dynamicQObject == null)"); block.WriteStartBraceIndent(); block.WriteLine("dynamicQObject = new DynamicQObject(null);"); block.WriteCloseBraceIndent(); block.WriteLine("return dynamicQObject;"); block.WriteCloseBraceIndent(); block.WriteCloseBraceIndent(); block.NewLine(); this.addedDynamicQObject = true; } int argNum = 1; StringBuilder fullNameBuilder = new StringBuilder("Action"); foreach (Parameter parameter in @event.Parameters) { argNum++; if (argNum == 2) { fullNameBuilder.Append('<'); } fullNameBuilder.Append(parameter.Type); fullNameBuilder.Append(','); } if (fullNameBuilder[fullNameBuilder.Length - 1] == ',') { fullNameBuilder[fullNameBuilder.Length - 1] = '>'; } string signature = string.Format("{0}({1})", @event.OriginalName, string.Join(", ", from e in @event.Parameters select GetOriginalParameterType(e))); Event existing = @class.Events.FirstOrDefault(e => e.Name == @event.Name); if (existing != null && existing != @event) { if (@event.Parameters.Count > 0) { @event.Name += GetSignalEventSuffix(@event); } else { existing.Name += GetSignalEventSuffix(@event); } } else { if (@event.Parameters.Count > 0 && (@class.Methods.Any(m => m.IsGenerated && m.OriginalName == @event.Name) || @class.Properties.Any(p => p.IsGenerated && p.OriginalName == @event.Name))) { @event.Name += GetSignalEventSuffix(@event); } } if (@event.OriginalDeclaration.Comment != null) { block.WriteLine("/// <summary>"); foreach (string line in HtmlEncoder.HtmlEncode(@event.OriginalDeclaration.Comment.BriefText).Split( Environment.NewLine.ToCharArray())) { block.WriteLine("/// <para>{0}</para>", line); } block.WriteLine("/// </summary>"); } block.WriteLine(string.Format(@"public event {0} {1} {{ add {{ __DynamicQObject.ConnectDynamicSlot(this, ""{2}"", value); }} remove {{ __DynamicQObject.DisconnectDynamicSlot(this, ""{2}"", value); }} }}", fullNameBuilder, char.ToUpperInvariant(@event.Name[0]) + @event.Name.Substring(1), signature)); } } }
private void OnUnitGenerated(GeneratorOutput output) { foreach (var template in output.Templates) { foreach (var block in template.FindBlocks(CLIBlockKind.MethodBody)) { var method = block.Declaration as Method; VisitMethod(method, block); } } }
private void GenerateSingleTemplate(IEnumerable<TranslationUnit> units, ICollection<GeneratorOutput> outputs) { var output = new GeneratorOutput { TranslationUnit = new TranslationUnit { FilePath = string.Format("{0}.cs", Driver.Options.OutputNamespace ?? Driver.Options.LibraryName) }, Templates = Generate(units) }; output.Templates[0].Process(); outputs.Add(output); OnUnitGenerated(output); }
private void GenerateTemplate(TranslationUnit unit, ICollection<GeneratorOutput> outputs) { var templates = Generate(new[] { unit }); if (templates.Count == 0) return; foreach (var template in templates) { template.Process(); } var output = new GeneratorOutput { TranslationUnit = unit, Templates = templates }; outputs.Add(output); OnUnitGenerated(output); }
/// <summary> /// Generates the outputs. /// </summary> public virtual List<GeneratorOutput> Generate() { var outputs = new List<GeneratorOutput>(); foreach (var unit in Driver.ASTContext.TranslationUnits) { if (!unit.IsGenerated || !unit.HasDeclarations) continue; if (unit.IsSystemHeader || !unit.IsValid) continue; var templates = Generate(unit); if (templates.Count == 0) continue; foreach (var template in templates) template.Process(); var output = new GeneratorOutput { TranslationUnit = unit, Templates = templates }; outputs.Add(output); OnUnitGenerated(output); } return outputs; }
public void ProcessUnit(GeneratorOutput output) { foreach (var template in output.Templates) WriteHeader(template.FindBlock(BlockKind.Header).Text); }