Browse Source

Reworked MoveOperatorToClassPass to be simpler and correct.

pull/47/merge
triton 12 years ago
parent
commit
5ada754d72
  1. 1
      src/AST/Function.cs
  2. 1
      src/Generator/Driver.cs
  3. 1
      src/Generator/Generators/CSharp/CSharpGenerator.cs
  4. 2
      src/Generator/Passes/FunctionToInstanceMethodPass.cs
  5. 82
      src/Generator/Passes/MoveOperatorToClassPass.cs

1
src/AST/Function.cs

@ -63,6 +63,7 @@ namespace CppSharp.AST
public enum FunctionSynthKind public enum FunctionSynthKind
{ {
None, None,
NonMemberOperator
} }
public class Function : Declaration, ITypedDecl, IMangledDecl public class Function : Declaration, ITypedDecl, IMangledDecl

1
src/Generator/Driver.cs

@ -133,6 +133,7 @@ namespace CppSharp
TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass()); TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass());
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass()); TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
TranslationUnitPasses.AddPass(new FindSymbolsPass()); TranslationUnitPasses.AddPass(new FindSymbolsPass());
TranslationUnitPasses.AddPass(new MoveOperatorToClassPass());
library.SetupPasses(this); library.SetupPasses(this);

1
src/Generator/Generators/CSharp/CSharpGenerator.cs

@ -31,7 +31,6 @@ namespace CppSharp.Generators.CSharp
// CheckAbiParameters runs last because hidden structure parameters // CheckAbiParameters runs last because hidden structure parameters
// should always occur first. // should always occur first.
Driver.AddTranslationUnitPass(new MoveOperatorToClassPass());
Driver.AddTranslationUnitPass(new CheckOperatorsOverloadsPass()); Driver.AddTranslationUnitPass(new CheckOperatorsOverloadsPass());
Driver.AddTranslationUnitPass(new CheckAbiParameters(Driver.Options)); Driver.AddTranslationUnitPass(new CheckAbiParameters(Driver.Options));

2
src/Generator/Passes/FunctionToInstanceMethodPass.cs

@ -70,7 +70,7 @@ namespace CppSharp.Passes
return true; return true;
} }
private static bool GetClassParameter(Parameter classParam, out Class @class) public static bool GetClassParameter(Parameter classParam, out Class @class)
{ {
TagType tag; TagType tag;
if (classParam.Type.IsPointerTo(out tag)) if (classParam.Type.IsPointerTo(out tag))

82
src/Generator/Passes/MoveOperatorToClassPass.cs

@ -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;
}
} }
} }

Loading…
Cancel
Save