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