Skip to content

Commit 695a753

Browse files
committed
Made the checking if a type is const char* universally accessible.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent d5a1210 commit 695a753

File tree

7 files changed

+40
-40
lines changed

7 files changed

+40
-40
lines changed

src/AST/TypeExtensions.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,36 @@ public static bool ResolvesTo(this QualifiedType type, QualifiedType other)
346346
return left.Equals(right);
347347
}
348348

349+
public static bool IsConst(this QualifiedType type)
350+
{
351+
return type.Type != null && (type.Qualifiers.IsConst ||
352+
type.Type.GetQualifiedPointee().IsConst());
353+
}
354+
355+
public static bool IsConstCharString(this Type type)
356+
{
357+
var desugared = type.Desugar();
358+
359+
if (!(desugared is PointerType))
360+
return false;
361+
362+
var pointer = desugared as PointerType;
363+
return IsConstCharString(pointer);
364+
}
365+
366+
public static bool IsConstCharString(this PointerType pointer)
367+
{
368+
if (pointer.IsReference)
369+
return false;
370+
371+
var pointee = pointer.Pointee.Desugar();
372+
373+
return (pointee.IsPrimitiveType(PrimitiveType.Char) ||
374+
pointee.IsPrimitiveType(PrimitiveType.Char16) ||
375+
pointee.IsPrimitiveType(PrimitiveType.WideChar)) &&
376+
pointer.QualifiedPointee.Qualifiers.IsConst;
377+
}
378+
349379
public static bool IsDependentPointer(this Type type)
350380
{
351381
var desugared = type.Desugar();

src/Generator/Generators/CLI/CLIMarshal.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
102102
return true;
103103
}
104104

105-
if (CSharpTypePrinter.IsConstCharString(pointer))
105+
if (pointer.IsConstCharString())
106106
{
107107
Context.Return.Write(MarshalStringToManaged(Context.ReturnVarName,
108108
pointer.Pointee.Desugar() as BuiltinType));

src/Generator/Generators/CLI/CLITypePrinter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public override TypePrinterResult VisitPointerType(PointerType pointer,
116116
return string.Format("{0}^", function.Visit(this, quals));
117117
}
118118

119-
if (CSharpTypePrinter.IsConstCharString(pointer))
119+
if (pointer.IsConstCharString())
120120
return "System::String^";
121121

122122
// From http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

src/Generator/Generators/CSharp/CSharpMarshal.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,9 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
157157
var isRefParam = param != null && (param.IsInOut || param.IsOut);
158158

159159
var pointee = pointer.Pointee.Desugar();
160-
bool marshalPointeeAsString = CSharpTypePrinter.IsConstCharString(pointee) && isRefParam;
160+
bool marshalPointeeAsString = pointee.IsConstCharString() && isRefParam;
161161

162-
if ((CSharpTypePrinter.IsConstCharString(pointer) && !MarshalsParameter) ||
162+
if ((pointer.IsConstCharString() && !MarshalsParameter) ||
163163
marshalPointeeAsString)
164164
{
165165
Context.Return.Write(MarshalStringToManaged(Context.ReturnVarName,
@@ -604,7 +604,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
604604
var param = Context.Parameter;
605605
var isRefParam = param != null && (param.IsInOut || param.IsOut);
606606

607-
if (CSharpTypePrinter.IsConstCharString(pointee) && isRefParam)
607+
if (pointee.IsConstCharString() && isRefParam)
608608
{
609609
if (param.IsOut)
610610
{
@@ -650,7 +650,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
650650
return true;
651651
}
652652

653-
var marshalAsString = CSharpTypePrinter.IsConstCharString(pointer);
653+
var marshalAsString = pointer.IsConstCharString();
654654
var finalPointee = pointer.GetFinalPointee();
655655
PrimitiveType primitive;
656656
if (finalPointee.IsPrimitiveType(out primitive) || finalPointee.IsEnumType() ||

src/Generator/Generators/CSharp/CSharpSources.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -926,8 +926,7 @@ private void GenerateFieldSetter(Field field, Class @class, QualifiedType fieldT
926926
if (type.IsPointer())
927927
{
928928
Type pointee = type.GetFinalPointee();
929-
if (pointee.IsPrimitiveType() &&
930-
!CSharpTypePrinter.IsConstCharString(type))
929+
if (pointee.IsPrimitiveType() && !type.IsConstCharString())
931930
{
932931
Write($"({CSharpTypePrinter.IntPtrType}) ");
933932
var templateSubstitution = pointee.Desugar(false) as TemplateParameterSubstitutionType;

src/Generator/Generators/CSharp/CSharpTypePrinter.cs

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -177,35 +177,6 @@ public override TypePrinterResult VisitFunctionType(FunctionType function,
177177
return string.Format("Func<{0}{1}>", returnTypePrinterResult, args);
178178
}
179179

180-
public static bool IsConstCharString(PointerType pointer)
181-
{
182-
if (pointer.IsReference)
183-
return false;
184-
185-
var pointee = pointer.Pointee.Desugar();
186-
187-
return (pointee.IsPrimitiveType(PrimitiveType.Char) ||
188-
pointee.IsPrimitiveType(PrimitiveType.Char16) ||
189-
pointee.IsPrimitiveType(PrimitiveType.WideChar)) &&
190-
pointer.QualifiedPointee.Qualifiers.IsConst;
191-
}
192-
193-
public static bool IsConstCharString(Type type)
194-
{
195-
var desugared = type.Desugar();
196-
197-
if (!(desugared is PointerType))
198-
return false;
199-
200-
var pointer = desugared as PointerType;
201-
return IsConstCharString(pointer);
202-
}
203-
204-
public static bool IsConstCharString(QualifiedType qualType)
205-
{
206-
return IsConstCharString(qualType.Type);
207-
}
208-
209180
private bool allowStrings = true;
210181

211182
public override TypePrinterResult VisitPointerType(PointerType pointer,
@@ -224,7 +195,7 @@ public override TypePrinterResult VisitPointerType(PointerType pointer,
224195

225196
var isManagedContext = ContextKind == TypePrinterContextKind.Managed;
226197

227-
if (allowStrings && IsConstCharString(pointer))
198+
if (allowStrings && pointer.IsConstCharString())
228199
{
229200
if (isManagedContext)
230201
return "string";
@@ -259,7 +230,7 @@ public override TypePrinterResult VisitPointerType(PointerType pointer,
259230
if (pointee.IsPrimitiveType(PrimitiveType.Void))
260231
return IntPtrType;
261232

262-
if (IsConstCharString(pointee) && isRefParam)
233+
if (pointee.IsConstCharString() && isRefParam)
263234
return IntPtrType + "*";
264235

265236
// Do not allow strings inside primitive arrays case, else we'll get invalid types

src/Generator/Types/Std/Stdlib.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
9393

9494
public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
9595
{
96-
var type = ctx.ReturnType.Type.Desugar();
96+
var type = Type.Desugar(resolveTemplateSubstitution: false);
9797
ClassTemplateSpecialization basicString = GetBasicString(type);
9898
var c_str = basicString.Methods.First(m => m.OriginalName == "c_str");
9999
var typePrinter = new CSharpTypePrinter(ctx.Context);

0 commit comments

Comments
 (0)