|
|
@ -1,5 +1,5 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using CppSharp.AST; |
|
|
|
using CppSharp.AST; |
|
|
|
|
|
|
|
|
|
|
|
namespace CppSharp.Passes |
|
|
|
namespace CppSharp.Passes |
|
|
@ -8,20 +8,19 @@ namespace CppSharp.Passes |
|
|
|
{ |
|
|
|
{ |
|
|
|
public override bool VisitMethodDecl(Method method) |
|
|
|
public override bool VisitMethodDecl(Method method) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
// Ignore methods as they are not relevant for this pass.
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public override bool VisitFunctionDecl(Function function) |
|
|
|
public override bool VisitFunctionDecl(Function function) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (function.Ignore || !function.Name.StartsWith("operator")) |
|
|
|
if (function.Ignore || !function.IsOperator) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
string type = function.Parameters[0].Type.Desugar().ToString(); |
|
|
|
var param = function.Parameters[0]; |
|
|
|
if (string.IsNullOrEmpty(type)) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var @class = Library.FindCompleteClass(type); |
|
|
|
Class @class; |
|
|
|
if (@class == null) |
|
|
|
if (!FunctionToInstanceMethodPass.GetClassParameter(param, out @class)) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
function.ExplicityIgnored = true; |
|
|
|
function.ExplicityIgnored = true; |
|
|
@ -37,76 +36,21 @@ namespace CppSharp.Passes |
|
|
|
Access = AccessSpecifier.Public, |
|
|
|
Access = AccessSpecifier.Public, |
|
|
|
Kind = CXXMethodKind.Operator, |
|
|
|
Kind = CXXMethodKind.Operator, |
|
|
|
ReturnType = function.ReturnType, |
|
|
|
ReturnType = function.ReturnType, |
|
|
|
Parameters = new List<Parameter>(function.Parameters), |
|
|
|
Parameters = new List<Parameter>(function.Parameters).Skip(1).ToList(), |
|
|
|
CallingConvention = function.CallingConvention, |
|
|
|
CallingConvention = function.CallingConvention, |
|
|
|
IsVariadic = function.IsVariadic, |
|
|
|
IsVariadic = function.IsVariadic, |
|
|
|
IsInline = function.IsInline, |
|
|
|
IsInline = function.IsInline, |
|
|
|
IsStatic = true, |
|
|
|
OperatorKind = function.OperatorKind, |
|
|
|
Conversion = MethodConversionKind.FunctionToStaticMethod, |
|
|
|
SynthKind = FunctionSynthKind.NonMemberOperator, |
|
|
|
OperatorKind = GetOperatorKind(function.Name) |
|
|
|
OriginalFunction = function |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
@class.Methods.Add(method); |
|
|
|
@class.Methods.Add(method); |
|
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("Static method: {0}::{1}", @class.Name, |
|
|
|
Driver.Diagnostics.Debug("Function converted to operator: {0}::{1}", |
|
|
|
function.Name); |
|
|
|
@class.Name, function.Name); |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private static CXXOperatorKind GetOperatorKind(string @operator) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
const string op = "operator"; |
|
|
|
|
|
|
|
if (!@operator.StartsWith(op)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return CXXOperatorKind.None; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
switch (@operator.Substring(8).Trim()) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
case "+": return CXXOperatorKind.Plus; |
|
|
|
|
|
|
|
case "-": return CXXOperatorKind.Minus; |
|
|
|
|
|
|
|
case "!": return CXXOperatorKind.Exclaim; |
|
|
|
|
|
|
|
case "~": return CXXOperatorKind.Tilde; |
|
|
|
|
|
|
|
case "++": return CXXOperatorKind.PlusPlus; |
|
|
|
|
|
|
|
case "--": return CXXOperatorKind.MinusMinus; |
|
|
|
|
|
|
|
case "*": return CXXOperatorKind.Star; |
|
|
|
|
|
|
|
case "/": return CXXOperatorKind.Slash; |
|
|
|
|
|
|
|
case "&": return CXXOperatorKind.Amp; |
|
|
|
|
|
|
|
case "|": return CXXOperatorKind.Pipe; |
|
|
|
|
|
|
|
case "^": return CXXOperatorKind.Caret; |
|
|
|
|
|
|
|
case "<<": return CXXOperatorKind.LessLess; |
|
|
|
|
|
|
|
case ">>": return CXXOperatorKind.GreaterGreater; |
|
|
|
|
|
|
|
case "==": return CXXOperatorKind.EqualEqual; |
|
|
|
|
|
|
|
case "!=": return CXXOperatorKind.ExclaimEqual; |
|
|
|
|
|
|
|
case "<": return CXXOperatorKind.Less; |
|
|
|
|
|
|
|
case ">": return CXXOperatorKind.Greater; |
|
|
|
|
|
|
|
case "<=": return CXXOperatorKind.LessEqual; |
|
|
|
|
|
|
|
case ">=": return CXXOperatorKind.GreaterEqual; |
|
|
|
|
|
|
|
case "+=": return CXXOperatorKind.PlusEqual; |
|
|
|
|
|
|
|
case "-=": return CXXOperatorKind.MinusEqual; |
|
|
|
|
|
|
|
case "*=": return CXXOperatorKind.StarEqual; |
|
|
|
|
|
|
|
case "/=": return CXXOperatorKind.SlashEqual; |
|
|
|
|
|
|
|
case "%=": return CXXOperatorKind.PercentEqual; |
|
|
|
|
|
|
|
case "&=": return CXXOperatorKind.AmpEqual; |
|
|
|
|
|
|
|
case "|=": return CXXOperatorKind.PipeEqual; |
|
|
|
|
|
|
|
case "^=": return CXXOperatorKind.CaretEqual; |
|
|
|
|
|
|
|
case "<<=": return CXXOperatorKind.LessLessEqual; |
|
|
|
|
|
|
|
case ">>=": return CXXOperatorKind.GreaterGreaterEqual; |
|
|
|
|
|
|
|
case "[]": return CXXOperatorKind.Subscript; |
|
|
|
|
|
|
|
case "&&": return CXXOperatorKind.AmpAmp; |
|
|
|
|
|
|
|
case "||": return CXXOperatorKind.PipePipe; |
|
|
|
|
|
|
|
case "=": return CXXOperatorKind.Equal; |
|
|
|
|
|
|
|
case ",": return CXXOperatorKind.Comma; |
|
|
|
|
|
|
|
case "->*": return CXXOperatorKind.ArrowStar; |
|
|
|
|
|
|
|
case "->": return CXXOperatorKind.Arrow; |
|
|
|
|
|
|
|
case "()": return CXXOperatorKind.Call; |
|
|
|
|
|
|
|
case "?": return CXXOperatorKind.Conditional; |
|
|
|
|
|
|
|
case "new": return CXXOperatorKind.New; |
|
|
|
|
|
|
|
case "delete": return CXXOperatorKind.Delete; |
|
|
|
|
|
|
|
case "new[]": return CXXOperatorKind.Array_New; |
|
|
|
|
|
|
|
case "delete[]": return CXXOperatorKind.Array_Delete; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return CXXOperatorKind.None; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|