mirror of
https://github.com/github/codeql.git
synced 2026-04-30 11:15:13 +02:00
Convert CIL.GenericContext to interface
This commit is contained in:
@@ -95,11 +95,11 @@ namespace Semmle.Extraction.CIL
|
||||
/// <param name="h">The handle of the entity.</param>
|
||||
/// <param name="genericContext">The generic context.</param>
|
||||
/// <returns></returns>
|
||||
public IExtractedEntity CreateGeneric(GenericContext genericContext, Handle h) => genericHandleFactory[genericContext, h];
|
||||
public IExtractedEntity CreateGeneric(IGenericContext genericContext, Handle h) => genericHandleFactory[genericContext, h];
|
||||
|
||||
private readonly GenericContext defaultGenericContext;
|
||||
private readonly IGenericContext defaultGenericContext;
|
||||
|
||||
private IExtractedEntity CreateGenericHandle(GenericContext gc, Handle handle)
|
||||
private IExtractedEntity CreateGenericHandle(IGenericContext gc, Handle handle)
|
||||
{
|
||||
IExtractedEntity entity;
|
||||
switch (handle.Kind)
|
||||
@@ -136,7 +136,7 @@ namespace Semmle.Extraction.CIL
|
||||
return entity;
|
||||
}
|
||||
|
||||
private IExtractedEntity Create(GenericContext gc, MemberReferenceHandle handle)
|
||||
private IExtractedEntity Create(IGenericContext gc, MemberReferenceHandle handle)
|
||||
{
|
||||
var mr = MdReader.GetMemberReference(handle);
|
||||
switch (mr.GetKind())
|
||||
@@ -228,7 +228,7 @@ namespace Semmle.Extraction.CIL
|
||||
|
||||
#endregion
|
||||
|
||||
private readonly CachedFunction<GenericContext, Handle, IExtractedEntity> genericHandleFactory;
|
||||
private readonly CachedFunction<IGenericContext, Handle, IExtractedEntity> genericHandleFactory;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the short name of a member, without the preceding interface qualifier.
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace Semmle.Extraction.CIL
|
||||
|
||||
globalNamespace = new Lazy<Entities.Namespace>(() => Populate(new Entities.Namespace(this, "", null)));
|
||||
systemNamespace = new Lazy<Entities.Namespace>(() => Populate(new Entities.Namespace(this, "System")));
|
||||
genericHandleFactory = new CachedFunction<GenericContext, Handle, IExtractedEntity>(CreateGenericHandle);
|
||||
genericHandleFactory = new CachedFunction<IGenericContext, Handle, IExtractedEntity>(CreateGenericHandle);
|
||||
namespaceFactory = new CachedFunction<StringHandle, Entities.Namespace>(n => CreateNamespace(MdReader.GetString(n)));
|
||||
namespaceDefinitionFactory = new CachedFunction<NamespaceDefinitionHandle, Entities.Namespace>(CreateNamespace);
|
||||
sourceFiles = new CachedFunction<PDB.ISourceFile, Entities.PdbSourceFile>(path => new Entities.PdbSourceFile(this, path));
|
||||
|
||||
@@ -5,14 +5,18 @@ namespace Semmle.Extraction.CIL
|
||||
/// <summary>
|
||||
/// A generic context which does not contain any type parameters.
|
||||
/// </summary>
|
||||
public class EmptyContext : GenericContext
|
||||
public class EmptyContext : IGenericContext
|
||||
{
|
||||
public EmptyContext(Context cx) : base(cx)
|
||||
public EmptyContext(Context cx)
|
||||
{
|
||||
Cx = cx;
|
||||
}
|
||||
|
||||
public override IEnumerable<Entities.Type> TypeParameters { get { yield break; } }
|
||||
public Context Cx { get; }
|
||||
|
||||
public IEnumerable<Entities.Type> TypeParameters { get { yield break; } }
|
||||
|
||||
public IEnumerable<Entities.Type> MethodParameters { get { yield break; } }
|
||||
|
||||
public override IEnumerable<Entities.Type> MethodParameters { get { yield break; } }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
|
||||
public override IList<LocalVariable>? LocalVariables => locals;
|
||||
|
||||
public DefinitionMethod(GenericContext gc, MethodDefinitionHandle handle) : base(gc)
|
||||
public DefinitionMethod(IGenericContext gc, MethodDefinitionHandle handle) : base(gc)
|
||||
{
|
||||
md = Cx.MdReader.GetMethodDefinition(handle);
|
||||
this.gc = gc;
|
||||
|
||||
@@ -7,13 +7,13 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
/// </summary>
|
||||
internal class ExceptionRegion : UnlabelledEntity
|
||||
{
|
||||
private readonly GenericContext gc;
|
||||
private readonly IGenericContext gc;
|
||||
private readonly MethodImplementation method;
|
||||
private readonly int index;
|
||||
private readonly System.Reflection.Metadata.ExceptionRegion r;
|
||||
private readonly Dictionary<int, Instruction> jump_table;
|
||||
|
||||
public ExceptionRegion(GenericContext gc, MethodImplementation method, int index, System.Reflection.Metadata.ExceptionRegion r, Dictionary<int, Instruction> jump_table) : base(gc.Cx)
|
||||
public ExceptionRegion(IGenericContext gc, MethodImplementation method, int index, System.Reflection.Metadata.ExceptionRegion r, Dictionary<int, Instruction> jump_table) : base(gc.Cx)
|
||||
{
|
||||
this.gc = gc;
|
||||
this.method = method;
|
||||
|
||||
@@ -8,10 +8,11 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
/// <summary>
|
||||
/// An entity representing a field.
|
||||
/// </summary>
|
||||
internal abstract class Field : GenericContext, IMember, ICustomModifierReceiver
|
||||
internal abstract class Field : IGenericContext, IMember, ICustomModifierReceiver
|
||||
{
|
||||
protected Field(Context cx) : base(cx)
|
||||
protected Field(Context cx)
|
||||
{
|
||||
Cx = cx;
|
||||
}
|
||||
|
||||
public Label Label { get; set; }
|
||||
@@ -61,5 +62,11 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
}
|
||||
|
||||
TrapStackBehaviour IEntity.TrapStackBehaviour => TrapStackBehaviour.NoLabel;
|
||||
|
||||
public abstract IEnumerable<Type> TypeParameters { get; }
|
||||
|
||||
public abstract IEnumerable<Type> MethodParameters { get; }
|
||||
|
||||
public Context Cx { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,6 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
{
|
||||
internal interface ITypeSignature
|
||||
{
|
||||
void WriteId(TextWriter trapFile, GenericContext gc);
|
||||
void WriteId(TextWriter trapFile, IGenericContext gc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,10 +8,10 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
{
|
||||
private readonly MemberReferenceHandle handle;
|
||||
private readonly MemberReference mr;
|
||||
private readonly GenericContext gc;
|
||||
private readonly IGenericContext gc;
|
||||
private readonly Type declType;
|
||||
|
||||
public MemberReferenceField(GenericContext gc, MemberReferenceHandle handle) : base(gc.Cx)
|
||||
public MemberReferenceField(IGenericContext gc, MemberReferenceHandle handle) : base(gc.Cx)
|
||||
{
|
||||
this.handle = handle;
|
||||
this.gc = gc;
|
||||
|
||||
@@ -12,10 +12,10 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
private readonly MemberReferenceHandle handle;
|
||||
private readonly MemberReference mr;
|
||||
private readonly Type declaringType;
|
||||
private readonly GenericContext parent;
|
||||
private readonly IGenericContext parent;
|
||||
private readonly Method? sourceDeclaration;
|
||||
|
||||
public MemberReferenceMethod(GenericContext gc, MemberReferenceHandle handle) : base(gc)
|
||||
public MemberReferenceMethod(IGenericContext gc, MemberReferenceHandle handle) : base(gc)
|
||||
{
|
||||
this.handle = handle;
|
||||
this.gc = gc;
|
||||
@@ -23,7 +23,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
|
||||
signature = mr.DecodeMethodSignature(new SignatureDecoder(), gc);
|
||||
|
||||
parent = (GenericContext)Cx.CreateGeneric(gc, mr.Parent);
|
||||
parent = (IGenericContext)Cx.CreateGeneric(gc, mr.Parent);
|
||||
|
||||
var declType = parent is Method parentMethod
|
||||
? parentMethod.DeclaringType
|
||||
|
||||
@@ -12,10 +12,10 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
internal abstract class Method : TypeContainer, IMember, ICustomModifierReceiver, IParameterizable
|
||||
{
|
||||
protected MethodTypeParameter[]? genericParams;
|
||||
protected GenericContext gc;
|
||||
protected IGenericContext gc;
|
||||
protected MethodSignature<ITypeSignature> signature;
|
||||
|
||||
protected Method(GenericContext gc) : base(gc.Cx)
|
||||
protected Method(IGenericContext gc) : base(gc.Cx)
|
||||
{
|
||||
this.gc = gc;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
private readonly Method unboundMethod;
|
||||
private readonly ImmutableArray<Type> typeParams;
|
||||
|
||||
public MethodSpecificationMethod(GenericContext gc, MethodSpecificationHandle handle) : base(gc)
|
||||
public MethodSpecificationMethod(IGenericContext gc, MethodSpecificationHandle handle) : base(gc)
|
||||
{
|
||||
this.handle = handle;
|
||||
ms = Cx.MdReader.GetMethodSpecification(handle);
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
|
||||
public override string Name => "!" + index;
|
||||
|
||||
public MethodTypeParameter(GenericContext gc, Method m, int index) : base(gc)
|
||||
public MethodTypeParameter(IGenericContext gc, Method m, int index) : base(gc)
|
||||
{
|
||||
method = m;
|
||||
this.index = index;
|
||||
|
||||
@@ -14,9 +14,9 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
private readonly Type type;
|
||||
private readonly PropertyDefinition pd;
|
||||
public override string IdSuffix => ";cil-property";
|
||||
private readonly GenericContext gc;
|
||||
private readonly IGenericContext gc;
|
||||
|
||||
public Property(GenericContext gc, Type type, PropertyDefinitionHandle handle) : base(gc.Cx)
|
||||
public Property(IGenericContext gc, Type type, PropertyDefinitionHandle handle) : base(gc.Cx)
|
||||
{
|
||||
this.gc = gc;
|
||||
this.handle = handle;
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.shape = shape;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext gc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext gc)
|
||||
{
|
||||
elementType.WriteId(trapFile, gc);
|
||||
trapFile.Write('[');
|
||||
@@ -38,7 +38,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.elementType = elementType;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext gc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext gc)
|
||||
{
|
||||
elementType.WriteId(trapFile, gc);
|
||||
trapFile.Write('&');
|
||||
@@ -54,7 +54,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.signature = signature;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext gc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext gc)
|
||||
{
|
||||
FunctionPointerType.WriteName(
|
||||
trapFile.Write,
|
||||
@@ -84,7 +84,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.typeArguments = typeArguments;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext gc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext gc)
|
||||
{
|
||||
genericType.WriteId(trapFile, gc);
|
||||
trapFile.Write('<');
|
||||
@@ -112,7 +112,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.index = index;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext outerGc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext outerGc)
|
||||
{
|
||||
if (!ReferenceEquals(innerGc, outerGc) && innerGc is Method method)
|
||||
{
|
||||
@@ -132,7 +132,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.index = index;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext gc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext gc)
|
||||
{
|
||||
trapFile.Write("T!");
|
||||
trapFile.Write(index);
|
||||
@@ -158,7 +158,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.isRequired = isRequired;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext gc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext gc)
|
||||
{
|
||||
unmodifiedType.WriteId(trapFile, gc);
|
||||
trapFile.Write(isRequired ? " modreq(" : " modopt(");
|
||||
@@ -186,7 +186,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.elementType = elementType;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext gc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext gc)
|
||||
{
|
||||
elementType.WriteId(trapFile, gc);
|
||||
trapFile.Write('*');
|
||||
@@ -207,7 +207,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.typeCode = typeCode;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext gc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext gc)
|
||||
{
|
||||
trapFile.Write(typeCode.Id());
|
||||
}
|
||||
@@ -227,7 +227,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.elementType = elementType;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext gc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext gc)
|
||||
{
|
||||
elementType.WriteId(trapFile, gc);
|
||||
trapFile.Write("[]");
|
||||
@@ -248,7 +248,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.handle = handle;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext gc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext gc)
|
||||
{
|
||||
var type = (Type)gc.Cx.Create(handle);
|
||||
type.WriteId(trapFile);
|
||||
@@ -269,7 +269,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
this.handle = handle;
|
||||
}
|
||||
|
||||
public void WriteId(TextWriter trapFile, GenericContext gc)
|
||||
public void WriteId(TextWriter trapFile, IGenericContext gc)
|
||||
{
|
||||
var type = (Type)gc.Cx.Create(handle);
|
||||
type.WriteId(trapFile);
|
||||
|
||||
@@ -198,7 +198,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
|
||||
public sealed override IEnumerable<Type> MethodParameters => Enumerable.Empty<Type>();
|
||||
|
||||
public static Type DecodeType(GenericContext gc, TypeSpecificationHandle handle) =>
|
||||
public static Type DecodeType(IGenericContext gc, TypeSpecificationHandle handle) =>
|
||||
gc.Cx.MdReader.GetTypeSpecification(handle).DecodeSignature(gc.Cx.TypeSignatureDecoder, gc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,10 +8,13 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
/// <summary>
|
||||
/// Base class for all type containers (namespaces, types, methods).
|
||||
/// </summary>
|
||||
public abstract class TypeContainer : GenericContext, IExtractedEntity
|
||||
public abstract class TypeContainer : IGenericContext, IExtractedEntity
|
||||
{
|
||||
protected TypeContainer(Context cx) : base(cx)
|
||||
public Context Cx { get; }
|
||||
|
||||
protected TypeContainer(Context cx)
|
||||
{
|
||||
Cx = cx;
|
||||
}
|
||||
|
||||
public virtual Label Label { get; set; }
|
||||
@@ -42,5 +45,8 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
}
|
||||
|
||||
TrapStackBehaviour IEntity.TrapStackBehaviour => TrapStackBehaviour.NoLabel;
|
||||
|
||||
public abstract IEnumerable<Type> MethodParameters { get; }
|
||||
public abstract IEnumerable<Type> TypeParameters { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,9 +9,9 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
{
|
||||
internal abstract class TypeParameter : Type
|
||||
{
|
||||
protected readonly GenericContext gc;
|
||||
protected readonly IGenericContext gc;
|
||||
|
||||
protected TypeParameter(GenericContext gc) : base(gc.Cx)
|
||||
protected TypeParameter(IGenericContext gc) : base(gc.Cx)
|
||||
{
|
||||
this.gc = gc;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
/// <summary>
|
||||
/// Decodes a type signature and produces a Type, for use by DecodeSignature() and friends.
|
||||
/// </summary>
|
||||
public class TypeSignatureDecoder : ISignatureTypeProvider<Type, GenericContext>
|
||||
public class TypeSignatureDecoder : ISignatureTypeProvider<Type, IGenericContext>
|
||||
{
|
||||
private readonly Context cx;
|
||||
|
||||
@@ -23,22 +23,22 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
Type IConstructedTypeProvider<Type>.GetByReferenceType(Type elementType) =>
|
||||
new ByRefType(cx, elementType);
|
||||
|
||||
Type ISignatureTypeProvider<Type, GenericContext>.GetFunctionPointerType(MethodSignature<Type> signature) =>
|
||||
Type ISignatureTypeProvider<Type, IGenericContext>.GetFunctionPointerType(MethodSignature<Type> signature) =>
|
||||
cx.Populate(new FunctionPointerType(cx, signature));
|
||||
|
||||
Type IConstructedTypeProvider<Type>.GetGenericInstantiation(Type genericType, ImmutableArray<Type> typeArguments) =>
|
||||
genericType.Construct(typeArguments);
|
||||
|
||||
Type ISignatureTypeProvider<Type, GenericContext>.GetGenericMethodParameter(GenericContext genericContext, int index) =>
|
||||
Type ISignatureTypeProvider<Type, IGenericContext>.GetGenericMethodParameter(IGenericContext genericContext, int index) =>
|
||||
genericContext.MethodParameters.ElementAt(index);
|
||||
|
||||
Type ISignatureTypeProvider<Type, GenericContext>.GetGenericTypeParameter(GenericContext genericContext, int index) =>
|
||||
Type ISignatureTypeProvider<Type, IGenericContext>.GetGenericTypeParameter(IGenericContext genericContext, int index) =>
|
||||
genericContext.TypeParameters.ElementAt(index);
|
||||
|
||||
Type ISignatureTypeProvider<Type, GenericContext>.GetModifiedType(Type modifier, Type unmodifiedType, bool isRequired) =>
|
||||
Type ISignatureTypeProvider<Type, IGenericContext>.GetModifiedType(Type modifier, Type unmodifiedType, bool isRequired) =>
|
||||
new ModifiedType(cx, unmodifiedType, modifier, isRequired);
|
||||
|
||||
Type ISignatureTypeProvider<Type, GenericContext>.GetPinnedType(Type elementType) => elementType;
|
||||
Type ISignatureTypeProvider<Type, IGenericContext>.GetPinnedType(Type elementType) => elementType;
|
||||
|
||||
Type IConstructedTypeProvider<Type>.GetPointerType(Type elementType) =>
|
||||
cx.Populate(new PointerType(cx, elementType));
|
||||
@@ -54,7 +54,7 @@ namespace Semmle.Extraction.CIL.Entities
|
||||
Type ISimpleTypeProvider<Type>.GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) =>
|
||||
(Type)cx.Create(handle);
|
||||
|
||||
Type ISignatureTypeProvider<Type, GenericContext>.GetTypeFromSpecification(MetadataReader reader, GenericContext genericContext, TypeSpecificationHandle handle, byte rawTypeKind) =>
|
||||
Type ISignatureTypeProvider<Type, IGenericContext>.GetTypeFromSpecification(MetadataReader reader, IGenericContext genericContext, TypeSpecificationHandle handle, byte rawTypeKind) =>
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Semmle.Extraction.CIL
|
||||
{
|
||||
@@ -7,24 +6,19 @@ namespace Semmle.Extraction.CIL
|
||||
/// When we decode a type/method signature, we need access to
|
||||
/// generic parameters.
|
||||
/// </summary>
|
||||
public abstract class GenericContext
|
||||
public interface IGenericContext
|
||||
{
|
||||
public Context Cx { get; }
|
||||
|
||||
protected GenericContext(Context cx)
|
||||
{
|
||||
this.Cx = cx;
|
||||
}
|
||||
Context Cx { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The list of generic type parameters/arguments, including type parameters/arguments of
|
||||
/// containing types.
|
||||
/// </summary>
|
||||
public abstract IEnumerable<Entities.Type> TypeParameters { get; }
|
||||
IEnumerable<Entities.Type> TypeParameters { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The list of generic method parameters/arguments.
|
||||
/// </summary>
|
||||
public abstract IEnumerable<Entities.Type> MethodParameters { get; }
|
||||
IEnumerable<Entities.Type> MethodParameters { get; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user