in resharper/resharper-unity/src/Unity/CSharp/Daemon/UsageChecking/UsageInspectionsSuppressor.cs [50:122]
public ImplicitUseFlags SuppressUsageInspectionsOnElement(IDeclaredElement element)
{
if (!element.IsFromUnityProject()) return ImplicitUseFlags.Empty;
var solution = element.GetSolution();
var unityApi = solution.GetComponent<UnityApi>();
switch (element)
{
case IClass cls when unityApi.IsUnityType(cls) ||
cls.IsDotsImplicitlyUsedType() ||
IsUxmlFactory(cls) ||
unityApi.IsOdinType(cls):
return new ImplicitUseFlags(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature);
case IStruct @struct when unityApi.IsUnityType(@struct) ||
@struct.IsDotsImplicitlyUsedType() :
return new ImplicitUseFlags(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature);
case ITypeElement typeElement when unityApi.IsSerializableTypeDeclaration(typeElement).HasFlag(SerializedFieldStatus.SerializedField):
// TODO: We should only really mark it as in use if it's actually used somewhere
// That is, it should be used as a field in a Unity type, or another serializable type
return new ImplicitUseFlags(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature);
case ITypeElement typeElement when IsImplicitlyUsedInterfaceType(typeElement):
return new ImplicitUseFlags(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature);
case IMethod method:
var function = unityApi.GetUnityEventFunction(method, out var match);
if (function != null)
{
if (match == MethodSignatureMatch.ExactMatch)
{
return HasOptionalParameter(function)
? new ImplicitUseFlags(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)
: new ImplicitUseFlags(ImplicitUseKindFlags.Access);
}
return ImplicitUseFlags.Empty;
}
if (IsEventHandler(unityApi, method) ||
IsRequiredSignatureMethod(method) ||
IsAnimationEvent(solution, method) ||
IsImplicitlyUsedInterfaceMethod(method) ||
IsImplicitlyUsedByInputActions(solution, method))
{
return new ImplicitUseFlags(ImplicitUseKindFlags.Access);
}
break;
case IField field when unityApi.IsSerialisedField(field).HasFlag(SerializedFieldStatus.SerializedField):
return new ImplicitUseFlags(ImplicitUseKindFlags.Assign);
case IField field when unityApi.IsOdinInspectorField(field):
return new ImplicitUseFlags(ImplicitUseKindFlags.Assign);
case IProperty property when IsEventHandler(unityApi, property.Setter) ||
IsImplicitlyUsedInterfaceProperty(property) ||
IsAnimationEvent(solution, property) ||
unityApi.IsSerialisedAutoProperty(property, useSwea:true).HasFlag(SerializedFieldStatus.SerializedField):
return new ImplicitUseFlags(ImplicitUseKindFlags.Assign);
case IProperty property when unityApi.IsOdinInspectorProperty(property):
return new ImplicitUseFlags(ImplicitUseKindFlags.Assign);
case IParameter parameter
when parameter.IsRefMember() && parameter.GetContainingType().IsDotsImplicitlyUsedType():
return new ImplicitUseFlags(ImplicitUseKindFlags.Assign);
}
return ImplicitUseFlags.Empty;
}