mirror of https://github.com/mono/CppSharp.git
2 changed files with 254 additions and 251 deletions
@ -0,0 +1,254 @@
@@ -0,0 +1,254 @@
|
||||
using System; |
||||
using Cxxi; |
||||
using Cxxi.Types; |
||||
|
||||
namespace Cxxi.Generators.CLI |
||||
{ |
||||
public class CLITypePrinter : ITypeVisitor<string>, IDeclVisitor<string> |
||||
{ |
||||
public Cxxi.Generators.Generator Generator { get; set; } |
||||
public Library Library { get; set; } |
||||
|
||||
public CLITypePrinter(Cxxi.Generators.Generator generator) |
||||
{ |
||||
Generator = generator; |
||||
Library = generator.Library; |
||||
} |
||||
|
||||
public string VisitTagType(TagType tag, TypeQualifiers quals) |
||||
{ |
||||
Declaration decl = tag.Declaration; |
||||
|
||||
if (decl == null) |
||||
return string.Empty; |
||||
|
||||
return VisitDeclaration(decl, quals); |
||||
} |
||||
|
||||
public string VisitArrayType(ArrayType array, TypeQualifiers quals) |
||||
{ |
||||
return string.Format("cli::array<{0}>^", array.Type.Visit(this)); |
||||
} |
||||
|
||||
public string VisitFunctionType(FunctionType function, TypeQualifiers quals) |
||||
{ |
||||
var arguments = function.Arguments; |
||||
var returnType = function.ReturnType; |
||||
|
||||
string args = string.Empty; |
||||
|
||||
if (arguments.Count > 0) |
||||
args = GetArgumentsString(function, hasNames: false); |
||||
|
||||
if (returnType.IsPrimitiveType(PrimitiveType.Void)) |
||||
{ |
||||
if (!string.IsNullOrEmpty(args)) |
||||
args = string.Format("<{0}>", args); |
||||
return string.Format("System::Action{0}", args); |
||||
} |
||||
|
||||
if (!string.IsNullOrEmpty(args)) |
||||
args = string.Format(", {0}", args); |
||||
|
||||
return string.Format("System::Func<{0}{1}>", returnType.Visit(this), args); |
||||
} |
||||
|
||||
public string GetArgumentsString(FunctionType function, bool hasNames) |
||||
{ |
||||
var arguments = function.Arguments; |
||||
var s = string.Empty; |
||||
|
||||
for (var i = 0; i < arguments.Count; ++i) |
||||
{ |
||||
s += GetArgumentString(arguments[i], hasNames); |
||||
if (i < arguments.Count - 1) |
||||
s += ", "; |
||||
} |
||||
|
||||
return s; |
||||
} |
||||
|
||||
public string GetArgumentString(Parameter arg, bool hasName = true) |
||||
{ |
||||
var quals = new TypeQualifiers { IsConst = arg.IsConst }; |
||||
|
||||
var type = arg.Type.Visit(this, quals); |
||||
var name = arg.Name; |
||||
|
||||
if (hasName && !string.IsNullOrEmpty(name)) |
||||
return string.Format("{0} {1}", type, name); |
||||
|
||||
return type; |
||||
} |
||||
|
||||
public string ToDelegateString(FunctionType function) |
||||
{ |
||||
return string.Format("delegate {0} {{0}}({1})", |
||||
function.ReturnType.Visit(this), |
||||
GetArgumentsString(function, hasNames: true)); |
||||
} |
||||
|
||||
public string VisitPointerType(PointerType pointer, TypeQualifiers quals) |
||||
{ |
||||
var pointee = pointer.Pointee; |
||||
|
||||
if (pointee is FunctionType) |
||||
{ |
||||
var function = pointee as FunctionType; |
||||
return string.Format("{0}^", function.Visit(this, quals)); |
||||
} |
||||
|
||||
if (pointee.IsPrimitiveType(PrimitiveType.Void, walkTypedefs: true) || |
||||
pointee.IsPrimitiveType(PrimitiveType.UInt8, walkTypedefs: true)) |
||||
{ |
||||
return "System::IntPtr"; |
||||
} |
||||
|
||||
if (pointee.IsPrimitiveType(PrimitiveType.Char)) |
||||
{ |
||||
return "System::String^"; |
||||
} |
||||
|
||||
return pointee.Visit(this, quals); |
||||
} |
||||
|
||||
public string VisitMemberPointerType(MemberPointerType member, |
||||
TypeQualifiers quals) |
||||
{ |
||||
throw new NotImplementedException(); |
||||
} |
||||
|
||||
public string VisitBuiltinType(BuiltinType builtin, TypeQualifiers quals) |
||||
{ |
||||
return VisitPrimitiveType(builtin.Type); |
||||
} |
||||
|
||||
public string VisitPrimitiveType(PrimitiveType primitive) |
||||
{ |
||||
switch (primitive) |
||||
{ |
||||
case PrimitiveType.Bool: return "bool"; |
||||
case PrimitiveType.Void: return "void"; |
||||
case PrimitiveType.WideChar: return "char"; |
||||
case PrimitiveType.Int8: return "char"; |
||||
case PrimitiveType.UInt8: return "unsigned char"; |
||||
case PrimitiveType.Int16: return "short"; |
||||
case PrimitiveType.UInt16: return "unsigned short"; |
||||
case PrimitiveType.Int32: return "int"; |
||||
case PrimitiveType.UInt32: return "unsigned int"; |
||||
case PrimitiveType.Int64: return "long"; |
||||
case PrimitiveType.UInt64: return "unsigned long"; |
||||
case PrimitiveType.Float: return "float"; |
||||
case PrimitiveType.Double: return "double"; |
||||
} |
||||
|
||||
return string.Empty; |
||||
} |
||||
|
||||
public string VisitTypedefType(TypedefType typedef, TypeQualifiers quals) |
||||
{ |
||||
var decl = typedef.Declaration; |
||||
|
||||
if (string.IsNullOrEmpty(decl.Name)) |
||||
return null; |
||||
|
||||
TypeMap typeMap = null; |
||||
if (Generator.TypeMapDatabase.FindTypeMap(decl, out typeMap)) |
||||
{ |
||||
return typeMap.Signature(); |
||||
} |
||||
|
||||
FunctionType func; |
||||
if (decl.Type.IsPointerTo<FunctionType>(out func)) |
||||
{ |
||||
// TODO: Use SafeIdentifier()
|
||||
return string.Format("{0}^", VisitDeclaration(decl)); |
||||
} |
||||
|
||||
return decl.Type.Visit(this); |
||||
} |
||||
|
||||
public string VisitTemplateSpecializationType(TemplateSpecializationType template, |
||||
TypeQualifiers quals) |
||||
{ |
||||
var decl = template.Template.TemplatedDecl; |
||||
|
||||
TypeMap typeMap = null; |
||||
if (Generator.TypeMapDatabase.FindTypeMap(decl, out typeMap)) |
||||
{ |
||||
typeMap.Declaration = decl; |
||||
typeMap.Type = template; |
||||
return typeMap.Signature(); |
||||
} |
||||
|
||||
return decl.Name; |
||||
} |
||||
|
||||
public string VisitDeclaration(Declaration decl, TypeQualifiers quals) |
||||
{ |
||||
return VisitDeclaration(decl); |
||||
} |
||||
|
||||
public string VisitDeclaration(Declaration decl) |
||||
{ |
||||
var name = decl.Visit(this); |
||||
return string.Format("{0}::{1}", Library.Name, name); |
||||
} |
||||
|
||||
public string VisitClassDecl(Class @class) |
||||
{ |
||||
return string.Format("{0}{1}", @class.Name, @class.IsRefType ? "^" |
||||
: string.Empty); |
||||
} |
||||
|
||||
public string VisitFieldDecl(Field field) |
||||
{ |
||||
throw new NotImplementedException(); |
||||
} |
||||
|
||||
public string VisitFunctionDecl(Function function) |
||||
{ |
||||
throw new NotImplementedException(); |
||||
} |
||||
|
||||
public string VisitMethodDecl(Method method) |
||||
{ |
||||
throw new NotImplementedException(); |
||||
} |
||||
|
||||
public string VisitParameterDecl(Parameter parameter) |
||||
{ |
||||
throw new NotImplementedException(); |
||||
} |
||||
|
||||
public string VisitTypedefDecl(TypedefDecl typedef) |
||||
{ |
||||
return typedef.Name; |
||||
} |
||||
|
||||
public string VisitEnumDecl(Enumeration @enum) |
||||
{ |
||||
return @enum.Name; |
||||
} |
||||
|
||||
public string VisitClassTemplateDecl(ClassTemplate template) |
||||
{ |
||||
throw new NotImplementedException(); |
||||
} |
||||
|
||||
public string VisitFunctionTemplateDecl(FunctionTemplate template) |
||||
{ |
||||
throw new NotImplementedException(); |
||||
} |
||||
|
||||
public string VisitMacroDefinition(MacroDefinition macro) |
||||
{ |
||||
throw new NotImplementedException(); |
||||
} |
||||
|
||||
public string VisitNamespace(Namespace @namespace) |
||||
{ |
||||
throw new NotImplementedException(); |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue