mirror of
https://github.com/github/codeql.git
synced 2026-04-27 17:55:19 +02:00
C#: Escape IDs in TRAP label definitions
This commit is contained in:
@@ -69,7 +69,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
return AssemblyConstructorFactory.Instance.CreateEntity(cx, outputAssemblyCacheKey, null);
|
||||
}
|
||||
|
||||
public override void WriteId(System.IO.TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.Write(assembly.ToString());
|
||||
if (!(assemblyPath is null))
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
this.entity = entity;
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
if (ReportingLocation?.IsInSource == true)
|
||||
{
|
||||
@@ -33,7 +33,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
}
|
||||
}
|
||||
|
||||
public override void WriteQuotedId(TextWriter trapFile)
|
||||
public sealed override void WriteQuotedId(EscapingTextWriter trapFile)
|
||||
{
|
||||
if (ReportingLocation?.IsInSource == true)
|
||||
{
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
|
||||
public override bool NeedsPopulation => true;
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.WriteSubId(Context.CreateLocation(Symbol.Location));
|
||||
trapFile.Write(";commentblock");
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
|
||||
public override bool NeedsPopulation => true;
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.WriteSubId(Context.CreateLocation(Location));
|
||||
trapFile.Write(";commentline");
|
||||
|
||||
@@ -81,7 +81,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
trapFile.compilation_finished(this, (float)p.Total.Cpu.TotalSeconds, (float)p.Total.Elapsed.TotalSeconds);
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.Write(hashCode);
|
||||
trapFile.Write(";compilation");
|
||||
|
||||
@@ -144,7 +144,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
}
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
if (Symbol.IsStatic)
|
||||
trapFile.Write("static");
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
private Event(Context cx, IEventSymbol init)
|
||||
: base(cx, init) { }
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.WriteSubId(ContainingType!);
|
||||
trapFile.Write('.');
|
||||
|
||||
@@ -118,7 +118,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
private readonly Lazy<Type> type;
|
||||
public Type Type => type.Value;
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.WriteSubId(Type);
|
||||
trapFile.Write(" ");
|
||||
|
||||
@@ -73,13 +73,13 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
|
||||
public static new Indexer Create(Context cx, IPropertySymbol prop) => IndexerFactory.Instance.CreateEntityFromSymbol(cx, prop);
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.WriteSubId(ContainingType!);
|
||||
trapFile.Write('.');
|
||||
trapFile.Write(Symbol.MetadataName);
|
||||
trapFile.Write('(');
|
||||
trapFile.BuildList(",", Symbol.Parameters, (p, tb0) => tb0.WriteSubId(Type.Create(Context, p.Type)));
|
||||
trapFile.BuildList(",", Symbol.Parameters, p => trapFile.WriteSubId(Type.Create(Context, p.Type)));
|
||||
trapFile.Write(");indexer");
|
||||
}
|
||||
|
||||
|
||||
@@ -10,12 +10,12 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
{
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
throw new InvalidOperationException();
|
||||
}
|
||||
|
||||
public override void WriteQuotedId(TextWriter trapFile)
|
||||
public sealed override void WriteQuotedId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.Write('*');
|
||||
}
|
||||
|
||||
@@ -8,12 +8,12 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
{
|
||||
private LocalVariable(Context cx, ISymbol init) : base(cx, init) { }
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
throw new InvalidOperationException();
|
||||
}
|
||||
|
||||
public override void WriteQuotedId(TextWriter trapFile)
|
||||
public sealed override void WriteQuotedId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.Write('*');
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
/// <summary>
|
||||
/// Factored out to share logic between `Method` and `UserOperator`.
|
||||
/// </summary>
|
||||
private static void BuildMethodId(Method m, TextWriter trapFile)
|
||||
private static void BuildMethodId(Method m, EscapingTextWriter trapFile)
|
||||
{
|
||||
m.Symbol.ReturnType.BuildOrWriteId(m.Context, trapFile, m.Symbol);
|
||||
trapFile.Write(" ");
|
||||
@@ -153,7 +153,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
// Type arguments with different nullability can result in
|
||||
// a constructed method with different nullability of its parameters and return type,
|
||||
// so we need to create a distinct database entity for it.
|
||||
trapFile.BuildList(",", m.Symbol.GetAnnotatedTypeArguments(), (ta, tb0) => { ta.Symbol.BuildOrWriteId(m.Context, tb0, m.Symbol); trapFile.Write((int)ta.Nullability); });
|
||||
trapFile.BuildList(",", m.Symbol.GetAnnotatedTypeArguments(), ta => { ta.Symbol.BuildOrWriteId(m.Context, trapFile, m.Symbol); trapFile.Write((int)ta.Nullability); });
|
||||
trapFile.Write('>');
|
||||
}
|
||||
}
|
||||
@@ -182,12 +182,12 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
}
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
BuildMethodId(this, trapFile);
|
||||
}
|
||||
|
||||
protected static void AddParametersToId(Context cx, TextWriter trapFile, IMethodSymbol method)
|
||||
protected static void AddParametersToId(Context cx, EscapingTextWriter trapFile, IMethodSymbol method)
|
||||
{
|
||||
trapFile.Write('(');
|
||||
var index = 0;
|
||||
@@ -222,7 +222,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
trapFile.Write(')');
|
||||
}
|
||||
|
||||
public static void AddExplicitInterfaceQualifierToId(Context cx, System.IO.TextWriter trapFile, IEnumerable<ISymbol> explicitInterfaceImplementations)
|
||||
public static void AddExplicitInterfaceQualifierToId(Context cx, EscapingTextWriter trapFile, IEnumerable<ISymbol> explicitInterfaceImplementations)
|
||||
{
|
||||
if (explicitInterfaceImplementations.Any())
|
||||
trapFile.AppendList(",", explicitInterfaceImplementations.Select(impl => cx.CreateEntity(impl.ContainingType)));
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
|
||||
public override Location? ReportingLocation => null;
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.Write(Symbol);
|
||||
trapFile.Write(";modifier");
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
|
||||
public override bool NeedsPopulation => true;
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
if (!Symbol.IsGlobalNamespace)
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.WriteSubId(Context.CreateLocation(ReportingLocation));
|
||||
trapFile.Write(";namespacedeclaration");
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
get;
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.Write("loc,");
|
||||
trapFile.WriteSubId(FileEntity);
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
public static Parameter Create(Context cx, IParameterSymbol param) =>
|
||||
ParameterFactory.Instance.CreateEntity(cx, param, (param, null, null));
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
if (Parent is null)
|
||||
Parent = Method.Create(Context, Symbol.ContainingSymbol as IMethodSymbol);
|
||||
@@ -209,7 +209,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
|
||||
public override bool NeedsPopulation => true;
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.Write("__arglist;type");
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
|
||||
private Type Type => type.Value;
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.WriteSubId(Type);
|
||||
trapFile.Write(" ");
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
PopulateType(trapFile);
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.WriteSubId(ElementType);
|
||||
Symbol.BuildArraySuffix(trapFile);
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
trapFile.parent_namespace(this, Namespace.Create(Context, Context.Compilation.GlobalNamespace));
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.Write("dynamic;type");
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
{
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
Symbol.BuildTypeId(Context, trapFile, Symbol);
|
||||
trapFile.Write(";functionpointertype");
|
||||
|
||||
@@ -128,7 +128,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
|
||||
private bool IsAnonymousType() => Symbol.IsAnonymousType || Symbol.Name.Contains("__AnonymousType");
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
if (IsAnonymousType())
|
||||
{
|
||||
@@ -141,7 +141,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
}
|
||||
}
|
||||
|
||||
public override void WriteQuotedId(TextWriter trapFile)
|
||||
public sealed override void WriteQuotedId(EscapingTextWriter trapFile)
|
||||
{
|
||||
if (IsAnonymousType())
|
||||
trapFile.Write('*');
|
||||
@@ -195,7 +195,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
|
||||
public override bool NeedsPopulation => true;
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.WriteSubId(referencedType);
|
||||
trapFile.Write(";typeRef");
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
trapFile.types(this, Kinds.TypeKind.NULL, "null");
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.Write("<null>;type");
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
return h;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile)
|
||||
public void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.Write(Annotation);
|
||||
trapFile.Write('(');
|
||||
@@ -90,7 +90,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
using var w = new StringWriter();
|
||||
using var w = new EscapingTextWriter();
|
||||
WriteId(w);
|
||||
return w.ToString();
|
||||
}
|
||||
@@ -120,7 +120,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
}
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
Symbol.WriteId(trapFile);
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
PointedAtType = Create(cx, Symbol.PointedAtType);
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.WriteSubId(PointedAtType);
|
||||
trapFile.Write("*;type");
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
// All tuple types are "local types"
|
||||
public override bool NeedsPopulation => true;
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
Symbol.BuildTypeId(Context, trapFile, Symbol);
|
||||
trapFile.Write(";tuple");
|
||||
|
||||
@@ -103,7 +103,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
}
|
||||
}
|
||||
|
||||
public override void WriteId(TextWriter trapFile)
|
||||
public override void WriteId(EscapingTextWriter trapFile)
|
||||
{
|
||||
string kind;
|
||||
IEntity containingEntity;
|
||||
|
||||
@@ -160,10 +160,10 @@ namespace Semmle.Extraction.CSharp
|
||||
/// <param name="trapFile">The trap builder used to store the result.</param>
|
||||
/// <param name="symbolBeingDefined">The outer symbol being defined (to avoid recursive ids).</param>
|
||||
/// <param name="constructUnderlyingTupleType">Whether to build a type ID for the underlying `System.ValueTuple` struct in the case of tuple types.</param>
|
||||
public static void BuildTypeId(this ITypeSymbol type, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined, bool constructUnderlyingTupleType = false) =>
|
||||
public static void BuildTypeId(this ITypeSymbol type, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined, bool constructUnderlyingTupleType = false) =>
|
||||
type.BuildTypeId(cx, trapFile, symbolBeingDefined, true, constructUnderlyingTupleType);
|
||||
|
||||
private static void BuildTypeId(this ITypeSymbol type, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType)
|
||||
private static void BuildTypeId(this ITypeSymbol type, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType)
|
||||
{
|
||||
using (cx.StackGuard)
|
||||
{
|
||||
@@ -207,7 +207,7 @@ namespace Semmle.Extraction.CSharp
|
||||
}
|
||||
}
|
||||
|
||||
private static void BuildOrWriteId(this ISymbol? symbol, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType = false)
|
||||
private static void BuildOrWriteId(this ISymbol? symbol, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType = false)
|
||||
{
|
||||
if (symbol is null)
|
||||
{
|
||||
@@ -249,7 +249,7 @@ namespace Semmle.Extraction.CSharp
|
||||
/// it will generate an appropriate ID that encodes the signature of
|
||||
/// <paramref name="symbol" />.
|
||||
/// </summary>
|
||||
public static void BuildOrWriteId(this ISymbol? symbol, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined) =>
|
||||
public static void BuildOrWriteId(this ISymbol? symbol, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined) =>
|
||||
symbol.BuildOrWriteId(cx, trapFile, symbolBeingDefined, true);
|
||||
|
||||
/// <summary>
|
||||
@@ -264,7 +264,7 @@ namespace Semmle.Extraction.CSharp
|
||||
trapFile.Write(']');
|
||||
}
|
||||
|
||||
private static void BuildAssembly(IAssemblySymbol asm, TextWriter trapFile, bool extraPrecise = false)
|
||||
private static void BuildAssembly(IAssemblySymbol asm, EscapingTextWriter trapFile, bool extraPrecise = false)
|
||||
{
|
||||
var assembly = asm.Identity;
|
||||
trapFile.Write(assembly.Name);
|
||||
@@ -282,22 +282,22 @@ namespace Semmle.Extraction.CSharp
|
||||
trapFile.Write("::");
|
||||
}
|
||||
|
||||
private static void BuildFunctionPointerTypeId(this IFunctionPointerTypeSymbol funptr, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined)
|
||||
private static void BuildFunctionPointerTypeId(this IFunctionPointerTypeSymbol funptr, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined)
|
||||
{
|
||||
BuildFunctionPointerSignature(funptr, trapFile, (s, tw) => s.BuildOrWriteId(cx, tw, symbolBeingDefined));
|
||||
BuildFunctionPointerSignature(funptr, trapFile, s => s.BuildOrWriteId(cx, trapFile, symbolBeingDefined));
|
||||
}
|
||||
|
||||
private static void BuildNamedTypeId(this INamedTypeSymbol named, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType)
|
||||
private static void BuildNamedTypeId(this INamedTypeSymbol named, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType)
|
||||
{
|
||||
if (!constructUnderlyingTupleType && named.IsTupleType)
|
||||
{
|
||||
trapFile.Write('(');
|
||||
trapFile.BuildList(",", named.TupleElements,
|
||||
(f, tb0) =>
|
||||
f =>
|
||||
{
|
||||
trapFile.Write((f.CorrespondingTupleField ?? f).Name);
|
||||
trapFile.Write(":");
|
||||
f.Type.BuildOrWriteId(cx, tb0, symbolBeingDefined, addBaseClass);
|
||||
f.Type.BuildOrWriteId(cx, trapFile, symbolBeingDefined, addBaseClass);
|
||||
}
|
||||
);
|
||||
trapFile.Write(")");
|
||||
@@ -340,7 +340,7 @@ namespace Semmle.Extraction.CSharp
|
||||
// a constructed type with different nullability of its members and methods,
|
||||
// so we need to create a distinct database entity for it.
|
||||
trapFile.BuildList(",", named.GetAnnotatedTypeArguments(),
|
||||
(ta, tb0) => ta.Symbol.BuildOrWriteId(cx, tb0, symbolBeingDefined, addBaseClass)
|
||||
ta => ta.Symbol.BuildOrWriteId(cx, trapFile, symbolBeingDefined, addBaseClass)
|
||||
);
|
||||
trapFile.Write('>');
|
||||
}
|
||||
@@ -364,7 +364,7 @@ namespace Semmle.Extraction.CSharp
|
||||
}
|
||||
}
|
||||
|
||||
private static void BuildNamespace(this INamespaceSymbol ns, Context cx, TextWriter trapFile)
|
||||
private static void BuildNamespace(this INamespaceSymbol ns, Context cx, EscapingTextWriter trapFile)
|
||||
{
|
||||
trapFile.WriteSubId(Namespace.Create(cx, ns));
|
||||
trapFile.Write('.');
|
||||
@@ -377,7 +377,7 @@ namespace Semmle.Extraction.CSharp
|
||||
trapFile.Write("<>__AnonType");
|
||||
trapFile.Write(hackTypeNumber);
|
||||
trapFile.Write('<');
|
||||
trapFile.BuildList(",", type.GetMembers().OfType<IPropertySymbol>(), (prop, tb0) => BuildDisplayName(prop.Type, cx, tb0));
|
||||
trapFile.BuildList(",", type.GetMembers().OfType<IPropertySymbol>(), prop => BuildDisplayName(prop.Type, cx, trapFile));
|
||||
trapFile.Write('>');
|
||||
}
|
||||
|
||||
@@ -433,7 +433,7 @@ namespace Semmle.Extraction.CSharp
|
||||
}
|
||||
|
||||
public static void BuildFunctionPointerSignature(IFunctionPointerTypeSymbol funptr, TextWriter trapFile,
|
||||
Action<ITypeSymbol, TextWriter> buildNested)
|
||||
Action<ITypeSymbol> buildNested)
|
||||
{
|
||||
trapFile.Write("delegate* ");
|
||||
trapFile.Write(funptr.Signature.CallingConvention.ToString().ToLowerInvariant());
|
||||
@@ -447,19 +447,19 @@ namespace Semmle.Extraction.CSharp
|
||||
|
||||
trapFile.Write('<');
|
||||
trapFile.BuildList(",", funptr.Signature.Parameters,
|
||||
(p, trap) =>
|
||||
p =>
|
||||
{
|
||||
buildNested(p.Type, trap);
|
||||
buildNested(p.Type);
|
||||
switch (p.RefKind)
|
||||
{
|
||||
case RefKind.Out:
|
||||
trap.Write(" out");
|
||||
trapFile.Write(" out");
|
||||
break;
|
||||
case RefKind.In:
|
||||
trap.Write(" in");
|
||||
trapFile.Write(" in");
|
||||
break;
|
||||
case RefKind.Ref:
|
||||
trap.Write(" ref");
|
||||
trapFile.Write(" ref");
|
||||
break;
|
||||
}
|
||||
});
|
||||
@@ -469,7 +469,7 @@ namespace Semmle.Extraction.CSharp
|
||||
trapFile.Write(",");
|
||||
}
|
||||
|
||||
buildNested(funptr.Signature.ReturnType, trapFile);
|
||||
buildNested(funptr.Signature.ReturnType);
|
||||
|
||||
if (funptr.Signature.ReturnsByRef)
|
||||
trapFile.Write(" ref");
|
||||
@@ -481,7 +481,7 @@ namespace Semmle.Extraction.CSharp
|
||||
|
||||
private static void BuildFunctionPointerTypeDisplayName(this IFunctionPointerTypeSymbol funptr, Context cx, TextWriter trapFile)
|
||||
{
|
||||
BuildFunctionPointerSignature(funptr, trapFile, (s, tw) => s.BuildDisplayName(cx, tw));
|
||||
BuildFunctionPointerSignature(funptr, trapFile, s => s.BuildDisplayName(cx, trapFile));
|
||||
}
|
||||
|
||||
private static void BuildNamedTypeDisplayName(this INamedTypeSymbol namedType, Context cx, TextWriter trapFile, bool constructUnderlyingTupleType)
|
||||
@@ -492,7 +492,7 @@ namespace Semmle.Extraction.CSharp
|
||||
trapFile.BuildList(
|
||||
",",
|
||||
namedType.TupleElements.Select(f => f.Type),
|
||||
(t, tb0) => t.BuildDisplayName(cx, tb0));
|
||||
t => t.BuildDisplayName(cx, trapFile));
|
||||
trapFile.Write(")");
|
||||
return;
|
||||
}
|
||||
@@ -512,11 +512,11 @@ namespace Semmle.Extraction.CSharp
|
||||
trapFile.BuildList(
|
||||
",",
|
||||
namedType.TypeArguments,
|
||||
(p, tb0) =>
|
||||
p =>
|
||||
{
|
||||
if (IsReallyBound(namedType))
|
||||
{
|
||||
p.BuildDisplayName(cx, tb0);
|
||||
p.BuildDisplayName(cx, trapFile);
|
||||
}
|
||||
});
|
||||
trapFile.Write('>');
|
||||
|
||||
Reference in New Issue
Block a user