From bf91b075c7389e3330df04fbce9a6420d9fbd119 Mon Sep 17 00:00:00 2001 From: suzdalnitski Date: Sun, 25 Jun 2017 22:13:02 -0600 Subject: [PATCH 1/9] - Added a search predicate to FromComponentInChildren and to FromComponentInHierarchy. Usage example: Container.Bind().WithId("close").FromComponentInChildren(go => go.name == "close button"); - Added an option to include inactive objects to FromComponentInChildren and FromComponentInHierarchy. - Added Resharper's [MeansImplicitUse] attribute to InjectOptionalAttribute. --- .../Binders/FromBinders/FromBinderGeneric.cs | 63 +++++++++++-------- .../Source/Usage/InjectOptionalAttribute.cs | 2 + 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Binding/Binders/FromBinders/FromBinderGeneric.cs b/UnityProject/Assets/Plugins/Zenject/Source/Binding/Binders/FromBinders/FromBinderGeneric.cs index 4524e9705..516847b5a 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Binding/Binders/FromBinders/FromBinderGeneric.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Binding/Binders/FromBinders/FromBinderGeneric.cs @@ -52,25 +52,35 @@ public ScopeConditionCopyNonLazyBinder FromInstance(TContract instance) #if !NOT_UNITY3D - public ScopeArgConditionCopyNonLazyBinder FromComponentInChildren(bool excludeSelf = false) - { - BindingUtil.AssertIsInterfaceOrComponent(AllParentTypes); + public ScopeArgConditionCopyNonLazyBinder FromComponentInChildren(Func predicate, bool includeInactive = false) + { + return FromComponentInChildren(false, predicate, includeInactive); + } - return FromMethodMultiple((ctx) => - { - Assert.That(ctx.ObjectType.DerivesFromOrEqual()); - Assert.IsNotNull(ctx.ObjectInstance); - var res = ((MonoBehaviour)ctx.ObjectInstance).GetComponentsInChildren() - .Where(x => !ReferenceEquals(x, ctx.ObjectInstance)); + public ScopeArgConditionCopyNonLazyBinder FromComponentInChildren(bool excludeSelf = false, + Func predicate = null, bool includeInactive = false) + { + BindingUtil.AssertIsInterfaceOrComponent(AllParentTypes); - if (excludeSelf) res = res.Where(x => (x as Component).gameObject != (ctx.ObjectInstance as Component).gameObject); + return FromMethodMultiple((ctx) => { + Assert.That(ctx.ObjectType.DerivesFromOrEqual()); + Assert.IsNotNull(ctx.ObjectInstance); - return res; - }); - } + var res = ((MonoBehaviour)ctx.ObjectInstance).GetComponentsInChildren(includeInactive) + .Where(x => !ReferenceEquals(x, ctx.ObjectInstance)); + + if (excludeSelf) + res = res.Where(x => (x as Component).gameObject != (ctx.ObjectInstance as Component).gameObject); + + if (predicate != null) res = res.Where(predicate); - public ScopeArgConditionCopyNonLazyBinder FromComponentInParents(bool excludeSelf = false) + return res; + }); + } + + + public ScopeArgConditionCopyNonLazyBinder FromComponentInParents(bool excludeSelf = false) { BindingUtil.AssertIsInterfaceOrComponent(AllParentTypes); @@ -102,17 +112,20 @@ public ScopeArgConditionCopyNonLazyBinder FromComponentSibling() }); } - public ScopeArgConditionCopyNonLazyBinder FromComponentInHierarchy() - { - BindingUtil.AssertIsInterfaceOrComponent(AllParentTypes); + public ScopeArgConditionCopyNonLazyBinder FromComponentInHierarchy(Func predicate = null, bool includeInactive = false) + { + BindingUtil.AssertIsInterfaceOrComponent(AllParentTypes); - return FromMethodMultiple((ctx) => - { - return ctx.Container.Resolve().GetRootGameObjects() - .SelectMany(x => x.GetComponentsInChildren()) - .Where(x => !ReferenceEquals(x, ctx.ObjectInstance)); - }); - } + return FromMethodMultiple((ctx) => { + var res = ctx.Container.Resolve().GetRootGameObjects() + .SelectMany(x => x.GetComponentsInChildren(includeInactive)) + .Where(x => !ReferenceEquals(x, ctx.ObjectInstance)); + + if (predicate != null) res = res.Where(predicate); + + return res; + }); + } #endif - } + } } diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectOptionalAttribute.cs b/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectOptionalAttribute.cs index 39ef2559f..6f9e6ec71 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectOptionalAttribute.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectOptionalAttribute.cs @@ -1,9 +1,11 @@ using System; +using JetBrains.Annotations; namespace Zenject { [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] + [MeansImplicitUse] public class InjectOptionalAttribute : InjectAttributeBase { public InjectOptionalAttribute() From cb62b8b0b18351b98af56f3425bdf5b766a84517 Mon Sep 17 00:00:00 2001 From: suzdalnitski Date: Sun, 25 Jun 2017 22:32:41 -0600 Subject: [PATCH 2/9] - Added support for injecting C# 6.0 get-only (readonly properties). C# 6.0 introduced a very useful feature - get-only properties, which is a great addition to dependency injection toolbox. C# 6.0 support is currently available in Unity unofficially, and official support is coming soon. Usage example: [Inject] private UIButton Button { get; } --- .../Zenject/Source/Util/TypeAnalyzer.cs | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Util/TypeAnalyzer.cs b/UnityProject/Assets/Plugins/Zenject/Source/Util/TypeAnalyzer.cs index 5defc6d85..589fbffc1 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Util/TypeAnalyzer.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Util/TypeAnalyzer.cs @@ -1,12 +1,13 @@ +using JetBrains.Annotations; +using ModestTree; using System; using System.Collections.Generic; -using System.Reflection; using System.Linq; -using ModestTree; +using System.Reflection; namespace Zenject { - public static class TypeAnalyzer + public static class TypeAnalyzer { static Dictionary _typeInfo = new Dictionary(); @@ -156,6 +157,33 @@ static IEnumerable GetFieldInjectables(Type type) } } + private static IEnumerable GetAllFields(Type t, BindingFlags flags) + { + if (t == null) + return Enumerable.Empty(); + + return t.GetFields(flags).Concat(GetAllFields(t.BaseType, flags)).Distinct(); + } + + [NotNull] + private static Action GetOnlyPropertySetter( [NotNull] Type parentType, + [NotNull] string propertyName) { + if (parentType == null) throw new ArgumentNullException(nameof(parentType)); + if (string.IsNullOrEmpty(propertyName)) throw new ArgumentException("Value cannot be null or empty.", nameof(propertyName)); + + var allFields = GetAllFields(parentType, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); + + var writeableField = allFields.SingleOrDefault(f => f.Name == string.Format("<{0}>k__BackingField", propertyName)); + + if (writeableField == null) { + throw new ZenjectException(string.Format( + "Can't find backing field for get only property {0} on {1}.\r\n{2}", + propertyName, parentType.FullName,string.Join(";", allFields.Select(f => f.Name).ToArray()))); + } + + return ( injectable, value ) => writeableField.SetValue(injectable, value); + } + static InjectableInfo CreateForMember(MemberInfo memInfo, Type parentType) { var injectAttributes = memInfo.AllAttributes().ToList(); @@ -189,8 +217,12 @@ static InjectableInfo CreateForMember(MemberInfo memInfo, Type parentType) { Assert.That(memInfo is PropertyInfo); var propInfo = (PropertyInfo)memInfo; - setter = ((object injectable, object value) => propInfo.SetValue(injectable, value, null)); - memberType = propInfo.PropertyType; + memberType = propInfo.PropertyType; + + if (propInfo.CanWrite) + setter = (( object injectable, object value ) => propInfo.SetValue(injectable, value, null)); + else + setter = GetOnlyPropertySetter(parentType, propInfo.Name); } return new InjectableInfo( From 0fabd5b7babde08bdbc4744fb3a4061ee9b53543 Mon Sep 17 00:00:00 2001 From: suzdalnitski Date: Thu, 13 Jul 2017 20:17:44 -0600 Subject: [PATCH 3/9] Added support for injecting static classes/static members. --- .../Source/Install/Contexts/Context.cs | 27 ++++++++-- .../Zenject/Source/Internal/TypeExtensions.cs | 51 ++++++++++++------- .../Zenject/Source/Main/DiContainer.cs | 30 ++++++----- .../Providers/UntypedFactoryProvider.cs | 2 +- .../Zenject/Source/Util/TypeAnalyzer.cs | 17 ++++--- 5 files changed, 82 insertions(+), 45 deletions(-) diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Install/Contexts/Context.cs b/UnityProject/Assets/Plugins/Zenject/Source/Install/Contexts/Context.cs index e56d21c31..987e02a06 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Install/Contexts/Context.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Install/Contexts/Context.cs @@ -166,7 +166,7 @@ protected void InstallInstallers( protected void InstallSceneBindings() { - foreach (var binding in GetInjectableMonoBehaviours().OfType()) + foreach (var binding in GetInjectableMonoBehaviours().OfType()) { if (binding == null) { @@ -193,9 +193,28 @@ protected void InstallSceneBindings() InstallZenjectBinding(binding); } } - } - - void InstallZenjectBinding(ZenjectBinding binding) + } + + [Inject] + private void InjectStaticClasses() { + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies() + .Where(a => a.FullName.Contains("Assembly-CSharp")); + + var allStaticTypes = allAssemblies.SelectMany(a => a.GetTypes()).Where(t => t.IsStatic()); + + foreach (var type in allStaticTypes) { + Container.InjectExplicit(null, + type, + new InjectArgs + { + Context = new InjectContext(Container, type, null), + ConcreteIdentifier = null, + ExtraArgs = InjectUtil.CreateArgList( new object[0] ) + }); + } + } + + void InstallZenjectBinding(ZenjectBinding binding) { if (!binding.enabled) { diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Internal/TypeExtensions.cs b/UnityProject/Assets/Plugins/Zenject/Source/Internal/TypeExtensions.cs index 476f303e1..ba6238bbf 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Internal/TypeExtensions.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Internal/TypeExtensions.cs @@ -50,18 +50,18 @@ public static bool IsValueType(this Type type) #endif } - public static MethodInfo[] DeclaredInstanceMethods(this Type type) + public static MethodInfo[] DeclaredMethods(this Type type) { #if UNITY_WSA && ENABLE_DOTNET && !UNITY_EDITOR return type.GetRuntimeMethods() .Where(x => x.DeclaringType == type).ToArray(); #else return type.GetMethods( - BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); + BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly); #endif } - public static PropertyInfo[] DeclaredInstanceProperties(this Type type) + public static PropertyInfo[] DeclaredProperties(this Type type) { #if UNITY_WSA && ENABLE_DOTNET && !UNITY_EDITOR // There doesn't appear to be an IsStatic member on PropertyInfo @@ -69,18 +69,18 @@ public static PropertyInfo[] DeclaredInstanceProperties(this Type type) .Where(x => x.DeclaringType == type).ToArray(); #else return type.GetProperties( - BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); + BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly); #endif } - public static FieldInfo[] DeclaredInstanceFields(this Type type) + public static FieldInfo[] DeclaredFields(this Type type) { #if UNITY_WSA && ENABLE_DOTNET && !UNITY_EDITOR return type.GetRuntimeFields() .Where(x => x.DeclaringType == type && !x.IsStatic).ToArray(); #else return type.GetFields( - BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); + BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly); #endif } @@ -143,6 +143,19 @@ public static bool IsAbstract(this Type type) return type.IsAbstract; #endif } + + public static bool IsSealed(this Type type) + { +#if UNITY_WSA && ENABLE_DOTNET && !UNITY_EDITOR + return type.GetTypeInfo().IsSealed; +#else + return type.IsSealed; +#endif + } + + public static bool IsStatic(this Type type) { + return type.IsAbstract() && type.IsSealed(); + } public static MethodInfo Method(this Delegate del) { @@ -238,51 +251,51 @@ public static bool IsOpenGenericType(this Type type) return type.IsGenericType() && type == type.GetGenericTypeDefinition(); } - // Returns all instance fields, including private and public and also those in base classes - public static IEnumerable GetAllInstanceFields(this Type type) + // Returns all instance and static properties fields, including private and public and also those in base classes + public static IEnumerable GetAllFields(this Type type) { - foreach (var fieldInfo in type.DeclaredInstanceFields()) + foreach (var fieldInfo in type.DeclaredFields()) { yield return fieldInfo; } if (type.BaseType() != null && type.BaseType() != typeof(object)) { - foreach (var fieldInfo in type.BaseType().GetAllInstanceFields()) + foreach (var fieldInfo in type.BaseType().GetAllFields()) { yield return fieldInfo; } } } - // Returns all instance properties, including private and public and also those in base classes - public static IEnumerable GetAllInstanceProperties(this Type type) + // Returns all instance and static properties, including private and public and also those in base classes + public static IEnumerable GetAllProperties(this Type type) { - foreach (var propInfo in type.DeclaredInstanceProperties()) + foreach (var propInfo in type.DeclaredProperties()) { yield return propInfo; } - if (type.BaseType() != null && type.BaseType() != typeof(object)) + if (type.BaseType() != null && type.BaseType() != typeof(object)) { - foreach (var propInfo in type.BaseType().GetAllInstanceProperties()) + foreach (var propInfo in type.BaseType().GetAllProperties()) { yield return propInfo; } } } - // Returns all instance methods, including private and public and also those in base classes - public static IEnumerable GetAllInstanceMethods(this Type type) + // Returns all instance and static properties methods, including private and public and also those in base classes + public static IEnumerable GetAllMethods(this Type type) { - foreach (var methodInfo in type.DeclaredInstanceMethods()) + foreach (var methodInfo in type.DeclaredMethods()) { yield return methodInfo; } if (type.BaseType() != null && type.BaseType() != typeof(object)) { - foreach (var methodInfo in type.BaseType().GetAllInstanceMethods()) + foreach (var methodInfo in type.BaseType().GetAllMethods()) { yield return methodInfo; } diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Main/DiContainer.cs b/UnityProject/Assets/Plugins/Zenject/Source/Main/DiContainer.cs index d6a0d7966..0a75d7d91 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Main/DiContainer.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Main/DiContainer.cs @@ -872,14 +872,19 @@ public void InjectExplicit(object injectable, List extraArgs) { Type injectableType; - if (injectable is ValidationMarker) + if (injectable is ValidationMarker) { injectableType = ((ValidationMarker)injectable).MarkedType; } - else - { - injectableType = injectable.GetType(); - } + else { + var injectableAsType = injectable as Type; + if (injectableAsType != null) { + injectableType = injectableAsType; + injectable = null; + } else { + injectableType = injectable.GetType(); + } + } InjectExplicit( injectable, @@ -895,12 +900,10 @@ public void InjectExplicit(object injectable, List extraArgs) public void InjectExplicit( object injectable, Type injectableType, InjectArgs args) { - Assert.That(injectable != null); - // Installers are the only things that we instantiate/inject on during validation bool isDryRun = IsValidating && !CanCreateOrInjectDuringValidation(injectableType); - if (!isDryRun) + if (injectable != null && !isDryRun) { Assert.IsEqual(injectable.GetType(), injectableType); } @@ -930,6 +933,8 @@ public void InjectExplicit( } else { + if (injectable == null) + Debug.Log($"DiContainer.InjectExplicit(): injectableType='{injectableType}', injectInfo='{injectInfo.MemberName}'"); injectInfo.Setter(injectable, value); } } @@ -1563,13 +1568,12 @@ public Component InjectGameObjectForComponentExplicit( // Any fields marked [Inject] will be set using the bindings on the container // Any methods marked with a [Inject] will be called // Any constructor parameters will be filled in with values from the container - public void Inject(object injectable) - { - Inject(injectable, new object[0]); + public void Inject(object injectable) { + Inject(injectable, new object[0]); } - // Same as Inject(injectable) except allows adding extra values to be injected - public void Inject(object injectable, IEnumerable extraArgs) + // Same as Inject(injectable) except allows adding extra values to be injected + public void Inject(object injectable, IEnumerable extraArgs) { InjectExplicit( injectable, InjectUtil.CreateArgList(extraArgs)); diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Providers/UntypedFactoryProvider.cs b/UnityProject/Assets/Plugins/Zenject/Source/Providers/UntypedFactoryProvider.cs index d30f97688..81e5357f8 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Providers/UntypedFactoryProvider.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Providers/UntypedFactoryProvider.cs @@ -25,7 +25,7 @@ public UntypedFactoryProvider( _factoryArgs = factoryArgs; _createMethod = factoryType - .DeclaredInstanceMethods().Where(x => x.Name == "Create").Single(); + .DeclaredMethods().Where(x => x.Name == "Create").Single(); Assert.That(_createMethod.ReturnType == _concreteType); } diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Util/TypeAnalyzer.cs b/UnityProject/Assets/Plugins/Zenject/Source/Util/TypeAnalyzer.cs index 589fbffc1..c83776e25 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Util/TypeAnalyzer.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Util/TypeAnalyzer.cs @@ -22,7 +22,7 @@ public static ZenjectTypeInfo GetInfo(Type type) using (ProfileBlock.Start("Zenject Reflection")) #endif { - Assert.That(!type.IsAbstract(), + Assert.That(type.IsStatic() || !type.IsAbstract(), "Tried to analyze abstract type '{0}'. This is not currently allowed.", type); ZenjectTypeInfo info; @@ -106,7 +106,7 @@ static List GetPostInjectMethods(Type type) // This is so that we can ignore inherited attributes, which is necessary // otherwise a base class method marked with [Inject] would cause all overridden // derived methods to be added as well - var methods = type.GetAllInstanceMethods() + var methods = type.GetAllMethods() .Where(x => x.GetCustomAttributes(typeof(InjectAttribute), false).Any()).ToList(); var heirarchyList = type.Yield().Concat(type.GetParentTypes()).Reverse().ToList(); @@ -137,7 +137,7 @@ static List GetPostInjectMethods(Type type) static IEnumerable GetPropertyInjectables(Type type) { - var propInfos = type.GetAllInstanceProperties() + var propInfos = type.GetAllProperties() .Where(x => x.HasAttribute(typeof(InjectAttributeBase))); foreach (var propInfo in propInfos) @@ -148,7 +148,7 @@ static IEnumerable GetPropertyInjectables(Type type) static IEnumerable GetFieldInjectables(Type type) { - var fieldInfos = type.GetAllInstanceFields() + var fieldInfos = type.GetAllFields() .Where(x => x.HasAttribute(typeof(InjectAttributeBase))); foreach (var fieldInfo in fieldInfos) @@ -171,17 +171,18 @@ private static Action GetOnlyPropertySetter( [NotNull] Type pare if (parentType == null) throw new ArgumentNullException(nameof(parentType)); if (string.IsNullOrEmpty(propertyName)) throw new ArgumentException("Value cannot be null or empty.", nameof(propertyName)); - var allFields = GetAllFields(parentType, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); + var allFields = GetAllFields(parentType, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public + | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); - var writeableField = allFields.SingleOrDefault(f => f.Name == string.Format("<{0}>k__BackingField", propertyName)); + var writeableFields = allFields.Where(f => f.Name == string.Format("<{0}>k__BackingField", propertyName)).ToList(); - if (writeableField == null) { + if (!writeableFields.Any()) { throw new ZenjectException(string.Format( "Can't find backing field for get only property {0} on {1}.\r\n{2}", propertyName, parentType.FullName,string.Join(";", allFields.Select(f => f.Name).ToArray()))); } - return ( injectable, value ) => writeableField.SetValue(injectable, value); + return ( injectable, value ) => writeableFields.ForEach( f => f.SetValue(injectable, value) ); } static InjectableInfo CreateForMember(MemberInfo memInfo, Type parentType) From af6a9c7c8eb473dc409f3d373954947bdfc33803 Mon Sep 17 00:00:00 2001 From: suzdalnitski Date: Fri, 14 Jul 2017 13:34:29 -0600 Subject: [PATCH 4/9] Reverted Context (automatic injection of static classes), this would be a bad practice. --- .../Source/Install/Contexts/Context.cs | 27 +++---------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Install/Contexts/Context.cs b/UnityProject/Assets/Plugins/Zenject/Source/Install/Contexts/Context.cs index 987e02a06..e56d21c31 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Install/Contexts/Context.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Install/Contexts/Context.cs @@ -166,7 +166,7 @@ protected void InstallInstallers( protected void InstallSceneBindings() { - foreach (var binding in GetInjectableMonoBehaviours().OfType()) + foreach (var binding in GetInjectableMonoBehaviours().OfType()) { if (binding == null) { @@ -193,28 +193,9 @@ protected void InstallSceneBindings() InstallZenjectBinding(binding); } } - } - - [Inject] - private void InjectStaticClasses() { - var allAssemblies = AppDomain.CurrentDomain.GetAssemblies() - .Where(a => a.FullName.Contains("Assembly-CSharp")); - - var allStaticTypes = allAssemblies.SelectMany(a => a.GetTypes()).Where(t => t.IsStatic()); - - foreach (var type in allStaticTypes) { - Container.InjectExplicit(null, - type, - new InjectArgs - { - Context = new InjectContext(Container, type, null), - ConcreteIdentifier = null, - ExtraArgs = InjectUtil.CreateArgList( new object[0] ) - }); - } - } - - void InstallZenjectBinding(ZenjectBinding binding) + } + + void InstallZenjectBinding(ZenjectBinding binding) { if (!binding.enabled) { From e5cb6ed53ca758d9e6a08f40f8cf325e19d9a48d Mon Sep 17 00:00:00 2001 From: suzdalnitski Date: Fri, 14 Jul 2017 13:36:32 -0600 Subject: [PATCH 5/9] Moved GetMonoBehaviourContext from FromBinderGeneric to InjectContext. This will allow to easily access the current MonoBehaviour context. Example: Bind().FromMethod(ctx => ctx.ToMonoBehaviourContext().gameObject); --- .../Binders/FromBinders/FromBinderGeneric.cs | 23 +++---------------- .../Zenject/Source/Injection/InjectContext.cs | 21 ++++++++++++++++- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Binding/Binders/FromBinders/FromBinderGeneric.cs b/UnityProject/Assets/Plugins/Zenject/Source/Binding/Binders/FromBinders/FromBinderGeneric.cs index f1035f8b2..8d1ccd37e 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Binding/Binders/FromBinders/FromBinderGeneric.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Binding/Binders/FromBinders/FromBinderGeneric.cs @@ -57,23 +57,6 @@ public ScopeArgConditionCopyNonLazyBinder FromComponentInChildren(Func()) { - return (MonoBehaviour) ancestorContext.ObjectInstance; - } - } - } - - return null; - } - public ScopeArgConditionCopyNonLazyBinder FromComponentInChildren( bool excludeSelf = false, Func predicate = null, bool includeInactive = false ) @@ -81,7 +64,7 @@ public ScopeArgConditionCopyNonLazyBinder FromComponentInChildren( bool excludeS BindingUtil.AssertIsInterfaceOrComponent(AllParentTypes); return FromMethodMultiple((ctx) => { - var monoBehaviourContext = GetMonoBehaviourContext(ctx); + var monoBehaviourContext = ctx.ToMonoBehaviourContext(); Assert.IsNotNull(monoBehaviourContext); var res = monoBehaviourContext.GetComponentsInChildren(includeInactive) @@ -106,7 +89,7 @@ public ScopeArgConditionCopyNonLazyBinder FromComponentInParents(bool excludeSel return FromMethodMultiple((ctx) => { - var monoBehaviourContext = GetMonoBehaviourContext(ctx); + var monoBehaviourContext = ctx.ToMonoBehaviourContext(); Assert.IsNotNull(monoBehaviourContext); var res = monoBehaviourContext.GetComponentsInParent() @@ -126,7 +109,7 @@ public ScopeArgConditionCopyNonLazyBinder FromComponentSibling() { return FromMethodMultiple((ctx) => { - var monoBehaviourContext = GetMonoBehaviourContext(ctx); + var monoBehaviourContext = ctx.ToMonoBehaviourContext(); Assert.IsNotNull(monoBehaviourContext); if (typeof(TContract) == typeof(GameObject)) diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Injection/InjectContext.cs b/UnityProject/Assets/Plugins/Zenject/Source/Injection/InjectContext.cs index d3750492c..f1cd42610 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Injection/InjectContext.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Injection/InjectContext.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using ModestTree; +using UnityEngine; namespace Zenject { @@ -247,5 +248,23 @@ public string GetObjectGraphString() return result.ToString(); } - } + + public MonoBehaviour ToMonoBehaviourContext() + { + var monoBehaviourContext = this.ObjectInstance as MonoBehaviour; + + if (monoBehaviourContext != null) return monoBehaviourContext; + + //If the context is not MonoBehaviour look in the parent context + if (monoBehaviourContext == null && this.Container.InheritMonoBehaviourBindings) { + foreach (var ancestorContext in this.ParentContextsAndSelf) { + if (ancestorContext.ObjectInstance != null && ancestorContext.ObjectType.DerivesFromOrEqual()) { + return (MonoBehaviour)ancestorContext.ObjectInstance; + } + } + } + + return null; + } + } } From 8b6d2b216b7c0fc7bc1dd1b005c86704ac399d8f Mon Sep 17 00:00:00 2001 From: suzdalnitski Date: Fri, 14 Jul 2017 20:22:29 -0600 Subject: [PATCH 6/9] + Fixed unit tests to pass when injecting static members. + Fixed InjectContext to work with non-Unity project + Added JetBrains.Annotations to the main project so we can mark the [Inject] attribute with [MeansImplicitUse]. This is useful in non-Unity projects. --- .../.vs/Supercharger/Zenject/workbench.dat | 1 + .../JetBrains.Annotations.10.2.1.nupkg | Bin 0 -> 90325 bytes .../lib/net/JetBrains.Annotations.dll | Bin 0 -> 61952 bytes .../lib/net/JetBrains.Annotations.xml | 594 ++++++++++++++++++ .../JetBrains.Annotations.NetStandard.dll | Bin 0 -> 61952 bytes .../JetBrains.Annotations.NetStandard.xml | 594 ++++++++++++++++++ .../JetBrains.Annotations.PCL1.dll | Bin 0 -> 61952 bytes .../JetBrains.Annotations.PCL1.xml | 594 ++++++++++++++++++ .../JetBrains.Annotations.PCL328.dll | Bin 0 -> 61952 bytes .../JetBrains.Annotations.PCL328.xml | 594 ++++++++++++++++++ .../Editor/Injection/TestAllInjectionTypes.cs | 36 +- .../Zenject/Source/Injection/InjectContext.cs | 5 + .../Zenject/Source/Main/DiContainer.cs | 2 - .../Zenject/Source/Usage/InjectAttribute.cs | 5 +- .../Source/Usage/InjectOptionalAttribute.cs | 1 + .../Plugins/Zenject/Source/Zenject.csproj | 6 + .../Plugins/Zenject/Source/packages.config | 4 + 17 files changed, 2412 insertions(+), 24 deletions(-) create mode 100644 NonUnityBuild/.vs/Supercharger/Zenject/workbench.dat create mode 100644 NonUnityBuild/packages/JetBrains.Annotations.10.2.1/JetBrains.Annotations.10.2.1.nupkg create mode 100644 NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/net/JetBrains.Annotations.dll create mode 100644 NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/net/JetBrains.Annotations.xml create mode 100644 NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/netstandard1.0/JetBrains.Annotations.NetStandard.dll create mode 100644 NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/netstandard1.0/JetBrains.Annotations.NetStandard.xml create mode 100644 NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/portable-net4+sl4+wp7+netcore45/JetBrains.Annotations.PCL1.dll create mode 100644 NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/portable-net4+sl4+wp7+netcore45/JetBrains.Annotations.PCL1.xml create mode 100644 NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/portable-net4+sl5+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1/JetBrains.Annotations.PCL328.dll create mode 100644 NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/portable-net4+sl5+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1/JetBrains.Annotations.PCL328.xml create mode 100644 UnityProject/Assets/Plugins/Zenject/Source/packages.config diff --git a/NonUnityBuild/.vs/Supercharger/Zenject/workbench.dat b/NonUnityBuild/.vs/Supercharger/Zenject/workbench.dat new file mode 100644 index 000000000..a719ca885 --- /dev/null +++ b/NonUnityBuild/.vs/Supercharger/Zenject/workbench.dat @@ -0,0 +1 @@ +Zenject \ No newline at end of file diff --git a/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/JetBrains.Annotations.10.2.1.nupkg b/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/JetBrains.Annotations.10.2.1.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..964f9bd9d3a3c18168658b9b53fd3d6144c8f1a4 GIT binary patch literal 90325 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 a^Ox&OI#h>9RnQSXJ(K{z!ZqUX1Na{T9MQi3 literal 0 HcmV?d00001 diff --git a/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/net/JetBrains.Annotations.dll b/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/net/JetBrains.Annotations.dll new file mode 100644 index 0000000000000000000000000000000000000000..16407abc92b681dd89c0957084b96a93e16cb6c6 GIT binary patch literal 61952 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 v$0LT3F8~+gpr#D4AVJAArtZji^O

{O9K{B$iOYH=m! + + + JetBrains.Annotations + + + +

+ Indicates that the value of the marked element could be null sometimes, + so the check for null is necessary before its usage. + + + [CanBeNull] object Test() => null; + + void UseTest() { + var p = Test(); + var s = p.ToString(); // Warning: Possible 'System.NullReferenceException' + } + + + + + Indicates that the value of the marked element could never be null. + + + [NotNull] object Foo() { + return null; // Warning: Possible 'null' assignment + } + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can never be null. + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can be null. + + + + + Indicates that the marked method builds string by format pattern and (optional) arguments. + Parameter, which contains format string, should be given in constructor. The format string + should be in -like form. + + + [StringFormatMethod("message")] + void ShowError(string message, params object[] args) { /* do something */ } + + void Foo() { + ShowError("Failed: {0}"); // Warning: Non-existing argument in format string + } + + + + + Specifies which parameter of an annotated method should be treated as format-string + + + + + For a parameter that is expected to be one of the limited set of values. + Specify fields of which type should be used as values for this parameter. + + + + + Indicates that the function argument should be string literal and match one + of the parameters of the caller function. For example, ReSharper annotates + the parameter of . + + + void Foo(string param) { + if (param == null) + throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol + } + + + + + Indicates that the method is contained in a type that implements + System.ComponentModel.INotifyPropertyChanged interface and this method + is used to notify that some property value changed. + + + The method should be non-static and conform to one of the supported signatures: + + NotifyChanged(string) + NotifyChanged(params string[]) + NotifyChanged{T}(Expression{Func{T}}) + NotifyChanged{T,U}(Expression{Func{T,U}}) + SetProperty{T}(ref T, T, string) + + + + public class Foo : INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + + [NotifyPropertyChangedInvocator] + protected virtual void NotifyChanged(string propertyName) { ... } + + string _name; + + public string Name { + get { return _name; } + set { _name = value; NotifyChanged("LastName"); /* Warning */ } + } + } + + Examples of generated notifications: + + NotifyChanged("Property") + NotifyChanged(() => Property) + NotifyChanged((VM x) => x.Property) + SetProperty(ref myField, value, "Property") + + + + + + Describes dependency between method input and output. + + +

Function Definition Table syntax:

+ + FDT ::= FDTRow [;FDTRow]* + FDTRow ::= Input => Output | Output <= Input + Input ::= ParameterName: Value [, Input]* + Output ::= [ParameterName: Value]* {halt|stop|void|nothing|Value} + Value ::= true | false | null | notnull | canbenull + + If method has single input parameter, it's name could be omitted.
+ Using halt (or void/nothing, which is the same) for method output + means that the methos doesn't return normally (throws or terminates the process).
+ Value canbenull is only applicable for output parameters.
+ You can use multiple [ContractAnnotation] for each FDT row, or use single attribute + with rows separated by semicolon. There is no notion of order rows, all rows are checked + for applicability and applied per each program state tracked by R# analysis.
+
+ + + [ContractAnnotation("=> halt")] + public void TerminationMethod() + + + [ContractAnnotation("halt <= condition: false")] + public void Assert(bool condition, string text) // regular assertion method + + + [ContractAnnotation("s:null => true")] + public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty() + + + // A method that returns null if the parameter is null, + // and not null if the parameter is not null + [ContractAnnotation("null => null; notnull => notnull")] + public object Transform(object data) + + + [ContractAnnotation("=> true, result: notnull; => false, result: null")] + public bool TryParse(string s, out Person result) + + +
+ + + Indicates that marked element should be localized or not. + + + [LocalizationRequiredAttribute(true)] + class Foo { + string str = "my string"; // Warning: Localizable string + } + + + + + Indicates that the value of the marked type (or its derivatives) + cannot be compared using '==' or '!=' operators and Equals() + should be used instead. However, using '==' or '!=' for comparison + with null is always permitted. + + + [CannotApplyEqualityOperator] + class NoEquality { } + + class UsesNoEquality { + void Test() { + var ca1 = new NoEquality(); + var ca2 = new NoEquality(); + if (ca1 != null) { // OK + bool condition = ca1 == ca2; // Warning + } + } + } + + + + + When applied to a target attribute, specifies a requirement for any type marked + with the target attribute to implement or inherit specific type or types. + + + [BaseTypeRequired(typeof(IComponent)] // Specify requirement + class ComponentAttribute : Attribute { } + + [Component] // ComponentAttribute requires implementing IComponent interface + class MyComponent : IComponent { } + + + + + Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library), + so this symbol will not be marked as unused (as well as by other usage inspections). + + + + + Should be used on attributes and causes ReSharper to not mark symbols marked with such attributes + as unused (as well as by other usage inspections) + + + + Only entity marked with attribute considered used. + + + Indicates implicit assignment to a member. + + + + Indicates implicit instantiation of a type with fixed constructor signature. + That means any unused constructor parameters won't be reported as such. + + + + Indicates implicit instantiation of a type. + + + + Specify what is considered used implicitly when marked + with or . + + + + Members of entity marked with attribute are considered used. + + + Entity marked with attribute and all its members considered used. + + + + This attribute is intended to mark publicly available API + which should not be removed and so is treated as used. + + + + + Tells code analysis engine if the parameter is completely handled when the invoked method is on stack. + If the parameter is a delegate, indicates that delegate is executed while the method is executed. + If the parameter is an enumerable, indicates that it is enumerated while the method is executed. + + + + + Indicates that a method does not make any observable state changes. + The same as System.Diagnostics.Contracts.PureAttribute. + + + [Pure] int Multiply(int x, int y) => x * y; + + void M() { + Multiply(123, 42); // Waring: Return value of pure method is not used + } + + + + + Indicates that the return value of method invocation must be used. + + + + + Indicates the type member or parameter of some type, that should be used instead of all other ways + to get the value that type. This annotation is useful when you have some "context" value evaluated + and stored somewhere, meaning that all other ways to get this value must be consolidated with existing one. + + + class Foo { + [ProvidesContext] IBarService _barService = ...; + + void ProcessNode(INode node) { + DoSomething(node, node.GetGlobalServices().Bar); + // ^ Warning: use value of '_barService' field + } + } + + + + + Indicates that a parameter is a path to a file or a folder within a web project. + Path can be relative or absolute, starting from web root (~). + + + + + An extension method marked with this attribute is processed by ReSharper code completion + as a 'Source Template'. When extension method is completed over some expression, it's source code + is automatically expanded like a template at call site. + + + Template method body can contain valid source code and/or special comments starting with '$'. + Text inside these comments is added as source code when the template is applied. Template parameters + can be used either as additional method parameters or as identifiers wrapped in two '$' signs. + Use the attribute to specify macros for parameters. + + + In this example, the 'forEach' method is a source template available over all values + of enumerable types, producing ordinary C# 'foreach' statement and placing caret inside block: + + [SourceTemplate] + public static void forEach<T>(this IEnumerable<T> xs) { + foreach (var x in xs) { + //$ $END$ + } + } + + + + + + Allows specifying a macro for a parameter of a source template. + + + You can apply the attribute on the whole method or on any of its additional parameters. The macro expression + is defined in the property. When applied on a method, the target + template parameter is defined in the property. To apply the macro silently + for the parameter, set the property value = -1. + + + Applying the attribute on a source template method: + + [SourceTemplate, Macro(Target = "item", Expression = "suggestVariableName()")] + public static void forEach<T>(this IEnumerable<T> collection) { + foreach (var item in collection) { + //$ $END$ + } + } + + Applying the attribute on a template method parameter: + + [SourceTemplate] + public static void something(this Entity x, [Macro(Expression = "guid()", Editable = -1)] string newguid) { + /*$ var $x$Id = "$newguid$" + x.ToString(); + x.DoSomething($x$Id); */ + } + + + + + + Allows specifying a macro that will be executed for a source template + parameter when the template is expanded. + + + + + Allows specifying which occurrence of the target parameter becomes editable when the template is deployed. + + + If the target parameter is used several times in the template, only one occurrence becomes editable; + other occurrences are changed synchronously. To specify the zero-based index of the editable occurrence, + use values >= 0. To make the parameter non-editable when the template is expanded, use -1. + > + + + + Identifies the target parameter of a source template if the + is applied on a template method. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC action. If applied to a method, the MVC action name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC area. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is + an MVC controller. If applied to a method, the MVC controller name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC Master. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC model type. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is an MVC + partial view. If applied to a method, the MVC partial view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method. + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC display template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.DisplayExtensions.DisplayForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC editor template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.EditorExtensions.EditorForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC template. + Use this attribute for custom wrappers similar to + System.ComponentModel.DataAnnotations.UIHintAttribute(System.String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component. If applied to a method, the MVC view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Controller.View(Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component name. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component view. If applied to a method, the MVC view component view name is default. + + + + + ASP.NET MVC attribute. When applied to a parameter of an attribute, + indicates that this parameter is an MVC action name. + + + [ActionName("Foo")] + public ActionResult Login(string returnUrl) { + ViewBag.ReturnUrl = Url.Action("Foo"); // OK + return RedirectToAction("Bar"); // Error: Cannot resolve action + } + + + + + Razor attribute. Indicates that a parameter or a method is a Razor section. + Use this attribute for custom wrappers similar to + System.Web.WebPages.WebPageBase.RenderSection(String). + + + + + Indicates how method, constructor invocation or property access + over collection type affects content of the collection. + + + + Method does not use or modify content of the collection. + + + Method only reads content of the collection but does not modify it. + + + Method can change content of the collection but does not add new elements. + + + Method can add new elements to the collection. + + + + Indicates that the marked method is assertion method, i.e. it halts control flow if + one of the conditions is satisfied. To set the condition, mark one of the parameters with + attribute. + + + + + Indicates the condition parameter of the assertion method. The method itself should be + marked by attribute. The mandatory argument of + the attribute is the assertion type. + + + + + Specifies assertion type. If the assertion method argument satisfies the condition, + then the execution continues. Otherwise, execution is assumed to be halted. + + + + Marked parameter should be evaluated to true. + + + Marked parameter should be evaluated to false. + + + Marked parameter should be evaluated to null value. + + + Marked parameter should be evaluated to not null value. + + + + Indicates that the marked method unconditionally terminates control flow execution. + For example, it could unconditionally throw exception. + + + + + Indicates that method is pure LINQ method, with postponed enumeration (like Enumerable.Select, + .Where). This annotation allows inference of [InstantHandle] annotation for parameters + of delegate type by analyzing LINQ method chains. + + + + + Indicates that IEnumerable, passed as parameter, is not enumerated. + + + + + Indicates that parameter is regular expression pattern. + + + + + Prevents the Member Reordering feature from tossing members of the marked class. + + + The attribute must be mentioned in your member reordering patterns + + + + + XAML attribute. Indicates the type that has ItemsSource property and should be treated + as ItemsControl-derived type, to enable inner items DataContext type resolve. + + + + + XAML attribute. Indicates the property of some BindingBase-derived type, that + is used to bind some item of ItemsControl-derived type. This annotation will + enable the DataContext type resolve for XAML bindings for such properties. + + + Property should have the tree ancestor of the ItemsControl type or + marked with the attribute. + + + + diff --git a/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/netstandard1.0/JetBrains.Annotations.NetStandard.dll b/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/netstandard1.0/JetBrains.Annotations.NetStandard.dll new file mode 100644 index 0000000000000000000000000000000000000000..ada8c7e4aa8344722b499c63b2761b73bb8f10e2 GIT binary patch literal 61952 zcmeHw3wT^tb?%;#EX#KMguGwJl4Fk?d1S>-ocI-wB{`l%FQl=Z;27s<=13kqno(v( zwiG)-j>{tj0xjiL3OG2oG;MkzExmz!a6bprHqdYzzCv5Lv~}vhZJ-|nxGfhN;Qnjv z$2n)_%t*4w0oo|>p1s$8uf6tKYp?w{J+FVas1rieJ=uxvL0sQvtR58?s; z)*C|T*S0rPQu^QhRY93r{0_?PBR|UhCLyBqZ(B%Q1lZk;A#qh{T(z(zM58CZ5#gPl zaJ1-56cPT{7vUg|`-*mZ|12TyiRKIWB!JvDw2?dduijKVR@W%U@ zTo;*(F_PK@atUA$m)c@VRX&u;KDX5CWvOdaslcWzggq#Afd;V0 z?Mu7L02Ig!>~Z5asQAltJbT>u%_<%^llj?$3a`)r_5g6D2CxSJ%p;kFJ#LY=sUm@9 z8P6U!{&p3AjgDuJ8{ebiuhsGFapU_{yrtvW- zpk;pcxbbgL@hfyZd))XT6%PuL`Pt*f->c$R>Uj3J@!%&+S*vtBd))X56(7;@>~Z6d zs`#jmXOBy2Z$Uf=_-!iLdYz0t7}py$fIV)x5339}>3H@a187Wkls#^ScT)y8_&X~9 z%{n=I+;+Vm@o3ivRkB-jGWMXFjT*onx7^=T88+#7_6V_k@b>K?0XBs{;-`n!N7qKz ztzFlS0tI+v2JYja-R1{`xC}J9b{YJG#e6zDQlJz&+fX2Wn|BS0Zur3vMe}XD;+^=t z8{tkwHgC`5Fy8zZ79zCg>JuSm#Xk+L6PEyhnAhSTXkMUM;t~Ao#Xl+wY)^C{0mxf` z1VlIfQF{Fk(r*#@(LM3g1z%d+ATD1-?((@$E?z8lpoj+XY~vp+Y7pIXvw**E9=U(Y z?llX^FBXxzVc`O}Tb7bLZ!WptYJ3u|y@>ql8mP>>=aB!q3&>rznB4Bh1z_2-HRR&I z&=Rq1-fNd`F`*U}3Ul0bDpbdzMJiO!p-(r+d~-PT_?{+w%=4=jg(&`&IR z?b04lM3h56;LtJ-EfJsQQZ7}Y8#&));s!3|Nflbhp${}t4VQ`a9C{Pice%KkLqFtp zUM_Co(2qIa6#{ret3S+rzd~%~(E5w0l&eJ-ho0fkHIU+za*9LOiaR)TH-{`x55@f( zhn9=iap?Cs)Fcudx`=CN7JE4Kf4E00#9j{lEyrCa_H*bpjKP&6$)RK1&Xpp?p~tyL zD}}?M7L{_CLuCVU@^psEPX!5#t=Xg8Lp3hY%8C1A5ydTEryBeU!%`szUvoFDmZil>b&wDci*T zobm|M*?JZFDc84NJiu{ZS8;FR&|A5b^fk(x8)Y` zUJiYV^KBBp%b^U%Z5AKq&>I=^o5e>s^Z=K#S$vd3DHS@wp_f#?M=&kvf_no1} zkZ#Gr`bN~gL6G~umy-J|+>pqI7Me7#5eosI&+e7%Hp2~xFEEx~$2j>@ZtYgam8@ks zLmuNa{|o+pi}>wZE}H`P4b38Sr^yE{DMn zLv_nS_2OMBxpMo<}JS;uETrAEA^6@o7)Wx#IICbV;aD z{JqL|aOtwpd~rtQn^?L;%oi`JxLr%G3M~*nP;u!c7ehw;RK_uuE)sRi1^x(U7lWfO zlcC1V;;PU>aRrBtHO9roVxg}Oi$t@@XN4At8&tjr>sN*ri;XJZyXq~3I!ww2NTD7R zx*lA3j|sJhmI~X1HiVXm!!p$P&Ly{oUMt?jp<|67S#mu>Z&Pt!S<)H0SiD=sJ-?(K zp%2P9?%yTiqzPRgxyer;;!|TVwHs2Jf&D-t19L5i`|dL zsIN)fqe8j5c&J$%P@$uBA<-=ERiTH`_Z4DNg+7SBukh7yop?~jasRFpzok<4BHv2! zK@J^jybJkOijR3xt`bjpQbxpQJSijM^PZF~;wzq%tHswnDOZbs_N2UC{J@j4Rs6)0 zvQ>n!j*)X^iC80+%1|SC*MutgPwdh`SNY} z6%KvO)1wXI3DqOw&^L?Es2&lAzFBvgt>j`ZVKT!Fu zn3D)?7C%w>*3Icb$U8>R)>mlid3|V$SSmw}U#Yi4TgBxZI@Wl${`ClX^WAzuLQSSE zBcWTx&8jU=14}WnO||9Az*0=aRos6AXWuSfr{ew$oPE2mWgS&Rua~9p4DS$WRpwvK zSr+OP_o_0#K4*#O6!)pP?<~G5)FmENaq}U$y2RUM97?%Z>=3_eLQBML;xUzvMtY}s zLgk~8-YK3kDYK!tcuu7pgM7b3{Jly!3Hg49cwWVQ2&Ht37ggM2D5YEcP{wf|dPE2| z3Gjl(BjBICVjhQ%H9iFX+3UkZ-#Le9&3I!yx#Nq--Q)4cJ^nW@rC4&q;(n}Yb$Xc# zwi*NZJx{JLaLPu`OMa{+*)MZRcSdPEx$ePwSJ(bcZnL*EuRrC}T*;OnEbGx~#-X=N8|8$>lPE#AO6GmP$~#X?Ert#b7q$qv z^Rdz*sou`+E$qhFjkEhYcJG3Fu}H(cLfp%cV{jY9Z?XFbLnhhZh}HC8Vby-Kcn1we*2s_#<9l{`{wX*j(vz@A7S`OhM#2kqYOXA z@Tb{5jo637r#bcvL!M{%Ea2}CpJn(9oa;q)Lm}#KU1+a(B3u`u7S=;QeNI>mU(Rkb zVxI~(bL=*T#Mtcs{B*d3;qlN9k;`Uy67YWrCmEh*_;EnK9X`&GhoI3vCr$$L{qV`q zH^jWUlMH{1;itHS(_F%7hJS(E^F@w5!?9-(o3A^|u`e>bE?hvF&Fr>>sr+qW>Q_g2 zd+11AN0>1mrheVS@MM_!n`C&J;ZqDh4){~y;|za@;U^e=lHn&A{uskg1M(Ynry24^ zhCI(H&vMCU8U7-}MIE&y#BN<3m0wp!?U`3c?X(!aoZV)`zO$~GV_P^j#_$fnKVH|t z@HoS5h9?=GWO$n4Qw%@G?s1Mi&auByM}3FtA7S?-r#Z=Ko@U5thMZ=|7dZX% z3_r{8vkZTc;h}n_ocg`u>AJdlrkr{zzrOxUq36Ur_Alo&%}Db^xS7+mFnk-sW9)Wt z2^}1J4?}ErlbkEb@HFR|V)!w3k8|vCj(vz@PcZxuc29DdCpq>}j(v>Xr#bdCV!u>( znq$An@aGwRmdiZL@D~^!n!|mZ!?R-!^|6`#&Fo(>hx)sX({up-bX^C-?_o%iQzjXb z;*?ViKh7zSGyDWYP6F~bbtf6}D5rdy;im!rX5DFqpJo49_P@YsL<6_2f$`r!ZL=8C z49K_Yni;a9fm+znK(iwW_*3B|!&3}D#_5j({zUjV!yjSDqa1sR{ZF%dy5WfUUfpRf z;WVc_!|>*z$MhpW6m&-$8jFDu$dvv3|TRcDUIPBfIkuLV0b6Prx<>M-A5U6hW%nb zm9vfAd)Pg}?kRSy1su!n33gAhYhA=}cEuv{TkPJ$?i9Oc*cFQ@_8xYp*gdg?Ag9

(9LkQ3~lV)qQYVj1UUcZ%Ip?4Ds)yoO>ecJE<#ie0jO&4m^+Pt-wD){6zOBP|4E z5#;$|K$gMIL-w3Y0l6HID*(9?lKU#`vs{gsYp^?TEn+R$=9eQy6H<^&Z$pZ9q*#v> zTaY4#*zJhz5Y5moRzN>r30-q}eK91&0K1#mJ-U=2qe~{>_6Ty{Q-2ihlS_`leR;`S zO8lSY^aG12*WWB6x1Ie{b#I6N!yLPB2JV7ol-KLZR!MimoOdDi=k@P}`;|IM`5A7N z%{4CK*2zYLfU0jmq)zY1wX!02N5o1hhv)nqCBE08ZFu7evEtC24xu7?{Itr(RMEDx8$ zzZPYLFdmn~e-lOrmSebKu?gjcp!r=5|5l7rNZblH3@vau{4{1^j9N4NG;U$6qppMh zHn?FC7pvgE9c~z!VhjAV6A;F^kn7>^hZ`0Hs6Pa~Z4LapKocRc8*W(Kg|>vm>*0pQ zKInTP@dmhIVT&8#AA%beV`yUt8tex63$(W*ig3f?Fj^fF6L7=g2<`HSqj1CG&1ic_ zyajGpycKN^iMPQGi+7^!A@MNWFzonU@V^^w7?$85_g**rFskR=fShNCzl$}I9o-0aQ}{2 z_h1)!5(B&Vw|7@}H-&rq68qVI$j*#A`}d0h$4-e6r?`K>xpzFBcT%F@4dgX+vyR_- zaR2`8cJd(hQ+K4DOiFC-N~MeT5Na-q>9t1#pqwo@Dq)WVNA%k`wB!_>d~o!RTz=Fp zPLn7xITp~G?RLQlj_Jr{i}_rpVkEkq&Sfh_XEIKb;$z9AQz!(diWRXhJv3enXjUi2 z0{IUGL{W?T?c#xQe0NQZyiiOJr;|1{syw4VJrWR`u=Aj}3XyUs%j@LPu#?5|7+G97 zydyU{>SO~l#Im{UD^7;`Y3q&K9CEIwr?BD@1#pB08K+*?Bo- zG~x4$X6#qqp9WpA!>y8iK@Ogb6sj~iydJ$FOIkKItLFxGP@8N+OKVH(exMY}QG zxul&*-^cV@9*YSwmd-f&+nlVEryjW(QB9{^w3$v_=zx7+F25(AE;>C<@j%X#-i_%- zY~Ie4CNLva8X=G7$XQ<+$EC(c$8z~1O_9QwopjvR5Dzq5$^{$Wu7W+{N#5xUjgO3w zpfV}+aPGvU_JXOgqeGd=M7rn&$FqlW2c5ic%DH99k%16)SY-GjIu4{WL?&9ExRL#! z6*tu5*x3R)42nn>!9?8{S$e`j97f8859Y?fi_76MJu#(RzEW&wx`5Iq%cJ{-3b_oV zty>L>E2AGbc4u)kV?w)0voImi1G$5q3^2$UmIRA9N$kG`HRQ zM0YxSZ(=-~bv&?m(HZTqv)i3sNGUfzfqQdBKk!a_G(!>FA+ey<^bJ#>phnBhtCN+- zB%J(c8q?k(fkLON-AtO2c3__EcJd^e%Om4i$%heXXUbCb=DM=uqclN%nYn$ChpvF~ z7R*dS>K|Ii5RC0XrIq-h@$4H*;by`boV(?7NjsekgeM7EZ=VL75oZE36HLI<(;hpS z&$;=T41lXc>6DXq!M(WwCztnuBpIu*0IPBna~nLo$jnMNiOk$%LwI>IO6cJD80$*A z)6U_pd_Lz%00K!5PiozuO?2wbHYTO6rgvWyDR|`(wqYK;ie!DoaBs*Qnkp9TfY4!4GDw9!F2x6N8Xn{(`WxJ~*F5MF(4bitg;sk!k8@=l% z(+g)y*^b3tm{qBL-%r42gyLuo9>xGz)Re&Zyo&6Z_hdDtl9XZ&b|NR#~1(X@xf^1qu+@&edzHGhpr#_?j`^BuJ7G@{|e{j z$G&&zOAmi#B>%|E15ZCa*7W>KU;o^5^#ivLZ~Rg{ZvTjSGLY3%>*~p7R^Lbt>}k@V zR^I?$xM5MaAzat6tgEhJ={Ef93^z2^H!PichMcbg7mMat;n1Qme2j%4?i5nXTg;USWL3rvJ8Tcv(zS=+qQW5xBR2LES4_72mDjbvm zrxT#YIq;wWa=(fjZq#}qt|9Cu!k6sH+hbUWcTFUnF_PJd1Nq$H0*<)CdZ^M}9_{T) zXp2Rw;lxR^oB#&KKmh5gjJD`0xQy(_VOAQtZ(+#l=h?MuWG z@xET%@K0A~dr`RK|{e%#0tF4}R!s>>&$`+i3^B2zV$c;_r(<29pRwUVC-LSU(Cd&|q zb)Z-r+t}82`0(NA8=c~iG`xWqQpSE-Td_&g!tK=qFi8$gT3BO&Gp1Ut;k@HmxnU~_ z>K$=ftzyoC?qh+F3%RV78!Ezv2bO8sRuT7UwVJgcVrrtsJNuyg~BMn>vk@isTki-3vV~^z$NP>~h!@%v3gR7zn zAi50QN|snd&A>50ZkN!-@gZe|%UEO@0v^k{8s#SJ?6L;?b|m)12D+^Hpw&Onw>#e1 z)oC@w1`%#*wf4jlJNtGeETkBS^(OAJ`gT~c-n*XqL)hD(Kleltp3@I#F(Kym!X{s_E+K>P_jM^5aJF^1JAF=^j?Kj@izHok9n@9HPs9jmi z!<1AJqqpHIAkFo_lrjw)n)>tULr~hPr7c@s^^GjF_8;kGGK!+x&qOJMcM{n^Q+6Yy;~y-=O0-(-?G|(q|Jr# z(NQ};xm5$=U<)uSfE^VN*x(!B3%qR9+zE*fVxGe`LYx=eVmy-~4zM}7H4Ee2=Cs+YRkNQHTaZDHgz9VG#yvP%UjMZR%!c z!iFut*}6FiHOTZ}udyWVgG^!WmjH*4v{;am)J71REK>g-%B52lWUESMkYl0id27tt zV#yejQAQLHF&0haq)j~1vI!Wq_DI6rX!Ym7Dv5MgDMf_Ln8pBZ6v0)x5%+5kP)Oa` z+@`xn5qphd!*=or!7R%F)j}vLjRV%v@)$#cfstxw%{p44+)j-52&f_`Gw(VCMRXk^ z3aM0NM+TBSC>v&vlOM+3K~N-bex#G8H!b@ZJJ5-wG_y02ra(=#Nv34MoP^x9Goa!m zx53bhL8rCRMWA)W!q8AHwVN+l=Ma>4|ExI&LhqHfaYN=iayd}BhkWyF#+O82fjDVG ztRkffb{Cq_x}&d>BU>g4(N~-t)u^5eF@lnbs_ZdXxzkb)EKH6L`b$vx4}PU9b*A9i?Ari=KQ5yKqpG1!>^j_I;Cb>X4MkLFbbqBS2!1Ca=xe z;OWk2tCk~FXmr3SU=2pE+(5T1LgSZ{4Dvzg!cu3dU+Db2mp9Y1NU8~zjeF@Na%ajGTuBII}Y$>UY){(XMHt@BbZ15{$YbPLL=)!JIH;_^`ql;G4#*3gtb$>V6z zf^AEaM4_1mbcm*jmo+l&;Fy!dnLr3#IXyTlow6ip38Bav+)&a}pc0;uF1Z(Z6N!vx zYMjO=r*skEUkEB z`C}^63cTbpK?NSMu-CE)`U0=;q3R>RbO?vq6R5_cAebFpjPl|a3sYwTNGFs+&w&uZ z-m+Fr*er+$lusaDB)hy!jum(y9T;ToOO6>GOY`tAvRu%h$lQbpC{d`^G^7H1nW1iD z1|x|0t4$1E)A8yZGs=B82KSfDtGF}*)1q5IPy5zZ~?G}Es49hbTI;yW+ zv2V4S9=0M3wYFfGP$7>X6-j?Z+A)LTf7przwJFkstfj&V`fV1^X2QUq%fPfP*EG8K zvy)ARK((o*Uvsfq%!R6F70**ild=FzMX6KZIAo=_m=#GrM^-di{2R)EHBS)$ooC<^ zHGEVu8V4gTKW@cVzqGO2&?1r9n3O{r;b;Q$JFrrW3QCa+MzR*Vt2^d|v_nM4xT;ZE z-XZm~V9b7`^p(jyY@|cdVe=-*a|##$i^bMS&dbRQI9!H}3F77YJTPsFC`o~RoT8~@ zGp%7^Z`>-;piY}9l5Qb1Y;NNuCVOxOCUdPTL#3Q?&LfHYBkoa{BRjxT0J?uR1+?x8 zC<4Ihg$z1HEikAJP@650s0RnJFlrrWrAT1 zHb>o3H9l;Jl&6OCrEx3@h{xy=lgdUpjhiEd``nacd1a)x4yE%&94eGrdk}FL3MZLD zih48}HJZ6wqGFEwjg;~?&9D7P@#JQKfHQ13Q^DQ@Z=}k!8#lL&x#|6EnkUkZ&II!dYvaZ(76Jp% zz4mUBo_(tWg`7%dah5nYUrxO~?f{k`%Cj<4+_c5w6oCcFyr`b)_Mv;D#R~vyFE;k6 zf(k8B^~eJD29>aHwRMCJ%p5Hgb7MzIH9eZmvBBgh*KmJe!(`>EVYCcFpN8!W4&@wW zeU*N4Mbcd1gPD5BA%AI6{y82W)+2rZ>p7#Vt zMJjESn$uuIA?Fmbt4PbHJ0rjVPF-d)lXMb?&bV2$rZrbCxSFwij<$PS{B4)mMf*IM z!)7v?mdm0zY--@14bw0+P`1pS#07t0cjd-;qW}u0HLA{^5gr0gPwitoQJId76&F!H z+Kr8hJgKXCNNjzIS|fu_4^cu4nnNQ+`Xh{~ za7G;P0i|#ebhwE($DNcepBkk5%%{Ma888GjVZTH+7r5jv1dx{NU~P`OzOo?$&B$P9 zCUH2xj~W;%OZbJ7GKH<112}`SQe$Jrk#q#|Z%2jt7$ z?m)HKzpoE-Fdf(R9DHk{N-fDypxnzn;Ei%pR%lC%FCj*Ta=8qxh-4P6#)48OiY>HN zns-LVGuZvd&ZxYzsHTJ-p7U&XVI#8%i8*2=<*nrw#tXe*A$|F-(XryBUOL0jixx_G z6!oV#2fU)Fn4a&v9F!9oWJ`<;i*mo2fanh^6?8YW8uPb~US-dG;g zM1B%NsoK*=8L)jjgy?MOEoLO=R%(Y|UyD7L?cON7W zq!(svHLX>zZAt`8)l1M3*Z52eW7kB$qaaO%N>9fR(A+c%k<1o~Cjap)T@9UlkO?$% zDqYZ;ImTMnv{MXIs}@Tz-9A#?%kJ`4UwBo`ishD?EsRRJ_VQ6p_3TVjdG*dn=@ifn z1>$v*Qo>f`%*B}GwV+9oQiu4Yh%%HbB4sltX~A@)kPpAW9C*kn7zPV*PAWy>m}<5kP)7aAAc6)mu|gC@zBNDC3RCuq`fCjuKf)lvMYwKI2^PJFcn z6%0n8Do*1Rye^5gOVZULMOZ(D*tIigBoD5+&2@DmVpiI^7-|kE9co<;N-Ixyhv64gw)dzMC1RC*9mS*$vYrqa6b( zZMoVnKvTgL`tI-+Wl81@mMm30l*tXCpBub9!JEnOfGUQrS@MOd=g2xL9flmlEKL?` z!BDCUeV~kXIRg!R**W1o2Vkqvs}b1Kv7f*P<}9;Nf=+EVtZmH?_|PzsJYD?YsVS$a zMn2O$P36+k_@J5Ir=VGx&fAM^eDkwJ`iJL7D+^zvC z^wzH8aNa|ca$1=5Rq!fpr@GhBht)0%*I+_!0jjcsmDV_*!yRtZfDSCO>C~()Q?{jN z(i8^1?@6z0ZalVn38p176)~-xW0I|^NmfFr=~YWD=(@BPQ+jnFSuvYO-AvGC{g8SM zr&QMI0>Dpnl2Tdc+9#FN;{r{_T1h=6=;ZDu*&C$r0in>lBxH$kq9ajkQP3>ZH=yaJ z6E=xKG%ylanKbTk2DaC*S#LsUWVVCA1nTR1j7{H}R`eNrg<(d_l_!rAv8kH=CEVqU!!IY?W##P@3F5 z<|iR^e9$tbQoWv%Og%K*CZMR)G|U@!fg0lJlH%Ijz0#HhHC>|sm-JY8$c(P!G0V1d z#z&<-`zj=UXLc_vx(Qt5t7D}^b z8akt2j8DrmD(X`g;{Hg*XP~O{mWtUfICrUBb0C>|CqU_}_QqA3YkHOkF}fKw#Y^9w zsaD#SpvLREr{yp+YKY4gX3}pjTTpF1BByhWdCcBjKG|k=EQ1g-3#K!JV!b2d^-srz z_A;mEC8uI-*eb(y6jx9hR1?M&+LS;APnHjXV3!Tne4N>VCyq11GkWSzooe*)!9Lnx z!od-|wZkk8JdnAVVPIs@E70>-Y#g9nH{WS*9FpXVp=eoqQ2DO;EUkJ-`wHsD6|HP+ z7~tuNlk#$9|F&2+1eGhPiMkR{16dy=M(FA~j3VmD7x!$KUP9zv@d6XeCUf?Q^)$IY zNzfJ0QQq~V^_tT62p2k+*`tICn4?`lm{IbMI!;9!nvesY0!z_0<52@<*9T!>=KU^1 zt+(zfPd=jNo4ID#1dKE)y^5;Wgog=XP@7B0g;#A#89z)5XDKRmaXccPvzHZl5e{C` z($|yJKl9Dnr}7ES>1Up29tX}n`7)Fm3>m0I_wqh79|5X5yLkI^ni;0csxTG0s?A>7 zprXB2G6BkoRyIUsxV?DWD(q3N>C9GqxB4T)YIo$ zEY17N9!ssR5tXOchl2h+NcE)D={IDj~WK+C1iKK z8aVc@h~nLK67_sLhtAEgO=Z-^T{4odxgnf2I3$m0@o^4$4B9njCNQdWMu)D9U~@nn z(e}Kdf#>JsCS)P%d#aYU5X`9gvB_=LmcNp{I4Xl)6e?Qk4X4Qn1tw@%i`FE+s4!uz zwkCNRQAwKMc>|z_rmu!rZW--2tZTK_-(YT*!IZfXYfC;pWVUd|P`5@ENQPJ-u{d3v zvCx~1eccC2F)fM6V<@$t4ILw|n1(gk1L}p1Cma7jsS` z!OIrFXvx$pRTI+iT-FV}oi9jG0xV)lzYN}GWDOrWjx@j0PNAMESYKevpLw|?EiQ!$ zq%&$H8)#EdzHo&QXlr;pBLxm#O@#!at21;-qX}v)9gu2L8?6o%M+e_@O{|z;lN5ZN zGC*eK(P&yg&~Alff4(Nt+DEnx70bqH5+@Zpmr3)}igGn(uASmO%Iuk$+z+Aa1Rj>O z7iXO5lCORUcApjBZtJ%@t^Gr;e+wPhX9DrEIknS?Qs_WqFXVd!R}~=Tvv7RO&$2pm zgTM(NGL2AlD<_KH<`m_lMf%0iNJ|uL@b8C$v-g^)MInb zJDF5Kz`a^N*G?;NZ7J0J1<1e_HCEC=aauA5MM|Dr;|F8p25L}s7s3=+LQV!ZUUoQJ zb;0EYG*!VGaPE{%2K3+^F$)`qi86Gkl-7}awd=4mME6bT?ISZ$=tW*W63Z*}3?G8v z-1K@pR6aTaNl!RqqVm%qR7O4rsT+CVoVRXjs)$hs%=<}!m?cW}3!30Ofik8-QY~Ka zI;6M$eR^3ydw&#DDrjhzkKm9oI?2q%i^+UWk|icL_F%9gjX^4#UfVo~q-1RhS|R=g zwvGKe_jOTTuc);M%F>(!%BPK2t@u+0IOKt)3S_{lsKrMDXiL#oGwRaI8SE_3yGJZb zaIqQ(9jS>>Ch2s0L6%2#>WZkDczg{vVR7)Aj+7%4L=2kA&o989r7Fit8>9`%Qot!< zL-7H6Zs`p)-Fl6tpB>#6NZKeQaM z1E8CRE2Uq@(j9ekG7o@x0=H0bCo_#RsMcXTRy&49q5s9hISYMZ>!7<1*@Zrk!s;@o52mguvBt+;TTpz9Oh;B2KGdAVX>Uq!QtYHJm8v!r}c@ zx_g8zjZlL^*UrLZNc6%ghd~~6EqCcE&ynDv4Svdx*dk8u3PD*#8?yb7KpCGqQjUB3W6=?9!jrJchgoifi=B> z{Wwn5Rd*>j(wA0fqSNJQtnp)+9d$1r)BMK7U_DPUeti~ml1s?uFBO)|!KYg4NB7Hdtr;qNox zS}|%L5n0)wma{22xHDrHtribaM4|<{MiX75!Be^JP!X_zPbuLE%-wcAO&y{OkCB%0 z%L&BF&VkvuPrOxTI@B!UI~CHN8~dq-RYPZLu9%UZ8DgvPVbWhn(H@ZuxJ&Llz$ms? z4u&81Bjf25kc}ZxkC0x~0fv`|&Wn}hGb@~~ScU48bRJuP~G`%}? zvj3GiJ{u=-{aNLFk}FIcSuPiCc-`H9To*IZ%F#NplG+sGbT zQ)>nAHGc2Nt>1Tcw-PSo^F+C1ay-x9ktA~xF)PWvUB(IR651;)*N!G zOm0%`NCkI_hsi4fWiqvSQC2SsC95a+Hr5bOy!nA)R#B;yN+ZTaD%#5DXPVrulr~u{ z#Haz%TIO~edLv)O9Ch_rLd|_nKDUMzccdw&oC%FGgBiD2 z&(^iE*A%R+TdcKQD(?XJX$ycBDm=JU^Z62%|{pRS?DUMU^tG>w$}EJ2Cc;+=Lo0mo4I6NDFz z^Ud(%UlmxQT20Kb5YG{4C8WR$u?jD>aqM6y0 z%@p&~m-H(7)x|!ST~pZ)6D-Qil6@Ua>k4V9*4xvw;) zS9oQocYG=;FCKBmbbt=)m>Es7=@mVqVy*rNu$h+K}R&l{>mFJU!wk3Ob!=@HSQYAil zP-Z7C{aFIH%K{58r~R@|8J6mhF)VZ@N3p=_*W1QhKu#sFGR?B$dbqr}>D0_w%@qH^ zIj@!2GYepAH8)F1YAd6wUvFYOH?|Fatr?w z!$ozJl*x!xD{4!Zwd2?l0fCe^-9BptopUB=$450C7<&1jV!0r#IqLiPTN?bJi;>@c zOZ?0=yBeaNkdOclYKi@G79C2}*SN=0fy`ofTfjLyz3}j+4iF!nTT;6G3$Oi4Js%o5 z^`lJxSMXo!1%T=UahV#DklIa?AK|2(Z5(jYPd)Gv3R>t9S>QO4K9(qt;PSSbToRt^ zG^=>MyVi@RK|Bpl$J7XU{2iVeV$gd49Ou`97ZboQjuhcAh}z&X7%S(8jP=T^U~@I2 z!ZNs1*5sK23Icm8zx{u~CPD3ZrD}0PA?uYMEZVQ5gC^%aR+{})7%JMr!+|%~SRnzw zMgt`q{L31r3o$?)`UNNXos3RAKI*ZYKQthVEg&3D}(>U}* zaIGsOQt14w{3yxvItQocm$QAA##dU`C{_1sscXIxRzwnjhI+jg@^e)GFAO=bQfWlw zFJE^jtQp4eYk)qQEHj)^W(u;BXS8`70~kSA{R?d0trJ zvq8L(;$IW<9tW08YOBCyfp`L)Zgvn;tAJ;=Y3uv2C3kw|mIfaIZNhE1@>8HP!GQcU zZ+8xt)b%^n@_y>Be8zWJkubO29>I7mA1o=C^qsPayX-jS%CV3mCw#6|oh z6u4;^!pw~gL6b!{J}8c_?$x4Kv@g~rKOJT|Q!qZSn4s}e$1~N*jOuv*IF&NVgBvMcYX^|<)NE?YOi@v zR;et(wJ}2m&HmciNElVB*@im2gfxwE=ne}$b8PO6Bt6ed(PJm_)E8Y-(>G2mn_t_~ zGJtP$xfcuMU3zmIDXB zDi>6i2RA+zqDI%e%`%R|CZIg*M9}vtL7Eka$xlR<)k{avalG4e@Y@{2S9S17b!=GU z^S~9$#YfeP{DCEY|3tMST`YU7Y5>Kcy7ns7(ali#p3F?E!)-Etr5)-DUvVv~6{Zeg zrAvJc9OTc)sqjFT>NPc^v|u`RR5CeB@wsb^AA)e}2(J66wVp;6TA^kR2J0H&G9CF0 z296e~%h99qsx&FuB_I94L8vGm%fRDB^t~ZDUf40WhH-}whu3w{eCzYGm{2SWY9aRp6o{Lm)3LFcI$q#o{pSj(;}AzPGnVv3D7Bd zSNiGJ`B6Hpwj#%?7R<`DR2FHPc}|i-9R-s;_FPL**HubK4hW|KRwG+1I2pXBqF=k! zm{H@8yYHUMfR$S9N3ObCnFV#`a5ETJ9mn}DaLy0~HP{RW5d#DC;K|)h-H=%hky*Xe zbd<{J$vaTgRKFr`5LKQrQXZ!Siz3-ziQW;E!>}QD&RFKrALiQla#@*Jh!5^h4D9Nv zDE?+xHh;q@sPG-J?m;R&SlZ37bpF~HU;huPqIXw!H);rcbakevxkynPAj0TL2BlkT82)Sf#JcEzml$OUIV0R{x z&KQXule>gz_0fAWcziF?L~Ev?FTJhWvX$lNDqMoau5l5%i?Tw!fv$lf{f(~McTMX>31gBkQd?COuEdYiBV}FGJGNmV`AQE zAyG#2-+inL!%S}&q_e|_&nBU%4qJPD?-lOzCZ{t>W=5MsfXHJWfGm>M4>8DZRNhCs z`kp?J_K4xCH0}m}7yQ||?sWFv#CSIAWK5l22{q$IC+mNn=QHru2l04*jK$yys-Jv( z(0#M=Trp5nag9$WsYf(17i)kA(_!kb{`e)Xn5sv5fEs*lHeYepn-)|U{hIcDz!`BS z@VF8+$W%NF66nw44l%viL-Jcb=!;j6_`|G3^TUn}OSYq~9^~*y5rF#HV5Mg&m61=h zRGF{c`R#z{5$Q@3?oH#%+xfCDOG(842m&( z`1LQKWP2KFes+Wmph1|#Lzf!$U`Q~-NR1bnWC{GB2#V7KT4_+qr6xV}po>Ymh+7!`T+4bOryXEtRn=pB8&Or~ft z0iIxR<(*4}=F&CvSjC*>8!Sb8gf>U;;EdTip}Mr1PySLfZ9-8-z5Yg%eN)6Vb8S<5H5t+y^qr?FcdZb|AyGo7ez=99|yD2$*W+g50s2Iin*}-sn(f^1@L% zZ|ve5A-Q~!1WjQK-xYPKXQTV(bNRSb&00?BujE;QY5DOhh1e`T%v@>NUJ0dTnaYt_ z#5D3M1xi3;<0+G(aV(`;mch^nTw#wd)$7Di224hmO6Bw^ljd3#KuOgnUZtFFwdc*7 zUZGL!Iw z=Xd+&zx^ADhbKOJ*Z=+Od(z)}@B9Dy)cv3MT;u&8?Y-}FEs>L%m*02hfnD>r-*Dm& zFS_%kyZ&U}+cxjJ`{z%6^z)DW)xK3vzIgY?p2$30c*mpn{?Q}<@7hBzzBD}AaJ4n~ z-f#S7@x%Z9{zcEGs12!?U*1E%Vf?!)B*a8xNKAZ3h=IY*!O5#zTh_F9#s27p*sYUK zuli#|i;j(V-|iH*=gDe+cPdxRI>j~k&~xE#&&8CxVa;$;MLjXmUZ*&S4+y60e2P;I z;2a2yHFu*JJQU0D_UPK_Ge^f#L)7eF%HL<_5hmo{-;&?bA^-0)o^(R&@5tplGnpP> zPK*|kcs<*RrZO4M@{8+G#u9(-piqbtT_(hoKQ<(&MQa1#lx`>f-D!oy19cRVe-G5H zhiA7K6#LS#0&p}6>dOE-7AT)+z#U0%K0S_< Xe`bFnaS;;!%PliY{c5WJTp0NO6qK0d literal 0 HcmV?d00001 diff --git a/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/netstandard1.0/JetBrains.Annotations.NetStandard.xml b/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/netstandard1.0/JetBrains.Annotations.NetStandard.xml new file mode 100644 index 000000000..ab8884ce5 --- /dev/null +++ b/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/netstandard1.0/JetBrains.Annotations.NetStandard.xml @@ -0,0 +1,594 @@ + + + + JetBrains.Annotations.NetStandard + + + +

+ Indicates that the value of the marked element could be null sometimes, + so the check for null is necessary before its usage. + + + [CanBeNull] object Test() => null; + + void UseTest() { + var p = Test(); + var s = p.ToString(); // Warning: Possible 'System.NullReferenceException' + } + + + + + Indicates that the value of the marked element could never be null. + + + [NotNull] object Foo() { + return null; // Warning: Possible 'null' assignment + } + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can never be null. + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can be null. + + + + + Indicates that the marked method builds string by format pattern and (optional) arguments. + Parameter, which contains format string, should be given in constructor. The format string + should be in -like form. + + + [StringFormatMethod("message")] + void ShowError(string message, params object[] args) { /* do something */ } + + void Foo() { + ShowError("Failed: {0}"); // Warning: Non-existing argument in format string + } + + + + + Specifies which parameter of an annotated method should be treated as format-string + + + + + For a parameter that is expected to be one of the limited set of values. + Specify fields of which type should be used as values for this parameter. + + + + + Indicates that the function argument should be string literal and match one + of the parameters of the caller function. For example, ReSharper annotates + the parameter of . + + + void Foo(string param) { + if (param == null) + throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol + } + + + + + Indicates that the method is contained in a type that implements + System.ComponentModel.INotifyPropertyChanged interface and this method + is used to notify that some property value changed. + + + The method should be non-static and conform to one of the supported signatures: + + NotifyChanged(string) + NotifyChanged(params string[]) + NotifyChanged{T}(Expression{Func{T}}) + NotifyChanged{T,U}(Expression{Func{T,U}}) + SetProperty{T}(ref T, T, string) + + + + public class Foo : INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + + [NotifyPropertyChangedInvocator] + protected virtual void NotifyChanged(string propertyName) { ... } + + string _name; + + public string Name { + get { return _name; } + set { _name = value; NotifyChanged("LastName"); /* Warning */ } + } + } + + Examples of generated notifications: + + NotifyChanged("Property") + NotifyChanged(() => Property) + NotifyChanged((VM x) => x.Property) + SetProperty(ref myField, value, "Property") + + + + + + Describes dependency between method input and output. + + +

Function Definition Table syntax:

+ + FDT ::= FDTRow [;FDTRow]* + FDTRow ::= Input => Output | Output <= Input + Input ::= ParameterName: Value [, Input]* + Output ::= [ParameterName: Value]* {halt|stop|void|nothing|Value} + Value ::= true | false | null | notnull | canbenull + + If method has single input parameter, it's name could be omitted.
+ Using halt (or void/nothing, which is the same) for method output + means that the methos doesn't return normally (throws or terminates the process).
+ Value canbenull is only applicable for output parameters.
+ You can use multiple [ContractAnnotation] for each FDT row, or use single attribute + with rows separated by semicolon. There is no notion of order rows, all rows are checked + for applicability and applied per each program state tracked by R# analysis.
+
+ + + [ContractAnnotation("=> halt")] + public void TerminationMethod() + + + [ContractAnnotation("halt <= condition: false")] + public void Assert(bool condition, string text) // regular assertion method + + + [ContractAnnotation("s:null => true")] + public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty() + + + // A method that returns null if the parameter is null, + // and not null if the parameter is not null + [ContractAnnotation("null => null; notnull => notnull")] + public object Transform(object data) + + + [ContractAnnotation("=> true, result: notnull; => false, result: null")] + public bool TryParse(string s, out Person result) + + +
+ + + Indicates that marked element should be localized or not. + + + [LocalizationRequiredAttribute(true)] + class Foo { + string str = "my string"; // Warning: Localizable string + } + + + + + Indicates that the value of the marked type (or its derivatives) + cannot be compared using '==' or '!=' operators and Equals() + should be used instead. However, using '==' or '!=' for comparison + with null is always permitted. + + + [CannotApplyEqualityOperator] + class NoEquality { } + + class UsesNoEquality { + void Test() { + var ca1 = new NoEquality(); + var ca2 = new NoEquality(); + if (ca1 != null) { // OK + bool condition = ca1 == ca2; // Warning + } + } + } + + + + + When applied to a target attribute, specifies a requirement for any type marked + with the target attribute to implement or inherit specific type or types. + + + [BaseTypeRequired(typeof(IComponent)] // Specify requirement + class ComponentAttribute : Attribute { } + + [Component] // ComponentAttribute requires implementing IComponent interface + class MyComponent : IComponent { } + + + + + Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library), + so this symbol will not be marked as unused (as well as by other usage inspections). + + + + + Should be used on attributes and causes ReSharper to not mark symbols marked with such attributes + as unused (as well as by other usage inspections) + + + + Only entity marked with attribute considered used. + + + Indicates implicit assignment to a member. + + + + Indicates implicit instantiation of a type with fixed constructor signature. + That means any unused constructor parameters won't be reported as such. + + + + Indicates implicit instantiation of a type. + + + + Specify what is considered used implicitly when marked + with or . + + + + Members of entity marked with attribute are considered used. + + + Entity marked with attribute and all its members considered used. + + + + This attribute is intended to mark publicly available API + which should not be removed and so is treated as used. + + + + + Tells code analysis engine if the parameter is completely handled when the invoked method is on stack. + If the parameter is a delegate, indicates that delegate is executed while the method is executed. + If the parameter is an enumerable, indicates that it is enumerated while the method is executed. + + + + + Indicates that a method does not make any observable state changes. + The same as System.Diagnostics.Contracts.PureAttribute. + + + [Pure] int Multiply(int x, int y) => x * y; + + void M() { + Multiply(123, 42); // Waring: Return value of pure method is not used + } + + + + + Indicates that the return value of method invocation must be used. + + + + + Indicates the type member or parameter of some type, that should be used instead of all other ways + to get the value that type. This annotation is useful when you have some "context" value evaluated + and stored somewhere, meaning that all other ways to get this value must be consolidated with existing one. + + + class Foo { + [ProvidesContext] IBarService _barService = ...; + + void ProcessNode(INode node) { + DoSomething(node, node.GetGlobalServices().Bar); + // ^ Warning: use value of '_barService' field + } + } + + + + + Indicates that a parameter is a path to a file or a folder within a web project. + Path can be relative or absolute, starting from web root (~). + + + + + An extension method marked with this attribute is processed by ReSharper code completion + as a 'Source Template'. When extension method is completed over some expression, it's source code + is automatically expanded like a template at call site. + + + Template method body can contain valid source code and/or special comments starting with '$'. + Text inside these comments is added as source code when the template is applied. Template parameters + can be used either as additional method parameters or as identifiers wrapped in two '$' signs. + Use the attribute to specify macros for parameters. + + + In this example, the 'forEach' method is a source template available over all values + of enumerable types, producing ordinary C# 'foreach' statement and placing caret inside block: + + [SourceTemplate] + public static void forEach<T>(this IEnumerable<T> xs) { + foreach (var x in xs) { + //$ $END$ + } + } + + + + + + Allows specifying a macro for a parameter of a source template. + + + You can apply the attribute on the whole method or on any of its additional parameters. The macro expression + is defined in the property. When applied on a method, the target + template parameter is defined in the property. To apply the macro silently + for the parameter, set the property value = -1. + + + Applying the attribute on a source template method: + + [SourceTemplate, Macro(Target = "item", Expression = "suggestVariableName()")] + public static void forEach<T>(this IEnumerable<T> collection) { + foreach (var item in collection) { + //$ $END$ + } + } + + Applying the attribute on a template method parameter: + + [SourceTemplate] + public static void something(this Entity x, [Macro(Expression = "guid()", Editable = -1)] string newguid) { + /*$ var $x$Id = "$newguid$" + x.ToString(); + x.DoSomething($x$Id); */ + } + + + + + + Allows specifying a macro that will be executed for a source template + parameter when the template is expanded. + + + + + Allows specifying which occurrence of the target parameter becomes editable when the template is deployed. + + + If the target parameter is used several times in the template, only one occurrence becomes editable; + other occurrences are changed synchronously. To specify the zero-based index of the editable occurrence, + use values >= 0. To make the parameter non-editable when the template is expanded, use -1. + > + + + + Identifies the target parameter of a source template if the + is applied on a template method. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC action. If applied to a method, the MVC action name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC area. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is + an MVC controller. If applied to a method, the MVC controller name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC Master. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC model type. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is an MVC + partial view. If applied to a method, the MVC partial view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method. + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC display template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.DisplayExtensions.DisplayForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC editor template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.EditorExtensions.EditorForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC template. + Use this attribute for custom wrappers similar to + System.ComponentModel.DataAnnotations.UIHintAttribute(System.String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component. If applied to a method, the MVC view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Controller.View(Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component name. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component view. If applied to a method, the MVC view component view name is default. + + + + + ASP.NET MVC attribute. When applied to a parameter of an attribute, + indicates that this parameter is an MVC action name. + + + [ActionName("Foo")] + public ActionResult Login(string returnUrl) { + ViewBag.ReturnUrl = Url.Action("Foo"); // OK + return RedirectToAction("Bar"); // Error: Cannot resolve action + } + + + + + Razor attribute. Indicates that a parameter or a method is a Razor section. + Use this attribute for custom wrappers similar to + System.Web.WebPages.WebPageBase.RenderSection(String). + + + + + Indicates how method, constructor invocation or property access + over collection type affects content of the collection. + + + + Method does not use or modify content of the collection. + + + Method only reads content of the collection but does not modify it. + + + Method can change content of the collection but does not add new elements. + + + Method can add new elements to the collection. + + + + Indicates that the marked method is assertion method, i.e. it halts control flow if + one of the conditions is satisfied. To set the condition, mark one of the parameters with + attribute. + + + + + Indicates the condition parameter of the assertion method. The method itself should be + marked by attribute. The mandatory argument of + the attribute is the assertion type. + + + + + Specifies assertion type. If the assertion method argument satisfies the condition, + then the execution continues. Otherwise, execution is assumed to be halted. + + + + Marked parameter should be evaluated to true. + + + Marked parameter should be evaluated to false. + + + Marked parameter should be evaluated to null value. + + + Marked parameter should be evaluated to not null value. + + + + Indicates that the marked method unconditionally terminates control flow execution. + For example, it could unconditionally throw exception. + + + + + Indicates that method is pure LINQ method, with postponed enumeration (like Enumerable.Select, + .Where). This annotation allows inference of [InstantHandle] annotation for parameters + of delegate type by analyzing LINQ method chains. + + + + + Indicates that IEnumerable, passed as parameter, is not enumerated. + + + + + Indicates that parameter is regular expression pattern. + + + + + Prevents the Member Reordering feature from tossing members of the marked class. + + + The attribute must be mentioned in your member reordering patterns + + + + + XAML attribute. Indicates the type that has ItemsSource property and should be treated + as ItemsControl-derived type, to enable inner items DataContext type resolve. + + + + + XAML attribute. Indicates the property of some BindingBase-derived type, that + is used to bind some item of ItemsControl-derived type. This annotation will + enable the DataContext type resolve for XAML bindings for such properties. + + + Property should have the tree ancestor of the ItemsControl type or + marked with the attribute. + + + + diff --git a/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/portable-net4+sl4+wp7+netcore45/JetBrains.Annotations.PCL1.dll b/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/portable-net4+sl4+wp7+netcore45/JetBrains.Annotations.PCL1.dll new file mode 100644 index 0000000000000000000000000000000000000000..62d51482cf81c56551c8b710a516b793770296b0 GIT binary patch literal 61952 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 nSq2!fK;bmj?udEw>G7ic=l2&97omW!-g + + + JetBrains.Annotations.PCL1 + + + + + Indicates that the value of the marked element could be null sometimes, + so the check for null is necessary before its usage. + + + [CanBeNull] object Test() => null; + + void UseTest() { + var p = Test(); + var s = p.ToString(); // Warning: Possible 'System.NullReferenceException' + } + + + + + Indicates that the value of the marked element could never be null. + + + [NotNull] object Foo() { + return null; // Warning: Possible 'null' assignment + } + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can never be null. + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can be null. + + + + + Indicates that the marked method builds string by format pattern and (optional) arguments. + Parameter, which contains format string, should be given in constructor. The format string + should be in -like form. + + + [StringFormatMethod("message")] + void ShowError(string message, params object[] args) { /* do something */ } + + void Foo() { + ShowError("Failed: {0}"); // Warning: Non-existing argument in format string + } + + + + + Specifies which parameter of an annotated method should be treated as format-string + + + + + For a parameter that is expected to be one of the limited set of values. + Specify fields of which type should be used as values for this parameter. + + + + + Indicates that the function argument should be string literal and match one + of the parameters of the caller function. For example, ReSharper annotates + the parameter of . + + + void Foo(string param) { + if (param == null) + throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol + } + + + + + Indicates that the method is contained in a type that implements + System.ComponentModel.INotifyPropertyChanged interface and this method + is used to notify that some property value changed. + + + The method should be non-static and conform to one of the supported signatures: + + NotifyChanged(string) + NotifyChanged(params string[]) + NotifyChanged{T}(Expression{Func{T}}) + NotifyChanged{T,U}(Expression{Func{T,U}}) + SetProperty{T}(ref T, T, string) + + + + public class Foo : INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + + [NotifyPropertyChangedInvocator] + protected virtual void NotifyChanged(string propertyName) { ... } + + string _name; + + public string Name { + get { return _name; } + set { _name = value; NotifyChanged("LastName"); /* Warning */ } + } + } + + Examples of generated notifications: + + NotifyChanged("Property") + NotifyChanged(() => Property) + NotifyChanged((VM x) => x.Property) + SetProperty(ref myField, value, "Property") + + + + + + Describes dependency between method input and output. + + +

Function Definition Table syntax:

+ + FDT ::= FDTRow [;FDTRow]* + FDTRow ::= Input => Output | Output <= Input + Input ::= ParameterName: Value [, Input]* + Output ::= [ParameterName: Value]* {halt|stop|void|nothing|Value} + Value ::= true | false | null | notnull | canbenull + + If method has single input parameter, it's name could be omitted.
+ Using halt (or void/nothing, which is the same) for method output + means that the methos doesn't return normally (throws or terminates the process).
+ Value canbenull is only applicable for output parameters.
+ You can use multiple [ContractAnnotation] for each FDT row, or use single attribute + with rows separated by semicolon. There is no notion of order rows, all rows are checked + for applicability and applied per each program state tracked by R# analysis.
+
+ + + [ContractAnnotation("=> halt")] + public void TerminationMethod() + + + [ContractAnnotation("halt <= condition: false")] + public void Assert(bool condition, string text) // regular assertion method + + + [ContractAnnotation("s:null => true")] + public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty() + + + // A method that returns null if the parameter is null, + // and not null if the parameter is not null + [ContractAnnotation("null => null; notnull => notnull")] + public object Transform(object data) + + + [ContractAnnotation("=> true, result: notnull; => false, result: null")] + public bool TryParse(string s, out Person result) + + +
+ + + Indicates that marked element should be localized or not. + + + [LocalizationRequiredAttribute(true)] + class Foo { + string str = "my string"; // Warning: Localizable string + } + + + + + Indicates that the value of the marked type (or its derivatives) + cannot be compared using '==' or '!=' operators and Equals() + should be used instead. However, using '==' or '!=' for comparison + with null is always permitted. + + + [CannotApplyEqualityOperator] + class NoEquality { } + + class UsesNoEquality { + void Test() { + var ca1 = new NoEquality(); + var ca2 = new NoEquality(); + if (ca1 != null) { // OK + bool condition = ca1 == ca2; // Warning + } + } + } + + + + + When applied to a target attribute, specifies a requirement for any type marked + with the target attribute to implement or inherit specific type or types. + + + [BaseTypeRequired(typeof(IComponent)] // Specify requirement + class ComponentAttribute : Attribute { } + + [Component] // ComponentAttribute requires implementing IComponent interface + class MyComponent : IComponent { } + + + + + Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library), + so this symbol will not be marked as unused (as well as by other usage inspections). + + + + + Should be used on attributes and causes ReSharper to not mark symbols marked with such attributes + as unused (as well as by other usage inspections) + + + + Only entity marked with attribute considered used. + + + Indicates implicit assignment to a member. + + + + Indicates implicit instantiation of a type with fixed constructor signature. + That means any unused constructor parameters won't be reported as such. + + + + Indicates implicit instantiation of a type. + + + + Specify what is considered used implicitly when marked + with or . + + + + Members of entity marked with attribute are considered used. + + + Entity marked with attribute and all its members considered used. + + + + This attribute is intended to mark publicly available API + which should not be removed and so is treated as used. + + + + + Tells code analysis engine if the parameter is completely handled when the invoked method is on stack. + If the parameter is a delegate, indicates that delegate is executed while the method is executed. + If the parameter is an enumerable, indicates that it is enumerated while the method is executed. + + + + + Indicates that a method does not make any observable state changes. + The same as System.Diagnostics.Contracts.PureAttribute. + + + [Pure] int Multiply(int x, int y) => x * y; + + void M() { + Multiply(123, 42); // Waring: Return value of pure method is not used + } + + + + + Indicates that the return value of method invocation must be used. + + + + + Indicates the type member or parameter of some type, that should be used instead of all other ways + to get the value that type. This annotation is useful when you have some "context" value evaluated + and stored somewhere, meaning that all other ways to get this value must be consolidated with existing one. + + + class Foo { + [ProvidesContext] IBarService _barService = ...; + + void ProcessNode(INode node) { + DoSomething(node, node.GetGlobalServices().Bar); + // ^ Warning: use value of '_barService' field + } + } + + + + + Indicates that a parameter is a path to a file or a folder within a web project. + Path can be relative or absolute, starting from web root (~). + + + + + An extension method marked with this attribute is processed by ReSharper code completion + as a 'Source Template'. When extension method is completed over some expression, it's source code + is automatically expanded like a template at call site. + + + Template method body can contain valid source code and/or special comments starting with '$'. + Text inside these comments is added as source code when the template is applied. Template parameters + can be used either as additional method parameters or as identifiers wrapped in two '$' signs. + Use the attribute to specify macros for parameters. + + + In this example, the 'forEach' method is a source template available over all values + of enumerable types, producing ordinary C# 'foreach' statement and placing caret inside block: + + [SourceTemplate] + public static void forEach<T>(this IEnumerable<T> xs) { + foreach (var x in xs) { + //$ $END$ + } + } + + + + + + Allows specifying a macro for a parameter of a source template. + + + You can apply the attribute on the whole method or on any of its additional parameters. The macro expression + is defined in the property. When applied on a method, the target + template parameter is defined in the property. To apply the macro silently + for the parameter, set the property value = -1. + + + Applying the attribute on a source template method: + + [SourceTemplate, Macro(Target = "item", Expression = "suggestVariableName()")] + public static void forEach<T>(this IEnumerable<T> collection) { + foreach (var item in collection) { + //$ $END$ + } + } + + Applying the attribute on a template method parameter: + + [SourceTemplate] + public static void something(this Entity x, [Macro(Expression = "guid()", Editable = -1)] string newguid) { + /*$ var $x$Id = "$newguid$" + x.ToString(); + x.DoSomething($x$Id); */ + } + + + + + + Allows specifying a macro that will be executed for a source template + parameter when the template is expanded. + + + + + Allows specifying which occurrence of the target parameter becomes editable when the template is deployed. + + + If the target parameter is used several times in the template, only one occurrence becomes editable; + other occurrences are changed synchronously. To specify the zero-based index of the editable occurrence, + use values >= 0. To make the parameter non-editable when the template is expanded, use -1. + > + + + + Identifies the target parameter of a source template if the + is applied on a template method. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC action. If applied to a method, the MVC action name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC area. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is + an MVC controller. If applied to a method, the MVC controller name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC Master. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC model type. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is an MVC + partial view. If applied to a method, the MVC partial view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method. + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC display template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.DisplayExtensions.DisplayForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC editor template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.EditorExtensions.EditorForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC template. + Use this attribute for custom wrappers similar to + System.ComponentModel.DataAnnotations.UIHintAttribute(System.String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component. If applied to a method, the MVC view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Controller.View(Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component name. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component view. If applied to a method, the MVC view component view name is default. + + + + + ASP.NET MVC attribute. When applied to a parameter of an attribute, + indicates that this parameter is an MVC action name. + + + [ActionName("Foo")] + public ActionResult Login(string returnUrl) { + ViewBag.ReturnUrl = Url.Action("Foo"); // OK + return RedirectToAction("Bar"); // Error: Cannot resolve action + } + + + + + Razor attribute. Indicates that a parameter or a method is a Razor section. + Use this attribute for custom wrappers similar to + System.Web.WebPages.WebPageBase.RenderSection(String). + + + + + Indicates how method, constructor invocation or property access + over collection type affects content of the collection. + + + + Method does not use or modify content of the collection. + + + Method only reads content of the collection but does not modify it. + + + Method can change content of the collection but does not add new elements. + + + Method can add new elements to the collection. + + + + Indicates that the marked method is assertion method, i.e. it halts control flow if + one of the conditions is satisfied. To set the condition, mark one of the parameters with + attribute. + + + + + Indicates the condition parameter of the assertion method. The method itself should be + marked by attribute. The mandatory argument of + the attribute is the assertion type. + + + + + Specifies assertion type. If the assertion method argument satisfies the condition, + then the execution continues. Otherwise, execution is assumed to be halted. + + + + Marked parameter should be evaluated to true. + + + Marked parameter should be evaluated to false. + + + Marked parameter should be evaluated to null value. + + + Marked parameter should be evaluated to not null value. + + + + Indicates that the marked method unconditionally terminates control flow execution. + For example, it could unconditionally throw exception. + + + + + Indicates that method is pure LINQ method, with postponed enumeration (like Enumerable.Select, + .Where). This annotation allows inference of [InstantHandle] annotation for parameters + of delegate type by analyzing LINQ method chains. + + + + + Indicates that IEnumerable, passed as parameter, is not enumerated. + + + + + Indicates that parameter is regular expression pattern. + + + + + Prevents the Member Reordering feature from tossing members of the marked class. + + + The attribute must be mentioned in your member reordering patterns + + + + + XAML attribute. Indicates the type that has ItemsSource property and should be treated + as ItemsControl-derived type, to enable inner items DataContext type resolve. + + + + + XAML attribute. Indicates the property of some BindingBase-derived type, that + is used to bind some item of ItemsControl-derived type. This annotation will + enable the DataContext type resolve for XAML bindings for such properties. + + + Property should have the tree ancestor of the ItemsControl type or + marked with the attribute. + + +
+
diff --git a/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/portable-net4+sl5+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1/JetBrains.Annotations.PCL328.dll b/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/portable-net4+sl5+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1/JetBrains.Annotations.PCL328.dll new file mode 100644 index 0000000000000000000000000000000000000000..18e634fe054463c0847c35ef2303b560de5e6a83 GIT binary patch literal 61952 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 literal 0 HcmV?d00001 diff --git a/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/portable-net4+sl5+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1/JetBrains.Annotations.PCL328.xml b/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/portable-net4+sl5+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1/JetBrains.Annotations.PCL328.xml new file mode 100644 index 000000000..97e439470 --- /dev/null +++ b/NonUnityBuild/packages/JetBrains.Annotations.10.2.1/lib/portable-net4+sl5+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1/JetBrains.Annotations.PCL328.xml @@ -0,0 +1,594 @@ + + + + JetBrains.Annotations.PCL328 + + + + + Indicates that the value of the marked element could be null sometimes, + so the check for null is necessary before its usage. + + + [CanBeNull] object Test() => null; + + void UseTest() { + var p = Test(); + var s = p.ToString(); // Warning: Possible 'System.NullReferenceException' + } + + + + + Indicates that the value of the marked element could never be null. + + + [NotNull] object Foo() { + return null; // Warning: Possible 'null' assignment + } + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can never be null. + + + + + Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task + and Lazy classes to indicate that the value of a collection item, of the Task.Result property + or of the Lazy.Value property can be null. + + + + + Indicates that the marked method builds string by format pattern and (optional) arguments. + Parameter, which contains format string, should be given in constructor. The format string + should be in -like form. + + + [StringFormatMethod("message")] + void ShowError(string message, params object[] args) { /* do something */ } + + void Foo() { + ShowError("Failed: {0}"); // Warning: Non-existing argument in format string + } + + + + + Specifies which parameter of an annotated method should be treated as format-string + + + + + For a parameter that is expected to be one of the limited set of values. + Specify fields of which type should be used as values for this parameter. + + + + + Indicates that the function argument should be string literal and match one + of the parameters of the caller function. For example, ReSharper annotates + the parameter of . + + + void Foo(string param) { + if (param == null) + throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol + } + + + + + Indicates that the method is contained in a type that implements + System.ComponentModel.INotifyPropertyChanged interface and this method + is used to notify that some property value changed. + + + The method should be non-static and conform to one of the supported signatures: + + NotifyChanged(string) + NotifyChanged(params string[]) + NotifyChanged{T}(Expression{Func{T}}) + NotifyChanged{T,U}(Expression{Func{T,U}}) + SetProperty{T}(ref T, T, string) + + + + public class Foo : INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + + [NotifyPropertyChangedInvocator] + protected virtual void NotifyChanged(string propertyName) { ... } + + string _name; + + public string Name { + get { return _name; } + set { _name = value; NotifyChanged("LastName"); /* Warning */ } + } + } + + Examples of generated notifications: + + NotifyChanged("Property") + NotifyChanged(() => Property) + NotifyChanged((VM x) => x.Property) + SetProperty(ref myField, value, "Property") + + + + + + Describes dependency between method input and output. + + +

Function Definition Table syntax:

+ + FDT ::= FDTRow [;FDTRow]* + FDTRow ::= Input => Output | Output <= Input + Input ::= ParameterName: Value [, Input]* + Output ::= [ParameterName: Value]* {halt|stop|void|nothing|Value} + Value ::= true | false | null | notnull | canbenull + + If method has single input parameter, it's name could be omitted.
+ Using halt (or void/nothing, which is the same) for method output + means that the methos doesn't return normally (throws or terminates the process).
+ Value canbenull is only applicable for output parameters.
+ You can use multiple [ContractAnnotation] for each FDT row, or use single attribute + with rows separated by semicolon. There is no notion of order rows, all rows are checked + for applicability and applied per each program state tracked by R# analysis.
+
+ + + [ContractAnnotation("=> halt")] + public void TerminationMethod() + + + [ContractAnnotation("halt <= condition: false")] + public void Assert(bool condition, string text) // regular assertion method + + + [ContractAnnotation("s:null => true")] + public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty() + + + // A method that returns null if the parameter is null, + // and not null if the parameter is not null + [ContractAnnotation("null => null; notnull => notnull")] + public object Transform(object data) + + + [ContractAnnotation("=> true, result: notnull; => false, result: null")] + public bool TryParse(string s, out Person result) + + +
+ + + Indicates that marked element should be localized or not. + + + [LocalizationRequiredAttribute(true)] + class Foo { + string str = "my string"; // Warning: Localizable string + } + + + + + Indicates that the value of the marked type (or its derivatives) + cannot be compared using '==' or '!=' operators and Equals() + should be used instead. However, using '==' or '!=' for comparison + with null is always permitted. + + + [CannotApplyEqualityOperator] + class NoEquality { } + + class UsesNoEquality { + void Test() { + var ca1 = new NoEquality(); + var ca2 = new NoEquality(); + if (ca1 != null) { // OK + bool condition = ca1 == ca2; // Warning + } + } + } + + + + + When applied to a target attribute, specifies a requirement for any type marked + with the target attribute to implement or inherit specific type or types. + + + [BaseTypeRequired(typeof(IComponent)] // Specify requirement + class ComponentAttribute : Attribute { } + + [Component] // ComponentAttribute requires implementing IComponent interface + class MyComponent : IComponent { } + + + + + Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library), + so this symbol will not be marked as unused (as well as by other usage inspections). + + + + + Should be used on attributes and causes ReSharper to not mark symbols marked with such attributes + as unused (as well as by other usage inspections) + + + + Only entity marked with attribute considered used. + + + Indicates implicit assignment to a member. + + + + Indicates implicit instantiation of a type with fixed constructor signature. + That means any unused constructor parameters won't be reported as such. + + + + Indicates implicit instantiation of a type. + + + + Specify what is considered used implicitly when marked + with or . + + + + Members of entity marked with attribute are considered used. + + + Entity marked with attribute and all its members considered used. + + + + This attribute is intended to mark publicly available API + which should not be removed and so is treated as used. + + + + + Tells code analysis engine if the parameter is completely handled when the invoked method is on stack. + If the parameter is a delegate, indicates that delegate is executed while the method is executed. + If the parameter is an enumerable, indicates that it is enumerated while the method is executed. + + + + + Indicates that a method does not make any observable state changes. + The same as System.Diagnostics.Contracts.PureAttribute. + + + [Pure] int Multiply(int x, int y) => x * y; + + void M() { + Multiply(123, 42); // Waring: Return value of pure method is not used + } + + + + + Indicates that the return value of method invocation must be used. + + + + + Indicates the type member or parameter of some type, that should be used instead of all other ways + to get the value that type. This annotation is useful when you have some "context" value evaluated + and stored somewhere, meaning that all other ways to get this value must be consolidated with existing one. + + + class Foo { + [ProvidesContext] IBarService _barService = ...; + + void ProcessNode(INode node) { + DoSomething(node, node.GetGlobalServices().Bar); + // ^ Warning: use value of '_barService' field + } + } + + + + + Indicates that a parameter is a path to a file or a folder within a web project. + Path can be relative or absolute, starting from web root (~). + + + + + An extension method marked with this attribute is processed by ReSharper code completion + as a 'Source Template'. When extension method is completed over some expression, it's source code + is automatically expanded like a template at call site. + + + Template method body can contain valid source code and/or special comments starting with '$'. + Text inside these comments is added as source code when the template is applied. Template parameters + can be used either as additional method parameters or as identifiers wrapped in two '$' signs. + Use the attribute to specify macros for parameters. + + + In this example, the 'forEach' method is a source template available over all values + of enumerable types, producing ordinary C# 'foreach' statement and placing caret inside block: + + [SourceTemplate] + public static void forEach<T>(this IEnumerable<T> xs) { + foreach (var x in xs) { + //$ $END$ + } + } + + + + + + Allows specifying a macro for a parameter of a source template. + + + You can apply the attribute on the whole method or on any of its additional parameters. The macro expression + is defined in the property. When applied on a method, the target + template parameter is defined in the property. To apply the macro silently + for the parameter, set the property value = -1. + + + Applying the attribute on a source template method: + + [SourceTemplate, Macro(Target = "item", Expression = "suggestVariableName()")] + public static void forEach<T>(this IEnumerable<T> collection) { + foreach (var item in collection) { + //$ $END$ + } + } + + Applying the attribute on a template method parameter: + + [SourceTemplate] + public static void something(this Entity x, [Macro(Expression = "guid()", Editable = -1)] string newguid) { + /*$ var $x$Id = "$newguid$" + x.ToString(); + x.DoSomething($x$Id); */ + } + + + + + + Allows specifying a macro that will be executed for a source template + parameter when the template is expanded. + + + + + Allows specifying which occurrence of the target parameter becomes editable when the template is deployed. + + + If the target parameter is used several times in the template, only one occurrence becomes editable; + other occurrences are changed synchronously. To specify the zero-based index of the editable occurrence, + use values >= 0. To make the parameter non-editable when the template is expanded, use -1. + > + + + + Identifies the target parameter of a source template if the + is applied on a template method. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC action. If applied to a method, the MVC action name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC area. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is + an MVC controller. If applied to a method, the MVC controller name is calculated + implicitly from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC Master. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC model type. Use this attribute + for custom wrappers similar to System.Web.Mvc.Controller.View(String, Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is an MVC + partial view. If applied to a method, the MVC partial view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method. + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC display template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.DisplayExtensions.DisplayForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC editor template. + Use this attribute for custom wrappers similar to + System.Web.Mvc.Html.EditorExtensions.EditorForModel(HtmlHelper, String). + + + + + ASP.NET MVC attribute. Indicates that a parameter is an MVC template. + Use this attribute for custom wrappers similar to + System.ComponentModel.DataAnnotations.UIHintAttribute(System.String). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component. If applied to a method, the MVC view name is calculated implicitly + from the context. Use this attribute for custom wrappers similar to + System.Web.Mvc.Controller.View(Object). + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component name. + + + + + ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter + is an MVC view component view. If applied to a method, the MVC view component view name is default. + + + + + ASP.NET MVC attribute. When applied to a parameter of an attribute, + indicates that this parameter is an MVC action name. + + + [ActionName("Foo")] + public ActionResult Login(string returnUrl) { + ViewBag.ReturnUrl = Url.Action("Foo"); // OK + return RedirectToAction("Bar"); // Error: Cannot resolve action + } + + + + + Razor attribute. Indicates that a parameter or a method is a Razor section. + Use this attribute for custom wrappers similar to + System.Web.WebPages.WebPageBase.RenderSection(String). + + + + + Indicates how method, constructor invocation or property access + over collection type affects content of the collection. + + + + Method does not use or modify content of the collection. + + + Method only reads content of the collection but does not modify it. + + + Method can change content of the collection but does not add new elements. + + + Method can add new elements to the collection. + + + + Indicates that the marked method is assertion method, i.e. it halts control flow if + one of the conditions is satisfied. To set the condition, mark one of the parameters with + attribute. + + + + + Indicates the condition parameter of the assertion method. The method itself should be + marked by attribute. The mandatory argument of + the attribute is the assertion type. + + + + + Specifies assertion type. If the assertion method argument satisfies the condition, + then the execution continues. Otherwise, execution is assumed to be halted. + + + + Marked parameter should be evaluated to true. + + + Marked parameter should be evaluated to false. + + + Marked parameter should be evaluated to null value. + + + Marked parameter should be evaluated to not null value. + + + + Indicates that the marked method unconditionally terminates control flow execution. + For example, it could unconditionally throw exception. + + + + + Indicates that method is pure LINQ method, with postponed enumeration (like Enumerable.Select, + .Where). This annotation allows inference of [InstantHandle] annotation for parameters + of delegate type by analyzing LINQ method chains. + + + + + Indicates that IEnumerable, passed as parameter, is not enumerated. + + + + + Indicates that parameter is regular expression pattern. + + + + + Prevents the Member Reordering feature from tossing members of the marked class. + + + The attribute must be mentioned in your member reordering patterns + + + + + XAML attribute. Indicates the type that has ItemsSource property and should be treated + as ItemsControl-derived type, to enable inner items DataContext type resolve. + + + + + XAML attribute. Indicates the property of some BindingBase-derived type, that + is used to bind some item of ItemsControl-derived type. This annotation will + enable the DataContext type resolve for XAML bindings for such properties. + + + Property should have the tree ancestor of the ItemsControl type or + marked with the attribute. + + +
+
diff --git a/UnityProject/Assets/Plugins/Zenject/OptionalExtras/UnitTests/Editor/Injection/TestAllInjectionTypes.cs b/UnityProject/Assets/Plugins/Zenject/OptionalExtras/UnitTests/Editor/Injection/TestAllInjectionTypes.cs index 865186104..13e2c55cd 100644 --- a/UnityProject/Assets/Plugins/Zenject/OptionalExtras/UnitTests/Editor/Injection/TestAllInjectionTypes.cs +++ b/UnityProject/Assets/Plugins/Zenject/OptionalExtras/UnitTests/Editor/Injection/TestAllInjectionTypes.cs @@ -45,13 +45,13 @@ abstract class FooBase : IFoo bool _didPostInjectBase; [Inject] - public static Test0 BaseStaticFieldPublic = null; + public static Test0 BaseStaticFieldPublic; [Inject] - static Test0 BaseStaticFieldPrivate = null; + static Test0 BaseStaticFieldPrivate; [Inject] - protected static Test0 BaseStaticFieldProtected = null; + protected static Test0 BaseStaticFieldProtected; [Inject] public static Test0 BaseStaticPropertyPublic @@ -108,12 +108,12 @@ protected Test0 BasePropertyProtected [Inject] public void PostInjectBase() { - Assert.IsNull(BaseStaticFieldPublic); - Assert.IsNull(BaseStaticFieldPrivate); - Assert.IsNull(BaseStaticFieldProtected); - Assert.IsNull(BaseStaticPropertyPublic); - Assert.IsNull(BaseStaticPropertyPrivate); - Assert.IsNull(BaseStaticPropertyProtected); + Assert.IsNotNull(BaseStaticFieldPublic); + Assert.IsNotNull(BaseStaticFieldPrivate); + Assert.IsNotNull(BaseStaticFieldProtected); + Assert.IsNotNull(BaseStaticPropertyPublic); + Assert.IsNotNull(BaseStaticPropertyPrivate); + Assert.IsNotNull(BaseStaticPropertyProtected); Assert.IsNotNull(BaseFieldPublic); Assert.IsNotNull(BaseFieldPrivate); @@ -153,13 +153,13 @@ public override bool DidPostInjectDerived } [Inject] - public static Test0 DerivedStaticFieldPublic = null; + public static Test0 DerivedStaticFieldPublic; [Inject] - static Test0 DerivedStaticFieldPrivate = null; + static Test0 DerivedStaticFieldPrivate; [Inject] - protected static Test0 DerivedStaticFieldProtected = null; + protected static Test0 DerivedStaticFieldProtected; [Inject] public static Test0 DerivedStaticPropertyPublic @@ -191,12 +191,12 @@ public FooDerived(Test0 param) [Inject] public void PostInject() { - Assert.IsNull(DerivedStaticFieldPublic); - Assert.IsNull(DerivedStaticFieldPrivate); - Assert.IsNull(DerivedStaticFieldProtected); - Assert.IsNull(DerivedStaticPropertyPublic); - Assert.IsNull(DerivedStaticPropertyPrivate); - Assert.IsNull(DerivedStaticPropertyProtected); + Assert.IsNotNull(DerivedStaticFieldPublic); + Assert.IsNotNull(DerivedStaticFieldPrivate); + Assert.IsNotNull(DerivedStaticFieldProtected); + Assert.IsNotNull(DerivedStaticPropertyPublic); + Assert.IsNotNull(DerivedStaticPropertyPrivate); + Assert.IsNotNull(DerivedStaticPropertyProtected); Assert.IsNotNull(DerivedFieldPublic); Assert.IsNotNull(DerivedFieldPrivate); diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Injection/InjectContext.cs b/UnityProject/Assets/Plugins/Zenject/Source/Injection/InjectContext.cs index f1cd42610..80d8e2ffa 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Injection/InjectContext.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Injection/InjectContext.cs @@ -3,7 +3,10 @@ using System.Linq; using System.Text; using ModestTree; + +#if !NOT_UNITY3D using UnityEngine; +#endif namespace Zenject { @@ -249,6 +252,7 @@ public string GetObjectGraphString() return result.ToString(); } + #if !NOT_UNITY3D public MonoBehaviour ToMonoBehaviourContext() { var monoBehaviourContext = this.ObjectInstance as MonoBehaviour; @@ -266,5 +270,6 @@ public MonoBehaviour ToMonoBehaviourContext() return null; } + #endif } } diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Main/DiContainer.cs b/UnityProject/Assets/Plugins/Zenject/Source/Main/DiContainer.cs index 0a75d7d91..61a5ffa40 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Main/DiContainer.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Main/DiContainer.cs @@ -933,8 +933,6 @@ public void InjectExplicit( } else { - if (injectable == null) - Debug.Log($"DiContainer.InjectExplicit(): injectableType='{injectableType}', injectInfo='{injectInfo.MemberName}'"); injectInfo.Setter(injectable, value); } } diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectAttribute.cs b/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectAttribute.cs index eef5604a8..fe57a008c 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectAttribute.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectAttribute.cs @@ -1,16 +1,13 @@ using System; -#if !NOT_UNITY3D + using JetBrains.Annotations; -#endif namespace Zenject { [AttributeUsage(AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] -#if !NOT_UNITY3D [MeansImplicitUse] -#endif public class InjectAttribute : InjectAttributeBase { } diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectOptionalAttribute.cs b/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectOptionalAttribute.cs index 6f9e6ec71..96ef0e5f5 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectOptionalAttribute.cs +++ b/UnityProject/Assets/Plugins/Zenject/Source/Usage/InjectOptionalAttribute.cs @@ -1,4 +1,5 @@ using System; + using JetBrains.Annotations; namespace Zenject diff --git a/UnityProject/Assets/Plugins/Zenject/Source/Zenject.csproj b/UnityProject/Assets/Plugins/Zenject/Source/Zenject.csproj index bc5756373..527d2fe7d 100644 --- a/UnityProject/Assets/Plugins/Zenject/Source/Zenject.csproj +++ b/UnityProject/Assets/Plugins/Zenject/Source/Zenject.csproj @@ -35,6 +35,9 @@ 4 + + ..\..\..\..\..\NonUnityBuild\packages\JetBrains.Annotations.10.2.1\lib\net\JetBrains.Annotations.dll + @@ -261,6 +264,9 @@ + + +