Browse Source

Added a test for the pass that moves functions to a class.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/128/head
Dimitar Dobrev 12 years ago
parent
commit
3cf6c7b3f1
  1. 18
      src/AST/ASTContext.cs
  2. 10
      src/AST/Namespace.cs
  3. 1
      src/Generator/Driver.cs
  4. 45
      src/Generator/Passes/MoveFunctionToClassPass.cs
  5. 6
      tests/Basic/Basic.Tests.cs
  6. 5
      tests/Basic/Basic.cpp
  7. 7
      tests/Basic/Basic.h

18
src/AST/ASTContext.cs

@ -51,7 +51,8 @@ namespace CppSharp.AST
/// Finds an existing enum in the library modules. /// Finds an existing enum in the library modules.
public IEnumerable<Enumeration> FindEnum(string name) public IEnumerable<Enumeration> FindEnum(string name)
{ {
return TranslationUnits.Select(module => module.FindEnum(name)).Where(type => type != null); return TranslationUnits.Select(
module => module.FindEnum(name)).Where(type => type != null);
} }
/// Finds the complete declaration of an enum. /// Finds the complete declaration of an enum.
@ -61,10 +62,13 @@ namespace CppSharp.AST
} }
/// Finds an existing struct/class in the library modules. /// Finds an existing struct/class in the library modules.
public IEnumerable<Class> FindClass(string name, bool create = false, bool ignoreCase = false) public IEnumerable<Class> FindClass(string name, bool create = false,
bool ignoreCase = false)
{ {
return TranslationUnits.Select( return TranslationUnits.Select(
module => module.FindClass(name, ignoreCase)).Where(type => type != null); module => module.FindClass(name,
ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal))
.Where(type => type != null);
} }
/// Finds the complete declaration of a class. /// Finds the complete declaration of a class.
@ -77,15 +81,15 @@ namespace CppSharp.AST
/// Finds an existing function in the library modules. /// Finds an existing function in the library modules.
public IEnumerable<Function> FindFunction(string name) public IEnumerable<Function> FindFunction(string name)
{ {
return TranslationUnits.Select(module => module.FindFunction(name)).Where( return TranslationUnits.Select(module => module.FindFunction(name))
type => type != null); .Where(type => type != null);
} }
/// Finds an existing typedef in the library modules. /// Finds an existing typedef in the library modules.
public IEnumerable<TypedefDecl> FindTypedef(string name) public IEnumerable<TypedefDecl> FindTypedef(string name)
{ {
return TranslationUnits.Select(module => module.FindTypedef(name)).Where( return TranslationUnits.Select(module => module.FindTypedef(name))
type => type != null); .Where(type => type != null);
} }
/// Finds an existing declaration by name. /// Finds an existing declaration by name.

10
src/AST/Namespace.cs

@ -168,7 +168,8 @@ namespace CppSharp.AST
return @class; return @class;
} }
public Class FindClass(string name, bool ignoreCase = false) public Class FindClass(string name,
StringComparison stringComparison = StringComparison.Ordinal)
{ {
if (string.IsNullOrEmpty(name)) return null; if (string.IsNullOrEmpty(name)) return null;
@ -177,12 +178,7 @@ namespace CppSharp.AST
if (entries.Count <= 1) if (entries.Count <= 1)
{ {
Class @class; return Classes.Find(e => e.Name.Equals(name, stringComparison));
if (ignoreCase)
@class = Classes.Find(e => e.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
else
@class = Classes.Find(e => e.Name.Equals(name));
return @class;
} }
var className = entries[entries.Count - 1]; var className = entries[entries.Count - 1];

1
src/Generator/Driver.cs

@ -201,6 +201,7 @@ namespace CppSharp
TranslationUnitPasses.AddPass(new FindSymbolsPass()); TranslationUnitPasses.AddPass(new FindSymbolsPass());
TranslationUnitPasses.AddPass(new MoveOperatorToClassPass()); TranslationUnitPasses.AddPass(new MoveOperatorToClassPass());
TranslationUnitPasses.AddPass(new MoveFunctionToClassPass());
TranslationUnitPasses.AddPass(new CheckAmbiguousFunctions()); TranslationUnitPasses.AddPass(new CheckAmbiguousFunctions());
TranslationUnitPasses.AddPass(new CheckOperatorsOverloadsPass()); TranslationUnitPasses.AddPass(new CheckOperatorsOverloadsPass());
TranslationUnitPasses.AddPass(new CheckVirtualOverrideReturnCovariance()); TranslationUnitPasses.AddPass(new CheckVirtualOverrideReturnCovariance());

45
src/Generator/Passes/MoveFunctionToClassPass.cs

@ -3,34 +3,34 @@ using CppSharp.AST;
namespace CppSharp.Passes namespace CppSharp.Passes
{ {
/// <summary>
/// Moves a function to a class, if any, named after the function's header.
/// </summary>
public class MoveFunctionToClassPass : TranslationUnitPass public class MoveFunctionToClassPass : TranslationUnitPass
{ {
public override bool VisitFunctionDecl(Function function) public override bool VisitFunctionDecl(Function function)
{ {
if (!AlreadyVisited(function) && !function.Ignore && !(function.Namespace is Class) if (AlreadyVisited(function) || function.Ignore || function.Namespace is Class)
// HACK: there are bugs with operators generated by Q_DECLARE_OPERATORS_FOR_FLAGS, an incorrect argument type, to say the least return base.VisitFunctionDecl(function);
&& !function.IsOperator)
{ Class @class = FindClassToMoveFunctionTo(function.Namespace);
TranslationUnit unit = function.Namespace as TranslationUnit;
Class @class;
if (unit != null)
{
@class = Driver.ASTContext.FindCompleteClass(
unit.FileNameWithoutExtension.ToLowerInvariant(), true);
if (@class != null) if (@class != null)
{ {
MoveFunction(function, @class); MoveFunction(function, @class);
return base.VisitFunctionDecl(function);
} }
return base.VisitFunctionDecl(function);
} }
@class = Driver.ASTContext.FindClass(
function.Namespace.Name, ignoreCase: true).FirstOrDefault(); private Class FindClassToMoveFunctionTo(INamedDecl @namespace)
if (@class != null)
{ {
MoveFunction(function, @class); TranslationUnit unit = @namespace as TranslationUnit;
} if (unit == null)
{
return Driver.ASTContext.FindClass(
@namespace.Name, ignoreCase: true).FirstOrDefault();
} }
return base.VisitFunctionDecl(function); return Driver.ASTContext.FindCompleteClass(
unit.FileNameWithoutExtension.ToLowerInvariant(), true);
} }
private static void MoveFunction(Function function, Class @class) private static void MoveFunction(Function function, Class @class)
@ -41,6 +41,17 @@ namespace CppSharp.Passes
IsStatic = true IsStatic = true
}; };
if (method.OperatorKind != CXXOperatorKind.None)
{
var param = function.Parameters[0];
Class type;
if (!FunctionToInstanceMethodPass.GetClassParameter(param, out type))
return;
method.Kind = CXXMethodKind.Operator;
method.SynthKind = FunctionSynthKind.NonMemberOperator;
method.OriginalFunction = null;
}
function.ExplicityIgnored = true; function.ExplicityIgnored = true;
@class.Methods.Add(method); @class.Methods.Add(method);

6
tests/Basic/Basic.Tests.cs

@ -123,6 +123,12 @@ public class BasicTests
Assert.That(foo.GetANSI(), Is.EqualTo("ANSI")); Assert.That(foo.GetANSI(), Is.EqualTo("ANSI"));
} }
[Test]
public void TestMoveFunctionToClass()
{
Assert.That(basic.test(new basic()), Is.EqualTo(5));
}
[Test, Ignore] [Test, Ignore]
public void TestConversionOperator() public void TestConversionOperator()
{ {

5
tests/Basic/Basic.cpp

@ -203,3 +203,8 @@ void DefaultParameters::Bar() const
void DefaultParameters::Bar() void DefaultParameters::Bar()
{ {
} }
int test(basic& s)
{
return 5;
}

7
tests/Basic/Basic.h

@ -178,3 +178,10 @@ class Base
class Derived : public Base<Derived> class Derived : public Base<Derived>
{ {
}; };
class DLL_API basic
{
};
DLL_API int test(basic& s);

Loading…
Cancel
Save