mirror of https://github.com/mono/CppSharp.git
Browse Source
Conflicts: src/Generator/Passes/CheckAmbiguousFunctions.cs src/Generator/Passes/CheckOperatorsOverloads.cspull/234/head
15 changed files with 517 additions and 375 deletions
@ -0,0 +1,61 @@
@@ -0,0 +1,61 @@
|
||||
using System.Linq; |
||||
using CppSharp.AST; |
||||
using CppSharp.AST.Extensions; |
||||
using CppSharp.Generators; |
||||
|
||||
namespace CppSharp.Passes |
||||
{ |
||||
/// <summary>
|
||||
/// This pass will create conversion operators out of single argument
|
||||
/// constructors.
|
||||
/// </summary>
|
||||
public class ConstructorToConversionOperatorPass : TranslationUnitPass |
||||
{ |
||||
public override bool VisitMethodDecl(Method method) |
||||
{ |
||||
if (!method.IsConstructor) |
||||
return false; |
||||
if (method.IsCopyConstructor) |
||||
return false; |
||||
if (method.Parameters.Count != 1) |
||||
return false; |
||||
var parameter = method.Parameters[0]; |
||||
var parameterType = parameter.Type as PointerType; |
||||
if (parameterType == null) |
||||
return false; |
||||
if (!parameterType.IsReference) |
||||
return false; |
||||
var qualifiedPointee = parameterType.QualifiedPointee; |
||||
if (!qualifiedPointee.Qualifiers.IsConst) |
||||
return false; |
||||
Class castFromClass; |
||||
if (!qualifiedPointee.Type.IsTagDecl(out castFromClass)) |
||||
return false; |
||||
var castToClass = method.OriginalNamespace as Class; |
||||
if (castToClass == null) |
||||
return false; |
||||
if (castFromClass == castToClass) |
||||
return false; |
||||
|
||||
var operatorKind = CXXOperatorKind.Conversion; |
||||
if (method.Signature.StartsWith("explicit", System.StringComparison.OrdinalIgnoreCase)) |
||||
operatorKind = CXXOperatorKind.ExplicitConversion; |
||||
|
||||
var castToType = new TagType(castToClass); |
||||
var qualifiedCastToType = new QualifiedType(castToType); |
||||
var conversionOperator = new Method() |
||||
{ |
||||
Name = Operators.GetOperatorIdentifier(operatorKind), |
||||
Namespace = castFromClass, |
||||
Kind = CXXMethodKind.Conversion, |
||||
IsSynthetized = true, |
||||
ConversionType = qualifiedCastToType, |
||||
ReturnType = qualifiedCastToType |
||||
}; |
||||
conversionOperator.OperatorKind = operatorKind; |
||||
|
||||
castFromClass.Methods.Add(conversionOperator); |
||||
return true; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue