Convert CIL.GenericContext to interface

This commit is contained in:
Tamas Vajk
2021-02-11 11:06:24 +01:00
parent 3e2a6fca21
commit 61e952766c
19 changed files with 72 additions and 61 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -4,6 +4,6 @@ namespace Semmle.Extraction.CIL.Entities
{
internal interface ITypeSignature
{
void WriteId(TextWriter trapFile, GenericContext gc);
void WriteId(TextWriter trapFile, IGenericContext gc);
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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);
}
}

View File

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

View File

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

View File

@@ -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();
}
}

View File

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