File: Linker\DependencyInfo.cs
Web Access
Project: src\src\tools\illink\src\linker\Mono.Linker.csproj (illink)
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
using System;
 
namespace Mono.Linker
{
	public enum DependencyKind
	{
		// For tracking any other kinds of dependencies in extensions to the core logic
		Custom = -1, // the source is reserved to carry any dependency information tracked by the extender
 
		// For use when we don't care about tracking a particular dependency
		Unspecified = 0, // currently unused
 
		// Entry points to the analysis
		AssemblyAction = 1, // assembly action -> entry assembly
		RootAssembly = 2, // assembly -> entry type
		XmlDescriptor = 3, // xml document -> entry member
						   // Attributes on assemblies are marked whether or not we keep
						   // the assembly, so mark these as entry points.
		AssemblyOrModuleAttribute = 4, // assembly/module -> entry attribute
 
		// Membership and containment relationships
		NestedType = 5, // parent type -> nested type
		MemberOfType = 6, // type -> member
		DeclaringType = 7, // member -> type
		FieldOnGenericInstance = 8, // fieldref on instantiated generic -> field on generic typedef
		MethodOnGenericInstance = 9, // methodref on instantiated generic -> method on generic typedef
 
		// Type relationships
		BaseType = 10, // type -> its base type
		FieldType = 11, // field -> its type
		ParameterType = 12, // method -> types of its parameters
		ReturnType = 13, // method -> type it returns
		VariableType = 14, // method -> types of its variables
		CatchType = 15, // method -> types of its exception handlers
 
		// Override relationships
		BaseMethod = 16, // override -> base method
		Override = 17, // base method -> override
		MethodImplOverride = 18, // method -> .override on the method
		VirtualNeededDueToPreservedScope = 19, // type -> virtuals kept because scope requires it
		MethodForInstantiatedType = 20, // type -> methods kept because type is instantiated or scope requires it
		BaseDefaultCtorForStubbedMethod = 21, // stubbed method -> default ctor of base type
 
		// Generic type relationships
		GenericArgumentType = 22, // generic instance -> argument type
		GenericParameterConstraintType = 23, // generic typedef/methoddef -> parameter constraint type
		DefaultCtorForNewConstrainedGenericArgument = 24, // generic instance -> argument ctor
		ElementType = 25, // generic type instantiation -> generic typedef
		ElementMethod = 26, // generic method instantiation -> generic methoddef
		ModifierType = 27, // modified type -> type modifier
 
		// Modules and assemblies
		ScopeOfType = 28, // type -> module/assembly
		AssemblyOfModule = 81, // module -> assembly
		TypeInAssembly = 29, // assembly -> type
		ModuleOfExportedType = 30, // exported type -> module
		ExportedType = 31, // type -> exported type
 
		// Grouping of property/event methods
		PropertyOfPropertyMethod = 32, // property method -> its property
		EventOfEventMethod = 33, // event method -> its event
		EventMethod = 34, // event -> its event methods
						  // PropertyMethod doesn't exist because property methods aren't always marked for a property
 
		// Interface implementations
		InterfaceImplementationInterfaceType = 35, // interfaceimpl -> interface type
		InterfaceImplementationOnType = 36, // type -> interfaceimpl on it
 
		// Interop methods
		ReturnTypeMarshalSpec = 37, // interop method -> marshal spec of its return type
		ParameterMarshalSpec = 38, // interop method -> marshal spec of its parameters
		FieldMarshalSpec = 39, // field -> its marshal spec
		InteropMethodDependency = 40, // interop method -> required members of its parameters, return type, declaring type
 
		// Dependencies created by instructions
		DirectCall = 41, // method -> method
		VirtualCall = 42, // method -> method
		Ldvirtftn = 43, // method -> method
		Ldftn = 44, // method -> method
		Newobj = 45, // method -> method
		Ldtoken = 46, // method -> member referenced
		FieldAccess = 47, // method -> field (for instructions that load/store fields)
		InstructionTypeRef = 48, // other instructions that have an inline type token (method -> type)
 
		// Custom attributes on various providers
		CustomAttribute = 49, // attribute provider (type/field/method/etc...) -> attribute on it
		ParameterAttribute = 50, // method parameter -> attribute on it
		ReturnTypeAttribute = 51, // method return type -> attribute on it
		GenericParameterCustomAttribute = 52, // generic parameter -> attribute on it
		GenericParameterConstraintCustomAttribute = 53, // generic parameter constraint -> attribute on it
 
		// Dependencies of custom attributes
		AttributeConstructor = 54, // attribute -> its ctor
								   // used for security attributes, where we mark the type/properties directly
		AttributeType = 55, // attribute -> attribute type
		AttributeProperty = 56, // attribute -> attribute property
		CustomAttributeArgumentType = 57, // attribute -> type of an argument to the attribute ctor
		CustomAttributeArgumentValue = 58, // attribute -> type passed as an argument to the attribute ctor
		CustomAttributeField = 59, // attribute -> field on the attribute
 
		// Tracking cctors
		TriggersCctorThroughFieldAccess = 60, // field-accessing method -> cctor of field's declaring type
		TriggersCctorForCalledMethod = 61, // caller method -> callee method type cctor
		DeclaringTypeOfCalledMethod = 62, // called method -> its declaring type (used to track when a cctor is triggered by a method call)
		CctorForType = 63, // type -> cctor of type
		CctorForField = 64, // field -> cctor of field's declaring type
 
		// Tracking instantiations
		InstantiatedByCtor = 65, // ctor -> its declaring type (indicating that it was marked instantiated due to the ctor)
		OverrideOnInstantiatedType = 66, // instantiated type -> override method on the type
 
		// Trimming-specific behavior (preservation hints, patterns, user inputs, trimming outputs, etc.)
		DynamicDependency = 67, // DynamicDependency attribute -> member
		PreservedDependency = 67, // PreserveDependency attribute -> member
		AccessedViaReflection = 68, // method -> detected member accessed via reflection from that method
		PreservedMethod = 69, // type/method -> preserved method (explicitly preserved in Annotations by XML or other steps)
		TypePreserve = 70, // type -> field/method preserved for the type (explicitly set in Annotations by XML or other steps)
		DisablePrivateReflection = 71, // type/method -> DisablePrivateReflection attribute added by trimming
		DynamicallyAccessedMember = 72, // DynamicallyAccessedMember attribute -> member
 
		// Built-in knowledge of special runtime/diagnostic subsystems
		// XmlSchemaProvider, DebuggerDisplay, DebuggerTypeProxy, SoapHeader, TypeDescriptionProvider
		ReferencedBySpecialAttribute = 73, // attribute -> referenced members
		KeptForSpecialAttribute = 74, // attribute -> kept members (used when the members are not explicitly referenced)
		SerializationMethodForType = 75, // type -> method required for serialization
		EventSourceProviderField = 76, // EventSource derived type -> fields on nested Keywords/Tasks/Opcodes provider classes
		MethodForSpecialType = 77, // type -> methods kept (currently used for MulticastDelegate)
 
		// Trimming internals, requirements for certain optimizations
		UnreachableBodyRequirement = 78, // method -> well-known type required for unreachable bodies optimization
		DisablePrivateReflectionRequirement = 79, // null -> DisablePrivateReflectionAttribute type/methods (note that no specific source is reported)
		DynamicInterfaceCastableImplementation = 80, // type -> type is marked with IDynamicInterfaceCastableImplementationAttribute and implements the provided interface
		AlreadyMarked = 82, // null -> member that has already been marked for a particular reason (used to propagate reasons internally, not reported)
 
		DataContractSerialized = 83, // entry type or member for DataContract serialization
		XmlSerialized = 84, // entry type or member for XML serialization
		SerializedRecursiveType = 85, // recursive type kept due to serialization handling
		SerializedMember = 86, // field or property kept on a type for serialization
 
		PreservedOperator = 87, // operator method preserved on a type
 
		DynamicallyAccessedMemberOnType = 88, // type with DynamicallyAccessedMembers annotations (including those inherited from base types and interfaces)
 
		UnsafeAccessorTarget = 89, // the member is referenced via UnsafeAccessor attribute
	}
 
	public readonly struct DependencyInfo : IEquatable<DependencyInfo>
	{
		public DependencyKind Kind { get; }
		public object? Source { get; }
		public DependencyInfo (DependencyKind kind, object? source) => (Kind, Source) = (kind, source);
		public static readonly DependencyInfo Unspecified = new DependencyInfo (DependencyKind.Unspecified, null);
		public static readonly DependencyInfo AlreadyMarked = new DependencyInfo (DependencyKind.AlreadyMarked, null);
		public static readonly DependencyInfo DisablePrivateReflectionRequirement = new DependencyInfo (DependencyKind.DisablePrivateReflectionRequirement, null);
		public bool Equals (DependencyInfo other) => (Kind, Source) == (other.Kind, other.Source);
		public override bool Equals (object? obj) => obj is DependencyInfo info && this.Equals (info);
		public override int GetHashCode () => (Kind, Source).GetHashCode ();
		public static bool operator == (DependencyInfo lhs, DependencyInfo rhs) => lhs.Equals (rhs);
		public static bool operator != (DependencyInfo lhs, DependencyInfo rhs) => !lhs.Equals (rhs);
	}
}