Browse Source

Made the checking if a type is const char* universally accessible.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1089/head
Dimitar Dobrev 7 years ago
parent
commit
695a7538d1
  1. 30
      src/AST/TypeExtensions.cs
  2. 2
      src/Generator/Generators/CLI/CLIMarshal.cs
  3. 2
      src/Generator/Generators/CLI/CLITypePrinter.cs
  4. 8
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  5. 3
      src/Generator/Generators/CSharp/CSharpSources.cs
  6. 33
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  7. 2
      src/Generator/Types/Std/Stdlib.cs

30
src/AST/TypeExtensions.cs

@ -346,6 +346,36 @@ @@ -346,6 +346,36 @@
return left.Equals(right);
}
public static bool IsConst(this QualifiedType type)
{
return type.Type != null && (type.Qualifiers.IsConst ||
type.Type.GetQualifiedPointee().IsConst());
}
public static bool IsConstCharString(this Type type)
{
var desugared = type.Desugar();
if (!(desugared is PointerType))
return false;
var pointer = desugared as PointerType;
return IsConstCharString(pointer);
}
public static bool IsConstCharString(this PointerType pointer)
{
if (pointer.IsReference)
return false;
var pointee = pointer.Pointee.Desugar();
return (pointee.IsPrimitiveType(PrimitiveType.Char) ||
pointee.IsPrimitiveType(PrimitiveType.Char16) ||
pointee.IsPrimitiveType(PrimitiveType.WideChar)) &&
pointer.QualifiedPointee.Qualifiers.IsConst;
}
public static bool IsDependentPointer(this Type type)
{
var desugared = type.Desugar();

2
src/Generator/Generators/CLI/CLIMarshal.cs

@ -102,7 +102,7 @@ namespace CppSharp.Generators.CLI @@ -102,7 +102,7 @@ namespace CppSharp.Generators.CLI
return true;
}
if (CSharpTypePrinter.IsConstCharString(pointer))
if (pointer.IsConstCharString())
{
Context.Return.Write(MarshalStringToManaged(Context.ReturnVarName,
pointer.Pointee.Desugar() as BuiltinType));

2
src/Generator/Generators/CLI/CLITypePrinter.cs

@ -116,7 +116,7 @@ namespace CppSharp.Generators.CLI @@ -116,7 +116,7 @@ namespace CppSharp.Generators.CLI
return string.Format("{0}^", function.Visit(this, quals));
}
if (CSharpTypePrinter.IsConstCharString(pointer))
if (pointer.IsConstCharString())
return "System::String^";
// From http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

8
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -157,9 +157,9 @@ namespace CppSharp.Generators.CSharp @@ -157,9 +157,9 @@ namespace CppSharp.Generators.CSharp
var isRefParam = param != null && (param.IsInOut || param.IsOut);
var pointee = pointer.Pointee.Desugar();
bool marshalPointeeAsString = CSharpTypePrinter.IsConstCharString(pointee) && isRefParam;
bool marshalPointeeAsString = pointee.IsConstCharString() && isRefParam;
if ((CSharpTypePrinter.IsConstCharString(pointer) && !MarshalsParameter) ||
if ((pointer.IsConstCharString() && !MarshalsParameter) ||
marshalPointeeAsString)
{
Context.Return.Write(MarshalStringToManaged(Context.ReturnVarName,
@ -604,7 +604,7 @@ namespace CppSharp.Generators.CSharp @@ -604,7 +604,7 @@ namespace CppSharp.Generators.CSharp
var param = Context.Parameter;
var isRefParam = param != null && (param.IsInOut || param.IsOut);
if (CSharpTypePrinter.IsConstCharString(pointee) && isRefParam)
if (pointee.IsConstCharString() && isRefParam)
{
if (param.IsOut)
{
@ -650,7 +650,7 @@ namespace CppSharp.Generators.CSharp @@ -650,7 +650,7 @@ namespace CppSharp.Generators.CSharp
return true;
}
var marshalAsString = CSharpTypePrinter.IsConstCharString(pointer);
var marshalAsString = pointer.IsConstCharString();
var finalPointee = pointer.GetFinalPointee();
PrimitiveType primitive;
if (finalPointee.IsPrimitiveType(out primitive) || finalPointee.IsEnumType() ||

3
src/Generator/Generators/CSharp/CSharpSources.cs

@ -926,8 +926,7 @@ namespace CppSharp.Generators.CSharp @@ -926,8 +926,7 @@ namespace CppSharp.Generators.CSharp
if (type.IsPointer())
{
Type pointee = type.GetFinalPointee();
if (pointee.IsPrimitiveType() &&
!CSharpTypePrinter.IsConstCharString(type))
if (pointee.IsPrimitiveType() && !type.IsConstCharString())
{
Write($"({CSharpTypePrinter.IntPtrType}) ");
var templateSubstitution = pointee.Desugar(false) as TemplateParameterSubstitutionType;

33
src/Generator/Generators/CSharp/CSharpTypePrinter.cs

@ -177,35 +177,6 @@ namespace CppSharp.Generators.CSharp @@ -177,35 +177,6 @@ namespace CppSharp.Generators.CSharp
return string.Format("Func<{0}{1}>", returnTypePrinterResult, args);
}
public static bool IsConstCharString(PointerType pointer)
{
if (pointer.IsReference)
return false;
var pointee = pointer.Pointee.Desugar();
return (pointee.IsPrimitiveType(PrimitiveType.Char) ||
pointee.IsPrimitiveType(PrimitiveType.Char16) ||
pointee.IsPrimitiveType(PrimitiveType.WideChar)) &&
pointer.QualifiedPointee.Qualifiers.IsConst;
}
public static bool IsConstCharString(Type type)
{
var desugared = type.Desugar();
if (!(desugared is PointerType))
return false;
var pointer = desugared as PointerType;
return IsConstCharString(pointer);
}
public static bool IsConstCharString(QualifiedType qualType)
{
return IsConstCharString(qualType.Type);
}
private bool allowStrings = true;
public override TypePrinterResult VisitPointerType(PointerType pointer,
@ -224,7 +195,7 @@ namespace CppSharp.Generators.CSharp @@ -224,7 +195,7 @@ namespace CppSharp.Generators.CSharp
var isManagedContext = ContextKind == TypePrinterContextKind.Managed;
if (allowStrings && IsConstCharString(pointer))
if (allowStrings && pointer.IsConstCharString())
{
if (isManagedContext)
return "string";
@ -259,7 +230,7 @@ namespace CppSharp.Generators.CSharp @@ -259,7 +230,7 @@ namespace CppSharp.Generators.CSharp
if (pointee.IsPrimitiveType(PrimitiveType.Void))
return IntPtrType;
if (IsConstCharString(pointee) && isRefParam)
if (pointee.IsConstCharString() && isRefParam)
return IntPtrType + "*";
// Do not allow strings inside primitive arrays case, else we'll get invalid types

2
src/Generator/Types/Std/Stdlib.cs

@ -93,7 +93,7 @@ namespace CppSharp.Types.Std @@ -93,7 +93,7 @@ namespace CppSharp.Types.Std
public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
{
var type = ctx.ReturnType.Type.Desugar();
var type = Type.Desugar(resolveTemplateSubstitution: false);
ClassTemplateSpecialization basicString = GetBasicString(type);
var c_str = basicString.Methods.First(m => m.OriginalName == "c_str");
var typePrinter = new CSharpTypePrinter(ctx.Context);

Loading…
Cancel
Save