public override void GenerateLanguageBindings(Graph graph) { if (!Directory.Exists(Configuration.LanguageBindingsDirectory)) { Directory.CreateDirectory(Configuration.LanguageBindingsDirectory); } foreach (Class classDefinition in graph.Classes) { WriteCsClass(classDefinition, Path.Combine(Configuration.LanguageBindingsDirectory, $"{ToPascalCase(classDefinition.Name)}.cs")); } using (IndentedWriter writer = new IndentedWriter($"{Path.Combine(Configuration.LanguageBindingsDirectory, Configuration.GlobalsClassName)}.cs")) { WriteFileHeader(writer); writer.WriteLine($"namespace {Configuration.GlobalsNamespace}"); using (Scope namespaceScope = writer.IndentBlock()) { writer.WriteLine($"public static class {Configuration.GlobalsClassName}"); using (Scope classScope = writer.IndentBlock()) { // write out the functions foreach (Function function in graph.Functions) { WriteCsFunction(function, writer); } // write out the variables foreach (Variable variable in graph.Variables) { WriteCsVariable(variable, writer); } // write out the native bindings for the functions foreach (Function function in graph.Functions) { WriteFunctionNativeBindings(function, writer); } // write out the native bindings for the variables foreach (Variable variable in graph.Variables) { WriteVariableNativeBindings(variable, writer); } } } } }
private void WriteCsClass(Class classDefinition, string filePath) { using (IndentedWriter writer = new IndentedWriter(filePath)) { WriteFileHeader(writer); writer.WriteLine($"namespace {ToCsNamespace(classDefinition.Namespace)}"); using (Scope namespaceScope = writer.IndentBlock()) { string className = ToPascalCase(classDefinition.Name); writer.WriteLine($"class {className} : SafeEpoxyHandle"); using (Scope classScope = writer.IndentBlock()) { // write out the constructor, destructor, and the member functions foreach (Function function in classDefinition.Functions) { WriteCsFunction(function, writer); } // write out the member variables foreach (Variable variable in classDefinition.Variables) { WriteCsVariable(variable, writer); } // write out the native bindings for the functions foreach (Function function in classDefinition.Functions) { WriteFunctionNativeBindings(function, writer); } // write out the native bindings for the variables foreach (Variable variable in classDefinition.Variables) { WriteVariableNativeBindings(variable, writer); } } } } }
private void WriteCsFunction(Function function, IndentedWriter writer) { string returnType = ToCsReturnType(function.Return); string qualifiers = function.IsStatic || !function.IsClassMember ? "static " : ""; writer.WriteLine($"public {qualifiers}{returnType} {ToPascalCase(function.Name)}{ToCsParameterString(function.Parameters)}"); using (Scope functionScope = writer.IndentBlock()) { writer.WriteLine($@"{(returnType == "void" ? "" : "return ")}{ToNativeFunction(function)}({(string.Join(", ", function.Parameters.Select(parameter => parameter.Name)))});"); } writer.WriteLine(); }
private void WriteCsVariable(Variable variable, IndentedWriter writer) { // TODO: is return type the right marshalling strategy here? string qualifiers = variable.IsStatic || !variable.IsClassMember ? "static " : ""; writer.WriteLine($"public {qualifiers}{ToCsReturnType(variable)} {ToPascalCase(variable.Name)}"); using (Scope propertyScope = writer.IndentBlock()) { writer.WriteLine($"get {{ return {ToNativeVariableGet(variable)}(); }}"); writer.WriteLine($"set {{ {ToNativeVariableSet(variable)}(value); }}"); } writer.WriteLine(); }