private TypePrinter GetTypePrinter(GeneratorKind kind, BindingContext context) { TypePrinter typePrinter; switch (kind) { case GeneratorKind.C: typePrinter = new CppTypePrinter(Context) { PrintFlavorKind = CppTypePrintFlavorKind.C }; break; case GeneratorKind.CPlusPlus: case GeneratorKind.QuickJS: case GeneratorKind.NAPI: case GeneratorKind.TypeScript: typePrinter = new CppTypePrinter(Context); break; case GeneratorKind.CLI: typePrinter = new CLITypePrinter(Context); break; case GeneratorKind.CSharp: typePrinter = new CSharpTypePrinter(Context); break; default: throw new System.NotImplementedException(); } return(typePrinter); }
void GenerateEquals(Class @class, Block block, Method method) { var equalsOverride = @class.Methods.FirstOrDefault(m => { var expansions = m.PreprocessedEntities.OfType <MacroExpansion>(); return(expansions.Any(e => e.Text == "FLD_EQUALS")); }); if (equalsOverride == null) { return; } var cliTypePrinter = new CLITypePrinter(Driver); var cppTypePrinter = new CppTypePrinter(Driver.TypeDatabase); var paramCppType = equalsOverride.Parameters[0].Visit(cppTypePrinter); var classCppType = @class.Visit(cppTypePrinter); var classCliType = @class.Visit(cliTypePrinter); block.Text.StringBuilder.Clear(); block.WriteLine("if (!object) return false;"); block.WriteLine("auto obj = dynamic_cast<{0}>({1});", classCliType, method.Parameters[0].Name); block.NewLine(); block.WriteLine("if (!obj) return false;"); block.WriteLine("auto param = ({0})obj->NativePtr;", paramCppType); block.WriteLine("return (({0}*)NativePtr)->{1}(param);", classCppType, equalsOverride.OriginalName); }
void GenerateEquals(Class @class, Block block, Method method) { var cliTypePrinter = new CLITypePrinter(Context); var classCliType = @class.Visit(cliTypePrinter); block.WriteLine("if (!object) return false;"); block.WriteLine("auto obj = dynamic_cast<{0}>({1});", classCliType, method.Parameters[0].Name); block.NewLine(); block.WriteLine("if (!obj) return false;"); block.Write("return __Instance == obj->__Instance;"); }
void GenerateEquals(Class @class, Block block, Method method) { var cliTypePrinter = new CLITypePrinter(Driver); var classCliType = @class.Visit(cliTypePrinter); block.WriteLine("if (!object) return false;"); block.WriteLine("auto obj = dynamic_cast<{0}>({1});", classCliType, method.Parameters[0].Name); block.NewLine(); block.WriteLine("if (!obj) return false;"); block.Write("return __Instance == obj->__Instance;"); }
public override bool VisitASTContext(ASTContext context) { TypePrinter typePrinter = null; switch (Options.GeneratorKind) { case GeneratorKind.CLI: typePrinter = new CLITypePrinter(Context); break; case GeneratorKind.CSharp: typePrinter = new CSharpTypePrinter(Context); break; } DeclarationName.ParameterTypeComparer.TypePrinter = typePrinter; return(base.VisitASTContext(context)); }
protected CLITextTemplate(Driver driver, IEnumerable<TranslationUnit> units) : base(driver, units) { TypePrinter = new CLITypePrinter(driver); Includes = new HashSet<Include>(); }
protected CLITemplate(BindingContext context, IEnumerable<TranslationUnit> units) : base(context, units) { TypePrinter = new CLITypePrinter(context); Includes = new HashSet<Include>(); }
public void GenerateClassGenericMethods(Class @class) { var printer = TypePrinter; var oldCtx = printer.Context; PushIndent(); foreach (var template in @class.Templates) { if (!template.IsGenerated) continue; var functionTemplate = template as FunctionTemplate; if (functionTemplate == null) continue; PushBlock(CLIBlockKind.Template); var function = functionTemplate.TemplatedFunction; var typeCtx = new CLITypePrinterContext() { Kind = TypePrinterContextKind.Template, Declaration = template }; printer.Context = typeCtx; var typePrinter = new CLITypePrinter(Driver, typeCtx); var retType = function.ReturnType.Type.Visit(typePrinter, function.ReturnType.Qualifiers); var typeNames = ""; var paramNames = template.Parameters.Select(param => param.Name).ToList(); if (paramNames.Any()) typeNames = "typename " + string.Join(", typename ", paramNames); Write("generic<{0}>", typeNames); // Process the generic type constraints var constraints = new List<string>(); foreach (var param in template.Parameters.OfType<TypeTemplateParameter>()) { if (string.IsNullOrWhiteSpace(param.Constraint)) continue; constraints.Add(string.Format("{0} : {1}", param.Name, param.Constraint)); } if (constraints.Any()) Write(" where {0}", string.Join(", ", constraints)); NewLine(); WriteLine("{0} {1}({2});", retType, function.Name, GenerateParametersList(function.Parameters)); PopBlock(NewLineKind.BeforeNextBlock); } PopIndent(); printer.Context = oldCtx; }
public void GenerateClassEvents(Class @class) { foreach (var @event in @class.Events) { if ([email protected]) continue; var cppTypePrinter = new CppTypePrinter(); var cppArgs = cppTypePrinter.VisitParameters(@event.Parameters, hasNames: true); WriteLine("private:"); PushIndent(); var delegateName = string.Format("_{0}Delegate", @event.Name); WriteLine("delegate void {0}({1});", delegateName, cppArgs); WriteLine("{0}^ {0}Instance;", delegateName); WriteLine("void _{0}Raise({1});", @event.Name, cppArgs); WriteLine("{0} _{1};", @event.Type, @event.Name); PopIndent(); WriteLine("public:"); PushIndent(); WriteLine("event {0} {1}", @event.Type, @event.Name); WriteStartBraceIndent(); WriteLine("void add({0} evt);", @event.Type); WriteLine("void remove({0} evt);", @event.Type); var cliTypePrinter = new CLITypePrinter(Driver); var cliArgs = cliTypePrinter.VisitParameters(@event.Parameters, hasNames: true); WriteLine("void raise({0});", cliArgs); WriteCloseBraceIndent(); PopIndent(); } }
private string ToCLITypeName(Declaration decl) { var typePrinter = new CLITypePrinter(Context.Driver); return typePrinter.VisitDeclaration(decl); }
public CLIGenerator(Driver driver) : base(driver) { typePrinter = new CLITypePrinter(driver); Type.TypePrinterDelegate += type => type.Visit(typePrinter); }
protected CLITextTemplate(Driver driver, TranslationUnit unit) : base(driver, unit) { TypePrinter = new CLITypePrinter(driver); Includes = new HashSet<Include>(); }
void GenerateEquals(Class @class, Block block, Method method) { var equalsOverride = @class.Methods.FirstOrDefault(m => { var expansions = m.PreprocessedEntities.OfType<MacroExpansion>(); return expansions.Any(e => e.Text == "FLD_EQUALS"); }); if (equalsOverride == null) return; var cliTypePrinter = new CLITypePrinter(Driver); var cppTypePrinter = new CppTypePrinter(Driver.TypeDatabase); var paramCppType = equalsOverride.Parameters[0].Visit(cppTypePrinter); var classCppType = @class.Visit(cppTypePrinter); var classCliType = @class.Visit(cliTypePrinter); block.Text.StringBuilder.Clear(); block.WriteLine("if (!object) return false;"); block.WriteLine("auto obj = dynamic_cast<{0}>({1});", classCliType, method.Parameters[0].Name); block.NewLine(); block.WriteLine("if (!obj) return false;"); block.WriteLine("auto param = ({0})obj->NativePtr;", paramCppType); block.WriteLine("return (({0}*)NativePtr)->{1}(param);", classCppType, equalsOverride.OriginalName); }
public CLIGenerator(Driver driver) : base(driver) { typePrinter = new CLITypePrinter(driver); }
public void Init() { ParseLibrary("CLITypes.h"); printer = new CLITypePrinter(Driver, new CLITypePrinterContext()); }
public CLIGenerator(BindingContext context) : base(context) { typePrinter = new CLITypePrinter(context); }